diff --git a/.eslintignore b/.eslintignore index 7de3c52e39db..75d57fa61623 100644 --- a/.eslintignore +++ b/.eslintignore @@ -2,3 +2,4 @@ /docs /__tests__/fixtures/cli-utils.js /stubs/* +/src/util/requireOrImportConfig.js diff --git a/package.json b/package.json index 19b7cb46e9b4..6ab1aea3115f 100644 --- a/package.json +++ b/package.json @@ -94,6 +94,9 @@ } } ] + ], + "exclude": [ + "src/util/requireOrImportConfig.js" ] }, "jest": { diff --git a/src/index.js b/src/index.js index e516e9a31c60..d3ebef849c90 100644 --- a/src/index.js +++ b/src/index.js @@ -9,6 +9,7 @@ import processTailwindFeatures from './processTailwindFeatures' import formatCSS from './lib/formatCSS' import resolveConfig from './util/resolveConfig' import getAllConfigs from './util/getAllConfigs' +import requireOrImportConfig from './util/requireOrImportConfig' import { supportedConfigFiles } from './constants' import defaultConfig from '../stubs/defaultConfig.stub.js' @@ -45,7 +46,7 @@ function resolveConfigPath(filePath) { return undefined } -const getConfigFunction = (config) => () => { +const getConfigFunction = (config) => async () => { if (_.isUndefined(config)) { return resolveConfig([...getAllConfigs(defaultConfig)]) } @@ -59,7 +60,9 @@ const getConfigFunction = (config) => () => { } } - const configObject = _.isObject(config) ? _.get(config, 'config', config) : require(config) + const configObject = _.isObject(config) + ? _.get(config, 'config', config) + : await requireOrImportConfig(config) return resolveConfig([...getAllConfigs(configObject)]) } diff --git a/src/processTailwindFeatures.js b/src/processTailwindFeatures.js index 76b335fddd1c..bb76f60a7542 100644 --- a/src/processTailwindFeatures.js +++ b/src/processTailwindFeatures.js @@ -25,8 +25,8 @@ let processedPlugins = null let getProcessedPlugins = null export default function (getConfig) { - return function (css) { - const config = getConfig() + return async function (css) { + const config = await getConfig() const configChanged = hash(previousConfig) !== hash(config) previousConfig = config diff --git a/src/util/requireOrImportConfig.js b/src/util/requireOrImportConfig.js new file mode 100644 index 000000000000..ddd32217c3aa --- /dev/null +++ b/src/util/requireOrImportConfig.js @@ -0,0 +1,26 @@ +"use strict"; + +// Node v12.17+ exposes `import` within CJS files +// in order to `require` ESM files. + +// This file is intentionally excluded from `babel` (and `eslint`) +// to avoid transpiling away the `import` statement + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +exports.default = requireOrImportConfig; + +function requireOrImportConfig(config) { + try { + return require(config) + } catch (e) { + if (e.code === 'ERR_REQUIRE_ESM') { + try { + return import(config).then(mdl => mdl.default) + } catch (e) {} + } + } + return null; +}