From 0556cf9b2088b5eb21a1787c1e822e53fa6f59bf Mon Sep 17 00:00:00 2001 From: Igor Randjelovic Date: Sun, 10 Jul 2022 11:34:23 +0200 Subject: [PATCH] refactor(webpack): use real modules and deprecate virtual modules --- .../__snapshots__/javascript.spec.ts.snap | 24 ++------------ .../__snapshots__/typescript.spec.ts.snap | 24 ++------------ .../configuration/typescript.spec.ts | 33 ++++++++++--------- .../webpack5/src/configuration/javascript.ts | 16 +++------ .../webpack5/src/configuration/typescript.ts | 16 +++------ .../webpack5/src/helpers/virtualModules.ts | 6 ++++ .../src/stubs/virtual-entry-javascript.js | 5 +++ .../src/stubs/virtual-entry-typescript.js | 5 +++ 8 files changed, 46 insertions(+), 83 deletions(-) create mode 100644 packages/webpack5/src/stubs/virtual-entry-javascript.js create mode 100644 packages/webpack5/src/stubs/virtual-entry-typescript.js diff --git a/packages/webpack5/__tests__/configuration/__snapshots__/javascript.spec.ts.snap b/packages/webpack5/__tests__/configuration/__snapshots__/javascript.spec.ts.snap index a72f3b8de..d52f8d5b1 100644 --- a/packages/webpack5/__tests__/configuration/__snapshots__/javascript.spec.ts.snap +++ b/packages/webpack5/__tests__/configuration/__snapshots__/javascript.spec.ts.snap @@ -302,16 +302,6 @@ exports[`javascript configuration for android 1`] = ` ), /* config.plugin('WatchStatePlugin') */ new WatchStatePlugin(), - /* config.plugin('ContextExclusionPlugin|__@nativescript_webpack_virtual_entry_javascript__') */ - new ContextExclusionPlugin( - /__@nativescript_webpack_virtual_entry_javascript__.js$/ - ), - /* config.plugin('VirtualModulesPlugin') */ - new VirtualModulesPlugin( - { - '__jest__/src/__@nativescript_webpack_virtual_entry_javascript__': '// VIRTUAL ENTRY START\\\\nrequire(\\\\'@nativescript/core/bundle-entry-points\\\\')\\\\nconst context = require.context(\\"~/\\", /* deep: */ true, /* filter: */ /.(xml|js|s?css)$/);\\\\nglobal.registerWebpackModules(context);\\\\n// VIRTUAL ENTRY END' - } - ), /* config.plugin('ContextExclusionPlugin|exclude_files') */ new ContextExclusionPlugin( /\\\\b_.+\\\\./ @@ -320,7 +310,7 @@ exports[`javascript configuration for android 1`] = ` entry: { bundle: [ '@nativescript/core/globals/index', - '__jest__/src/__@nativescript_webpack_virtual_entry_javascript__', + '__jest__/node_modules/@nativescript/webpack/dist/stubs/virtual-entry-javascript', '@nativescript/core/bundle-entry-points', '__jest__/src/app.js', '@nativescript/core/ui/frame', @@ -632,16 +622,6 @@ exports[`javascript configuration for ios 1`] = ` ), /* config.plugin('WatchStatePlugin') */ new WatchStatePlugin(), - /* config.plugin('ContextExclusionPlugin|__@nativescript_webpack_virtual_entry_javascript__') */ - new ContextExclusionPlugin( - /__@nativescript_webpack_virtual_entry_javascript__.js$/ - ), - /* config.plugin('VirtualModulesPlugin') */ - new VirtualModulesPlugin( - { - '__jest__/src/__@nativescript_webpack_virtual_entry_javascript__': '// VIRTUAL ENTRY START\\\\nrequire(\\\\'@nativescript/core/bundle-entry-points\\\\')\\\\nconst context = require.context(\\"~/\\", /* deep: */ true, /* filter: */ /.(xml|js|s?css)$/);\\\\nglobal.registerWebpackModules(context);\\\\n// VIRTUAL ENTRY END' - } - ), /* config.plugin('ContextExclusionPlugin|exclude_files') */ new ContextExclusionPlugin( /\\\\b_.+\\\\./ @@ -650,7 +630,7 @@ exports[`javascript configuration for ios 1`] = ` entry: { bundle: [ '@nativescript/core/globals/index', - '__jest__/src/__@nativescript_webpack_virtual_entry_javascript__', + '__jest__/node_modules/@nativescript/webpack/dist/stubs/virtual-entry-javascript', '@nativescript/core/bundle-entry-points', '__jest__/src/app.js' ], diff --git a/packages/webpack5/__tests__/configuration/__snapshots__/typescript.spec.ts.snap b/packages/webpack5/__tests__/configuration/__snapshots__/typescript.spec.ts.snap index 5831fac29..39af4794d 100644 --- a/packages/webpack5/__tests__/configuration/__snapshots__/typescript.spec.ts.snap +++ b/packages/webpack5/__tests__/configuration/__snapshots__/typescript.spec.ts.snap @@ -302,16 +302,6 @@ exports[`typescript configuration for android 1`] = ` ), /* config.plugin('WatchStatePlugin') */ new WatchStatePlugin(), - /* config.plugin('ContextExclusionPlugin|__@nativescript_webpack_virtual_entry_typescript__') */ - new ContextExclusionPlugin( - /__@nativescript_webpack_virtual_entry_typescript__.js$/ - ), - /* config.plugin('VirtualModulesPlugin') */ - new VirtualModulesPlugin( - { - '__jest__/src/__@nativescript_webpack_virtual_entry_typescript__': '// VIRTUAL ENTRY START\\\\nrequire(\\\\'@nativescript/core/bundle-entry-points\\\\')\\\\nconst context = require.context(\\"~/\\", /* deep: */ true, /* filter: */ /\\\\\\\\.(xml|js|(? { }); } - it('filter typescript declaration files', () => { + it('filters typescript declaration files', () => { init({ ios: true, }); - const tsConfig = typescript(new Config()); + // const tsConfig = typescript(new Config()); let regex: RegExp; - // Get the filterRE from the typescript configuration - tsConfig.plugin('VirtualModulesPlugin').tap((args) => { - const options = args[0]; - const virtualConfig: string = options[Object.keys(options)[0]]; - const filterLine = virtualConfig - .split('\n') - .find((v) => v.includes('filter')); - const matches = filterLine.match(/\/(?\S+)\//); + const virtualEntryPath = path.join( + __dirname, + '../../src/stubs/virtual-entry-typescript.js' + ); + const virtualEntry = fs.readFileSync(virtualEntryPath); - if (matches) { - regex = new RegExp(matches.groups.filter); - } + const filterLine = virtualEntry + .toString() + .split('\n') + .find((v) => v.includes('filter')); - return args; - }); + const matches = filterLine.match(/\/(?\S+)\//); + + if (matches) { + regex = new RegExp(matches.groups.filter); + } expect(regex).toBeDefined(); diff --git a/packages/webpack5/src/configuration/javascript.ts b/packages/webpack5/src/configuration/javascript.ts index 914036eb2..d0af14695 100644 --- a/packages/webpack5/src/configuration/javascript.ts +++ b/packages/webpack5/src/configuration/javascript.ts @@ -1,26 +1,18 @@ import Config from 'webpack-chain'; import { getEntryPath, getEntryDirPath } from '../helpers/platform'; -import { addVirtualEntry } from '../helpers/virtualModules'; import { chainedSetAddAfter } from '../helpers/chain'; import { env as _env, IWebpackEnv } from '../index'; import { ContextExclusionPlugin } from 'webpack'; import base from './base'; +import path from 'path'; export default function (config: Config, env: IWebpackEnv = _env): Config { base(config, env); const entryPath = getEntryPath(); - const filterRE = '/.(xml|js|s?css)$/'; - const virtualEntryPath = addVirtualEntry( - config, - 'javascript', - ` - // VIRTUAL ENTRY START - require('@nativescript/core/bundle-entry-points') - const context = require.context("~/", /* deep: */ true, /* filter: */ ${filterRE}); - global.registerWebpackModules(context); - // VIRTUAL ENTRY END - ` + const virtualEntryPath = path.resolve( + __dirname, + '../stubs/virtual-entry-javascript' ); // exclude files starting with _ from require.context diff --git a/packages/webpack5/src/configuration/typescript.ts b/packages/webpack5/src/configuration/typescript.ts index 4513af52d..da0409319 100644 --- a/packages/webpack5/src/configuration/typescript.ts +++ b/packages/webpack5/src/configuration/typescript.ts @@ -1,26 +1,18 @@ import Config from 'webpack-chain'; import { getEntryDirPath, getEntryPath } from '../helpers/platform'; -import { addVirtualEntry } from '../helpers/virtualModules'; import { chainedSetAddAfter } from '../helpers/chain'; import { env as _env, IWebpackEnv } from '../index'; import { ContextExclusionPlugin } from 'webpack'; import base from './base'; +import path from 'path'; export default function (config: Config, env: IWebpackEnv = _env): Config { base(config, env); const entryPath = getEntryPath(); - const filterRE = '/\\.(xml|js|(?