Initial commit
This commit is contained in:
107
hooks/scripts/check-deprecated-apis.sh
Executable file
107
hooks/scripts/check-deprecated-apis.sh
Executable file
@@ -0,0 +1,107 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
CLAUDE_MARKETPLACE_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)"
|
||||
|
||||
source "${CLAUDE_MARKETPLACE_ROOT}/marketplace-utils/hook-lifecycle.sh"
|
||||
|
||||
init_hook "prisma-6" "PreToolUse"
|
||||
|
||||
INPUT=$(read_hook_input)
|
||||
|
||||
if ! command -v grep &> /dev/null; then
|
||||
log_error "grep command not found"
|
||||
pretooluse_respond "allow"
|
||||
finish_hook 0
|
||||
fi
|
||||
|
||||
TS_FILES=$(find . -type f \( -name "*.ts" -o -name "*.tsx" -o -name "*.js" -o -name "*.jsx" \) \
|
||||
! -path "*/node_modules/*" \
|
||||
! -path "*/dist/*" \
|
||||
! -path "*/build/*" \
|
||||
! -path "*/.next/*" 2>/dev/null || true)
|
||||
|
||||
if [ -z "$TS_FILES" ]; then
|
||||
pretooluse_respond "allow"
|
||||
finish_hook 0
|
||||
fi
|
||||
|
||||
PRISMA_FILES=$(echo "$TS_FILES" | xargs grep -l '@prisma/client' 2>/dev/null || true)
|
||||
|
||||
BUFFER_USAGE=""
|
||||
if [ -n "$PRISMA_FILES" ]; then
|
||||
BUFFER_USAGE=$(echo "$PRISMA_FILES" | xargs grep -nE 'Buffer\.from\(' 2>/dev/null || true)
|
||||
fi
|
||||
|
||||
if [ -n "$BUFFER_USAGE" ]; then
|
||||
log_warn "Buffer.from() usage detected in files importing @prisma/client"
|
||||
pretooluse_respond "allow" "Warning: Buffer.from() usage detected in files importing @prisma/client
|
||||
|
||||
Prisma 6 Bytes fields use Uint8Array instead of Buffer:
|
||||
✗ const bytes = Buffer.from(data)
|
||||
✗ reportData: Buffer.from(jsonString)
|
||||
✓ reportData: new TextEncoder().encode(jsonString)
|
||||
|
||||
Bytes fields are returned as Uint8Array, no conversion needed:
|
||||
✗ Buffer.from(user.profilePicture)
|
||||
✓ user.profilePicture (already Uint8Array)"
|
||||
finish_hook 0
|
||||
fi
|
||||
|
||||
TOSTRING_ON_BYTES=$(echo "$TS_FILES" | xargs grep -nE '\.(avatar|file|attachment|document|reportData|image|photo|content|data|binary)\.toString\(' 2>/dev/null || true)
|
||||
|
||||
if [ -n "$TOSTRING_ON_BYTES" ]; then
|
||||
log_warn ".toString() on potential Bytes fields detected"
|
||||
pretooluse_respond "allow" "Warning: .toString() on potential Bytes fields detected
|
||||
|
||||
Bytes fields are now Uint8Array, not Buffer:
|
||||
✗ reportData.toString('utf-8')
|
||||
✓ new TextDecoder().decode(reportData)
|
||||
|
||||
For base64 encoding:
|
||||
✗ avatar.toString('base64')
|
||||
✓ Buffer.from(avatar).toString('base64')"
|
||||
finish_hook 0
|
||||
fi
|
||||
|
||||
NOT_FOUND_ERROR=$(echo "$TS_FILES" | xargs grep -En --include="*.ts" --include="*.tsx" --include="*.js" --include="*.jsx" 'Prisma.*NotFoundError|@prisma/client.*NotFoundError|PrismaClient.*NotFoundError|from.*["\047]@prisma/client["\047].*NotFoundError' 2>/dev/null || true)
|
||||
|
||||
if [ -n "$NOT_FOUND_ERROR" ]; then
|
||||
log_warn "Deprecated NotFoundError handling detected"
|
||||
pretooluse_respond "allow" "Warning: Deprecated NotFoundError handling detected
|
||||
|
||||
Use error code P2025 instead of NotFoundError:
|
||||
✗ if (error instanceof NotFoundError)
|
||||
✓ if (error.code === 'P2025')"
|
||||
finish_hook 0
|
||||
fi
|
||||
|
||||
REJECTONFOUND=$(echo "$TS_FILES" | xargs grep -n 'rejectOnNotFound' 2>/dev/null || true)
|
||||
|
||||
if [ -n "$REJECTONFOUND" ]; then
|
||||
log_warn "Deprecated rejectOnNotFound option detected"
|
||||
pretooluse_respond "allow" "Warning: Deprecated rejectOnNotFound option detected
|
||||
|
||||
Use findUniqueOrThrow() or findFirstOrThrow() instead:
|
||||
✗ findUnique({ where: { id }, rejectOnNotFound: true })
|
||||
✓ findUniqueOrThrow({ where: { id } })"
|
||||
finish_hook 0
|
||||
fi
|
||||
|
||||
EXPERIMENTAL_FEATURES=$(echo "$TS_FILES" | xargs grep -n 'experimentalFeatures.*extendedWhereUnique\|experimentalFeatures.*fullTextSearch' 2>/dev/null || true)
|
||||
|
||||
if [ -n "$EXPERIMENTAL_FEATURES" ]; then
|
||||
log_warn "Deprecated experimental features detected"
|
||||
pretooluse_respond "allow" "Warning: Deprecated experimental features detected
|
||||
|
||||
These features are now stable in Prisma 6:
|
||||
- extendedWhereUnique (enabled by default)
|
||||
- fullTextSearch (enabled by default)
|
||||
|
||||
Remove from schema.prisma generator block."
|
||||
finish_hook 0
|
||||
fi
|
||||
|
||||
pretooluse_respond "allow"
|
||||
finish_hook 0
|
||||
Reference in New Issue
Block a user