diff --git a/.github/renovate/docker.json5 b/.github/renovate/docker.json5 index 652bd3c8..c88db7aa 100644 --- a/.github/renovate/docker.json5 +++ b/.github/renovate/docker.json5 @@ -1,16 +1,16 @@ { - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "packageRules": [ + $schema: 'https://docs.renovatebot.com/renovate-schema.json', + packageRules: [ { - "description": "Group Docker non-major and digest updates", - "matchManagers": ["dockerfile"], + description: 'Group Docker non-major and digest updates', + matchManagers: ['dockerfile'], // Node.jsのDockerイメージはnode.json5でまとめて管理するため、ここでは除外する。 - "matchPackageNames": ["!node"], - "matchUpdateTypes": ["minor", "patch", "digest", "pinDigest"], - "groupName": "Docker non-major dependencies", + matchPackageNames: ['!node'], + matchUpdateTypes: ['minor', 'patch', 'digest', 'pinDigest'], + groupName: 'Docker non-major dependencies', // 現在は無効化中。将来再開する場合はtrueに変更する。 - "automerge": false, - "automergeType": "pr", + automerge: false, + automergeType: 'pr', }, ], } diff --git a/.github/renovate/github-actions.json5 b/.github/renovate/github-actions.json5 index 4b29f0af..c6f84698 100644 --- a/.github/renovate/github-actions.json5 +++ b/.github/renovate/github-actions.json5 @@ -1,54 +1,54 @@ { - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "customManagers": [ + $schema: 'https://docs.renovatebot.com/renovate-schema.json', + customManagers: [ // 定期実行ワークフローで使用するRenovate本体(Dockerイメージのバージョンとダイジェスト) { - "customType": "regex", - "description": "Update the Renovate image used by the GitHub Action", - "managerFilePatterns": [".github/workflows/renovate.yaml"], - "matchStrings": [ - "renovate-version: (?[^@\\s]+)@(?sha256:[a-f0-9]+)", + customType: 'regex', + description: 'Update the Renovate image used by the GitHub Action', + managerFilePatterns: ['.github/workflows/renovate.yaml'], + matchStrings: [ + 'renovate-version: (?[^@\\s]+)@(?sha256:[a-f0-9]+)', ], - "depNameTemplate": "ghcr.io/renovatebot/renovate", - "datasourceTemplate": "docker", - "versioningTemplate": "docker", + depNameTemplate: 'ghcr.io/renovatebot/renovate', + datasourceTemplate: 'docker', + versioningTemplate: 'docker', }, // 設定検証ワークフローでnpx経由で使用するRenovate CLI(npmパッケージのバージョン) { - "customType": "regex", - "description": "Update the Renovate config validator", - "managerFilePatterns": [ - ".github/workflows/renovate-config-validator-ci.yaml", + customType: 'regex', + description: 'Update the Renovate config validator', + managerFilePatterns: [ + '.github/workflows/renovate-config-validator-ci.yaml', ], - "matchStrings": ["renovate@(?[^\\s]+)"], - "depNameTemplate": "renovate", - "datasourceTemplate": "npm", + matchStrings: ['renovate@(?[^\\s]+)'], + depNameTemplate: 'renovate', + datasourceTemplate: 'npm', }, ], - "packageRules": [ + packageRules: [ { - "description": "Keep the Renovate runner and validator in one update", - "matchManagers": ["custom.regex"], - "matchPackageNames": ["ghcr.io/renovatebot/renovate", "renovate"], - "groupName": "Renovate", + description: 'Keep the Renovate runner and validator in one update', + matchManagers: ['custom.regex'], + matchPackageNames: ['ghcr.io/renovatebot/renovate', 'renovate'], + groupName: 'Renovate', }, { - "description": "Automerge non-major Renovate updates", - "matchManagers": ["custom.regex"], - "matchPackageNames": ["ghcr.io/renovatebot/renovate", "renovate"], - "matchUpdateTypes": ["minor", "patch", "digest", "pinDigest"], + description: 'Automerge non-major Renovate updates', + matchManagers: ['custom.regex'], + matchPackageNames: ['ghcr.io/renovatebot/renovate', 'renovate'], + matchUpdateTypes: ['minor', 'patch', 'digest', 'pinDigest'], // 現在は無効化中。将来再開する場合はtrueに変更する。 - "automerge": false, - "automergeType": "pr", + automerge: false, + automergeType: 'pr', }, { - "description": "Group GitHub Actions non-major and digest updates", - "matchManagers": ["github-actions"], - "matchUpdateTypes": ["minor", "patch", "digest", "pinDigest"], - "groupName": "GitHub Actions non-major dependencies", + description: 'Group GitHub Actions non-major and digest updates', + matchManagers: ['github-actions'], + matchUpdateTypes: ['minor', 'patch', 'digest', 'pinDigest'], + groupName: 'GitHub Actions non-major dependencies', // 現在は無効化中。将来再開する場合はtrueに変更する。 - "automerge": false, - "automergeType": "pr", + automerge: false, + automergeType: 'pr', }, ], } diff --git a/.github/renovate/labels.json5 b/.github/renovate/labels.json5 index fd3acdee..993478d8 100644 --- a/.github/renovate/labels.json5 +++ b/.github/renovate/labels.json5 @@ -1,34 +1,34 @@ { - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "labels": ["dependencies"], - "packageRules": [ + $schema: 'https://docs.renovatebot.com/renovate-schema.json', + labels: ['dependencies'], + packageRules: [ { - "matchUpdateTypes": ["major"], - "addLabels": ["type/major"], + matchUpdateTypes: ['major'], + addLabels: ['type/major'], }, { - "matchUpdateTypes": ["minor"], - "addLabels": ["type/minor"], + matchUpdateTypes: ['minor'], + addLabels: ['type/minor'], }, { - "matchUpdateTypes": ["patch"], - "addLabels": ["type/patch"], + matchUpdateTypes: ['patch'], + addLabels: ['type/patch'], }, { - "matchDatasources": ["npm"], - "addLabels": ["renovate/npm"], + matchDatasources: ['npm'], + addLabels: ['renovate/npm'], }, { - "matchDatasources": ["docker"], - "addLabels": ["renovate/docker"], + matchDatasources: ['docker'], + addLabels: ['renovate/docker'], }, { - "matchManagers": ["github-actions"], - "addLabels": ["renovate/actions"], + matchManagers: ['github-actions'], + addLabels: ['renovate/actions'], }, { - "matchManagers": ["nodenv"], - "addLabels": ["renovate/node"], + matchManagers: ['nodenv'], + addLabels: ['renovate/node'], }, ], } diff --git a/.github/renovate/node.json5 b/.github/renovate/node.json5 index 7a1dba68..af2b18e4 100644 --- a/.github/renovate/node.json5 +++ b/.github/renovate/node.json5 @@ -1,23 +1,23 @@ { - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["replacements:tsconfig-bases-node"], - "packageRules": [ + $schema: 'https://docs.renovatebot.com/renovate-schema.json', + extends: ['replacements:tsconfig-bases-node'], + packageRules: [ { - "description": "Keep Node.js versions in one update", + description: 'Keep Node.js versions in one update', // Dockerfile、.node-version、package.jsonなど、以下のマネージャーが対応する // Node.jsの更新はここで一元的に管理する。 - "matchManagers": ["dockerfile", "nodenv", "npm"], - "matchPackageNames": ["node", "@types/node", "@tsconfig/node**"], - "groupName": "Node.js", - "rangeStrategy": "bump", + matchManagers: ['dockerfile', 'nodenv', 'npm'], + matchPackageNames: ['node', '@types/node', '@tsconfig/node**'], + groupName: 'Node.js', + rangeStrategy: 'bump', }, { - "description": "Automerge non-major Node.js updates", - "matchManagers": ["dockerfile", "nodenv", "npm"], - "matchPackageNames": ["node", "@types/node", "@tsconfig/node**"], - "matchUpdateTypes": ["minor", "patch", "digest", "pinDigest"], - "automerge": false, - "automergeType": "pr", + description: 'Automerge non-major Node.js updates', + matchManagers: ['dockerfile', 'nodenv', 'npm'], + matchPackageNames: ['node', '@types/node', '@tsconfig/node**'], + matchUpdateTypes: ['minor', 'patch', 'digest', 'pinDigest'], + automerge: false, + automergeType: 'pr', }, ], } diff --git a/.github/renovate/npm.json5 b/.github/renovate/npm.json5 index 8672aefa..e969b3d8 100644 --- a/.github/renovate/npm.json5 +++ b/.github/renovate/npm.json5 @@ -1,16 +1,16 @@ { - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "packageRules": [ + $schema: 'https://docs.renovatebot.com/renovate-schema.json', + packageRules: [ { - "description": "Group npm minor and patch updates", - "matchManagers": ["npm"], + description: 'Group npm minor and patch updates', + matchManagers: ['npm'], // Node.js関連パッケージはnode.json5でまとめて管理するため、ここでは除外する。 - "matchPackageNames": ["!node", "!@types/node", "!@tsconfig/node**"], - "matchUpdateTypes": ["minor", "patch"], - "groupName": "npm minor and patch dependencies", + matchPackageNames: ['!node', '!@types/node', '!@tsconfig/node**'], + matchUpdateTypes: ['minor', 'patch'], + groupName: 'npm minor and patch dependencies', // 現在は無効化中。将来再開する場合はtrueに変更する。 - "automerge": false, - "automergeType": "pr", + automerge: false, + automergeType: 'pr', }, ], } diff --git a/.github/workflows/quality.yaml b/.github/workflows/quality.yaml new file mode 100644 index 00000000..5c9b7f8b --- /dev/null +++ b/.github/workflows/quality.yaml @@ -0,0 +1,42 @@ +name: Lint and Format + +on: + pull_request: + push: + branches: + - main + +permissions: + contents: read + +jobs: + lint-and-format: + name: Lint and Format + runs-on: ubuntu-24.04 + + steps: + - name: Checkout + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + with: + persist-credentials: false + - name: Setup pnpm + uses: pnpm/action-setup@8912a9102ac27614460f54aedde9e1e7f9aec20d # v6.0.5 + - name: Setup Node.js + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + with: + node-version-file: .node-version + cache: pnpm + cache-dependency-path: pnpm-lock.yaml + - name: Restore ESLint cache + uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: .eslintcache + key: eslint-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml', 'eslint.config.js') }}-${{ github.sha }} + restore-keys: | + eslint-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml', 'eslint.config.js') }}- + - name: Install dependencies + run: pnpm ci + - name: Run ESLint + run: pnpm lint:check + - name: Check Prettier formatting + run: pnpm format:check diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index 275ea026..104e680e 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -2,11 +2,11 @@ name: Renovate on: push: - branches: ["main"] + branches: ['main'] schedule: # Every day at 5 a.m. JST - - cron: "0 20 * * *" + - cron: '0 20 * * *' workflow_dispatch: inputs: @@ -37,7 +37,7 @@ jobs: with: app-id: ${{ secrets.RENOVATE_APP_ID }} private-key: ${{ secrets.RENOVATE_APP_PRIVATE_KEY }} - repositories: "rucQ-UI" + repositories: 'rucQ-UI' - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false diff --git a/.gitignore b/.gitignore index df94c542..a7765301 100644 --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,8 @@ coverage *.tsbuildinfo +.eslintcache + .env.local .env.*.local diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..4d44ccc3 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,3 @@ +*.md +pnpm-lock.yaml +public/mockServiceWorker.js diff --git a/package.json b/package.json index 5bf6f569..1a174413 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,10 @@ "preview:prod": "vite preview --mode production", "build-only": "vite build", "type-check": "vue-tsc --build", - "lint": "eslint . --fix", - "format": "prettier --write src/", + "lint": "eslint . --cache --cache-strategy content --cache-location .eslintcache --fix", + "lint:check": "eslint . --cache --cache-strategy content --cache-location .eslintcache --max-warnings=0", + "format": "prettier --write .", + "format:check": "prettier --check .", "generate:api": "openapi-typescript https://raw.githubusercontent.com/traPtitech/rucQ/main/openapi.yaml -o src/api/schema.d.ts && pnpm format" }, "packageManager": "pnpm@11.5.0", diff --git a/src/components/information/QuestionGroupPanel.vue b/src/components/information/QuestionGroupPanel.vue index 57a4f7eb..84232e55 100644 --- a/src/components/information/QuestionGroupPanel.vue +++ b/src/components/information/QuestionGroupPanel.vue @@ -141,7 +141,7 @@ const allChecked = computed(() => { let result = true for (const question of props.questionGroup.questions) { const answer = answersMap[question.id] - if (!answer || answer.value === undefined || answer.value === null) { + if (answer?.value === undefined) { result = false // multiple の [], free_text の '' は falsy だが回答済みとみなす break } diff --git a/src/components/layout/HeaderButton.vue b/src/components/layout/HeaderButton.vue index 8c436278..f06df281 100644 --- a/src/components/layout/HeaderButton.vue +++ b/src/components/layout/HeaderButton.vue @@ -36,13 +36,7 @@ const campIconUrl = computed(() => {