const fs = require('node:fs') const path = require('node:path') const envFile = process.env.PETSTORE_ADMIN_ENV_FILE || '.env.production' const absoluteEnvFile = path.resolve(process.cwd(), envFile) function fail(message) { console.error(`[release-preflight] FAIL: ${message}`) process.exit(1) } if (!fs.existsSync(absoluteEnvFile)) { fail('environment file does not exist') } const values = {} for (const rawLine of fs.readFileSync(absoluteEnvFile, 'utf8').split(/\r?\n/)) { const line = rawLine.trim() if (!line || line.startsWith('#')) continue const separator = line.indexOf('=') if (separator < 1) continue const key = line.slice(0, separator).trim().replace(/^export\s+/, '') const value = line.slice(separator + 1).trim().replace(/^(['"])(.*)\1$/, '$2') values[key] = value } const name = 'VITE_PUBLIC_H5_ORIGIN' const value = values[name] if (!value) fail(`${name} is required`) let url try { url = new URL(value) } catch { fail(`${name} must be a valid URL`) } const hostname = url.hostname.toLowerCase() const isLocal = hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '::1' const isPlaceholder = hostname.endsWith('.invalid') || hostname.endsWith('.test') || hostname.endsWith('.example') || ['example.com', 'example.net', 'example.org'].some( (reserved) => hostname === reserved || hostname.endsWith(`.${reserved}`), ) const hasExtraParts = Boolean(url.username || url.password || url.search || url.hash) || (url.pathname !== '' && url.pathname !== '/') if (url.protocol !== 'https:' || isLocal || isPlaceholder || hasExtraParts) { fail(`${name} must be an explicit production HTTPS origin`) } if (hostname === 'www.s-good.com') { fail(`${name} uses a domain reserved by another product`) } console.log(`[release-preflight] ${name}: PASS`) console.log('[release-preflight] admin release configuration PASS')