- Set Spanish as default language with ephemeral/encrypted privacy focus - Translate all user-facing strings and legal pages to Spanish - Replace Norwegian flag with Spanish flag in footer - Remove Hemmelig/terces.cloud links, add cloudhost.es sponsorship - Rewrite PrivacyPage: zero data collection, ephemeral design emphasis - Rewrite TermsPage: Spanish law, RGPD, paste.es/CloudHost.es references - Update PWA manifest, HTML meta tags, package.json branding - Rename webhook headers to X-Paste-Event / X-Paste-Signature - Update API docs title and contact to paste.es / cloudhost.es Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
35 lines
1.0 KiB
TypeScript
35 lines
1.0 KiB
TypeScript
import { z } from 'zod';
|
|
import { passwordSchema } from './password';
|
|
|
|
const sanitizeString = (str: string) => str.trim().replace(/[\x00-\x1F\x7F]/g, '');
|
|
|
|
const usernameSchema = z
|
|
.string()
|
|
.transform(sanitizeString)
|
|
.pipe(
|
|
z
|
|
.string()
|
|
.min(3, 'Username must be at least 3 characters')
|
|
.max(50, 'Username must be at most 50 characters')
|
|
.regex(
|
|
/^[a-zA-Z0-9_-]+$/,
|
|
'Username can only contain letters, numbers, underscores, and hyphens'
|
|
)
|
|
);
|
|
|
|
export const updateAccountSchema = z.object({
|
|
username: usernameSchema,
|
|
email: z.string().email('Invalid email address'),
|
|
});
|
|
|
|
export const updatePasswordSchema = z
|
|
.object({
|
|
currentPassword: z.string().min(1, 'Current password is required'),
|
|
newPassword: passwordSchema,
|
|
confirmPassword: z.string(),
|
|
})
|
|
.refine((data) => data.newPassword === data.confirmPassword, {
|
|
message: "Passwords don't match",
|
|
path: ['confirmPassword'],
|
|
});
|