{
"name": "featherreader-oauth-sidecar",
"version": "0.1.0",
"private": true,
"description": "atproto OAuth confidential-client sidecar for FeatherReader — owns the OAuth handshake (PAR/PKCE/DPoP/token-refresh) so the Rust server never touches it. Exposes login/callback + an internal shared-secret-guarded authed com.atproto.repo.* API.",
"license": "AGPL-3.0-or-later",
"type": "module",
"engines": {
"node": ">=24 <27"
},
"bin": {
"featherreader-oauth-sidecar": "dist/server.js"
},
"scripts": {
"build": "tsc -p tsconfig.json",
"start": "node dist/server.js",
"dev": "tsx watch src/server.ts",
"typecheck": "tsc -p tsconfig.json --noEmit",
"lint": "oxlint src test --max-warnings 0",
"lint:fix": "oxlint src test --fix",
"format:check": "prettier --check \".oxlintrc.json\" \".prettierrc.json\"",
"format:write": "prettier --write .",
"test:build": "rm -rf dist-test && tsc -p tsconfig.test.json",
"test:guard": "node -e \"const fs=require('node:fs');let f=[];try{f=fs.readdirSync('dist-test/test',{recursive:true}).filter(n=>String(n).endsWith('.test.js'))}catch(e){};if(f.length<5){console.error('FAIL: found '+f.length+' compiled test files under dist-test/test, expected at least 5. node --test exits 0 when it matches nothing, so this guard is what turns a vanished suite into a red build.');process.exit(1)}console.log('[guard] '+f.length+' compiled test files')\"",
"test": "npm run test:build && npm run test:guard && node --test 'dist-test/test/**/*.test.js'"
},
"dependencies": {
"@atproto/api": "^0.22.0",
"@atproto/jwk-jose": "^0.2.4",
"@atproto/oauth-client-node": "^0.5.8",
"@fastify/rate-limit": "^11.2.0",
"fastify": "^5.12.5"
},
"devDependencies": {
"@types/node": "^26.6.4",
"oxlint": "^1.86.0",
"prettier": "3.9.9",
"tsx": "^4.23.15",
"typescript": "^7.0.0"
}
}