/** * Shared local test domain configuration. * * Default layout (mirrors production subdomain split): * test.tkmind.cn → MindSpace H5 (Vite :5173) * testadm.tkmind.cn → memind_adm (:8082) * testpla.tkmind.cn → Plaza Next.js (:3001) * testops.tkmind.cn → Ops console SPA (:3002) */ import fs from 'node:fs'; export const LOCAL_IP = process.env.LOCAL_TEST_IP ?? '127.0.0.1'; export const DNS_PORT = Number(process.env.LOCAL_TEST_DNS_PORT ?? 5533); export const DNS_MARKER = 'tkmind-local-test'; export const H5_HOST = process.env.H5_LOCAL_HOST ?? 'test.tkmind.cn'; export const ADMIN_HOST = process.env.ADMIN_LOCAL_HOST ?? 'testadm.tkmind.cn'; export const PLAZA_HOST = process.env.PLAZA_LOCAL_HOST ?? 'testpla.tkmind.cn'; export const OPS_HOST = process.env.OPS_LOCAL_HOST ?? 'testops.tkmind.cn'; export const TEST_HOSTS = [H5_HOST, ADMIN_HOST, PLAZA_HOST, OPS_HOST]; export const PUBLIC_SCHEME = ( process.env.LOCAL_TEST_SCHEME ?? (String(process.env.LOCAL_TEST_HTTPS ?? '1') === '0' ? 'http' : 'https') ).replace(/:$/, ''); export const PUBLIC_PORT = Number( process.env.LOCAL_TEST_PUBLIC_PORT ?? (PUBLIC_SCHEME === 'https' ? 443 : 80), ); export function publicUrl(host, { path = '' } = {}) { const defaultPort = PUBLIC_SCHEME === 'https' ? 443 : 80; const portSuffix = PUBLIC_PORT === defaultPort ? '' : `:${PUBLIC_PORT}`; const normalizedPath = path.startsWith('/') ? path : path ? `/${path}` : ''; return `${PUBLIC_SCHEME}://${host}${portSuffix}${normalizedPath}`; } export const H5_PUBLIC_BASE = (process.env.H5_PUBLIC_BASE_URL ?? publicUrl(H5_HOST)).replace(/\/$/, ''); export const ADMIN_PUBLIC_BASE = publicUrl(ADMIN_HOST).replace(/\/$/, ''); export const PLAZA_PUBLIC_BASE = (process.env.PLAZA_PUBLIC_BASE ?? publicUrl(PLAZA_HOST)).replace(/\/$/, ''); export const OPS_PUBLIC_BASE = publicUrl(OPS_HOST, { path: '/ops/' }).replace(/\/$/, '') + '/'; export function hostConfigured(host) { try { const hosts = fs.readFileSync('/etc/hosts', 'utf8'); return new RegExp(`^\\s*${LOCAL_IP.replace('.', '\\.')}\\s+${host.replace('.', '\\.')}(\\s|$)`, 'm').test( hosts, ); } catch { return false; } } export function resolverConfigured(host) { try { const body = fs.readFileSync(`/etc/resolver/${host}`, 'utf8'); return body.includes(DNS_MARKER); } catch { return false; } } export function allHostsConfigured() { return TEST_HOSTS.every((host) => hostConfigured(host) && resolverConfigured(host)); }