ESLint Drizzle Plugin

νŠΉμ • μ‹œλ‚˜λ¦¬μ˜€μ— λŒ€ν•œ νƒ€μž… 검사λ₯Ό μˆ˜ν–‰ν•˜λŠ” 것이 λΆˆκ°€λŠ₯ν•˜κ±°λ‚˜, κ°€λŠ₯ν•˜λ”λΌλ„ 였λ₯˜ λ©”μ‹œμ§€λ₯Ό μ΄ν•΄ν•˜κΈ° μ–΄λ €μš΄ 경우λ₯Ό μœ„ν•΄, ꢌμž₯ κ·œμΉ™μ΄ ν¬ν•¨λœ ESLint νŒ¨ν‚€μ§€λ₯Ό λ§Œλ“€κΈ°λ‘œ κ²°μ •ν–ˆμŠ΅λ‹ˆλ‹€. 이 νŒ¨ν‚€μ§€λŠ” κ°œλ°œμžκ°€ 개발 쀑 μ€‘μš”ν•œ μ‹œλ‚˜λ¦¬μ˜€λ₯Ό μ²˜λ¦¬ν•˜λŠ” 데 도움을 μ£ΌλŠ” 것을 λͺ©ν‘œλ‘œ ν•©λ‹ˆλ‹€.

μ„€μΉ˜

npm
yarn
pnpm
bun
npm i eslint-plugin-drizzle
npm i @typescript-eslint/eslint-plugin @typescript-eslint/parser

μ‚¬μš©λ²•

.eslintrc.yml 예제

root: true
parser: '@typescript-eslint/parser'
parserOptions:
  project: './tsconfig.json'
plugins:
  - drizzle
rules:
  'drizzle/enforce-delete-with-where': "error"
  'drizzle/enforce-update-with-where': "error"

All μ„€μ •

이 ν”ŒλŸ¬κ·ΈμΈμ€ λͺ¨λ“  κ·œμΉ™(더 이상 μ‚¬μš©λ˜μ§€ μ•ŠλŠ” κ·œμΉ™ μ œμ™Έ)을 μ‚¬μš©ν•˜λŠ” all을 λ‚΄λ³΄λƒ…λ‹ˆλ‹€.

root: true
extends:
  - "plugin:drizzle/all"
parser: '@typescript-eslint/parser'
parserOptions:
  project: './tsconfig.json'
plugins:
  - drizzle

Recommended μ„€μ •

ν˜„μž¬ all은 recommended와 λ™μΌν•©λ‹ˆλ‹€

root: true
extends:
  - "plugin:drizzle/recommended"
parser: '@typescript-eslint/parser'
parserOptions:
  project: './tsconfig.json'
plugins:
  - drizzle

κ·œμΉ™

enforce-delete-with-where

.delete() λ¬Έμ—μ„œ .where() 절과 ν•¨κ»˜ deleteλ₯Ό μ‚¬μš©ν•˜λ„λ‘ κ°•μ œν•©λ‹ˆλ‹€. λŒ€λΆ€λΆ„μ˜ 경우 ν…Œμ΄λΈ”μ˜ λͺ¨λ“  행을 μ‚­μ œν•  ν•„μš”κ°€ μ—†μœΌλ©° μ–΄λ–€ ν˜•νƒœμ˜ WHERE 문이 ν•„μš”ν•©λ‹ˆλ‹€.

μ„ νƒμ μœΌλ‘œ, string λ˜λŠ” string[]λ₯Ό ν—ˆμš©ν•˜λŠ” ν”ŒλŸ¬κ·ΈμΈ μ˜΅μ…˜μ—μ„œ drizzleObjectName을 μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” Drizzle이 μ•„λ‹Œ delete λ©”μ„œλ“œκ°€ μžˆλŠ” κ°μ²΄λ‚˜ ν΄λž˜μŠ€κ°€ μžˆμ„ λ•Œ μœ μš©ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ delete λ©”μ„œλ“œλŠ” ESLint κ·œμΉ™μ„ νŠΈλ¦¬κ±°ν•©λ‹ˆλ‹€. 이λ₯Ό λ°©μ§€ν•˜λ €λ©΄ μ½”λ“œλ² μ΄μŠ€μ—μ„œ μ‚¬μš©ν•˜λŠ” Drizzle 객체의 이름(예: db)을 μ •μ˜ν•˜μ—¬ delete λ©”μ„œλ“œκ°€ 이 κ°μ²΄μ—μ„œ 온 κ²½μš°μ—λ§Œ κ·œμΉ™μ΄ νŠΈλ¦¬κ±°λ˜λ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

예제, μ„€μ • 1:

rules:
  'drizzle/enforce-delete-with-where': "error"
class MyClass {
  public delete() {
    return {}
  }
}

const myClassObj = new MyClass();

// ---> ESLint κ·œμΉ™μ— μ˜ν•΄ 트리거됨
myClassObj.delete()

const db = drizzle(...)
// ---> ESLint κ·œμΉ™μ— μ˜ν•΄ 트리거됨
db.delete()

예제, μ„€μ • 2:

rules:
  'drizzle/enforce-delete-with-where':
    - "error"
    - "drizzleObjectName": 
      - "db"
class MyClass {
  public delete() {
    return {}
  }
}

const myClassObj = new MyClass();

// ---> ESLint κ·œμΉ™μ— μ˜ν•΄ νŠΈλ¦¬κ±°λ˜μ§€ μ•ŠμŒ
myClassObj.delete()

const db = drizzle(...)
// ---> ESLint κ·œμΉ™μ— μ˜ν•΄ 트리거됨
db.delete()

enforce-update-with-where:

.update() λ¬Έμ—μ„œ .where() 절과 ν•¨κ»˜ updateλ₯Ό μ‚¬μš©ν•˜λ„λ‘ κ°•μ œν•©λ‹ˆλ‹€. λŒ€λΆ€λΆ„μ˜ 경우 ν…Œμ΄λΈ”μ˜ λͺ¨λ“  행을 μ—…λ°μ΄νŠΈν•  ν•„μš”κ°€ μ—†μœΌλ©° μ–΄λ–€ ν˜•νƒœμ˜ WHERE 문이 ν•„μš”ν•©λ‹ˆλ‹€.

μ„ νƒμ μœΌλ‘œ, string λ˜λŠ” string[]λ₯Ό ν—ˆμš©ν•˜λŠ” ν”ŒλŸ¬κ·ΈμΈ μ˜΅μ…˜μ—μ„œ drizzleObjectName을 μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” Drizzle이 μ•„λ‹Œ delete λ©”μ„œλ“œκ°€ μžˆλŠ” κ°μ²΄λ‚˜ ν΄λž˜μŠ€κ°€ μžˆμ„ λ•Œ μœ μš©ν•©λ‹ˆλ‹€. update λ©”μ„œλ“œμ™€ 같은 경우 ESLint κ·œμΉ™μ„ νŠΈλ¦¬κ±°ν•©λ‹ˆλ‹€. 이λ₯Ό λ°©μ§€ν•˜λ €λ©΄ μ½”λ“œλ² μ΄μŠ€μ—μ„œ μ‚¬μš©ν•˜λŠ” Drizzle 객체의 이름(예: db)을 μ •μ˜ν•˜μ—¬ delete λ©”μ„œλ“œκ°€ 이 κ°μ²΄μ—μ„œ 온 κ²½μš°μ—λ§Œ κ·œμΉ™μ΄ νŠΈλ¦¬κ±°λ˜λ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

예제, μ„€μ • 1:

rules:
  'drizzle/enforce-update-with-where': "error"
class MyClass {
  public update() {
    return {}
  }
}

const myClassObj = new MyClass();

// ---> ESLint κ·œμΉ™μ— μ˜ν•΄ 트리거됨
myClassObj.update()

const db = drizzle(...)
// ---> ESLint κ·œμΉ™μ— μ˜ν•΄ 트리거됨
db.update()

예제, μ„€μ • 2:

rules:
  'drizzle/enforce-update-with-where':
    - "error"
    - "drizzleObjectName": 
      - "db"
class MyClass {
  public update() {
    return {}
  }
}

const myClassObj = new MyClass();

// ---> ESLint κ·œμΉ™μ— μ˜ν•΄ νŠΈλ¦¬κ±°λ˜μ§€ μ•ŠμŒ
myClassObj.update()

const db = drizzle(...)
// ---> ESLint κ·œμΉ™μ— μ˜ν•΄ 트리거됨
db.update()