Skip to content
Open
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
2 changes: 1 addition & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20.19.4'
node-version: '24.13.0'
cache: 'npm'

- name: Install dependencies
Expand Down
2 changes: 1 addition & 1 deletion .nvmrc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
v20.19.4
v24.13.0
Empty file added apps/api/.gitignore
Empty file.
15 changes: 15 additions & 0 deletions apps/api/eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { defineConfig } from 'eslint/config'

import {
baseConfig,
javascriptConfig,
nodeConfig,
typescriptConfig,
} from '../../eslint.config.mjs'

export default defineConfig([
...baseConfig,
...javascriptConfig,
...nodeConfig,
...typescriptConfig,
])
13 changes: 11 additions & 2 deletions apps/api/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,14 @@
"build": "tsc && npm run copy:assets",
"copy:assets": "mkdir -p dist/assets && cp -r src/assets/* dist/assets/ 2>/dev/null || true",
"start": "node dist/index.js",
"lint": "eslint src --ext .ts",
"lint": "eslint src --ext .ts,.tsx",
"test": "jest",
"test:watch": "jest --watch"
},
"engines": {
"node": "24.13.0",
"npm": ">=8.0.0"
},
"dependencies": {
"@trpc/server": "^11.5.1",
"@types/debug": "^4.1.12",
Expand All @@ -31,6 +35,8 @@
"zod": "^4.1.9"
},
"devDependencies": {
"@eslint/compat": "^2.0.1",
"@eslint/js": "^9.39.2",
"@types/bcrypt": "^6.0.0",
"@types/cors": "^2.8.17",
"@types/express": "^4.17.21",
Expand All @@ -40,7 +46,10 @@
"@types/node": "^20",
"@types/nodemailer": "^6.4.14",
"@types/supertest": "^6.0.2",
"eslint": "^9",
"@typescript-eslint/parser": "^8.0.0",
"eslint": "^9.39.2",
"eslint-config-airbnb-extended": "^3.0.1",
"globals": "^16.0.0",
"jest": "^29.7.0",
"supertest": "^7.0.0",
"ts-jest": "^29.1.2",
Expand Down
2 changes: 1 addition & 1 deletion apps/mobile/eas.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
},
"build": {
"production": {
"node": "20.19.4",
"node": "24.13.0",
"ios": {
"image": "latest"
},
Expand Down
15 changes: 15 additions & 0 deletions apps/mobile/eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { defineConfig } from 'eslint/config'

import {
baseConfig,
javascriptConfig,
reactConfig,
typescriptConfig,
} from '../../eslint.config.mjs'

export default defineConfig([
...baseConfig,
...javascriptConfig,
...reactConfig,
...typescriptConfig,
])
12 changes: 11 additions & 1 deletion apps/mobile/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,18 @@
"android": "expo start --android",
"ios": "expo start --ios",
"web": "expo start --web",
"lint": "tsc --noEmit && eslint src --ext .ts",
"lint": "tsc --noEmit && eslint src --ext .ts,.tsx",
"test": "jest",
"test:watch": "jest --watch",
"build:development:add-device": "eas device:create",
"build:development:list-devices": "eas device:list",
"build:development:build": "eas build --clear-cache --platform ios --profile on-demand --no-wait",
"build:development:update": "ts-node ../../scripts/updateDevelopmentBuild.ts"
},
"engines": {
"node": "24.13.0",
"npm": ">=8.0.0"
},
"dependencies": {
"@react-native-async-storage/async-storage": "^2.2.0",
"@react-native-community/datetimepicker": "8.4.4",
Expand Down Expand Up @@ -45,12 +49,18 @@
"zod": "^4.1.9"
},
"devDependencies": {
"@eslint/compat": "^2.0.1",
"@eslint/js": "^9.39.2",
"@plannting/api": "*",
"@testing-library/react-native": "^12.0.0",
"@testing-library/jest-native": "^5.4.3",
"@types/jest": "29.5.14",
"@types/react": "~19.1.0",
"@typescript-eslint/parser": "^8.0.0",
"baseline-browser-mapping": "^2.9.17",
"eslint": "^9.39.2",
"eslint-config-airbnb-extended": "^3.0.1",
"globals": "^16.0.0",
"jest": "~29.7.0",
"jest-expo": "~54.0.16",
"react-test-renderer": "19.1.0",
Expand Down
94 changes: 94 additions & 0 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
import path from 'node:path'

import { includeIgnoreFile } from '@eslint/compat'
import js from '@eslint/js'
import { defineConfig } from 'eslint/config'
import { configs, plugins, rules } from 'eslint-config-airbnb-extended'

export const baseConfig = defineConfig([
// Ignore files and folders listed in .gitignore
includeIgnoreFile(path.resolve('.', '.gitignore')),
])

export const javascriptConfig = defineConfig([
// ESLint recommended config
{
name: 'js/config',
...js.configs.recommended,
},
// Stylistic plugin
plugins.stylistic,
// Import X plugin
plugins.importX,
// Airbnb base recommended config
...configs.base.recommended,
// Strict import rules
rules.base.importsStrict,
{
rules: {
'@stylistic/max-len': ['error', { 'code': 150 }],
'@stylistic/quotes': ['error', 'single', { 'avoidEscape': true }],
'@stylistic/semi': ['error', 'never'],
'import-x/prefer-default-export': 'off',
},
},
])

export const nodeConfig = defineConfig([
// Node plugin
plugins.node,
// Airbnb Node recommended config
...configs.node.recommended,
])

export const reactConfig = defineConfig([
// React plugin
plugins.react,
// React hooks plugin
plugins.reactHooks,
// React JSX A11y plugin
plugins.reactA11y,
// Airbnb React recommended config
...configs.react.recommended,
// Strict React rules
rules.react.strict,
// Airbnb React TypeScript config
...configs.react.typescript,
{
rules: {
'@stylistic/jsx-quotes': ['error', 'prefer-single'],
'react/require-default-props': 'off',
},
},
])

export const typescriptConfig = defineConfig([
// TypeScript ESLint plugin
plugins.typescriptEslint,
// Airbnb base TypeScript config
...configs.base.typescript,
// Strict TypeScript rules
rules.typescript.typescriptEslintStrict,
{
rules: {
'@stylistic/member-delimiter-style': [
'error',
{
'multiline': {
'delimiter': 'comma',
'requireLast': true,
},
'singleline': {
'delimiter': 'comma',
'requireLast': false,
},
'multilineDetection': 'brackets',
},
],
'@typescript-eslint/explicit-module-boundary-types': 'off',
'@typescript-eslint/no-use-before-define': 'off',
'@typescript-eslint/prefer-nullish-coalescing': 'off',
'no-underscore-dangle': 'off',
},
},
])
Loading