diff --git a/packages/pwa-kit-dev/src/configs/babel/babel-config.js b/packages/pwa-kit-dev/src/configs/babel/babel-config.js index bc0b8af56e..e61662a8a9 100644 --- a/packages/pwa-kit-dev/src/configs/babel/babel-config.js +++ b/packages/pwa-kit-dev/src/configs/babel/babel-config.js @@ -8,6 +8,7 @@ // PWA-Kit Imports import {getConfiguredExtensions} from '@salesforce/pwa-kit-extension-sdk/shared/utils' import {getConfig} from '@salesforce/pwa-kit-runtime/utils/ssr-config' +import path from 'path' export default { sourceType: 'unambiguous', @@ -60,13 +61,19 @@ export default { }, ignore: [ function (filepath) { + const normalizedPath = path.normalize(filepath) + + const extensionRegex = new RegExp( + `node_modules\\${path.sep}[^\\${path.sep}]+\\${path.sep}(pwa-kit-extension-sdk|@[^\\${path.sep}]+\\${path.sep}extension-|extension-)` + ) + // Return false if it's an allowed extension package @salesforce/pwa-kit-extension-sdk and extension-* - if (/node_modules\/@[^/]+\/(pwa-kit-extension-sdk|extension-)/.test(filepath)) { + if (extensionRegex.test(normalizedPath)) { return false } // Return true if it's in node_modules (excluding allowed packages handled above) - if (/node_modules/.test(filepath)) { + if (/node_modules/.test(normalizedPath)) { return true } diff --git a/packages/pwa-kit-dev/src/configs/webpack/config.js b/packages/pwa-kit-dev/src/configs/webpack/config.js index f0d6a3b175..99b09c6637 100644 --- a/packages/pwa-kit-dev/src/configs/webpack/config.js +++ b/packages/pwa-kit-dev/src/configs/webpack/config.js @@ -9,7 +9,7 @@ // For more information on these settings, see https://webpack.js.org/configuration import {BundleAnalyzerPlugin} from 'webpack-bundle-analyzer' -import {resolve} from 'path' +import path, {resolve} from 'path' import fse from 'fs-extra' import webpack from 'webpack' @@ -341,7 +341,10 @@ const ruleForBabelLoader = (babelPlugins) => { test: /(\.js(x?)|\.ts(x?))$/, // NOTE: Because our extensions are just folders containing source code, we need to ensure that the babel-loader processes them. // This regex exclude everything in node_modules, but node_modules/extensions-*/ folders - exclude: /node_modules\/(?!(@?[^/]+\/)?extension-)[^/]+\/.*$/i, + exclude: new RegExp( + `node_modules\\${path.sep}(?!(@?[^\\${path.sep}]+\\${path.sep})?extension-).*`, + 'i' + ), use: [ { loader: findDepInStack('babel-loader'), diff --git a/packages/pwa-kit-extension-sdk/src/configs/babel/utils.ts b/packages/pwa-kit-extension-sdk/src/configs/babel/utils.ts index 004f853407..49e73b6019 100644 --- a/packages/pwa-kit-extension-sdk/src/configs/babel/utils.ts +++ b/packages/pwa-kit-extension-sdk/src/configs/babel/utils.ts @@ -21,8 +21,22 @@ import {getConfiguredExtensions} from '../../shared/utils' * if no actual extensions are added. */ const NODE_MODULES_PATH = 'node_modules' -const SERVER_PATH = `${NODE_MODULES_PATH}/@salesforce/pwa-kit-runtime/ssr/server/build-remote-server.js` -const PLACEHOLDER_PATH = `${NODE_MODULES_PATH}/@salesforce/pwa-kit-extension-sdk/express/placeholders/application-extensions.js` +const SERVER_PATH = p.join( + NODE_MODULES_PATH, + '@salesforce', + 'pwa-kit-runtime', + 'ssr', + 'server', + 'build-remote-server.js' +) +const PLACEHOLDER_PATH = p.join( + NODE_MODULES_PATH, + '@salesforce', + 'pwa-kit-extension-sdk', + 'express', + 'placeholders', + 'application-extensions.js' +) /** * Builds Babel extensibility arguments for processing specific files and paths. @@ -31,21 +45,29 @@ const PLACEHOLDER_PATH = `${NODE_MODULES_PATH}/@salesforce/pwa-kit-extension-sdk * or symlinked paths that Babel doesn't support by using realpathSync. */ export const buildBabelExtensibilityArgs = (config: any) => { - const extensions = getConfiguredExtensions(config) - const serverPath = fse.realpathSync(p.resolve(SERVER_PATH)) - const placeHolderPath = fse.realpathSync(p.resolve(PLACEHOLDER_PATH)) + try { + const extensions = getConfiguredExtensions(config) + const serverPath = fse.realpathSync(p.resolve(SERVER_PATH)) + const placeHolderPath = fse.realpathSync(p.resolve(PLACEHOLDER_PATH)) - const extensionSrcPaths = - extensions.length > 0 - ? extensions.map( - ([packageName]) => - fse.realpathSync(p.resolve(`${NODE_MODULES_PATH}/${packageName}/src`)) + '/**' - ) - : [] + const extensionSrcPaths = + extensions.length > 0 + ? extensions.map( + ([packageName]) => + fse.realpathSync( + p.resolve(p.join(NODE_MODULES_PATH, packageName, 'src')) + ) + `${p.sep}**` + ) + : [] - const extensionsPathsStr = extensionSrcPaths.length > 0 ? `,${extensionSrcPaths.join(',')}` : '' + const extensionsPathsStr = + extensionSrcPaths.length > 0 ? `,${extensionSrcPaths.join(',')}` : '' - const babelArgs = `--only "app/**,${serverPath},${placeHolderPath}${extensionsPathsStr}"` + const babelArgs = `--only "${`app${p.sep}**`},${serverPath},${placeHolderPath}${extensionsPathsStr}"` - return babelArgs + return babelArgs + } catch (error) { + console.error('Error building Babel extensibility arguments:', error) + throw error + } } diff --git a/packages/pwa-kit-extension-sdk/src/configs/utils.test.ts b/packages/pwa-kit-extension-sdk/src/configs/utils.test.ts index 323fc70af2..9dcc662a42 100644 --- a/packages/pwa-kit-extension-sdk/src/configs/utils.test.ts +++ b/packages/pwa-kit-extension-sdk/src/configs/utils.test.ts @@ -30,16 +30,16 @@ describe('buildBabelExtensibilityArgs', () => { beforeEach(() => { realpathSyncMock.mockImplementation((filePath: string) => { if (filePath.includes('build-remote-server.js')) { - return '/absolute/path/to/build-remote-server.js' + return normalizePath('/absolute/path/to/build-remote-server.js') } if (filePath.includes('application-extensions.js')) { - return '/absolute/path/to/application-extensions.js' + return normalizePath('/absolute/path/to/application-extensions.js') } if (filePath.includes(normalizePath('@salesforce/extension-this/src'))) { - return '/absolute/path/to/@salesforce/extension-this/src' + return normalizePath('/absolute/path/to/@salesforce/extension-this/src') } if (filePath.includes(normalizePath('@salesforce/extension-that/src'))) { - return '/absolute/path/to/@salesforce/extension-that/src' + return normalizePath('/absolute/path/to/@salesforce/extension-that/src') } throw new Error(`Unexpected path: ${filePath}`) }) @@ -50,7 +50,7 @@ describe('buildBabelExtensibilityArgs', () => { }) test('should return the correct Babel arguments string', () => { - const expectedArgs = `--only "app/**,/absolute/path/to/build-remote-server.js,/absolute/path/to/application-extensions.js,/absolute/path/to/@salesforce/extension-this/src/**,/absolute/path/to/@salesforce/extension-that/src/**"` + const expectedArgs = `--only "app${path.sep}**,${path.sep}absolute${path.sep}path${path.sep}to${path.sep}build-remote-server.js,${path.sep}absolute${path.sep}path${path.sep}to${path.sep}application-extensions.js,${path.sep}absolute${path.sep}path${path.sep}to${path.sep}@salesforce${path.sep}extension-this${path.sep}src${path.sep}**,${path.sep}absolute${path.sep}path${path.sep}to${path.sep}@salesforce${path.sep}extension-that${path.sep}src${path.sep}**"` const result = buildBabelExtensibilityArgs(CONFIG) expect(result).toBe(expectedArgs) }) @@ -78,7 +78,7 @@ describe('buildBabelExtensibilityArgs', () => { }) test('should handle an empty list of configured extensions', () => { - const expectedArgs = `--only "app/**,/absolute/path/to/build-remote-server.js,/absolute/path/to/application-extensions.js"` + const expectedArgs = `--only "app${path.sep}**,${path.sep}absolute${path.sep}path${path.sep}to${path.sep}build-remote-server.js,${path.sep}absolute${path.sep}path${path.sep}to${path.sep}application-extensions.js"` const result = buildBabelExtensibilityArgs({app: {extensions: []}}) expect(result).toBe(expectedArgs) const result2 = buildBabelExtensibilityArgs({app: {}})