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:
90
server/node_modules/forwarded/index.js
generated
vendored
Normal file
90
server/node_modules/forwarded/index.js
generated
vendored
Normal file
@@ -0,0 +1,90 @@
|
||||
/*!
|
||||
* forwarded
|
||||
* Copyright(c) 2014-2017 Douglas Christopher Wilson
|
||||
* MIT Licensed
|
||||
*/
|
||||
|
||||
'use strict'
|
||||
|
||||
/**
|
||||
* Module exports.
|
||||
* @public
|
||||
*/
|
||||
|
||||
module.exports = forwarded
|
||||
|
||||
/**
|
||||
* Get all addresses in the request, using the `X-Forwarded-For` header.
|
||||
*
|
||||
* @param {object} req
|
||||
* @return {array}
|
||||
* @public
|
||||
*/
|
||||
|
||||
function forwarded (req) {
|
||||
if (!req) {
|
||||
throw new TypeError('argument req is required')
|
||||
}
|
||||
|
||||
// simple header parsing
|
||||
var proxyAddrs = parse(req.headers['x-forwarded-for'] || '')
|
||||
var socketAddr = getSocketAddr(req)
|
||||
var addrs = [socketAddr].concat(proxyAddrs)
|
||||
|
||||
// return all addresses
|
||||
return addrs
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the socket address for a request.
|
||||
*
|
||||
* @param {object} req
|
||||
* @return {string}
|
||||
* @private
|
||||
*/
|
||||
|
||||
function getSocketAddr (req) {
|
||||
return req.socket
|
||||
? req.socket.remoteAddress
|
||||
: req.connection.remoteAddress
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse the X-Forwarded-For header.
|
||||
*
|
||||
* @param {string} header
|
||||
* @private
|
||||
*/
|
||||
|
||||
function parse (header) {
|
||||
var end = header.length
|
||||
var list = []
|
||||
var start = header.length
|
||||
|
||||
// gather addresses, backwards
|
||||
for (var i = header.length - 1; i >= 0; i--) {
|
||||
switch (header.charCodeAt(i)) {
|
||||
case 0x20: /* */
|
||||
if (start === end) {
|
||||
start = end = i
|
||||
}
|
||||
break
|
||||
case 0x2c: /* , */
|
||||
if (start !== end) {
|
||||
list.push(header.substring(start, end))
|
||||
}
|
||||
start = end = i
|
||||
break
|
||||
default:
|
||||
start = i
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// final address
|
||||
if (start !== end) {
|
||||
list.push(header.substring(start, end))
|
||||
}
|
||||
|
||||
return list
|
||||
}
|
||||
Reference in New Issue
Block a user