import { readFile, writeFile as writeFileUnchecked } from 'fs/promises' import { basename, dirname, join, relative } from 'path' import prettier from 'prettier' import { fileURLToPath } from 'url' const __filename = fileURLToPath(import.meta.url) const __dirname = dirname(__filename) const isBublic = basename(join(__dirname, '../..')) === 'bublic' export const REPO_ROOT = join(__dirname, isBublic ? '../../..' : '../..') export const BUBLIC_ROOT = join(__dirname, '../..') export async function readJsonIfExists(file: string) { try { return JSON.parse(await readFile(file, 'utf8')) } catch { return null } } export async function readFileIfExists(file: string) { try { return await readFile(file, 'utf8') } catch { return null } } const prettierConfigPromise = prettier.resolveConfig(__dirname) export async function writeTypescriptFile(filePath: string, code: string) { const formattedCode = prettier.format( ` // This file is automatically generated by scripts/refresh-assets.ts. // Do not edit manually. ${code} `, { ...(await prettierConfigPromise), parser: 'typescript', } ) await writeStringFile(filePath, formattedCode) } export async function writeStringFile(filePath: string, contents: string) { await writeFile(filePath, Buffer.from(contents, 'utf-8')) } export async function writeFile(filePath: string, contents: Buffer) { if (process.env.CI) { let existingContents: Buffer | null = null try { existingContents = await readFile(filePath) } catch { // Ignore } if (existingContents && !existingContents.equals(contents)) { console.log( `Asset file ${relative( REPO_ROOT, filePath )} has changed. Please run this script again and commit the changes.` ) console.log('Contents before:') console.log(existingContents.toString('utf-8')) console.log('\nContents after:') console.log(contents.toString('utf-8')) process.exit(1) } } await writeFileUnchecked(filePath, contents, 'utf-8') } export async function writeJsonFile(filePath: string, contents: unknown) { const formattedJson = prettier.format(JSON.stringify(contents, null, '\t'), { ...(await prettierConfigPromise), parser: 'json', }) await writeStringFile(filePath, formattedJson) }