@intentsolutionsio/vercel-pack 1.0.0 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +67 -44
- package/package.json +4 -4
- package/skills/vercel-advanced-troubleshooting/SKILL.md +185 -195
- package/skills/vercel-advanced-troubleshooting/references/errors.md +11 -0
- package/skills/vercel-advanced-troubleshooting/references/evidence-collection-framework.md +34 -0
- package/skills/vercel-advanced-troubleshooting/references/examples.md +11 -0
- package/skills/vercel-advanced-troubleshooting/references/systematic-isolation.md +56 -0
- package/skills/vercel-advanced-troubleshooting/references/timing-analysis.md +35 -0
- package/skills/vercel-architecture-variants/SKILL.md +227 -216
- package/skills/vercel-architecture-variants/references/errors.md +11 -0
- package/skills/vercel-architecture-variants/references/examples.md +12 -0
- package/skills/vercel-architecture-variants/references/variant-a-monolith-(simple).md +44 -0
- package/skills/vercel-architecture-variants/references/variant-b-service-layer-(moderate).md +72 -0
- package/skills/vercel-architecture-variants/references/variant-c-microservice-(complex).md +81 -0
- package/skills/vercel-ci-integration/SKILL.md +183 -73
- package/skills/vercel-ci-integration/references/errors.md +10 -0
- package/skills/vercel-ci-integration/references/examples.md +36 -0
- package/skills/vercel-ci-integration/references/implementation.md +54 -0
- package/skills/vercel-common-errors/SKILL.md +164 -60
- package/skills/vercel-common-errors/references/errors.md +53 -0
- package/skills/vercel-common-errors/references/examples.md +23 -0
- package/skills/vercel-cost-tuning/SKILL.md +158 -145
- package/skills/vercel-cost-tuning/references/cost-estimation.md +34 -0
- package/skills/vercel-cost-tuning/references/cost-reduction-strategies.md +40 -0
- package/skills/vercel-cost-tuning/references/errors.md +11 -0
- package/skills/vercel-cost-tuning/references/examples.md +15 -0
- package/skills/vercel-data-handling/SKILL.md +202 -155
- package/skills/vercel-data-handling/references/errors.md +11 -0
- package/skills/vercel-data-handling/references/examples.md +27 -0
- package/skills/vercel-data-handling/references/implementation.md +223 -0
- package/skills/vercel-debug-bundle/SKILL.md +163 -67
- package/skills/vercel-debug-bundle/references/errors.md +12 -0
- package/skills/vercel-debug-bundle/references/examples.md +24 -0
- package/skills/vercel-debug-bundle/references/implementation.md +54 -0
- package/skills/vercel-deploy-integration/SKILL.md +163 -156
- package/skills/vercel-deploy-integration/references/errors.md +11 -0
- package/skills/vercel-deploy-integration/references/examples.md +21 -0
- package/skills/vercel-deploy-integration/references/google-cloud-run.md +36 -0
- package/skills/vercel-deploy-integration/references/vercel-deployment.md +35 -0
- package/skills/vercel-deploy-preview/SKILL.md +164 -39
- package/skills/vercel-edge-functions/SKILL.md +185 -37
- package/skills/vercel-enterprise-rbac/SKILL.md +185 -170
- package/skills/vercel-enterprise-rbac/references/errors.md +11 -0
- package/skills/vercel-enterprise-rbac/references/examples.md +12 -0
- package/skills/vercel-enterprise-rbac/references/role-implementation.md +33 -0
- package/skills/vercel-enterprise-rbac/references/sso-integration.md +35 -0
- package/skills/vercel-hello-world/SKILL.md +141 -55
- package/skills/vercel-incident-runbook/SKILL.md +186 -138
- package/skills/vercel-incident-runbook/references/errors.md +11 -0
- package/skills/vercel-incident-runbook/references/examples.md +10 -0
- package/skills/vercel-incident-runbook/references/immediate-actions-by-error-type.md +41 -0
- package/skills/vercel-install-auth/SKILL.md +130 -53
- package/skills/vercel-known-pitfalls/SKILL.md +235 -233
- package/skills/vercel-known-pitfalls/references/errors.md +11 -0
- package/skills/vercel-known-pitfalls/references/examples.md +12 -0
- package/skills/vercel-load-scale/SKILL.md +197 -204
- package/skills/vercel-load-scale/references/capacity-planning.md +47 -0
- package/skills/vercel-load-scale/references/errors.md +11 -0
- package/skills/vercel-load-scale/references/examples.md +26 -0
- package/skills/vercel-load-scale/references/load-testing-with-k6.md +59 -0
- package/skills/vercel-load-scale/references/scaling-patterns.md +65 -0
- package/skills/vercel-local-dev-loop/SKILL.md +159 -71
- package/skills/vercel-local-dev-loop/references/errors.md +11 -0
- package/skills/vercel-local-dev-loop/references/examples.md +21 -0
- package/skills/vercel-local-dev-loop/references/implementation.md +60 -0
- package/skills/vercel-migration-deep-dive/SKILL.md +202 -187
- package/skills/vercel-migration-deep-dive/references/errors.md +11 -0
- package/skills/vercel-migration-deep-dive/references/examples.md +12 -0
- package/skills/vercel-migration-deep-dive/references/implementation-plan.md +80 -0
- package/skills/vercel-migration-deep-dive/references/pre-migration-assessment.md +39 -0
- package/skills/vercel-multi-env-setup/SKILL.md +167 -164
- package/skills/vercel-multi-env-setup/references/configuration-structure.md +59 -0
- package/skills/vercel-multi-env-setup/references/errors.md +11 -0
- package/skills/vercel-multi-env-setup/references/examples.md +11 -0
- package/skills/vercel-observability/SKILL.md +205 -195
- package/skills/vercel-observability/references/alert-configuration.md +40 -0
- package/skills/vercel-observability/references/errors.md +11 -0
- package/skills/vercel-observability/references/examples.md +13 -0
- package/skills/vercel-observability/references/metrics-collection.md +65 -0
- package/skills/vercel-performance-tuning/SKILL.md +212 -156
- package/skills/vercel-performance-tuning/references/caching-strategy.md +49 -0
- package/skills/vercel-performance-tuning/references/errors.md +11 -0
- package/skills/vercel-performance-tuning/references/examples.md +13 -0
- package/skills/vercel-policy-guardrails/SKILL.md +276 -193
- package/skills/vercel-policy-guardrails/references/errors.md +11 -0
- package/skills/vercel-policy-guardrails/references/eslint-rules.md +46 -0
- package/skills/vercel-policy-guardrails/references/examples.md +10 -0
- package/skills/vercel-prod-checklist/SKILL.md +219 -94
- package/skills/vercel-prod-checklist/references/errors.md +11 -0
- package/skills/vercel-prod-checklist/references/examples.md +25 -0
- package/skills/vercel-prod-checklist/references/implementation.md +60 -0
- package/skills/vercel-rate-limits/SKILL.md +187 -100
- package/skills/vercel-rate-limits/references/errors.md +11 -0
- package/skills/vercel-rate-limits/references/examples.md +46 -0
- package/skills/vercel-rate-limits/references/implementation.md +66 -0
- package/skills/vercel-reference-architecture/SKILL.md +226 -180
- package/skills/vercel-reference-architecture/references/errors.md +11 -0
- package/skills/vercel-reference-architecture/references/examples.md +13 -0
- package/skills/vercel-reference-architecture/references/key-components.md +65 -0
- package/skills/vercel-reference-architecture/references/project-structure.md +40 -0
- package/skills/vercel-reliability-patterns/SKILL.md +272 -211
- package/skills/vercel-reliability-patterns/references/circuit-breaker.md +36 -0
- package/skills/vercel-reliability-patterns/references/dead-letter-queue.md +48 -0
- package/skills/vercel-reliability-patterns/references/errors.md +11 -0
- package/skills/vercel-reliability-patterns/references/examples.md +11 -0
- package/skills/vercel-reliability-patterns/references/idempotency-keys.md +36 -0
- package/skills/vercel-sdk-patterns/SKILL.md +264 -92
- package/skills/vercel-sdk-patterns/references/errors.md +11 -0
- package/skills/vercel-sdk-patterns/references/examples.md +45 -0
- package/skills/vercel-sdk-patterns/references/implementation.md +67 -0
- package/skills/vercel-security-basics/SKILL.md +186 -96
- package/skills/vercel-security-basics/references/errors.md +10 -0
- package/skills/vercel-security-basics/references/examples.md +70 -0
- package/skills/vercel-security-basics/references/implementation.md +39 -0
- package/skills/vercel-upgrade-migration/SKILL.md +167 -67
- package/skills/vercel-upgrade-migration/references/errors.md +10 -0
- package/skills/vercel-upgrade-migration/references/examples.md +51 -0
- package/skills/vercel-upgrade-migration/references/implementation.md +29 -0
- package/skills/vercel-webhooks-events/SKILL.md +208 -132
- package/skills/vercel-webhooks-events/references/errors.md +11 -0
- package/skills/vercel-webhooks-events/references/event-handler-pattern.md +37 -0
- package/skills/vercel-webhooks-events/references/examples.md +16 -0
- package/skills/vercel-webhooks-events/references/signature-verification.md +33 -0
|
@@ -1,220 +1,267 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: vercel-data-handling
|
|
3
|
-
description:
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
description: 'Implement data handling, PII protection, and GDPR/CCPA compliance for
|
|
4
|
+
Vercel deployments.
|
|
5
|
+
|
|
6
|
+
Use when handling sensitive data in serverless functions, implementing data redaction,
|
|
7
|
+
|
|
8
|
+
or ensuring privacy compliance on Vercel.
|
|
9
|
+
|
|
7
10
|
Trigger with phrases like "vercel data", "vercel PII",
|
|
8
|
-
|
|
11
|
+
|
|
12
|
+
"vercel GDPR", "vercel data retention", "vercel privacy", "vercel compliance".
|
|
13
|
+
|
|
14
|
+
'
|
|
9
15
|
allowed-tools: Read, Write, Edit
|
|
10
16
|
version: 1.0.0
|
|
11
17
|
license: MIT
|
|
12
18
|
author: Jeremy Longshore <jeremy@intentsolutions.io>
|
|
19
|
+
tags:
|
|
20
|
+
- saas
|
|
21
|
+
- vercel
|
|
22
|
+
- compliance
|
|
23
|
+
- privacy
|
|
24
|
+
- security
|
|
25
|
+
compatibility: Designed for Claude Code, also compatible with Codex and OpenClaw
|
|
13
26
|
---
|
|
14
|
-
|
|
15
27
|
# Vercel Data Handling
|
|
16
28
|
|
|
17
29
|
## Overview
|
|
18
|
-
|
|
30
|
+
|
|
31
|
+
Handle sensitive data correctly on Vercel: PII redaction in logs, GDPR-compliant data processing in serverless functions, secure cookie management, and data residency configuration. Covers both what Vercel stores and what your application should protect.
|
|
19
32
|
|
|
20
33
|
## Prerequisites
|
|
34
|
+
|
|
21
35
|
- Understanding of GDPR/CCPA requirements
|
|
22
|
-
- Vercel
|
|
23
|
-
-
|
|
24
|
-
- Scheduled job infrastructure for cleanup
|
|
36
|
+
- Vercel Pro or Enterprise (for data residency options)
|
|
37
|
+
- Logging infrastructure with PII awareness
|
|
25
38
|
|
|
26
|
-
##
|
|
39
|
+
## Instructions
|
|
27
40
|
|
|
28
|
-
|
|
29
|
-
|----------|----------|----------|
|
|
30
|
-
| PII | Email, name, phone | Encrypt, minimize |
|
|
31
|
-
| Sensitive | API keys, tokens | Never log, rotate |
|
|
32
|
-
| Business | Usage metrics | Aggregate when possible |
|
|
33
|
-
| Public | Product names | Standard handling |
|
|
41
|
+
### Step 1: Understand What Vercel Stores
|
|
34
42
|
|
|
35
|
-
|
|
43
|
+
| Data Type | Where | Retention | Control |
|
|
44
|
+
|-----------|-------|-----------|---------|
|
|
45
|
+
| Runtime logs | Vercel servers | 1hr (free), 30d (Plus) | Log drains |
|
|
46
|
+
| Build logs | Vercel servers | 30 days | Automatic |
|
|
47
|
+
| Analytics data | Vercel | Aggregated, no PII | Disable in dashboard |
|
|
48
|
+
| Deployment source | Vercel | Until deleted | Manual deletion |
|
|
49
|
+
| Environment variables | Vercel (encrypted) | Until deleted | Scoped access |
|
|
50
|
+
|
|
51
|
+
### Step 2: PII Redaction in Logs
|
|
36
52
|
|
|
37
53
|
```typescript
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
54
|
+
// lib/redact.ts — redact PII before logging
|
|
55
|
+
const PII_PATTERNS: [RegExp, string][] = [
|
|
56
|
+
[/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/g, '[EMAIL]'],
|
|
57
|
+
[/\b\d{3}[-.]?\d{3}[-.]?\d{4}\b/g, '[PHONE]'],
|
|
58
|
+
[/\b\d{3}-\d{2}-\d{4}\b/g, '[SSN]'],
|
|
59
|
+
[/\b\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4}\b/g, '[CARD]'],
|
|
60
|
+
[/\b(?:Bearer|token|key|secret|password)\s*[:=]\s*\S+/gi, '[CREDENTIAL]'],
|
|
43
61
|
];
|
|
44
62
|
|
|
45
|
-
function
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
const matches = text.matchAll(pattern.regex);
|
|
50
|
-
for (const match of matches) {
|
|
51
|
-
findings.push({ type: pattern.type, match: match[0] });
|
|
52
|
-
}
|
|
63
|
+
export function redact(text: string): string {
|
|
64
|
+
let result = text;
|
|
65
|
+
for (const [pattern, replacement] of PII_PATTERNS) {
|
|
66
|
+
result = result.replace(pattern, replacement);
|
|
53
67
|
}
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
54
70
|
|
|
55
|
-
|
|
71
|
+
// Usage — always redact before console.log
|
|
72
|
+
import { redact } from '@/lib/redact';
|
|
73
|
+
|
|
74
|
+
export async function POST(request: Request) {
|
|
75
|
+
const body = await request.json();
|
|
76
|
+
console.log('Request received:', redact(JSON.stringify(body)));
|
|
77
|
+
// Process safely...
|
|
56
78
|
}
|
|
57
79
|
```
|
|
58
80
|
|
|
59
|
-
|
|
81
|
+
### Step 3: GDPR-Compliant API Routes
|
|
60
82
|
|
|
61
83
|
```typescript
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
84
|
+
// api/users/[id]/route.ts — data subject request handlers
|
|
85
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
86
|
+
import { db } from '@/lib/db';
|
|
87
|
+
|
|
88
|
+
// Right to Access (GDPR Art. 15)
|
|
89
|
+
export async function GET(
|
|
90
|
+
request: NextRequest,
|
|
91
|
+
{ params }: { params: { id: string } }
|
|
92
|
+
) {
|
|
93
|
+
const user = await db.user.findUnique({
|
|
94
|
+
where: { id: params.id },
|
|
95
|
+
include: { posts: true, preferences: true },
|
|
96
|
+
});
|
|
65
97
|
|
|
66
|
-
|
|
67
|
-
if (redacted[field]) {
|
|
68
|
-
redacted[field] = '[REDACTED]';
|
|
69
|
-
}
|
|
70
|
-
}
|
|
98
|
+
if (!user) return NextResponse.json({ error: 'Not found' }, { status: 404 });
|
|
71
99
|
|
|
72
|
-
return
|
|
100
|
+
return NextResponse.json({
|
|
101
|
+
personalData: {
|
|
102
|
+
name: user.name,
|
|
103
|
+
email: user.email,
|
|
104
|
+
createdAt: user.createdAt,
|
|
105
|
+
posts: user.posts,
|
|
106
|
+
preferences: user.preferences,
|
|
107
|
+
},
|
|
108
|
+
exportedAt: new Date().toISOString(),
|
|
109
|
+
});
|
|
73
110
|
}
|
|
74
111
|
|
|
75
|
-
//
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
112
|
+
// Right to Erasure (GDPR Art. 17)
|
|
113
|
+
export async function DELETE(
|
|
114
|
+
request: NextRequest,
|
|
115
|
+
{ params }: { params: { id: string } }
|
|
116
|
+
) {
|
|
117
|
+
// Soft delete — anonymize instead of hard delete for audit trail
|
|
118
|
+
await db.user.update({
|
|
119
|
+
where: { id: params.id },
|
|
120
|
+
data: {
|
|
121
|
+
email: `deleted-${params.id}@redacted.local`,
|
|
122
|
+
name: '[DELETED]',
|
|
123
|
+
deletedAt: new Date(),
|
|
124
|
+
},
|
|
125
|
+
});
|
|
80
126
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
| Audit logs | 7 years | Compliance |
|
|
87
|
-
| PII | Until deletion request | GDPR/CCPA |
|
|
127
|
+
// Also delete from log drain provider if applicable
|
|
128
|
+
console.log(`GDPR deletion completed for user ${params.id}`);
|
|
129
|
+
return NextResponse.json({ deleted: true });
|
|
130
|
+
}
|
|
131
|
+
```
|
|
88
132
|
|
|
89
|
-
###
|
|
133
|
+
### Step 4: Secure Cookie Management
|
|
90
134
|
|
|
91
135
|
```typescript
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
136
|
+
// lib/cookies.ts — GDPR-aware cookie handling
|
|
137
|
+
import { cookies } from 'next/headers';
|
|
138
|
+
|
|
139
|
+
export function setSessionCookie(token: string): void {
|
|
140
|
+
cookies().set('session', token, {
|
|
141
|
+
httpOnly: true, // Not accessible via JavaScript
|
|
142
|
+
secure: true, // HTTPS only
|
|
143
|
+
sameSite: 'lax', // CSRF protection
|
|
144
|
+
maxAge: 60 * 60 * 24, // 24 hours
|
|
145
|
+
path: '/',
|
|
146
|
+
});
|
|
147
|
+
}
|
|
95
148
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
149
|
+
export function setConsentCookie(consent: Record<string, boolean>): void {
|
|
150
|
+
cookies().set('consent', JSON.stringify(consent), {
|
|
151
|
+
httpOnly: false, // Needs client-side access
|
|
152
|
+
secure: true,
|
|
153
|
+
sameSite: 'lax',
|
|
154
|
+
maxAge: 60 * 60 * 24 * 365, // 1 year
|
|
155
|
+
path: '/',
|
|
99
156
|
});
|
|
100
157
|
}
|
|
101
158
|
|
|
102
|
-
//
|
|
103
|
-
|
|
159
|
+
// Middleware — block analytics if consent not given
|
|
160
|
+
export function middleware(request: Request) {
|
|
161
|
+
const consent = request.headers.get('cookie')?.includes('consent');
|
|
162
|
+
if (!consent) {
|
|
163
|
+
// Strip analytics query params, skip tracking middleware
|
|
164
|
+
}
|
|
165
|
+
}
|
|
104
166
|
```
|
|
105
167
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
### Data Subject Access Request (DSAR)
|
|
168
|
+
### Step 5: Data Residency Configuration
|
|
109
169
|
|
|
110
|
-
|
|
111
|
-
async function exportUserData(userId: string): Promise<DataExport> {
|
|
112
|
-
const vercelData = await vercelClient.getUserData(userId);
|
|
170
|
+
Vercel allows configuring where your serverless functions execute:
|
|
113
171
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
}
|
|
122
|
-
}
|
|
172
|
+
```json
|
|
173
|
+
// vercel.json — restrict function execution to EU regions
|
|
174
|
+
{
|
|
175
|
+
"regions": ["cdg1", "lhr1"],
|
|
176
|
+
"functions": {
|
|
177
|
+
"api/**/*.ts": {
|
|
178
|
+
"regions": ["cdg1"]
|
|
179
|
+
}
|
|
180
|
+
}
|
|
123
181
|
}
|
|
124
182
|
```
|
|
125
183
|
|
|
126
|
-
|
|
184
|
+
EU regions for GDPR data residency:
|
|
127
185
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
// 2. Delete local copies
|
|
134
|
-
await db.vercelUserCache.deleteMany({ userId });
|
|
135
|
-
|
|
136
|
-
// 3. Audit log (required to keep)
|
|
137
|
-
await auditLog.record({
|
|
138
|
-
action: 'GDPR_DELETION',
|
|
139
|
-
userId,
|
|
140
|
-
service: 'vercel',
|
|
141
|
-
timestamp: new Date(),
|
|
142
|
-
});
|
|
186
|
+
| Region | Location | Code |
|
|
187
|
+
|--------|----------|------|
|
|
188
|
+
| Paris | France | `cdg1` |
|
|
189
|
+
| London | UK | `lhr1` |
|
|
190
|
+
| Frankfurt | Germany | `fra1` |
|
|
143
191
|
|
|
144
|
-
|
|
145
|
-
}
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
## Data Minimization
|
|
192
|
+
### Step 6: Audit Logging
|
|
149
193
|
|
|
150
194
|
```typescript
|
|
151
|
-
//
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
// Omit sensitive fields
|
|
161
|
-
};
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
## Instructions
|
|
195
|
+
// lib/audit-log.ts — track data access for compliance
|
|
196
|
+
interface AuditEntry {
|
|
197
|
+
action: 'read' | 'create' | 'update' | 'delete' | 'export';
|
|
198
|
+
resource: string;
|
|
199
|
+
resourceId: string;
|
|
200
|
+
userId: string;
|
|
201
|
+
ip: string;
|
|
202
|
+
timestamp: string;
|
|
203
|
+
}
|
|
165
204
|
|
|
166
|
-
|
|
167
|
-
|
|
205
|
+
export async function auditLog(entry: Omit<AuditEntry, 'timestamp'>): Promise<void> {
|
|
206
|
+
const record: AuditEntry = {
|
|
207
|
+
...entry,
|
|
208
|
+
timestamp: new Date().toISOString(),
|
|
209
|
+
};
|
|
168
210
|
|
|
169
|
-
|
|
170
|
-
|
|
211
|
+
// Write to database audit table
|
|
212
|
+
await db.auditLog.create({ data: record });
|
|
171
213
|
|
|
172
|
-
|
|
173
|
-
|
|
214
|
+
// Also log for log drain capture (structured JSON)
|
|
215
|
+
console.log(JSON.stringify({ type: 'audit', ...record }));
|
|
216
|
+
}
|
|
174
217
|
|
|
175
|
-
|
|
176
|
-
|
|
218
|
+
// Usage in API route:
|
|
219
|
+
export async function GET(request: NextRequest) {
|
|
220
|
+
await auditLog({
|
|
221
|
+
action: 'read',
|
|
222
|
+
resource: 'user',
|
|
223
|
+
resourceId: params.id,
|
|
224
|
+
userId: session.userId,
|
|
225
|
+
ip: request.headers.get('x-forwarded-for') ?? 'unknown',
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
```
|
|
177
229
|
|
|
178
|
-
##
|
|
179
|
-
- Data classification documented
|
|
180
|
-
- PII detection implemented
|
|
181
|
-
- Redaction in logging active
|
|
182
|
-
- Retention policy enforced
|
|
230
|
+
## Data Classification Guide
|
|
183
231
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
|
188
|
-
|
|
|
189
|
-
|
|
|
190
|
-
|
|
|
232
|
+
| Category | Examples | Handling on Vercel |
|
|
233
|
+
|----------|----------|-------------------|
|
|
234
|
+
| PII | Email, name, phone, IP | Redact from logs, encrypt at rest |
|
|
235
|
+
| Secrets | API keys, tokens, passwords | Use `type: sensitive` env vars, never log |
|
|
236
|
+
| Financial | Card numbers, bank info | Never process in functions — use Stripe/payment provider |
|
|
237
|
+
| Health | Medical records | Requires BAA — contact Vercel Enterprise |
|
|
238
|
+
| Business | Metrics, usage stats | Aggregate before logging |
|
|
191
239
|
|
|
192
|
-
##
|
|
240
|
+
## Output
|
|
193
241
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
}
|
|
200
|
-
```
|
|
242
|
+
- PII redaction applied to all log output
|
|
243
|
+
- GDPR data subject request endpoints implemented
|
|
244
|
+
- Secure cookie handling with consent management
|
|
245
|
+
- Data residency configured via function regions
|
|
246
|
+
- Audit logging for compliance trail
|
|
201
247
|
|
|
202
|
-
|
|
203
|
-
```typescript
|
|
204
|
-
const safeData = redactPII(apiResponse);
|
|
205
|
-
logger.info('Vercel response:', safeData);
|
|
206
|
-
```
|
|
248
|
+
## Error Handling
|
|
207
249
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
250
|
+
| Error | Cause | Solution |
|
|
251
|
+
|-------|-------|----------|
|
|
252
|
+
| PII in Vercel logs | Not redacting before console.log | Use `redact()` wrapper on all log calls |
|
|
253
|
+
| GDPR data request timeout | Large data export in function | Paginate or use background processing |
|
|
254
|
+
| Cookies not secure | Missing `secure: true` flag | Always set httpOnly and secure flags |
|
|
255
|
+
| Function running in wrong region | Region not set in vercel.json | Specify `regions` per function |
|
|
213
256
|
|
|
214
257
|
## Resources
|
|
215
|
-
|
|
216
|
-
- [
|
|
217
|
-
- [Vercel
|
|
258
|
+
|
|
259
|
+
- [Vercel Privacy Policy](https://vercel.com/legal/privacy-policy)
|
|
260
|
+
- [Vercel Data Processing Agreement](https://vercel.com/legal/dpa)
|
|
261
|
+
- [GDPR Overview](https://gdpr.eu/)
|
|
262
|
+
- [Vercel Function Regions](https://vercel.com/docs/functions/configuring-functions)
|
|
263
|
+
- [Vercel Security](https://vercel.com/security)
|
|
218
264
|
|
|
219
265
|
## Next Steps
|
|
220
|
-
|
|
266
|
+
|
|
267
|
+
For enterprise RBAC, see `vercel-enterprise-rbac`.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Error Handling Reference
|
|
2
|
+
|
|
3
|
+
| Issue | Cause | Solution |
|
|
4
|
+
|-------|-------|----------|
|
|
5
|
+
| PII in logs | Missing redaction | Wrap logging with redact |
|
|
6
|
+
| Deletion failed | Data locked | Check dependencies |
|
|
7
|
+
| Export incomplete | Timeout | Increase batch size |
|
|
8
|
+
| Audit gap | Missing entries | Review log pipeline |
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
*[Tons of Skills](https://tonsofskills.com) by [Intent Solutions](https://intentsolutions.io) | [jeremylongshore.com](https://jeremylongshore.com)*
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
## Examples
|
|
2
|
+
|
|
3
|
+
### Quick PII Scan
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
const findings = detectPII(JSON.stringify(userData));
|
|
7
|
+
if (findings.length > 0) {
|
|
8
|
+
console.warn(`PII detected: ${findings.map(f => f.type).join(', ')}`);
|
|
9
|
+
}
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
### Redact Before Logging
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
const safeData = redactPII(apiResponse);
|
|
16
|
+
logger.info('Vercel response:', safeData);
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### GDPR Data Export
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
const userExport = await exportUserData('user-123');
|
|
23
|
+
await sendToUser(userExport);
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
*[Tons of Skills](https://tonsofskills.com) by [Intent Solutions](https://intentsolutions.io) | [jeremylongshore.com](https://jeremylongshore.com)*
|