Add Milestones 1 & 2: full-stack POS foundation with admin UI

- Node/Express/TypeScript API under /api/v1 with JWT auth (login, refresh, logout, /me)
- Prisma schema: vendors, users, roles, products, categories, taxes, transactions
- SQLite for local dev; Postgres via docker-compose for production
- Full CRUD routes for vendors, users, categories, taxes, products with Zod validation and RBAC
- Paginated list endpoints scoped per vendor; refresh token rotation
- React/TypeScript admin SPA (Vite): login, protected routing, sidebar layout
- Pages: Dashboard, Catalog (tabbed Products/Categories/Taxes), Users, Vendor Settings
- Shared UI: Table, Modal, FormField, Btn, PageHeader components
- Multi-stage Dockerfile; docker-compose with Postgres healthcheck
- Seed script with demo vendor and owner account
- INSTRUCTIONS.md, ROADMAP.md, .claude/launch.json for dev server config

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-20 23:18:04 -05:00
parent fb62439eab
commit d53c772dd6
4594 changed files with 1876068 additions and 0 deletions

1
server/node_modules/tsx/dist/loader.cjs generated vendored Normal file
View File

@@ -0,0 +1 @@
"use strict";var q=Object.defineProperty;var r=(i,u)=>q(i,"name",{value:u,configurable:!0});var t=require("./get-pipe-path-BoR10qr8.cjs"),e=require("./esm/index.cjs");require("module"),require("node:path"),require("./temporary-directory-B83uKxJF.cjs"),require("node:os"),require("node:worker_threads"),require("./node-features-roYmp9jK.cjs"),require("./register-2sWVXuRQ.cjs"),require("node:module"),require("./register-D46fvsV_.cjs"),require("node:url"),require("get-tsconfig"),require("node:fs"),require("./index-gckBtVBf.cjs"),require("esbuild"),require("node:crypto"),require("./client-D6NvIMSC.cjs"),require("node:net"),require("node:util"),require("./index-BWFBUo6r.cjs"),require("./require-D4F1Lv60.cjs"),require("node:fs/promises"),t.require("./cjs/index.cjs"),exports.globalPreload=e.globalPreload,exports.initialize=e.initialize,Object.defineProperty(exports,"load",{enumerable:!0,get:r(function(){return e.load},"get")}),Object.defineProperty(exports,"resolve",{enumerable:!0,get:r(function(){return e.resolve},"get")});