60 lines
2.1 KiB
JavaScript
60 lines
2.1 KiB
JavaScript
const fs = require('node:fs')
|
|
const path = require('node:path')
|
|
|
|
const envFile = process.env.PETSTORE_FRONTEND_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
|
|
}
|
|
|
|
function requireProductionOrigin(name, forbiddenHosts) {
|
|
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 (forbiddenHosts.includes(hostname)) {
|
|
fail(`${name} uses a domain reserved by another product`)
|
|
}
|
|
console.log(`[release-preflight] ${name}: PASS`)
|
|
}
|
|
|
|
requireProductionOrigin('VITE_API_ORIGIN', ['api.s-good.com'])
|
|
requireProductionOrigin('VITE_REPORT_PUBLIC_ORIGIN', ['www.s-good.com'])
|
|
console.log('[release-preflight] frontend release configuration PASS')
|