Spaces:
Running
Running
/** | |
* Scripts to be done before starting the server for the first time. | |
*/ | |
import fs from 'node:fs'; | |
import path from 'node:path'; | |
import process from 'node:process'; | |
import yaml from 'yaml'; | |
import chalk from 'chalk'; | |
import { createRequire } from 'node:module'; | |
import { addMissingConfigValues } from './src/config-init.js'; | |
/** | |
* Colorizes console output. | |
*/ | |
const color = chalk; | |
/** | |
* Converts the old config.conf file to the new config.yaml format. | |
*/ | |
function convertConfig() { | |
if (fs.existsSync('./config.conf')) { | |
if (fs.existsSync('./config.yaml')) { | |
console.log(color.yellow('Both config.conf and config.yaml exist. Please delete config.conf manually.')); | |
return; | |
} | |
try { | |
console.log(color.blue('Converting config.conf to config.yaml. Your old config.conf will be renamed to config.conf.bak')); | |
fs.renameSync('./config.conf', './config.conf.cjs'); // Force loading as CommonJS | |
const require = createRequire(import.meta.url); | |
const config = require(path.join(process.cwd(), './config.conf.cjs')); | |
fs.copyFileSync('./config.conf.cjs', './config.conf.bak'); | |
fs.rmSync('./config.conf.cjs'); | |
fs.writeFileSync('./config.yaml', yaml.stringify(config)); | |
console.log(color.green('Conversion successful. Please check your config.yaml and fix it if necessary.')); | |
} catch (error) { | |
console.error(color.red('FATAL: Config conversion failed. Please check your config.conf file and try again.'), error); | |
return; | |
} | |
} | |
} | |
/** | |
* Creates the default config files if they don't exist yet. | |
*/ | |
function createDefaultFiles() { | |
/** | |
* @typedef DefaultItem | |
* @type {object} | |
* @property {'file' | 'directory'} type - Whether the item should be copied as a single file or merged into a directory structure. | |
* @property {string} defaultPath - The path to the default item (typically in `default/`). | |
* @property {string} productionPath - The path to the copied item for production use. | |
*/ | |
/** @type {DefaultItem[]} */ | |
const defaultItems = [ | |
{ | |
type: 'file', | |
defaultPath: './default/config.yaml', | |
productionPath: './config.yaml', | |
}, | |
{ | |
type: 'directory', | |
defaultPath: './default/public/', | |
productionPath: './public/', | |
}, | |
]; | |
for (const defaultItem of defaultItems) { | |
try { | |
if (defaultItem.type === 'file') { | |
if (!fs.existsSync(defaultItem.productionPath)) { | |
fs.copyFileSync( | |
defaultItem.defaultPath, | |
defaultItem.productionPath, | |
); | |
console.log( | |
color.green(`Created default file: ${defaultItem.productionPath}`), | |
); | |
} | |
} else if (defaultItem.type === 'directory') { | |
fs.cpSync(defaultItem.defaultPath, defaultItem.productionPath, { | |
force: false, // Don't overwrite existing files! | |
recursive: true, | |
}); | |
console.log( | |
color.green(`Synchronized missing files: ${defaultItem.productionPath}`), | |
); | |
} else { | |
throw new Error( | |
'FATAL: Unexpected default file format in `post-install.js#createDefaultFiles()`.', | |
); | |
} | |
} catch (error) { | |
console.error( | |
color.red( | |
`FATAL: Could not write default ${defaultItem.type}: ${defaultItem.productionPath}`, | |
), | |
error, | |
); | |
} | |
} | |
} | |
try { | |
// 0. Convert config.conf to config.yaml | |
convertConfig(); | |
// 1. Create default config files | |
createDefaultFiles(); | |
// 2. Add missing config values | |
addMissingConfigValues(path.join(process.cwd(), './config.yaml')); | |
} catch (error) { | |
console.error(error); | |
} | |