From ad1c47fe089aeecaf025ca034f425c662520e007 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20=C5=A0ime=C4=8Dek?= Date: Mon, 6 Mar 2023 15:18:47 +0100 Subject: [PATCH] Fixed issue where ManifestPlugin produced manifest.json file without client assets --- .changeset/tasty-avocados-roll.md | 5 +++++ .../webpack/plugins/ManifestPlugin/index.ts | 22 ++++++++++++++----- 2 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 .changeset/tasty-avocados-roll.md diff --git a/.changeset/tasty-avocados-roll.md b/.changeset/tasty-avocados-roll.md new file mode 100644 index 0000000000..e8b44dcbb3 --- /dev/null +++ b/.changeset/tasty-avocados-roll.md @@ -0,0 +1,5 @@ +--- +"@ima/cli": patch +--- + +Fixed issue where ManifestPlugin produced manifest.json file without client assets. This could resolve in error where application loads without and JS and CSS assets and is not revived. diff --git a/packages/cli/src/webpack/plugins/ManifestPlugin/index.ts b/packages/cli/src/webpack/plugins/ManifestPlugin/index.ts index a38e4e65c3..015bc18dd6 100644 --- a/packages/cli/src/webpack/plugins/ManifestPlugin/index.ts +++ b/packages/cli/src/webpack/plugins/ManifestPlugin/index.ts @@ -43,13 +43,16 @@ class ManifestPlugin { #pluginName: string; #options: ManifestPluginOptions; - static #instances = 0; - static #generated = 0; + static #generated: { + [key in ImaConfigurationContext['name']]?: boolean; + } = {}; constructor(options: ManifestPluginOptions) { this.#pluginName = this.constructor.name; this.#options = options; - ManifestPlugin.#instances++; + + // Track generated configurations status + ManifestPlugin.#generated[options.context.name] = false; // Validate options validate(schema as Schema, this.#options, { @@ -76,7 +79,6 @@ class ManifestPlugin { * Generate runner code from compiled assets. */ generate(assets: Compilation['assets'], compilation: Compilation): void { - ManifestPlugin.#generated++; const compilationName = compilation?.name as | ImaConfigurationContext['name'] | undefined; @@ -115,8 +117,16 @@ class ManifestPlugin { seed.assets[name] = assetWithInfo; }); - if (ManifestPlugin.#generated === ManifestPlugin.#instances) { - ManifestPlugin.#generated = 0; + // Mark this configuration as generated + ManifestPlugin.#generated[compilationName] = true; + + if (Object.values(ManifestPlugin.#generated).every(v => v)) { + // Reset tracking info + Object.keys(ManifestPlugin.#generated).forEach( + key => + (ManifestPlugin.#generated[key as ImaConfigurationContext['name']] = + false) + ); // Emit compiled ima runner with embedded runtime codes return compilation.emitAsset(