コンテンツにスキップ

コーディングルール

命名規則

対象 規則 例
TS の変数・関数 camelCase handleTableChange
React コンポーネント PascalCase QuestionResponseChart
コンポーネントの配置 components/<カテゴリ>/<Name>/index.tsx + index.scss components/SurveyCharts/QuestionResponseGrid/index.tsx
ページの配置 pages/<Name>/index.tsx + index.scss pages/Sample2/index.tsx
CSS クラス BEM sample2-page__title / step-card__select
TS の定数 UPPER_SNAKE_CASE CATALOG_NAME / QUESTION_TYPE_FILTER
Python の変数・関数 snake_case fetch_all_questions
Pydantic モデル PascalCase QuestionDataResponse
API のパス・クエリ snake_case /api/catalogs/{catalog_name}/.../all_questions?question_type=

フォーマッター・リンター

# フォーマット
npm run format          # チェックのみ: npm run format:check

# Lint
npm run lint            # 自動修正: npm run lint:fix

設定ファイル: nodejs-fastapi-hello-world-app/.prettierrc.json、nodejs-fastapi-hello-world-app/eslint.config.js

Prettier の設定はセミコロンなし・シングルクォート・printWidth: 100・trailingComma: es5。リポジトリルートの .husky/pre-commit が format:check と lint を実行するため、違反するとコミットできない。

Python 側のフォーマッター・リンターは未導入。

PRとレビューの基準

  • 1PRは1つの目的に絞る
  • レビュワーが理解できるよう説明をPR本文に書く
  • セルフレビューをしてからレビュー依頼する
  • フロントエンドを変更した PR には npm run build の成果物(backend/static/)を含める。含めないと本番に反映されない
  • API を変更した PR には npm run generate:client の再生成結果を含める

ブランチ戦略

ブランチ 環境
main dev
stg stg
prd prd

アンチパターン

  • 生成物を手で編集する — frontend/src/api/generated/** と frontend/src/api/openapi.yaml は生成物。変更したいときは元の Pydantic モデル/response_model を直して npm run generate:client を実行する。
  • SQL に識別子を直接埋め込む — catalog / schema / table は必ず backend/sql/utils.fully_qualified_name を通す(^[A-Za-z0-9_]+$ の allowlist + バッククォート)。
  • SQL に値を文字列連結する — 値は必ず ? プレースホルダで渡す。
  • route に業務ロジックを書く — routes/ は薄く保つ。asyncio.to_thread で同期の SQL 層を呼び、例外を ValueError → 400 / RuntimeError → 503 / その他 → 500 にマップするだけにする。
  • API クライアントを手書きする — orval の生成 hook を使う。
  • any 型の多用 — 生成された型をそのまま使う。
  • backend/generate_models_from_databricks.py を実行して放置する — このスクリプトは backend/models/__init__.py を生成モデルだけで上書きするため、実行後に api / data_sql の import を手で戻す。