mirror of
https://github.com/stack-auth/stack.git
synced 2026-06-13 21:01:21 +08:00
### Object of this PR This PR is NOT a monolithic series of fixes for the payments suite + a complete rework. Its aims were a) introducing and robustly testing the bulldozer db system b) reworking the payments underlying architecture to use bulldozer for correctness and scalability c) Achieving parity with the old payments system excepting a few changes like ensuring correctness of the ledger algo There may still be some work to do with handling refunds, decoupling the concepts of purchases from that of products, and some other things. ### Ledger Algorithm This has been tuned and fixed. Item removals i.e negative item quantity changes will apply to the soonest expiring item grant i.e positive item quantity change. This is what is best for the user. Item grants can also expire, and when they expire we obviate whatever is left of their original capacity (meaning after all the removals that were applied to it). Our ledger algo is applied via Bulldozer, so automatic re-computation is handled when a new grant/ removal is inserted in the middle of the existing ones. ### Things we got rid of * No more automatic support for default products. You can use $0 plan provisions to accomplish the same effect but it's manual * Negative item quantity changes (i.e item removals) no longer can have expiries <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Enhanced payment processing pipeline with improved data consistency and state management. * Advanced refund handling with comprehensive transaction tracking. * Better tracking and management of customer item quantities and owned products. * Improved subscription lifecycle management including period-end handling. * **Bug Fixes** * Fixed payment data integrity verification. * Improved handling of edge cases in refund scenarios. * **Chores** * Updated cSpell configuration with additional words. * Expanded developer documentation for linting workflows. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Konstantin Wohlwend <n2d4xc@gmail.com> Co-authored-by: Aadesh Kheria <kheriaaadesh@gmail.com> Co-authored-by: Mantra <87142457+mantrakp04@users.noreply.github.com>
144 lines
7.6 KiB
JSON
144 lines
7.6 KiB
JSON
{
|
|
"name": "@stackframe/backend",
|
|
"version": "2.8.84",
|
|
"repository": "https://github.com/stack-auth/stack-auth",
|
|
"private": true,
|
|
"type": "module",
|
|
"scripts": {
|
|
"clean": "rimraf src/generated && rimraf .next && rimraf node_modules",
|
|
"typecheck": "tsc --noEmit",
|
|
"with-env": "dotenv -c --",
|
|
"with-env:dev": "dotenv -c development --",
|
|
"with-env:prod": "dotenv -c production --",
|
|
"with-env:test": "dotenv -c test --",
|
|
"dev": "BACKEND_PORT=${STACK_DEV_FALLBACK_BACKEND:+${NEXT_PUBLIC_STACK_PORT_PREFIX:-81}10} && BACKEND_PORT=${BACKEND_PORT:-${NEXT_PUBLIC_STACK_PORT_PREFIX:-81}02} && concurrently -n \"dev,codegen,prisma-studio,email-queue,cron-jobs,bulldozer-studio\" -k \"next dev --port $BACKEND_PORT ${STACK_BACKEND_DEV_EXTRA_ARGS:-}\" \"pnpm run codegen:watch\" \"pnpm run prisma-studio\" \"pnpm run run-email-queue\" \"pnpm run run-cron-jobs\" \"pnpm run run-bulldozer-studio\"",
|
|
"dev:inspect": "STACK_BACKEND_DEV_EXTRA_ARGS=\"--inspect\" pnpm run dev",
|
|
"dev:profile": "STACK_BACKEND_DEV_EXTRA_ARGS=\"--experimental-cpu-prof\" pnpm run dev",
|
|
"build": "pnpm run codegen && next build",
|
|
"docker-build": "pnpm run codegen && next build --experimental-build-mode compile",
|
|
"build-self-host-migration-script": "tsdown --config scripts/db-migrations.tsdown.config.ts",
|
|
"analyze-bundle": "next experimental-analyze",
|
|
"start": "next start --port ${NEXT_PUBLIC_STACK_PORT_PREFIX:-81}02",
|
|
"codegen-prisma": "STACK_DATABASE_CONNECTION_STRING=\"${STACK_DATABASE_CONNECTION_STRING:-placeholder-database-connection-string}\" pnpm run prisma generate",
|
|
"codegen-prisma:watch": "STACK_DATABASE_CONNECTION_STRING=\"${STACK_DATABASE_CONNECTION_STRING:-placeholder-database-connection-string}\" pnpm run prisma generate --watch",
|
|
"generate-private-sign-up-risk-engine": "pnpm run with-env tsx scripts/generate-private-sign-up-risk-engine.ts",
|
|
"generate-private-sign-up-risk-engine:watch": "chokidar 'src/private/src/sign-up-risk-engine.ts' -c 'pnpm run generate-private-sign-up-risk-engine'",
|
|
"codegen-route-info": "pnpm run with-env tsx scripts/generate-route-info.ts",
|
|
"codegen-route-info:watch": "pnpm run with-env tsx watch --clear-screen=false scripts/generate-route-info.ts",
|
|
"codegen": "pnpm run with-env pnpm run generate-migration-imports && pnpm run with-env bash -c 'if [ \"$STACK_ACCELERATE_ENABLED\" = \"true\" ]; then pnpm run prisma generate --no-engine; else pnpm run codegen-prisma; fi' && pnpm run generate-private-sign-up-risk-engine && pnpm run codegen-docs && pnpm run codegen-route-info",
|
|
"codegen:watch": "pnpm run generate-private-sign-up-risk-engine && concurrently -n \"prisma,private-risk-engine,docs,route-info,migration-imports\" -k \"pnpm run codegen-prisma:watch\" \"pnpm run generate-private-sign-up-risk-engine:watch\" \"pnpm run codegen-docs:watch\" \"pnpm run codegen-route-info:watch\" \"pnpm run generate-migration-imports:watch\"",
|
|
"psql-inner": "psql $(echo $STACK_DATABASE_CONNECTION_STRING | sed 's/\\?.*$//')",
|
|
"clickhouse": "pnpm run with-env clickhouse-client --host localhost --port ${NEXT_PUBLIC_STACK_PORT_PREFIX:-81}37 --user stackframe --password PASSWORD-PLACEHOLDER--9gKyMxJeMx",
|
|
"psql": "pnpm run with-env:dev pnpm run psql-inner",
|
|
"prisma-studio": "pnpm run with-env:dev prisma studio --port ${NEXT_PUBLIC_STACK_PORT_PREFIX:-81}06 --browser none",
|
|
"prisma:dev": "pnpm run with-env:dev prisma",
|
|
"prisma": "pnpm run with-env prisma",
|
|
"db:migration-gen": "pnpm run with-env:dev tsx scripts/db-migrations.ts generate-migration-file",
|
|
"db:reset": "pnpm run with-env:dev tsx scripts/db-migrations.ts reset",
|
|
"db:seed": "pnpm run with-env:dev tsx scripts/db-migrations.ts seed",
|
|
"db:init": "pnpm run with-env:dev tsx scripts/db-migrations.ts init",
|
|
"db:migrate": "pnpm run with-env:dev tsx scripts/db-migrations.ts migrate",
|
|
"generate-migration-imports": "pnpm run with-env tsx scripts/generate-migration-imports.ts",
|
|
"generate-migration-imports:watch": "chokidar 'prisma/migrations/**/*.sql' -c 'pnpm run generate-migration-imports'",
|
|
"lint": "eslint .",
|
|
"codegen-docs": "pnpm run with-env tsx scripts/generate-openapi-fumadocs.ts",
|
|
"codegen-docs:watch": "pnpm run with-env tsx watch --exclude '**/node_modules/**' --clear-screen=false scripts/generate-openapi-fumadocs.ts",
|
|
"generate-keys": "pnpm run with-env tsx scripts/generate-keys.ts",
|
|
"db-seed-script": "pnpm run db:seed",
|
|
"run-cron-jobs": "pnpm run with-env:dev tsx scripts/run-cron-jobs.ts",
|
|
"run-cron-jobs:test": "pnpm run with-env:test tsx scripts/run-cron-jobs.ts",
|
|
"verify-data-integrity": "pnpm run with-env:dev tsx scripts/verify-data-integrity/index.ts",
|
|
"run-email-queue": "pnpm run with-env:dev tsx scripts/run-email-queue.ts",
|
|
"run-bulldozer-studio": "pnpm run with-env:dev tsx watch --clear-screen=false scripts/run-bulldozer-studio.ts"
|
|
},
|
|
"prisma": {
|
|
"seed": "pnpm run db-seed-script"
|
|
},
|
|
"dependencies": {
|
|
"@ai-sdk/mcp": "^1.0.21",
|
|
"spacetimedb": "^2.1.0",
|
|
"@ai-sdk/openai": "^3.0.29",
|
|
"@aws-sdk/client-s3": "^3.855.0",
|
|
"@clickhouse/client": "^1.14.0",
|
|
"@node-oauth/oauth2-server": "^5.1.0",
|
|
"@openrouter/ai-sdk-provider": "2.2.3",
|
|
"@opentelemetry/api": "^1.9.0",
|
|
"@opentelemetry/api-logs": "^0.53.0",
|
|
"@opentelemetry/auto-instrumentations-node": "^0.71.0",
|
|
"@opentelemetry/context-async-hooks": "^1.26.0",
|
|
"@opentelemetry/core": "^1.26.0",
|
|
"@opentelemetry/exporter-trace-otlp-http": "^0.53.0",
|
|
"@opentelemetry/instrumentation": "^0.53.0",
|
|
"@opentelemetry/resources": "^1.26.0",
|
|
"@opentelemetry/sdk-logs": "^0.53.0",
|
|
"@opentelemetry/sdk-trace-base": "^1.26.0",
|
|
"@opentelemetry/sdk-trace-node": "^1.26.0",
|
|
"@opentelemetry/semantic-conventions": "^1.27.0",
|
|
"@oslojs/otp": "^1.1.0",
|
|
"@prisma/adapter-neon": "^7.0.0",
|
|
"@prisma/adapter-pg": "^7.0.0",
|
|
"@prisma/client": "^7.0.0",
|
|
"@prisma/extension-read-replicas": "^0.5.0",
|
|
"@prisma/instrumentation": "^7.0.0",
|
|
"@react-email/render": "^1.2.1",
|
|
"@sentry/nextjs": "^10.45.0",
|
|
"@simplewebauthn/server": "^13.3.0",
|
|
"@stackframe/stack": "workspace:*",
|
|
"@stackframe/stack-shared": "workspace:*",
|
|
"@upstash/qstash": "^2.8.2",
|
|
"@vercel/functions": "^2.0.0",
|
|
"@vercel/otel": "^1.10.4",
|
|
"@vercel/sandbox": "^1.2.0",
|
|
"ai": "^6.0.0",
|
|
"bcrypt": "^6.0.0",
|
|
"cel-js": "^0.8.2",
|
|
"chokidar-cli": "^3.0.0",
|
|
"dotenv": "^16.4.5",
|
|
"dotenv-cli": "^7.3.0",
|
|
"elkjs": "^0.11.1",
|
|
"emailable": "^3.1.1",
|
|
"freestyle-sandboxes": "^0.1.6",
|
|
"jiti": "^2.6.1",
|
|
"jose": "^6.1.3",
|
|
"json-diff": "^1.0.6",
|
|
"next": "16.1.7",
|
|
"nodemailer": "^6.9.10",
|
|
"oidc-provider": "^8.5.1",
|
|
"openid-client": "5.6.4",
|
|
"pg": "^8.16.3",
|
|
"postgres": "^3.4.5",
|
|
"posthog-node": "^4.1.0",
|
|
"react": "19.2.3",
|
|
"react-dom": "19.2.3",
|
|
"resend": "^6.0.1",
|
|
"semver": "^7.6.3",
|
|
"sharp": "^0.34.4",
|
|
"stripe": "^18.3.0",
|
|
"svix": "^1.89.0",
|
|
"vite": "^6.1.0",
|
|
"yaml": "^2.4.5",
|
|
"yup": "^1.7.1",
|
|
"zod": "^3.23.8"
|
|
},
|
|
"devDependencies": {
|
|
"@simplewebauthn/types": "^11.0.0",
|
|
"@types/json-diff": "^1.0.3",
|
|
"@types/node": "20.17.6",
|
|
"@types/nodemailer": "^6.4.14",
|
|
"@types/oidc-provider": "^8.5.1",
|
|
"@types/pg": "^8.16.0",
|
|
"@types/react": "19.2.7",
|
|
"@types/react-dom": "19.2.3",
|
|
"@types/semver": "^7.5.8",
|
|
"concurrently": "^8.2.2",
|
|
"glob": "^10.4.1",
|
|
"import-in-the-middle": "1.14.2",
|
|
"prisma": "^7.0.0",
|
|
"require-in-the-middle": "^7.4.0",
|
|
"rimraf": "^5.0.5",
|
|
"tsdown": "^0.20.3",
|
|
"tsx": "^4.7.2"
|
|
},
|
|
"packageManager": "pnpm@10.23.0"
|
|
}
|