build: move from pnpm to npm

Replace pnpm-lock.yaml with package-lock.json. There was no pnpm-workspace.yaml
and no packageManager field, so the lockfile was the only pnpm-specific config.

Add package.json#allowScripts for sharp and unrs-resolver. pnpm 11 refuses to
install this branch at all without that approval (ERR_PNPM_IGNORED_BUILDS), so
recording it under npm keeps the branch installable; sharp backs next/image and
unrs-resolver backs eslint module resolution.

Update CLAUDE.md to describe npm commands and drop the stale pnpm permission
from the tracked local settings. next-env.d.ts and tsconfig.tsbuildinfo are
regenerated by the build.

Type-check, lint, test, and build fail on this branch exactly as they did on the
pnpm lockfile: six TS errors, an unresolvable @typescript-eslint/recommended
config, and a jest.config.ts that imports next/jest instead of next/jest.js.
Verified against the pre-change tree; none of it is caused by this commit.
This commit is contained in:
tiennm99 committed 2026-08-17 15:19:40 +07:00
1 parent 7b62155973
commit 5730302515
7 files changed
+12372 -7530

No files matched your search

-1
View File
@@ -12,7 +12,6 @@
"Bash(curl:*)",
"WebFetch",
"Bash(grep:*)",
"Bash(pnpm:*)",
"Bash(cat:*)"
],
"deny": []
+11 -11
View File
@@ -22,7 +22,7 @@ VIGEOGUESSR is a Vietnamese geography guessing game built with Next.js 15 and Re
- **Testing**: Jest + React Testing Library
- **Linting**: ESLint with `@typescript-eslint`
- **Formatting**: Prettier
- **Package Manager**: pnpm (preferred)
- **Package Manager**: npm
## 📂 Project Structure
@@ -73,19 +73,19 @@ Key configuration files in the project root:
- Tailwind CSS with PostCSS configuration
- shadcn/ui: `npx shadcn-ui@latest init`
- React Query: `<QueryClientProvider>` in app/layout.tsx
- MapLibre GL JS: `pnpm add maplibre-gl`
- MapillaryJS: `pnpm add mapillary-js`
- MapLibre GL JS: `npm install maplibre-gl`
- MapillaryJS: `npm install mapillary-js`
- TypeScript configuration with `tsconfig.json`
- ESLint with TypeScript support
## ⚙️ Development Commands
- **Dev server**: `pnpm dev` - Start development server on localhost:3000
- **Build**: `pnpm build` - Build for production
- **Start**: `pnpm start` - Start production server
- **Lint**: `pnpm lint` - Run ESLint to check code quality
- **Test**: `pnpm test` - Run Jest + RTL tests
- **Format**: `pnpm format` - Format code with Prettier
- **Dev server**: `npm run dev` - Start development server on localhost:3000
- **Build**: `npm run build` - Build for production
- **Start**: `npm start` - Start production server
- **Lint**: `npm run lint` - Run ESLint to check code quality
- **Test**: `npm test` - Run Jest + RTL tests
- **Format**: `npm run format` - Format code with Prettier
## 🧠 React Query Architecture
@@ -296,7 +296,7 @@ Game state managed at page level with React hooks:
### Modern Tech Stack Migration (Latest)
- **Language**: TypeScript (`^5.7.3`) with strict typing, interfaces, and complete migration
- **Package Manager**: Migrated from npm to pnpm with updated scripts (dev, build, start, lint, format, test, type-check)
- **Package Manager**: npm, with scripts dev, build, start, lint, format, test, type-check
- **Tailwind CSS**: Complete migration from custom CSS to Tailwind utilities with custom design tokens matching game theme
- **shadcn/ui**: Installed and configured with utility functions, ready for UI component replacements
- **React Query**: Added TanStack Query with QueryClientProvider in layout and custom hooks (`useMapillary`, `useScoring`)
@@ -313,7 +313,7 @@ Game state managed at page level with React hooks:
- ✅ **Styling**: Tailwind CSS with custom game design tokens
- ✅ **Data Fetching**: React Query hooks for API management
- ✅ **Testing**: Jest + RTL with TypeScript and library mocks
- ✅ **Package Management**: pnpm with modern scripts
- ✅ **Package Management**: npm with modern scripts
- ✅ **App Router**: All app router files migrated to TypeScript (.tsx)
- ✅ **API Routes**: All API routes migrated to TypeScript (.ts)
- ✅ **Service Layer**: All service files migrated with proper TypeScript interfaces
+1
View File
@@ -1,5 +1,6 @@
/// <reference types="next" />
/// <reference types="next/image-types/global" />
/// <reference path="./.next/types/routes.d.ts" />
// NOTE: This file should not be edited
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
+12355
View File
File diff suppressed because it is too large. Load diff
+4
View File
@@ -47,5 +47,9 @@
"prettier": "^3.6.2",
"tailwindcss": "^3.4.17",
"typescript": "^5.9.2"
},
"allowScripts": {
"sharp": true,
"unrs-resolver": true
}
}
-7517
View File
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -1 +1 @@
{"fileNames":["./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es5.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.dom.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/.pnpm/[email protected]/node_modules/typescript/lib/lib.es2022.object.d.ts",".Line truncated
{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.esnext.float16.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/@types/react/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/react/index.d.ts","./node_modules/next/dist/styled-jsx/types/css.d.ts","./node_modules/next/dist/styled-jsx/types/macro.d.ts","./node_modules/next/dist/styled-jsx/types/style.d.ts","./node_modules/next/dist/styled-jsx/types/global.d.ts","./node_modules/next/dist/styled-jsx/types/index.d.ts","./node_modules/next/dist/shared/lib/amp.d.ts","./node_modules/next/amp.d.ts","./node_modules/next/dist/server/get-page-files.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/crypto.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/undici-types/utility.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client-stats.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-tLine truncated