Skip to content

feat: add tseslint.configs.recommendedTypeChecked and remove no-unsafe-member-access rule #1657

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 6 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/good-taxis-drum.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@liam-hq/configs": patch
---

feat: add tseslint.configs.recommendedTypeChecked and remove no-unsafe-member-access rule
1 change: 0 additions & 1 deletion frontend/apps/app/eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ const gitignorePath = fileURLToPath(new URL('.gitignore', import.meta.url))

export default [
...createBaseConfig({
tsconfigPath: './tsconfig.json',
gitignorePath,
}),
]
1 change: 0 additions & 1 deletion frontend/apps/docs/eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,5 @@ import { createBaseConfig } from '../../packages/configs/eslint/index.js'
const gitignorePath = fileURLToPath(new URL('.gitignore', import.meta.url))

export default createBaseConfig({
tsconfigPath: './tsconfig.json',
gitignorePath,
})
10 changes: 0 additions & 10 deletions frontend/packages/cli/eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,6 @@ const gitignorePath = fileURLToPath(new URL('.gitignore', import.meta.url))

export default [
...createBaseConfig({
tsconfigPath: './tsconfig.json',
gitignorePath,
}),
{
ignores: [
'**/src/**/*.ts',
'**/src/**/*.tsx',
'**/vite-plugins/**/*.ts',
'**/*.d.ts',
'**/vite.config.ts',
],
},
]
44 changes: 9 additions & 35 deletions frontend/packages/configs/eslint/base.js
Original file line number Diff line number Diff line change
@@ -1,55 +1,29 @@
import { includeIgnoreFile } from '@eslint/compat'
import tseslint from '@typescript-eslint/eslint-plugin'
import { globalIgnores } from "eslint/config";
import tseslint from 'typescript-eslint';
import tsParser from '@typescript-eslint/parser'

/**
* Base ESLint configuration with typescript-eslint setup
* @param {Object} options Configuration options
* @param {string} options.tsconfigPath Path to tsconfig.json file
* @returns {Array} ESLint configuration array
*/
export function createBaseConfig(options = {}) {
const { tsconfigPath = './tsconfig.json', gitignorePath } = options
const { gitignorePath } = options

return [
includeIgnoreFile(gitignorePath),
globalIgnores(['eslint.config.mjs']),
...tseslint.config(
tseslint.configs?.recommendedTypeChecked,
{
files: ['**/*.ts', '**/*.tsx'],
ignores: [
'**/trigger.config.ts',
'**/vitest.config.ts',
'**/dist/**',
'**/.trigger/**',
'**/app/.well-known/**',
],
plugins: {
'@typescript-eslint': tseslint,
},
languageOptions: {
parser: tsParser,
parserOptions: {
projectService: tsconfigPath,
ecmaVersion: 2022,
sourceType: 'module',
},
},
rules: {
'@typescript-eslint/no-unsafe-member-access': 'error',
},
},
{
files: ['**/trigger.config.ts', '**/vitest.config.ts'],
plugins: {
'@typescript-eslint': tseslint,
},
languageOptions: {
parser: tsParser,
parserOptions: {
ecmaVersion: 2022,
sourceType: 'module',
projectService: true,
tsconfigRootDir: import.meta.dirname,
},
},
rules: {},
},
)
]
}
6 changes: 3 additions & 3 deletions frontend/packages/configs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@
"@biomejs/biome": "1.9.4",
"@eslint/compat": "1.2.9",
"@tsconfig/strictest": "2.0.5",
"@typescript-eslint/eslint-plugin": "8.31.1",
"@typescript-eslint/parser": "8.31.1",
"eslint": "9.25.1"
"@typescript-eslint/parser": "^8.32.0",
"eslint": "9.25.1",
"typescript-eslint": "8.32.0"
},
"files": [
"eslint",
Expand Down
1 change: 0 additions & 1 deletion frontend/packages/db-structure/eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,5 @@ import { createBaseConfig } from '../../packages/configs/eslint/index.js'
const gitignorePath = fileURLToPath(new URL('.gitignore', import.meta.url))

export default createBaseConfig({
tsconfigPath: './tsconfig.json',
gitignorePath,
})
16 changes: 16 additions & 0 deletions frontend/packages/db-structure/src/parser/schemarb/parser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ function extractTableName(
)
}

// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
const value = nameNode.unescaped.value

return ok(value)
Expand All @@ -85,6 +86,7 @@ function extractTableComment(argNodes: Node[]): string | null {
(elem) =>
elem instanceof AssocNode &&
elem.key instanceof SymbolNode &&
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
elem.key.unescaped.value === 'comment',
)

Expand Down Expand Up @@ -120,6 +122,7 @@ function extractIdColumnAndConstraint(
(elem) =>
elem instanceof AssocNode &&
elem.key instanceof SymbolNode &&
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
elem.key.unescaped.value === 'id',
)

Expand All @@ -129,6 +132,7 @@ function extractIdColumnAndConstraint(
idAssoc.value instanceof StringNode ||
idAssoc.value instanceof SymbolNode
)
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
idColumn.type = idAssoc.value.unescaped.value

return [idColumn, idPrimaryKeyConstraint]
Expand Down Expand Up @@ -229,6 +233,7 @@ function extractColumnDetails(node: CallNode): Column {
const argNodes = node.arguments_?.compactChildNodes() || []
for (const argNode of argNodes) {
if (argNode instanceof StringNode) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
column.name = argNode.unescaped.value
} else if (argNode instanceof KeywordHashNode) {
extractColumnOptions(argNode, column)
Expand All @@ -252,6 +257,7 @@ function extractIndexDetails(node: CallNode): Index {
const argElemens = argNode.compactChildNodes()
for (const argElem of argElemens) {
if (argElem instanceof StringNode) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
index.columns.push(argElem.unescaped.value)
}
}
Expand Down Expand Up @@ -328,6 +334,7 @@ function extractDefaultValue(
): string | number | boolean | null {
if (value instanceof TrueNode) return true
if (value instanceof FalseNode) return false
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
if (value instanceof StringNode) return value.unescaped.value
if (value instanceof IntegerNode) return value.value
return null
Expand All @@ -347,6 +354,7 @@ function extractRelationshipTableNames(

const [foreignTableName, primaryTableName] = stringNodes.map(
(node): string => {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
if (node instanceof StringNode) return node.unescaped.value
return ''
},
Expand All @@ -364,6 +372,7 @@ function extractStringValues(
const stringNodes = nodes.filter((node) => node instanceof StringNode)

const values = stringNodes.map((node): string => {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
if (node instanceof StringNode) return node.unescaped.value
return ''
})
Expand All @@ -387,6 +396,7 @@ function extractConstraintName(node: KeywordHashNode): string | null {
key === 'name' &&
(value instanceof StringNode || value instanceof SymbolNode)
) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
return value.unescaped.value
}
}
Expand Down Expand Up @@ -467,25 +477,31 @@ function processForeignKeyOption(
switch (key) {
case 'column':
if (value instanceof StringNode || value instanceof SymbolNode) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
relation.foreignColumnName = value.unescaped.value
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
foreignKeyConstraint.columnName = value.unescaped.value
}
break
case 'name':
if (value instanceof StringNode || value instanceof SymbolNode) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
relation.name = value.unescaped.value
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
foreignKeyConstraint.name = value.unescaped.value
}
break
case 'on_update':
if (value instanceof SymbolNode) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
const updateConstraint = normalizeConstraintName(value.unescaped.value)
relation.updateConstraint = updateConstraint
foreignKeyConstraint.updateConstraint = updateConstraint
}
break
case 'on_delete':
if (value instanceof SymbolNode) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
const deleteConstraint = normalizeConstraintName(value.unescaped.value)
relation.deleteConstraint = deleteConstraint
foreignKeyConstraint.deleteConstraint = deleteConstraint
Expand Down
10 changes: 10 additions & 0 deletions frontend/packages/db/.eslintrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
module.exports = {
overrides: [
{
files: ['supabase/database.types.ts'],
rules: {
'@typescript-eslint/no-redundant-type-constituents': 'off',
},
},
],
}
1 change: 0 additions & 1 deletion frontend/packages/db/eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,5 @@ import { createBaseConfig } from '../../packages/configs/eslint/index.js'
const gitignorePath = fileURLToPath(new URL('.gitignore', import.meta.url))

export default createBaseConfig({
tsconfigPath: './tsconfig.json',
gitignorePath,
})
2 changes: 2 additions & 0 deletions frontend/packages/db/src/types/supabase-overrides/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,12 @@ export type AppDatabaseOverrides = MergeDeep<
GithubPullRequestsOverride &
MigrationPullRequestMappingsOverride &
GithubPullRequestCommentsOverride &
// eslint-disable-next-line @typescript-eslint/no-duplicate-type-constituents
OverallReviewKnowledgeSuggestionMappingsOverride &
SchemaFilePathsOverride &
DocFilePathsOverride &
ProjectRepositoryMappingsOverride &
MigrationsOverride &
// eslint-disable-next-line @typescript-eslint/no-duplicate-type-constituents
GithubPullRequestsOverride
>
1 change: 0 additions & 1 deletion frontend/packages/e2e/eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,5 @@ import { createBaseConfig } from '../../packages/configs/eslint/index.js'
const gitignorePath = fileURLToPath(new URL('.gitignore', import.meta.url))

export default createBaseConfig({
tsconfigPath: './tsconfig.json',
gitignorePath,
})
1 change: 1 addition & 0 deletions frontend/packages/e2e/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
"name": "@liam-hq/e2e",
"private": true,
"version": "0.0.0",
"type": "module",
"devDependencies": {
"@biomejs/biome": "1.9.4",
"@liam-hq/configs": "workspace:*",
Expand Down
1 change: 0 additions & 1 deletion frontend/packages/erd-core/eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,5 @@ import { createBaseConfig } from '../../packages/configs/eslint/index.js'
const gitignorePath = fileURLToPath(new URL('.gitignore', import.meta.url))

export default createBaseConfig({
tsconfigPath: './tsconfig.json',
gitignorePath,
})
10 changes: 10 additions & 0 deletions frontend/packages/github/.eslintrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
module.exports = {
overrides: [
{
files: ['src/api.server.ts'],
rules: {
'@typescript-eslint/require-await': 'off',
},
},
],
}
1 change: 0 additions & 1 deletion frontend/packages/github/eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,5 @@ import { createBaseConfig } from '../../packages/configs/eslint/index.js'
const gitignorePath = fileURLToPath(new URL('.gitignore', import.meta.url))

export default createBaseConfig({
tsconfigPath: './tsconfig.json',
gitignorePath,
})
1 change: 0 additions & 1 deletion frontend/packages/jobs/eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,5 @@ import { createBaseConfig } from '../../packages/configs/eslint/index.js'
const gitignorePath = fileURLToPath(new URL('.gitignore', import.meta.url))

export default createBaseConfig({
tsconfigPath: './tsconfig.json',
gitignorePath,
})
1 change: 0 additions & 1 deletion frontend/packages/prompt-test/eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,5 @@ import { createBaseConfig } from '../../packages/configs/eslint/index.js'
const gitignorePath = fileURLToPath(new URL('.gitignore', import.meta.url))

export default createBaseConfig({
tsconfigPath: './tsconfig.json',
gitignorePath,
})
1 change: 0 additions & 1 deletion frontend/packages/ui/eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,5 @@ import { createBaseConfig } from '../../packages/configs/eslint/index.js'
const gitignorePath = fileURLToPath(new URL('.gitignore', import.meta.url))

export default createBaseConfig({
tsconfigPath: './tsconfig.json',
gitignorePath,
})
Loading
Loading