{ "name": "zpan", "version": "2.8.1", "private": true, "license": "AGPL-3.0-only", "type": "module", "packageManager": "pnpm@10.30.2", "scripts": { "dev": "CLOUDFLARE_ENV=staging vite dev", "dev:node": "node --env-file=.dev.vars node_modules/vite/bin/vite.js dev --mode node", "build": "[ \"$WORKERS_CI\" = \"1\" ] && [ \"$WORKERS_CI_BRANCH\" != \"main\" ] && export CLOUDFLARE_ENV=staging; vite build", "build:node": "vite build --mode node && tsup server/entry-node.ts --config server/tsup.config.mjs --format esm --outDir dist-server --external better-sqlite3 --external @libsql/client", "build:lambda": "tsup server/entry-lambda.ts --config server/tsup.config.mjs --format cjs --outDir dist-lambda --external @libsql/client", "build:vercel": "vite build --mode node && tsup server/entry-vercel.ts --config server/tsup.config.mjs --format esm --outDir api --external @libsql/client", "build:netlify": "tsup server/entry-netlify.ts --config server/tsup.config.mjs --format esm --outDir netlify/functions --external @libsql/client", "build:azure": "vite build && tsup server/entry-azure.ts --config server/tsup.config.mjs --format esm --outDir azure-functions --external @azure/functions --external @libsql/client && cp server/azure-host.json azure-functions/host.json && cp -r dist azure-functions/dist", "deploy": "pnpm build && pnpm db:migrate:d1:prod && wrangler deploy", "release": "node scripts/release.mjs", "release:check-version": "node scripts/check-release-version.mjs", "db:generate": "drizzle-kit generate", "db:migrate": "drizzle-kit migrate", "db:migrate:d1": "wrangler d1 migrations apply zpan-db-staging --local --env staging", "db:migrate:d1:staging": "wrangler d1 migrations apply zpan-db-staging --remote --env staging", "db:migrate:d1:prod": "wrangler d1 migrations apply zpan-db --remote", "db:reset": "tsx --env-file=.dev.vars scripts/db-reset.ts", "db:reset:d1": "tsx --env-file=.dev.vars scripts/db-reset.ts --d1", "seed:preview-admin": "TMPDIR=/tmp node --env-file-if-exists=.dev.vars --import tsx scripts/seed-preview-admin.ts", "stats:backfill": "tsx scripts/backfill-admin-stats.ts", "storage:backfill": "tsx scripts/backfill-storage-usage.ts", "storage-status:backfill": "tsx scripts/backfill-storage-enabled-status.ts", "api-key-scopes:backfill": "tsx scripts/backfill-api-key-scopes.ts", "agent-oauth-scopes:backfill": "tsx scripts/backfill-agent-oauth-scopes.ts", "typecheck": "tsc --noEmit -p server/tsconfig.json && tsc --noEmit -p src/tsconfig.json", "test": "vitest run --project unit --project integration", "test:cf": "vitest run --project cloudflare", "test:libsql": "vitest run --project libsql", "test:watch": "vitest --project unit --project integration", "lint": "biome check .", "lint:fix": "biome check --write .", "lint:arch": "depcruise server/ shared/ --config .dependency-cruiser.cjs", "lint:http": "tsx scripts/lint-http-boundary.ts", "lint:spec": "node scripts/lint-spec.mjs", "prepare": "husky", "format": "biome format --write .", "e2e": "playwright test", "e2e:cloud": "node scripts/run-cloud-e2e.mjs", "e2e:cloud:cf": "node scripts/run-cloud-e2e.mjs --runtime cf", "e2e:archive": "node scripts/run-cloud-e2e.mjs --local --with-s3-mock --spec archive.spec.ts", "e2e:archive:cf": "node scripts/run-cloud-e2e.mjs --runtime cf --local --with-s3-mock --spec archive.spec.ts", "openapi:client": "tsx scripts/openapi-client.ts", "openapi:client:check": "tsx scripts/openapi-client.ts --check" }, "engines": { "node": ">=24" }, "dependencies": { "@aws-sdk/client-s3": "^3.1022.0", "@aws-sdk/s3-request-presigner": "^3.1022.0", "@azure/functions": "^4.12.0", "@better-auth/api-key": "1.7.0-rc.2", "@better-auth/oauth-provider": "1.7.0-rc.2", "@better-captcha/react": "^0.7.0", "@dnd-kit/core": "^6.3.1", "@hono/node-server": "^2.0.10", "@hono/zod-openapi": "^1.4.0", "@hono/zod-validator": "^0.7.6", "@hookform/resolvers": "^5.2.2", "@libsql/client": "^0.17.2", "@scalar/hono-api-reference": "^0.11.3", "@tanstack/react-query": "^5.100.9", "@tanstack/react-router": "^1.93.0", "@tanstack/react-table": "^8.21.3", "@uiw/react-markdown-preview": "5.2.0", "@uiw/react-md-editor": "^4.1.0", "@vidstack/react": "^1.12.13", "better-auth": "1.7.0-rc.2", "better-sqlite3": "^12.10.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "date-fns": "^4.4.0", "drizzle-orm": "^0.45.2", "echarts": "^6.1.0", "fflate": "^0.8.2", "hono": "^4.12.27", "i18next": "^26.0.3", "i18next-browser-languagedetector": "^8.2.1", "jose": "6.2.3", "lucide-react": "^0.577.0", "nanoid": "^5.1.11", "next-themes": "^0.4.6", "nodemailer": "^9.0.1", "paseto-ts": "^2.0.6", "pdfjs-dist": "^5.6.205", "posthog-node": "^5.36.4", "radix-ui": "^1.4.3", "react": "^19.2.5", "react-day-picker": "^10.0.1", "react-dom": "^19.2.5", "react-dropzone": "^15.0.0", "react-hook-form": "^7.54.0", "react-i18next": "^17.0.2", "react-markdown": "^10.1.0", "react-pdf": "^10.4.1", "recharts": "3.8.0", "remark-gfm": "^4.0.1", "shiki": "^4.0.2", "simple-icons": "^16.18.0", "sonner": "^2.0.7", "tailwind-merge": "^3.5.0", "yet-another-react-lightbox": "^3.30.1", "zod": "^4.4.3", "zpan-cloud-sdk": "^2.5.1" }, "devDependencies": { "@biomejs/biome": "^2.4.10", "@cloudflare/vite-plugin": "^1.39.0", "@cloudflare/vitest-pool-workers": "^0.16.10", "@cloudflare/workers-types": "^4.20260606.1", "@hono/vite-dev-server": "^0.25.1", "@playwright/test": "^1.59.1", "@tailwindcss/vite": "^4.2.2", "@tanstack/router-plugin": "^1.167.12", "@testing-library/dom": "^10.4.1", "@testing-library/react": "^16.3.2", "@testing-library/user-event": "^14.6.1", "@types/better-sqlite3": "^7.6.0", "@types/nodemailer": "^8.0.0", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", "@vitejs/plugin-react-swc": "^4.3.0", "@vitest/coverage-v8": "^4.1.2", "dependency-cruiser": "^17.4.3", "drizzle-kit": "^0.31.10", "husky": "^9.1.7", "jsdom": "^29.0.2", "lint-staged": "^16.4.0", "tailwindcss": "^4.2.4", "tsup": "^8.5.1", "tsx": "^4.0.0", "tw-animate-css": "^1.4.0", "typescript": "^5.9.3", "typescript-language-server": "^5.3.0", "vite": "^7.3.5", "vitest": "^4.1.2", "webdav": "^5.10.0", "wrangler": "^4.95.0" }, "cloudflare": { "bindings": { "BETTER_AUTH_SECRET": { "description": "Signing secret for auth sessions. Generate with: `openssl rand -base64 32`" }, "DB": { "description": "D1 database for storing users, files, and settings" }, "CACHE_KV": { "description": "Workers KV namespace for distributed application caches" }, "WEBDAV_RATE_LIMITER": { "description": "Workers native rate limiter for WebDAV credentials" }, "ZPAN_CACHE_MODE": { "description": "Cache mode: off, memory, or distributed" } } }, "lint-staged": { "*.{ts,tsx,js,jsx,json,jsonc}": "biome check --write --no-errors-on-unmatched" }, "pnpm": { "overrides": { "@better-auth/core": "1.7.0-rc.2", "@better-auth/drizzle-adapter": "1.7.0-rc.2", "@better-auth/kysely-adapter": "1.7.0-rc.2", "@better-auth/memory-adapter": "1.7.0-rc.2", "@better-auth/mongo-adapter": "1.7.0-rc.2", "@better-auth/prisma-adapter": "1.7.0-rc.2", "@better-auth/telemetry": "1.7.0-rc.2", "@vitest/expect": "4.1.4", "@vitest/mocker": "4.1.4", "@vitest/pretty-format": "4.1.4", "@vitest/runner": "4.1.4", "@vitest/snapshot": "4.1.4", "@vitest/spy": "4.1.4", "@vitest/utils": "4.1.4", "undici": "7.28.0", "@esbuild-kit/core-utils>esbuild": "0.25.12" }, "onlyBuiltDependencies": [ "@swc/core", "better-sqlite3", "esbuild", "sharp", "workerd" ] }, "volta": { "node": "24.14.1", "pnpm": "10.30.2" } }