UNPKG

@lipemat/js-boilerplate

Version:

Dependencies and scripts for a no config JavaScript app

199 lines (198 loc) 6.36 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getDefaultBrowsersList = void 0; exports.hasLocalOverride = hasLocalOverride; exports.getConfig = getConfig; exports.getExtensionsConfig = getExtensionsConfig; exports.getTsConfigFile = getTsConfigFile; exports.getBrowsersList = getBrowsersList; exports.adjustBrowserslist = adjustBrowserslist; const fs_1 = require("fs"); const path_1 = require("path"); const package_config_1 = require("./package-config"); // Must be required to avoid issues with browserslist. const browserslist = require('browserslist'); const { dependencies, devDependencies, workingDirectory, packageDirectory } = (0, package_config_1.getPackageConfig)(); const extensions = [ ...Object.keys(dependencies ?? {}).filter(name => name.includes('js-boilerplate-')), ...Object.keys(devDependencies ?? {}).filter(name => name.includes('js-boilerplate-')), ]; /** * Check to see if a local config file exists. * * @param {string} fileName * @param {boolean} inWorkingDirectory - Look in working directory instead of their /config directory * * @return {boolean} */ function hasLocalOverride(fileName, inWorkingDirectory = false) { let hasLocal = false; try { if (inWorkingDirectory) { require((0, path_1.resolve)(workingDirectory, fileName)); hasLocal = true; } else { require((0, path_1.resolve)(packageDirectory + '/config', fileName)); hasLocal = true; } } catch (e) { if (e instanceof Error) { if (!('code' in e) || 'MODULE_NOT_FOUND' !== e.code) { console.error(e); } } } return hasLocal; } /** * Get a config from our /config directory merged with any * matching configuration from the project directory. * * For instance if we have a file named config/babel.config.js in our project * we will merge the contents with our config/babel.config.js in favor of whatever * is specified with the project's file. * * If the `module.exports` are a function, the existing configuration will be passed * as the only argument. Otherwise, standard `module.exports` are also supported. * * @example ```ts * // standard * module.export = { * externals: {extra: 'Extra'} * } * // function * module.exports = function( config ) { * return { * externals: {...config.externals, extra: 'Extra'} * } * } * ``` * * @param {string} fileName * * @return {Object} */ function getConfig(fileName) { let mergedConfig = require('../config/' + fileName); mergedConfig = { ...mergedConfig, ...getExtensionsConfig(fileName, mergedConfig) }; try { const localConfig = require((0, path_1.resolve)(packageDirectory + '/config', fileName)); if ('function' === typeof localConfig) { mergedConfig = { ...mergedConfig, ...localConfig(mergedConfig) }; } else { mergedConfig = { ...mergedConfig, ...localConfig }; } } catch (e) { if (e instanceof Error) { if (!('code' in e) || 'MODULE_NOT_FOUND' !== e.code) { console.error(e); } } } return mergedConfig; } /** * Get a config from any existing extension's /config directories * merged into one. * * @param {string} fileName * @param {Object} defaultConfig - Default config from this package. * Used for passing to an extension callback. * * @see getConfig * * @return {Object} */ function getExtensionsConfig(fileName, defaultConfig) { let mergedConfig = {}; extensions.forEach(extension => { try { const extensionConfig = require(extension + '/config/' + fileName); if ('function' === typeof extensionConfig) { mergedConfig = { ...mergedConfig, ...extensionConfig({ ...defaultConfig, ...mergedConfig }) }; } else { mergedConfig = { ...mergedConfig, ...extensionConfig }; } } catch (e) { if (e instanceof Error) { if (!('code' in e) || 'MODULE_NOT_FOUND' !== e.code) { console.error(e); } } } }); return mergedConfig; } /** * Get the path to the "tsconfig.json" file if it exists. * * 1. The working directory. * 2. The package directory. * * The package directory takes priority over the working directory. * * * @return {string} */ function getTsConfigFile() { const possibles = [ // Backward compatible for before @lipemat/eslint-config version 3. (0, path_1.resolve)(workingDirectory + '/tsconfig.json'), (0, path_1.resolve)(packageDirectory + '/tsconfig.json'), ].filter(fs_1.existsSync); let tsConfig = ''; possibles.forEach(filePath => { tsConfig = filePath; }); return tsConfig; } /** * Get the browserslist from the current project. * * - If specified using standard browserslist config, we will use that. * * @link https://github.com/browserslist/browserslist#config-file */ function getBrowsersList() { const projectBrowsersList = browserslist(); if (browserslist(browserslist.defaults) === projectBrowsersList) { const wp = [...require('@wordpress/browserslist-config')]; return adjustBrowserslist(wp); } return projectBrowsersList; } /** * If browserslist is not specified, we fall back to WordPress defaults. * * - Return the default browserslist if the current project does not specify one. * - Return false if a browserslist is specified. * * Used in cases where we can fall back to standard browserslist config if the project * has not specified one. * * @deprecated Use getBrowsersList instead. * * @link https://github.com/browserslist/browserslist#config-file * * @return {boolean | string[]} */ const getDefaultBrowsersList = () => { if (browserslist(browserslist.defaults) === browserslist()) { const wp = [...require('@wordpress/browserslist-config')]; return adjustBrowserslist(wp); } return false; }; exports.getDefaultBrowsersList = getDefaultBrowsersList; /** * Adjust the browserslist to include our defaults. */ function adjustBrowserslist(browserRules) { return browserRules; }