diff --git a/packages/webpack5/__tests__/index.spec.ts b/packages/webpack5/__tests__/index.spec.ts index 40931b186..2639d91ed 100644 --- a/packages/webpack5/__tests__/index.spec.ts +++ b/packages/webpack5/__tests__/index.spec.ts @@ -15,7 +15,7 @@ describe('@nativescript/webpack', () => { expect(webpack.resolveConfig).toBeInstanceOf(Function); }); - it('applies chain configs', () => { + it('applies chain configs', async () => { webpack.useConfig(false); const chainFn = jest.fn(); @@ -26,13 +26,13 @@ describe('@nativescript/webpack', () => { // chainFn should only be called when // resolving a chainable config - const config = webpack.resolveChainableConfig(); + const config = await webpack.resolveChainableConfig(); expect(chainFn).toHaveBeenCalledTimes(1); expect(chainFn).toHaveBeenCalledWith(config, {}); }); - it('applies chain configs in the right order', () => { + it('applies chain configs in the right order', async () => { webpack.useConfig(false); let lastCalled = false; @@ -52,26 +52,29 @@ describe('@nativescript/webpack', () => { }); webpack.chainWebpack(chainFnNormal); - webpack.resolveChainableConfig(); + await webpack.resolveChainableConfig(); }); - it('prints plugin name that has a chain function that throws an error', () => { + it('prints plugin name that has a chain function that throws an error', async () => { webpack.useConfig(false); webpack.setCurrentPlugin('test-plugin'); const chainFn = jest.fn(() => { throw new Error('something wrong'); }); webpack.chainWebpack(chainFn); + let resolvable: Promise; // should not throw - expect(() => webpack.resolveChainableConfig()).not.toThrow(); + expect(() => (resolvable = webpack.resolveChainableConfig())).not.toThrow(); + expect(resolvable).resolves.toBeDefined(); + await resolvable; expect( 'Unable to apply chain function from: test-plugin' ).toHaveBeenWarned(); }); - it('applies merge configs', () => { + it('applies merge configs', async () => { const dummyEnv = { foo: true }; webpack.init(dummyEnv); webpack.useConfig(false); @@ -82,20 +85,20 @@ describe('@nativescript/webpack', () => { // mergeFn should not be called yet expect(mergeFn).not.toHaveBeenCalled(); - const config = webpack.resolveChainableConfig(); + const config = await webpack.resolveChainableConfig(); // mergeFn should not be called yet expect(mergeFn).not.toHaveBeenCalled(); // mergeFn should only be called when // resolving the final config - webpack.resolveConfig(); + await webpack.resolveConfig(); expect(mergeFn).toHaveBeenCalledTimes(1); expect(mergeFn).toHaveBeenCalledWith(config.toConfig(), dummyEnv); }); - it('merges mutate config', () => { + it('merges mutate config', async () => { const dummyEnv = { foo: true }; webpack.init(dummyEnv); webpack.useConfig(false); @@ -104,12 +107,12 @@ describe('@nativescript/webpack', () => { (config as any).mutated = true; }); - expect(webpack.resolveConfig()).toMatchObject({ + expect(await webpack.resolveConfig()).toMatchObject({ mutated: true, }); }); - it('merges returned config', () => { + it('merges returned config', async () => { const dummyEnv = { foo: true }; webpack.init(dummyEnv); webpack.useConfig(false); @@ -120,12 +123,12 @@ describe('@nativescript/webpack', () => { }; }); - expect(webpack.resolveConfig()).toMatchObject({ + expect(await webpack.resolveConfig()).toMatchObject({ returned: true, }); }); - it('merges objects', () => { + it('merges objects', async () => { const dummyEnv = { foo: true }; webpack.init(dummyEnv); webpack.useConfig(false); @@ -134,7 +137,7 @@ describe('@nativescript/webpack', () => { object: true, } as any); - expect(webpack.resolveConfig()).toMatchObject({ + expect(await webpack.resolveConfig()).toMatchObject({ object: true, }); }); diff --git a/packages/webpack5/src/helpers/externalConfigs.ts b/packages/webpack5/src/helpers/externalConfigs.ts index 3dc2a5d83..b355a5c49 100644 --- a/packages/webpack5/src/helpers/externalConfigs.ts +++ b/packages/webpack5/src/helpers/externalConfigs.ts @@ -9,12 +9,12 @@ import * as lib from '../index'; /** * @internal */ -export function applyExternalConfigs() { - getAllDependencies().forEach((dependency) => { +export async function applyExternalConfigs() { + for (const dependency of getAllDependencies()) { const packagePath = getDependencyPath(dependency); if (!packagePath) { - return; + continue; } const configPath = path.join(packagePath, 'nativescript.webpack.js'); @@ -27,7 +27,7 @@ export function applyExternalConfigs() { if (typeof externalConfig === 'function') { info('Applying external config...'); - externalConfig(lib); + await externalConfig(lib); } else if (externalConfig) { info('Merging external config...'); lib.mergeWebpack(externalConfig); @@ -43,7 +43,7 @@ export function applyExternalConfigs() { `); } } - }); + } clearCurrentPlugin(); } diff --git a/packages/webpack5/src/index.ts b/packages/webpack5/src/index.ts index a8ca9ffe7..d9e606684 100644 --- a/packages/webpack5/src/index.ts +++ b/packages/webpack5/src/index.ts @@ -159,7 +159,7 @@ export function mergeWebpack( /** * Resolve a new instance of the internal chain config with all chain functions applied. */ -export function resolveChainableConfig(): Config { +export async function resolveChainableConfig(): Promise { const config = new Config(); if (!explicitUseConfig) { @@ -168,7 +168,7 @@ export function resolveChainableConfig(): Config { // apply configs from dependencies // todo: allow opt-out - applyExternalConfigs(); + await applyExternalConfigs(); webpackChains .splice(0) @@ -206,12 +206,13 @@ export function resolveChainableConfig(): Config { * * @param chainableConfig Optional chain config to use. */ -export function resolveConfig( - chainableConfig = resolveChainableConfig() -): webpack.Configuration { +export async function resolveConfig( + chainableConfig: Config | Promise = resolveChainableConfig() +): Promise { if (!hasInitialized) { throw error('resolveConfig() must be called after init()'); } + chainableConfig = await chainableConfig; let config = chainableConfig.toConfig();