stack/package.json
Bilal Godil 6c7b14b3bc feat: wire mock-saml-idp into CI, snapshots, and seed dummy data
Three smaller pieces that unlock e2e testing:

- .github/workflows/e2e-api-tests.yaml: starts mock-saml-idp on port
  8115 alongside mock-oauth-server, with /idp as the readiness probe.
  Root package.json adds start:mock-saml-idp script and includes the
  mock in dev:basic.

- apps/e2e/tests/snapshot-serializer.ts: strips SAMLRequest /
  SAMLResponse / RelayState query+form params, adds stack-saml-inner-
  to keyed cookie name prefixes (so the per-AuthnRequest CSRF cookie
  doesn't reroll snapshots), and adds regex replacements for SAML xs:ID
  identifiers and IssueInstant/NotBefore/NotOnOrAfter timestamps.

- apps/backend/src/lib/seed-dummy-data.ts: STACK_SEED_ENABLE_SAML=true
  pre-creates acme + globex SAML connections on the dummy project,
  fetching the IdP metadata from the running mock at seed time so the
  seeded cert matches what the mock generated at startup. The mock
  regenerates keys per restart, so re-seed if you restart it. Mock URL
  configurable via STACK_MOCK_SAML_URL (default localhost:8115).
2026-04-29 16:38:03 -07:00

130 lines
9.4 KiB
JSON

{
"name": "@stackframe/monorepo",
"version": "0.0.0",
"private": true,
"repository": "https://github.com/stack-auth/stack-auth",
"scripts": {
"pre-no-codegen": "pnpm exec only-allow pnpm",
"pre-preinstall": "pnpx only-allow@1.2.2 pnpm && node -e \"if(process.env.STACK_SKIP_TEMPLATE_GENERATION !== 'true') require('child_process').execSync('pnpm exec tsx ./scripts/generate-sdks.ts', {stdio: 'inherit'})\"",
"pre": "pnpm pre-preinstall",
"preinstall": "pnpm pre-preinstall",
"postinstall": "node ./scripts/postinstall-patch-next-async-debug-info.mjs",
"typecheck": "pnpm pre && turbo typecheck --",
"build:dev": "pnpm pre && NODE_ENV=development pnpm run build",
"build": "pnpm pre && turbo build",
"build:backend": "pnpm pre && turbo run build --filter=@stackframe/backend...",
"build:dashboard": "pnpm pre && turbo run build --filter=@stackframe/dashboard...",
"build:demo": "pnpm pre && turbo run build --filter=demo-app...",
"build:docs": "pnpm run build:packages && pnpm run codegen && pnpm run build:backend && pnpm run --filter=@stackframe/stack-docs generate-openapi-docs && turbo run build --filter=@stackframe/stack-docs",
"build:packages": "pnpm pre && turbo run build --filter=./packages/*",
"clean": "pnpm pre-no-codegen && turbo run clean && rimraf --glob **/.next && rimraf --glob **/.turbo && rimraf .turbo && rimraf --glob **/node_modules && rimraf node_modules",
"uff-cutie": "pnpm clean && pnpm i && (pnpm build || true) && pnpm codegen",
"fml": "pnpm uff-cutie && pnpm restart-deps",
"codegen": "pnpm pre && turbo run codegen && pnpm run generate-sdks",
"codegen:backend": "pnpm pre && turbo run codegen --filter=@stackframe/backend...",
"deps-compose": "docker compose -p stack-dependencies-${NEXT_PUBLIC_STACK_PORT_PREFIX:-81} -f docker/dependencies/docker.compose.yaml",
"emulator:generate-env": "node ./docker/local-emulator/generate-env-development.mjs",
"emulator:check-env": "node ./docker/local-emulator/generate-env-development.mjs --check",
"emulator:start": "pnpm run emulator:generate-env && docker/local-emulator/qemu/run-emulator.sh start",
"emulator:stop": "docker/local-emulator/qemu/run-emulator.sh stop",
"emulator:reset": "docker/local-emulator/qemu/run-emulator.sh reset",
"emulator:status": "docker/local-emulator/qemu/run-emulator.sh status",
"emulator:build": "docker/local-emulator/qemu/build-image.sh",
"emulator:bench": "docker/local-emulator/qemu/run-emulator.sh bench",
"stop-deps": "POSTGRES_DELAY_MS=0 pnpm run deps-compose kill && POSTGRES_DELAY_MS=0 pnpm run deps-compose down -v",
"wait-until-postgres-is-ready:pg_isready": "until pg_isready -h localhost -p ${NEXT_PUBLIC_STACK_PORT_PREFIX:-81}28 && pg_isready -h localhost -p ${NEXT_PUBLIC_STACK_PORT_PREFIX:-81}34; do sleep 1; done",
"wait-until-postgres-is-ready": "command -v pg_isready >/dev/null 2>&1 && pnpm run wait-until-postgres-is-ready:pg_isready || sleep 10 # not everyone has pg_isready installed, so we fallback to sleeping",
"wait-until-clickhouse-is-ready": "pnpm exec wait-on http://localhost:${NEXT_PUBLIC_STACK_PORT_PREFIX:-81}36/ping",
"start-deps:no-delay": "pnpm pre && pnpm run deps-compose up --detach --build && pnpm run wait-until-postgres-is-ready && pnpm run wait-until-clickhouse-is-ready && pnpm run db:init && echo \"\\nDependencies started in the background as Docker containers. 'pnpm run stop-deps' to stop them\"n",
"start-deps": "POSTGRES_DELAY_MS=${POSTGRES_DELAY_MS:-0} pnpm run start-deps:no-delay",
"restart-deps": "pnpm pre && pnpm run stop-deps && pnpm run start-deps",
"restart-deps:no-delay": "pnpm pre && pnpm run stop-deps && pnpm run start-deps:no-delay",
"restart-deps:with-tests": "pnpm run restart-deps && pnpm test run auto-migrations/migration-tests",
"psql": "pnpm pre && pnpm run --filter=@stackframe/backend psql",
"clickhouse": "pnpm pre && pnpm run --filter=@stackframe/backend clickhouse",
"explain-query": "pnpm pre && echo 'Paste your query (end with Ctrl-D):' && query=$(cat) && echo 'Connecting to Postgres...' && printf \"EXPLAIN (ANALYZE, COSTS, VERBOSE, BUFFERS, FORMAT JSON)\n$query\" | pnpm run --silent psql -qAt | sed -n '/\\[/,$p' > explained-query.untracked.json && echo 'Explained query saved to explained-query.untracked.json. To analyze it, open it in the query analyzer at https://tatiyants.com/pev/#/plans/new'",
"db:migration-gen": "pnpm pre && pnpm run --filter=@stackframe/backend db:migration-gen",
"db:reset": "pnpm pre && pnpm run --filter=@stackframe/backend db:reset",
"db:seed": "pnpm pre && pnpm run --filter=@stackframe/backend db:seed",
"db:init": "pnpm pre && pnpm run --filter=@stackframe/backend db:init",
"db:migrate": "pnpm pre && pnpm run --filter=@stackframe/backend db:migrate",
"fern": "pnpm pre && pnpm run --filter=@stackframe/docs fern",
"dev:full": "pnpm pre && concurrently -k \"pnpm run generate-sdks:watch\" \"turbo run dev --concurrency 99999\"",
"dev": "pnpm pre && concurrently -k \"pnpm run generate-sdks:watch\" \"pnpm run generate-openapi-docs:watch\" \"turbo run dev --concurrency 99999 --filter=./apps/* --filter=@stackframe/docs-mintlify --filter=@stackframe/stack-docs --filter=./packages/* --filter=./examples/demo \"",
"dev:tui": "pnpm pre && (trap 'kill 0' EXIT; pnpm run generate-sdks:watch & pnpm run generate-openapi-docs:watch & turbo run dev --ui tui --concurrency 99999 --filter=./apps/* --filter=@stackframe/stack-docs --filter=./packages/* --filter=./examples/demo)",
"dev:inspect": "pnpm pre && STACK_BACKEND_DEV_EXTRA_ARGS=\"--inspect\" pnpm run dev",
"dev:profile": "pnpm pre && STACK_BACKEND_DEV_EXTRA_ARGS=\"--experimental-cpu-prof\" pnpm run dev",
"dev:basic": "pnpm pre && concurrently -k \"pnpm run generate-sdks:watch\" \"turbo run dev --concurrency 99999 --filter=@stackframe/backend --filter=@stackframe/dashboard --filter=@stackframe/mock-oauth-server --filter=@stackframe/mock-saml-idp\"",
"dev:docs": "pnpm pre && concurrently -k \"pnpm run generate-openapi-docs:watch\" \"turbo run dev --concurrency 99999 --filter=@stackframe/stack-docs\"",
"dev:named": "pnpm pre && concurrently -k \"pnpm run dev\" \"node -e \\\"process.title='node (stack-named-dev-server)'; process.stdin.resume();\\\"\"",
"kill-dev:named": "(pgrep -f 'stack-named-dev-server' | xargs -r -n1 pkill -P); echo 'Killed named dev server (if found). Sleeping to give some time for it to shut down...' && sleep 10",
"kms": "PREFIX=${NEXT_PUBLIC_STACK_PORT_PREFIX:-81}; for p in 00 01 02 03 04 06 14; do pids=$(lsof -i :$PREFIX$p 2>/dev/null | grep LISTEN | awk '$1 != \"OrbStack\" {print $2}' | sort -u); [ -n \"$pids\" ] && echo $pids | xargs kill -9 2>/dev/null; done; echo Done.",
"start": "pnpm pre && turbo run start --concurrency 99999",
"start:backend": "pnpm pre && turbo run start --concurrency 99999 --filter=@stackframe/backend",
"start:dashboard": "pnpm pre && turbo run start --concurrency 99999 --filter=@stackframe/dashboard",
"start:mock-oauth-server": "pnpm pre && turbo run start --concurrency 99999 --filter=@stackframe/mock-oauth-server",
"start:mock-saml-idp": "pnpm pre && turbo run start --concurrency 99999 --filter=@stackframe/mock-saml-idp",
"lint": "pnpm pre && turbo run lint --continue -- --max-warnings=0",
"release": "pnpm pre && release",
"dotenv": "dotenv",
"peek": "pnpm pre && pnpm release --peek",
"changeset": "pnpm pre && changeset",
"test": "pnpm pre && vitest",
"test:e2e": "pnpm pre && vitest e2e/tests",
"test:unit": "pnpm pre && vitest src",
"verify-data-integrity": "pnpm pre && pnpm -C apps/backend run verify-data-integrity",
"generate-keys": "pnpm pre && turbo run generate-keys",
"generate-sdks": "pnpm exec tsx ./scripts/generate-sdks.ts",
"generate-sdks:watch": "chokidar --silent -c 'pnpm run generate-sdks' './packages/template' --ignore './packages/template/package.json' --ignore '**/node_modules/**' --ignore '**/dist/**' --ignore '**/.turbo/**' --throttle 2000",
"generate-openapi-docs:watch": "chokidar --silent -c 'pnpm run --filter=@stackframe/stack-docs generate-openapi-docs' './docs/openapi/{admin,client,server,webhooks}.json' --throttle 2000"
},
"devDependencies": {
"@changesets/cli": "^2.27.9",
"@testing-library/react": "^15.0.7",
"@types/node": "20.17.6",
"@types/supertest": "^6.0.2",
"@typescript-eslint/eslint-plugin": "^8.56.1",
"@typescript-eslint/parser": "^8.56.1",
"@vitejs/plugin-react": "^4.3.3",
"chokidar-cli": "^3.0.0",
"codebuff": "^1.0.261",
"concurrently": "^8.2.2",
"dotenv-cli": "^7.3.0",
"esbuild": "^0.24.0",
"eslint": "^8.57.0",
"eslint-config-next": "^14.2.17",
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^6.6.0",
"eslint-plugin-react": "^7.37.2",
"jsdom": "^24.1.3",
"only-allow": "^1.2.1",
"rimraf": "^5.0.10",
"tsdown": "^0.20.3",
"turbo": "^2.8.15",
"typescript": "5.9.3",
"vite-tsconfig-paths": "^4.3.2",
"vitest": "^1.6.0",
"wait-on": "^8.0.1"
},
"pnpm": {
"overrides": {
"@types/react": "^18.2.0",
"@types/react-dom": "^18.2.0"
},
"patchedDependencies": {
"openid-client@5.6.4": "patches/openid-client@5.6.4.patch"
}
},
"engines": {
"npm": ">=10.0.0",
"node": ">=20.0.0"
},
"packageManager": "pnpm@10.23.0",
"dependencies": {
"commander": "^13.1.0",
"tsx": "^4.19.3",
"yaml": "^2.4.5"
}
}