diff --git a/src/README.md b/src/README.md index b9faaa8..9698a1d 100644 --- a/src/README.md +++ b/src/README.md @@ -150,6 +150,8 @@ dotenv parameters are string based, failed or missing dotenv parameters return a ## Global * [Global](#module_Global) + * [~jsFileExtensions](#module_Global..jsFileExtensions) : Array.<string> + * [~tsFileExtensions](#module_Global..tsFileExtensions) : Array.<string> * [~contextPath](#module_Global..contextPath) : string * [~OPTIONS](#module_Global..OPTIONS) : Object * [~errorMessageHandler(errors)](#module_Global..errorMessageHandler) ⇒ string \| any \| Array.<any> @@ -157,6 +159,18 @@ dotenv parameters are string based, failed or missing dotenv parameters return a * [~dynamicImport(file)](#module_Global..dynamicImport) ⇒ Promise.<any> * [~createFile(contents, options)](#module_Global..createFile) ⇒ Object + + +### Global~jsFileExtensions : Array.<string> +JS file extensions + +**Kind**: inner constant of [Global](#module_Global) + + +### Global~tsFileExtensions : Array.<string> +TS file extensions + +**Kind**: inner constant of [Global](#module_Global) ### Global~contextPath : string @@ -453,7 +467,7 @@ Start webpack development or production. * [webpackConfigs](#module_webpackConfigs) * [~preprocessLoader(dotenv, options)](#module_webpackConfigs..preprocessLoader) ⇒ Object - * [~common(dotenv, options)](#module_webpackConfigs..common) ⇒ Object + * [~common(dotenv)](#module_webpackConfigs..common) ⇒ Object * [~development(dotenv)](#module_webpackConfigs..development) ⇒ Object * [~production(dotenv)](#module_webpackConfigs..production) ⇒ Object @@ -483,7 +497,7 @@ Assumption based preprocess loader -### webpackConfigs~common(dotenv, options) ⇒ Object +### webpackConfigs~common(dotenv) ⇒ Object Common webpack settings between environments. **Kind**: inner method of [webpackConfigs](#module_webpackConfigs) @@ -512,10 +526,6 @@ Common webpack settings between environments. dotenv._BUILD_STATIC_DIRstring dotenv._BUILD_UI_NAMEstring - - optionsobject - - options.loaderstring diff --git a/src/__tests__/__snapshots__/global.test.js.snap b/src/__tests__/__snapshots__/global.test.js.snap index 6fc8089..e8c398a 100644 --- a/src/__tests__/__snapshots__/global.test.js.snap +++ b/src/__tests__/__snapshots__/global.test.js.snap @@ -37,6 +37,18 @@ exports[`Global should return specific properties: specific properties 1`] = ` "dynamicImport": [Function], "errorMessageHandler": [Function], "isPromise": [Function], + "jsFileExtensions": [ + "js", + "jsx", + "mjs", + "cjs", + ], + "tsFileExtensions": [ + "ts", + "tsx", + "mts", + "cts", + ], } `; diff --git a/src/__tests__/__snapshots__/wp.test.js.snap b/src/__tests__/__snapshots__/wp.test.js.snap index cf857be..5a6702c 100644 --- a/src/__tests__/__snapshots__/wp.test.js.snap +++ b/src/__tests__/__snapshots__/wp.test.js.snap @@ -427,15 +427,20 @@ exports[`webpack should create a webpack config with language: language configur ], "resolve": { "extensions": [ - ".jsx", ".js", + ".jsx", ".mjs", ".cjs" ] }, "use": [ { - "loader": "babel-loader" + "loader": "babel-loader", + "options": { + "presets": [ + "@babel/preset-env" + ] + } } ] } @@ -618,15 +623,20 @@ exports[`webpack should create a webpack config with language: language configur ], "resolve": { "extensions": [ - ".jsx", ".js", + ".jsx", ".mjs", ".cjs" ] }, "use": [ { - "loader": "babel-loader" + "loader": "babel-loader", + "options": { + "presets": [ + "@babel/preset-env" + ] + } } ] } diff --git a/src/__tests__/__snapshots__/wpConfigs.test.js.snap b/src/__tests__/__snapshots__/wpConfigs.test.js.snap index 30d69b0..541aeed 100644 --- a/src/__tests__/__snapshots__/wpConfigs.test.js.snap +++ b/src/__tests__/__snapshots__/wpConfigs.test.js.snap @@ -592,16 +592,16 @@ exports[`webpackConfigs should return a development configuration object: develo exports[`webpackConfigs should return a preprocessLoader configuration object: language dev, prod hashes 1`] = ` [ { - "devHash": "94105185f5f28d4ba07282938bd4d43a", + "devHash": "b1a27bfb44b6063a2a599931989a64f8", "isEqual": true, "loader": "js", - "prodHash": "94105185f5f28d4ba07282938bd4d43a", + "prodHash": "b1a27bfb44b6063a2a599931989a64f8", }, { - "devHash": "3905735acd7ce27ca46d4aaad2d6aa1d", + "devHash": "6cf8d288bb31e0a6e6c97b9d54e0c192", "isEqual": true, "loader": "ts", - "prodHash": "3905735acd7ce27ca46d4aaad2d6aa1d", + "prodHash": "6cf8d288bb31e0a6e6c97b9d54e0c192", }, { "devHash": "49e595be76828acf4f2a3617fea9a378", @@ -623,15 +623,20 @@ exports[`webpackConfigs should return a preprocessLoader configuration object: p ], "resolve": { "extensions": [ - ".jsx", ".js", + ".jsx", ".mjs", ".cjs" ] }, "use": [ { - "loader": "babel-loader" + "loader": "babel-loader", + "options": { + "presets": [ + "@babel/preset-env" + ] + } } ] } @@ -659,10 +664,14 @@ exports[`webpackConfigs should return a preprocessLoader configuration object: p ], "resolve": { "extensions": [ - "tsx", ".ts", + ".tsx", + ".mts", + ".cts", + ".js", ".jsx", - ".js" + ".mjs", + ".cjs" ] }, "use": [ diff --git a/src/global.js b/src/global.js index ec6c012..60ddec3 100644 --- a/src/global.js +++ b/src/global.js @@ -7,6 +7,20 @@ const { consoleMessage } = require('./logger'); * @module Global */ +/** + * JS file extensions + * + * @type {string[]} + */ +const jsFileExtensions = ['js', 'jsx', 'mjs', 'cjs']; + +/** + * TS file extensions + * + * @type {string[]} + */ +const tsFileExtensions = ['ts', 'tsx', 'mts', 'cts']; + /** * Handle a variety of error types consistently. * @@ -153,4 +167,13 @@ const OPTIONS = { } }; -module.exports = { contextPath, createFile, dynamicImport, errorMessageHandler, isPromise, OPTIONS }; +module.exports = { + contextPath, + createFile, + dynamicImport, + errorMessageHandler, + jsFileExtensions, + isPromise, + OPTIONS, + tsFileExtensions +}; diff --git a/src/wpConfigs.js b/src/wpConfigs.js index d009edf..1806f2a 100644 --- a/src/wpConfigs.js +++ b/src/wpConfigs.js @@ -8,7 +8,7 @@ const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const SvgToMiniDataURI = require('mini-svg-data-uri'); const TerserJSPlugin = require('terser-webpack-plugin'); const { babelLoaderResolve, cssLoaderResolve, tsLoaderResolve } = require('../lib/packages'); -const { OPTIONS } = require('./global'); +const { jsFileExtensions, OPTIONS, tsFileExtensions } = require('./global'); const { consoleMessage } = require('./logger'); const { setupWebpackDotenvFilesForEnv } = require('./dotenv'); @@ -32,10 +32,10 @@ const preprocessLoader = ({ _BUILD_SRC_DIR: SRC_DIR = '' } = OPTIONS.dotenv || { case 'js': return [ { - test: /\.(jsx|[cm]?js)?$/, + test: new RegExp(`\\.(${jsFileExtensions.join('|')})?$`), include: [SRC_DIR], resolve: { - extensions: ['.jsx', '.js', '.cjs', '.mjs'] + extensions: jsFileExtensions.map(ext => `.${ext}`) }, use: [ { @@ -50,11 +50,11 @@ const preprocessLoader = ({ _BUILD_SRC_DIR: SRC_DIR = '' } = OPTIONS.dotenv || { case 'ts': return [ { - test: /\.(jsx|tsx|[cm]?ts|[cm]?js)?$/, + test: new RegExp(`\\.(${[...tsFileExtensions, ...jsFileExtensions].join('|')})?$`), include: [SRC_DIR], resolve: { // Dependent on tsconfig resolutions may, or may not, be necessary - extensions: ['.tsx', '.ts', '.mts', '.cts', '.jsx', '.js', '.mjs', '.cjs'] + extensions: [...tsFileExtensions, ...jsFileExtensions].map(ext => `.${ext}`) }, use: [ { @@ -82,8 +82,6 @@ const preprocessLoader = ({ _BUILD_SRC_DIR: SRC_DIR = '' } = OPTIONS.dotenv || { * @param {string} dotenv._BUILD_SRC_DIR * @param {string} dotenv._BUILD_STATIC_DIR * @param {string} dotenv._BUILD_UI_NAME - * @param {object} options - * @param {string} options.loader * @returns {{output: {path: string, filename: string, publicPath: string, clean: boolean}, entry: {app: string}, * resolve: {cacheWithContext: boolean, symlinks: boolean}, plugins: any[], module: {rules: Array}}} */ @@ -97,29 +95,20 @@ const common = ( _BUILD_SRC_DIR: SRC_DIR = '', _BUILD_STATIC_DIR: STATIC_DIR = '', _BUILD_UI_NAME: UI_NAME - } = OPTIONS.dotenv || {}, - { loader } = OPTIONS + } = OPTIONS.dotenv || {} ) => ({ context: RELATIVE_DIRNAME, entry: { app: (() => { let entryFiles; try { - const entryFilesSet = new Set([ - path.join(SRC_DIR, `${APP_INDEX_PREFIX}.js`), - path.join(SRC_DIR, `${APP_INDEX_PREFIX}.mjs`), - path.join(SRC_DIR, `${APP_INDEX_PREFIX}.cjs`), - path.join(SRC_DIR, `${APP_INDEX_PREFIX}.jsx`), - path.join(SRC_DIR, `${APP_INDEX_PREFIX}.ts`), - path.join(SRC_DIR, `${APP_INDEX_PREFIX}.mts`), - path.join(SRC_DIR, `${APP_INDEX_PREFIX}.cts`), - path.join(SRC_DIR, `${APP_INDEX_PREFIX}.tsx`) - ]); + const fileExtensions = [...tsFileExtensions, ...jsFileExtensions]; + const entryFilesSet = new Set([...fileExtensions.map(ext => path.join(SRC_DIR, `${APP_INDEX_PREFIX}.${ext}`))]); entryFiles = Array.from(entryFilesSet).filter(file => fs.existsSync(file)); if (!entryFiles.length) { consoleMessage.warn( - `webpack app entry file error: Missing entry/app file. Expected an index file! ${APP_INDEX_PREFIX}.(${loader}x|[cm]?${loader})` + `webpack app entry file error: Missing entry/app file. Expected an index file! ${APP_INDEX_PREFIX}.(${fileExtensions.join('|')})` ); } } catch (e) {