项目文件夹

文件
2026-06-14 14:40:49 +08:00

58 行
2.0 KiB
JavaScript

import { readFileSync } from "node:fs";
import { fileURLToPath } from "node:url";
import path from "node:path";
const scriptDir = path.dirname(fileURLToPath(import.meta.url));
const detailSource = readFileSync(
path.resolve(scriptDir, "../src/pages/instances/InstanceDetailPage.tsx"),
"utf8",
);
const serviceSource = readFileSync(
path.resolve(scriptDir, "../src/services/instanceService.ts"),
"utf8",
);
const typeSource = readFileSync(
path.resolve(scriptDir, "../src/types/instance.ts"),
"utf8",
);
function assert(condition, message) {
if (!condition) {
throw new Error(message);
}
}
for (const label of ["1 hour", "24 hours", "7 days", "30 days", "Custom", "Permanent"]) {
assert(detailSource.includes(label), `External access expiration option missing: ${label}`);
}
assert(
detailSource.includes('useState<ExternalAccessExpirationMode>("preset")') &&
detailSource.includes('useState<ExternalAccessExpirationPreset>("24h")'),
"External access UI must default to a 24 hour preset.",
);
assert(
serviceSource.includes("ExternalAccessRequest") &&
serviceSource.includes("external-access/share-link") &&
serviceSource.includes("external-access/password"),
"Instance service must send expiration payloads to share link and password endpoints.",
);
assert(
detailSource.includes("Share Link") &&
detailSource.includes("Password") &&
!detailSource.includes("Public Link") &&
!detailSource.includes("API Key"),
"Instance external access UI must use Share Link and Password labels.",
);
assert(
!serviceSource.includes("external-access/public-link") &&
!serviceSource.includes("external-access/api-key"),
"Instance service must not call legacy public-link or api-key endpoints.",
);
assert(
!typeSource.includes("public_slug:") && !typeSource.includes("token?:"),
"Frontend external access types must not expose legacy long-link slug or token fields.",
);
console.log("Instance external access short-link UI contract is valid.");