diff --git a/packages/webpack5/__tests__/configuration/base.spec.ts b/packages/webpack5/__tests__/configuration/base.spec.ts index 35e6f9fe4..9f6ffeac7 100644 --- a/packages/webpack5/__tests__/configuration/base.spec.ts +++ b/packages/webpack5/__tests__/configuration/base.spec.ts @@ -109,4 +109,14 @@ describe('base configuration', () => { force: true, }); }); + + it('supports --env.profile', () => { + init({ + platform: 'ios', + profile: true, + }); + const config = base(new Config()); + + expect(config.get('profile')).toBe(true); + }); }); diff --git a/packages/webpack5/package.json b/packages/webpack5/package.json index 210e9a290..dc1d34e75 100644 --- a/packages/webpack5/package.json +++ b/packages/webpack5/package.json @@ -1,6 +1,6 @@ { "name": "@nativescript/webpack", - "version": "5.0.4", + "version": "5.0.5-rc.0", "private": false, "main": "dist/index.js", "files": [ diff --git a/packages/webpack5/src/bin/index.ts b/packages/webpack5/src/bin/index.ts index b8e1656bb..87ceed551 100644 --- a/packages/webpack5/src/bin/index.ts +++ b/packages/webpack5/src/bin/index.ts @@ -1,6 +1,6 @@ #!/usr/bin/env node -import { redBright, green, greenBright } from 'chalk'; +import { redBright, green, greenBright, yellow } from 'chalk'; import { program } from 'commander'; import dedent from 'ts-dedent'; import webpack from 'webpack'; @@ -115,6 +115,28 @@ program errorDetails: env.verbose, }) ); + + // if webpack profile is enabled we write the stats to a JSON file + if (configuration.profile || env.profile) { + console.log( + [ + '', + '|', + `| The build profile has been written to ${yellow( + 'webpack.stats.json' + )}`, + `| You can analyse the stats at ${green( + 'https://webpack.github.io/analyse/' + )}`, + '|', + '', + ].join('\n') + ); + fs.writeFileSync( + path.join(process.cwd(), 'webpack.stats.json'), + JSON.stringify(stats.toJson()) + ); + } } }; diff --git a/packages/webpack5/src/configuration/base.ts b/packages/webpack5/src/configuration/base.ts index 842f28ea4..d8548711f 100644 --- a/packages/webpack5/src/configuration/base.ts +++ b/packages/webpack5/src/configuration/base.ts @@ -222,6 +222,11 @@ export default function (config: Config, env: IWebpackEnv = _env): Config { }); }); + // enable profiling with --env.profile + config.when(env.profile, (config) => { + config.profile(true); + }); + // worker-loader should be declared before ts-loader config.module .rule('workers') diff --git a/packages/webpack5/src/index.ts b/packages/webpack5/src/index.ts index eb77451cb..47ecb41ce 100644 --- a/packages/webpack5/src/index.ts +++ b/packages/webpack5/src/index.ts @@ -43,6 +43,9 @@ export interface IWebpackEnv { // enable verbose output verbose?: boolean; + // enable webpack profiling + profile?: boolean; + // misc replace?: string[] | string; watchNodeModules?: boolean; diff --git a/packages/webpack5/src/loaders/xml-namespace-loader/index.ts b/packages/webpack5/src/loaders/xml-namespace-loader/index.ts index edb3fbf68..585f989a7 100644 --- a/packages/webpack5/src/loaders/xml-namespace-loader/index.ts +++ b/packages/webpack5/src/loaders/xml-namespace-loader/index.ts @@ -75,16 +75,22 @@ async function parseXML(content: string): Promise { const resolvePaths = [ localNamespacePath, localModulePath, - `${localModulePath}.xml`, moduleName, namespace, - `${moduleName}.xml`, `~/${moduleName}`, `~/${namespace}`, + ]; + + // fallbacks for codeless namespaces + const fallbackResolvePaths = [ + `${localModulePath}.xml`, + `${moduleName}.xml`, `~/${moduleName}.xml`, ]; - DEBUG && console.log({ resolvePaths }); + + DEBUG && console.log({ resolvePaths, fallbackResolvePaths }); let resolvedPath; + let isFallbackPath = false; for (const p of resolvePaths) { resolvedPath = await resolveAsync(this.context, p).catch(noop); @@ -95,7 +101,23 @@ async function parseXML(content: string): Promise { } } - DEBUG && console.log({ resolvedPath }); + if (!resolvedPath) { + for (const p of fallbackResolvePaths) { + resolvedPath = await resolveAsync(this.context, p).catch(noop); + + // break on first match + if (resolvedPath) { + isFallbackPath = true; + break; + } + } + } + + DEBUG && + console.log({ + resolvedPath, + isFallbackPath, + }); // bail if we haven't resolved a path if (!resolvedPath) { @@ -104,10 +126,15 @@ async function parseXML(content: string): Promise { const { dir, name } = parse(resolvedPath); - // register resolved path + short name - namespaces.push({ name: namespace, path: resolvedPath }); - namespaces.push({ name: moduleName, path: resolvedPath }); - this.addDependency(resolvedPath); + DEBUG && console.log({ namespace, moduleName }); + + // check if we are not in a fallback path, in which case we shouldn't register it as a namespace + if (!isFallbackPath) { + // register resolved path + short name + namespaces.push({ name: namespace, path: resolvedPath }); + namespaces.push({ name: moduleName, path: resolvedPath }); + this.addDependency(resolvedPath); + } const noExtFilename = join(dir, name);