diff --git a/apps/mobile/.release-it.json b/apps/mobile/.release-it.json new file mode 100644 index 0000000..1c0bf27 --- /dev/null +++ b/apps/mobile/.release-it.json @@ -0,0 +1,23 @@ +{ + "npm": false, + "git": { + "requireCleanWorkingDir": true, + "commitMessage": "chore(release): v${version}", + "tagName": "v${version}", + "push": true + }, + "github": { + "release": true, + "assets": ["android/app/build/outputs/apk/release/app-release.apk"] + }, + "plugins": { + "@release-it/conventional-changelog": { + "preset": "conventionalcommits", + "infile": "CHANGELOG.md" + } + }, + "hooks": { + "before:init": ["pnpm run lint:check", "pnpm run typecheck"], + "before:github:release": "pnpm run build:signed:apk" + } +} diff --git a/apps/mobile/app.config.ts b/apps/mobile/app.config.ts index 284d68e..a008235 100644 --- a/apps/mobile/app.config.ts +++ b/apps/mobile/app.config.ts @@ -2,6 +2,14 @@ import { type ExpoConfig } from 'expo/config'; import 'tsx/cjs'; import packageJson from './package.json'; +function semverToCode(v: string) { + const [maj, min, pat] = v.split('.').map((n) => parseInt(n || '0', 10)); + if (maj === undefined || min === undefined || pat === undefined) + throw new Error(`Invalid version: ${v}`); + return maj * 10000 + min * 100 + pat; +} +const versionCode = semverToCode(packageJson.version); + const config: ExpoConfig = { name: 'Fressh', slug: 'fressh', @@ -15,9 +23,11 @@ const config: ExpoConfig = { supportsTablet: true, config: { usesNonExemptEncryption: false }, bundleIdentifier: 'dev.fressh.app', + buildNumber: String(versionCode), }, android: { package: 'dev.fressh.app', + versionCode, adaptiveIcon: { foregroundImage: '../../packages/assets/adaptive-icon.png', backgroundColor: '#151718', diff --git a/apps/mobile/package.json b/apps/mobile/package.json index e8a7607..78627b0 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -23,7 +23,9 @@ "expo:dep:check": "expo install --fix", "expo:doctor": "pnpm dlx expo-doctor@latest", "test:e2e": "maestro test test/e2e/", - "adb:logs": "while ! adb logcat --pid=$(adb shell pidof -s dev.fressh.app); do sleep 1; done" + "adb:logs": "while ! adb logcat --pid=$(adb shell pidof -s dev.fressh.app); do sleep 1; done", + "release": "release-it", + "release:dry": "release-it --dry-run" }, "dependencies": { "@expo/vector-icons": "^15.0.2", @@ -77,6 +79,7 @@ "@eslint-community/eslint-plugin-eslint-comments": "^4.5.0", "@eslint-react/eslint-plugin": "^1.53.0", "@eslint/js": "^9.35.0", + "@release-it/conventional-changelog": "^10.0.1", "@tanstack/eslint-plugin-query": "^5.86.0", "@types/react": "~19.1.12", "@typescript-eslint/parser": "^8.44.0", @@ -93,6 +96,7 @@ "npm-run-all": "^4.1.5", "prettier": "^3.6.2", "prettier-plugin-organize-imports": "^4.2.0", + "release-it": "^19.0.4", "tsx": "^4.20.5", "typescript": "~5.9.2", "typescript-eslint": "^8.44.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bd26e50..3e232f9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -194,6 +194,9 @@ importers: '@eslint/js': specifier: ^9.35.0 version: 9.35.0 + '@release-it/conventional-changelog': + specifier: ^10.0.1 + version: 10.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.0)(release-it@19.0.4(@types/node@24.3.0)(magicast@0.3.5)) '@tanstack/eslint-plugin-query': specifier: ^5.86.0 version: 5.89.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) @@ -242,6 +245,9 @@ importers: prettier-plugin-organize-imports: specifier: ^4.2.0 version: 4.2.0(prettier@3.6.2)(typescript@5.9.2) + release-it: + specifier: ^19.0.4 + version: 19.0.4(@types/node@24.3.0)(magicast@0.3.5) tsx: specifier: ^4.20.5 version: 4.20.5 @@ -14813,7 +14819,7 @@ snapshots: get-tsconfig: 4.10.1 is-bun-module: 2.0.0 stable-hash: 0.0.5 - tinyglobby: 0.2.14 + tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.35.0(jiti@2.5.1))