minecraft-utils-shared
Version:
Shared utils for Minecraft Bedrock / Forge development related utilities.
170 lines (152 loc) • 4.22 kB
JavaScript
/**
* @file Minecraft Utils Shared - Configuration
* @license Apache-2.0
* @author Markus@Bordihn.de (Markus Bordihn)
*/
import chalk from 'chalk';
import fs from 'fs';
import path from 'path';
import files from './files.mjs';
import normalizer from './../helper/normalizer.mjs';
import defaultProjectConfig from './../default/project_config.mjs';
/**
* @returns {string}
*/
const getConfigurationExtension = () => {
switch (getConfigurationPath()) {
case '.minecraft-bedrock-utils':
return '.mbu';
case '.minecraft-forge-utils':
return '.mfu';
default:
return '.mus';
}
};
/**
* @returns {string}
*/
const getConfigurationPath = () => {
if (process.env) {
if (
(process.env.npm_lifecycle_script || '').includes(
'minecraft-bedrock-utils'
) ||
(process.env.npm_package_name || '').includes('minecraft-bedrock-utils')
) {
return '.minecraft-bedrock-utils';
} else if (
(process.env.npm_lifecycle_script || '').includes(
'minecraft-forge-utils'
) ||
(process.env.npm_package_name || '').includes('minecraft-forge-utils')
) {
return '.minecraft-forge-utils';
}
}
return '.minecraft-utils-shared';
};
// eslint-disable-next-line prefer-const
let configPath = path.join(process.cwd(), getConfigurationPath());
// eslint-disable-next-line prefer-const
let configExtension = getConfigurationExtension();
// eslint-disable-next-line prefer-const
let projectConfig = path.join(configPath, `project${configExtension}`);
/**
* @param {string} file
* @returns {Object}
*/
const loadConfig = (file) => {
if (!fs.existsSync(file)) {
console.error(chalk.red('Unable to load configuration file', file));
return {};
}
if (!file.endsWith(configExtension)) {
console.warn(
chalk.yellow(
`File is not ending with ${configExtension} suffix, but will try to load it!`
)
);
}
const configurationFile = fs.readFileSync(file);
return JSON.parse(configurationFile);
};
/**
* @param {string} name
* @returns {Object}
*/
const loadDefaultConfig = (name) => {
return loadConfig(path.join(configPath, normalizer.normalizeFileName(name)));
};
/**
* @returns {Object}
*/
const loadProjectConfig = () => {
if (!fs.existsSync(projectConfig)) {
if (!global.loadProjectConfigWarningShowed) {
console.warn(
chalk.yellow(
'⚠️ Project file',
projectConfig,
'does not exists, using automatic default values instead!'
)
);
global.loadProjectConfigWarningShowed = true;
}
return defaultProjectConfig.config;
}
return loadConfig(projectConfig);
};
/**
* @param {string} file
* @param {Object} options
*/
const saveConfig = (file, options = {}) => {
// Make sure file has an valid or known extension.
if (
!file.endsWith(configExtension) &&
!file.endsWith('.mbu') &&
!file.endsWith('.mfu') &&
!file.endsWith('.mus')
) {
file = `${file}${configExtension}`;
}
if (fs.existsSync(file)) {
console.log('Overwrite configuration for', options.name, 'in file', file);
files.createBackupFile(file);
} else {
console.log('Storing configuration for', options.name, 'in file', file);
}
// Remove context and other options to avoid a endless loop.
delete options.context;
delete options.save_config;
fs.writeFileSync(file, JSON.stringify(options, null, 2));
};
/**
* @param {string} name
* @param {Object} options
*/
const saveDefaultConfig = (name, options = {}) => {
files.createFolderIfNotExists(configPath);
saveConfig(
path.join(configPath, normalizer.normalizeFileName(name)),
options
);
};
/**
* @param {Object} options
*/
const saveProjectConfig = (options = {}) => {
files.createFolderIfNotExists(configPath);
saveConfig(projectConfig, options);
};
export default {
configExtension,
configPath,
loadConfig,
loadDefaultConfig,
loadProjectConfig,
projectConfig,
saveConfig,
saveDefaultConfig,
saveProjectConfig,
};