daizong
Version:
`package.json` script runner for ES Modules
79 lines • 2.44 kB
JavaScript
import * as fs from 'fs';
import * as np from 'path';
import { fileURLToPath } from 'url';
const settingsKey = '_';
const dirname = np.dirname(fileURLToPath(import.meta.url));
async function fileExists(file) {
return fs.promises
.access(file, fs.constants.F_OK)
.then(() => true)
.catch(() => false);
}
function normalizeImport(path) {
path = np.relative(dirname, path);
if (process.platform === 'win32') {
return path.split(np.sep).join(np.posix.sep);
}
return path;
}
async function getConfigPath(files) {
for (const file of files) {
if (await fileExists(file)) {
return file;
}
}
throw new Error(`Config file "${files[0]}" does not exist.`);
}
export async function loadConfig(configFile) {
configFile = await getConfigPath(configFile
? [configFile]
: ['daizong.config.js', 'daizong.config.mjs', 'daizong.config.cjs']);
const rawConfig = (await import(normalizeImport(configFile)))
?.default;
const rawSettings = (rawConfig[settingsKey] ||
{});
delete rawConfig[settingsKey];
const rawTasks = rawConfig;
const settings = { envGroups: {} };
settings.defaultEnv = rawSettings.defaultEnv;
if (rawSettings.envGroups) {
settings.envGroups = rawSettings.envGroups;
}
const tasks = { ...rawTasks };
const { privateTasks } = rawSettings;
if (privateTasks) {
for (const [key, value] of Object.entries(privateTasks)) {
if (!value) {
continue;
}
if (rawTasks[key]) {
throw new Error(`Task "${key}" is already defined in public tasks`);
}
value.__isPrivate = true;
tasks[key] = value;
}
delete rawSettings.privateTasks;
}
for (const [name, task] of Object.entries(tasks)) {
if (!task) {
continue;
}
const { alias } = task;
if (alias) {
if (task.__isPrivate) {
throw new Error(`Private cannot have an alias. Task: "${name}", alias: "${alias}"`);
}
if (tasks[alias]) {
throw new Error(`Duplicate name "${alias}"`);
}
tasks[alias] = task;
}
}
const config = {
settings,
tasks,
path: configFile,
};
return config;
}
//# sourceMappingURL=config.js.map