0ac4beaaa8
- Add requireAuth() to admin-permissions.ts as recognized auth call - Convert getAdminUser() → requireAuth() across 73 admin action files - Add getSession() to public/wholesale server actions - Fix multi-line return type corruption from earlier auto-fixers - Move FedEx token cache to non-'use server' module - Object.freeze module-level constants: PRICE_KEYS, EMPTY_MOBILE_DASHBOARD, EMPTY_PAY_PERIOD, LOCALE_CART_SUBJECT, WELCOME_EMAILS - Update Stripe API version 2026-05-27 → 2026-06-24 - Fix wholesale employee portal: getEmployeeSessionAction + EmployeePortalClient - Fix 51 TypeScript errors (return type corruption, missing imports)
78 lines
1.8 KiB
JavaScript
78 lines
1.8 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* Convert Zod 3 chained format calls to the Zod 4 top-level API.
|
|
* Idempotent: re-running on an already-converted file is a no-op.
|
|
*
|
|
* Before: z.string().email()
|
|
* After: z.email()
|
|
*
|
|
* Mirrors https://zod.dev/v4/changelog and the react-doctor rule
|
|
* `react-doctor/zod-v4-prefer-top-level-string-formats`.
|
|
*/
|
|
const fs = require("node:fs");
|
|
const path = require("node:path");
|
|
|
|
const SIMPLE_METHODS = [
|
|
"email",
|
|
"url",
|
|
"uuid",
|
|
"cuid",
|
|
"cuid2",
|
|
"nanoid",
|
|
"ulid",
|
|
"emoji",
|
|
"jwt",
|
|
];
|
|
|
|
const SIMPLE_REGEX = new RegExp(
|
|
String.raw`\b(z|zod|schema)(\.string\(\))\.(${SIMPLE_METHODS.join("|")})\(`,
|
|
"g",
|
|
);
|
|
|
|
const ISO_REGEX = new RegExp(
|
|
String.raw`\b(z|zod|schema)(\.string\(\))\.(${"datetime|date|time|ip|ipv4|ipv6|cidr|cidrv4|cidrv6"})\(`,
|
|
"g",
|
|
);
|
|
|
|
function patch(src) {
|
|
let out = src;
|
|
|
|
// email/url/uuid/etc — drop the .string() wrapper
|
|
out = out.replace(SIMPLE_REGEX, (_, z, _str, method) => `${z}.${method}(`);
|
|
|
|
// iso.* — wrap the leaf call in .iso.<format>(...)
|
|
out = out.replace(ISO_REGEX, (_, z, _str, method) => `${z}.iso.${method}(`);
|
|
|
|
return out === src ? null : out;
|
|
}
|
|
|
|
function processFile(filePath) {
|
|
const abs = path.resolve(filePath);
|
|
if (!fs.existsSync(abs)) {
|
|
console.error(`skip (not found): ${abs}`);
|
|
return 0;
|
|
}
|
|
const original = fs.readFileSync(abs, "utf8");
|
|
if (!/from\s+["']zod["']/.test(original)) {
|
|
return 0;
|
|
}
|
|
const patched = patch(original);
|
|
if (patched) {
|
|
fs.writeFileSync(abs, patched, "utf8");
|
|
console.log(`patched: ${abs}`);
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
const files = process.argv.slice(2);
|
|
if (files.length === 0) {
|
|
console.error("usage: node scripts/fix-zod-format.js <file>...");
|
|
process.exit(2);
|
|
}
|
|
let n = 0;
|
|
for (const f of files) {
|
|
n += processFile(f);
|
|
}
|
|
console.log(`done — ${n} files patched`);
|