* Enforce safe TypeScript assertions and validate runtime payloads * Fix CI knip config and floating promise lint * Validate DataForSEO payloads with Zod schemas Replace weak object guards with endpoint-level schema parsing so invalid API shapes fail fast instead of being silently filtered. Align downstream keyword mapping with the stricter validated payload contracts.
90 lines
3.1 KiB
JSON
90 lines
3.1 KiB
JSON
{
|
|
"name": "open-seo",
|
|
"private": true,
|
|
"sideEffects": false,
|
|
"type": "module",
|
|
"scripts": {
|
|
"dev": "AUTH_MODE=local_noauth vite dev",
|
|
"dev:agents": "mkdir -p .logs && AUTH_MODE=local_noauth portless run vite dev 2>&1 | tee .logs/dev-server.log",
|
|
"build": "vite build && tsc --noEmit",
|
|
"lint": "oxlint . --type-aware",
|
|
"lint:fix": "oxlint . --type-aware --fix",
|
|
"preview": "npm run build && vite preview --port 3001",
|
|
"deploy": "npm run db:migrate:prod && npm run build && wrangler deploy",
|
|
"cf-typegen": "wrangler types",
|
|
"types:check": "tsc --noEmit",
|
|
"format:check": "prettier --check .",
|
|
"format:write": "prettier . --write",
|
|
"db:generate": "drizzle-kit generate",
|
|
"db:migrate:local": "wrangler d1 migrations apply DB --local",
|
|
"db:migrate:prod": "wrangler d1 migrations apply DB --remote",
|
|
"knip": "knip",
|
|
"ci": "prettier --check . && knip && tsc --noEmit && oxlint . --type-aware"
|
|
},
|
|
"cloudflare": {
|
|
"bindings": {
|
|
"AUTH_MODE": {
|
|
"description": "Set to `cloudflare_access` for secured deployments behind Cloudflare Access, or `local_noauth` for trusted local self-host mode only."
|
|
},
|
|
"TEAM_DOMAIN": {
|
|
"description": "Cloudflare Access team domain (for example `https://your-team.cloudflareaccess.com`) used to validate `cf-access-jwt-assertion` JWTs."
|
|
},
|
|
"POLICY_AUD": {
|
|
"description": "Cloudflare Access Application Audience (AUD) tag for this Worker route/domain."
|
|
},
|
|
"DATAFORSEO_API_KEY": {
|
|
"description": "Base64-encoded `login:password` for DataForSEO API access."
|
|
}
|
|
}
|
|
},
|
|
"dependencies": {
|
|
"@every-app/sdk": "^0.1.14",
|
|
"@tanstack/query-core": "^5.90.9",
|
|
"@tanstack/query-sync-storage-persister": "^5.90.14",
|
|
"@tanstack/react-form": "^1.25.0",
|
|
"@tanstack/react-query": "^5.90.9",
|
|
"@tanstack/react-query-persist-client": "^5.90.14",
|
|
"@tanstack/react-router": "^1.136.3",
|
|
"@tanstack/react-router-devtools": "^1.136.3",
|
|
"@tanstack/react-start": "^1.136.3",
|
|
"cheerio": "^1.2.0",
|
|
"cloudflare": "^5.2.0",
|
|
"daisyui": "^5.5.5",
|
|
"dataforseo-client": "^2.0.19",
|
|
"drizzle-orm": "^0.44.4",
|
|
"fast-xml-parser": "^5.4.1",
|
|
"jose": "^6.0.12",
|
|
"lucide-react": "^0.542.0",
|
|
"react": "^19.0.0",
|
|
"react-dom": "^19.0.0",
|
|
"recharts": "^3.7.0",
|
|
"remeda": "^2.33.6",
|
|
"robots-parser": "^3.0.1",
|
|
"sonner": "^2.0.7",
|
|
"tailwindcss": "^4.1.16",
|
|
"zod": "^4.1.12"
|
|
},
|
|
"devDependencies": {
|
|
"@cloudflare/vite-plugin": "^1.13.18",
|
|
"@cloudflare/workers-types": "^4.20251014.0",
|
|
"@libsql/client": "^0.15.15",
|
|
"@tailwindcss/vite": "^4.1.11",
|
|
"@tanstack/devtools-vite": "^0.5.1",
|
|
"@tanstack/react-devtools": "^0.9.6",
|
|
"@types/node": "^22.18.13",
|
|
"@types/react": "^19.0.8",
|
|
"@types/react-dom": "^19.0.3",
|
|
"@vitejs/plugin-react": "^4.6.0",
|
|
"drizzle-kit": "^0.31.4",
|
|
"knip": "^5.66.4",
|
|
"oxlint": "^1.50.0",
|
|
"oxlint-tsgolint": "^0.15.0",
|
|
"portless": "^0.5.2",
|
|
"prettier": "^3.6.2",
|
|
"typescript": "^5.9.3",
|
|
"vite": "^7.1.2",
|
|
"vite-tsconfig-paths": "^5.1.4",
|
|
"wrangler": "^4.45.3"
|
|
}
|
|
}
|