@forge/cli

13.1.013.2.0-next.4-experimental-c6a3916
out/service/module-file-service.js
~out/service/module-file-service.jsModified
+22−2
Index: package/out/service/module-file-service.js
===================================================================
--- package/out/service/module-file-service.js
+++ package/out/service/module-file-service.js
@@ -9,8 +9,9 @@
 const manifest_merger_1 = require("../module-add/manifest-merger");
 const dependencies_merger_1 = require("../module-add/dependencies-merger");
 const vite_scaffolder_1 = require("../module-add/vite-scaffolder");
 const TEMPLATE_FILES_DIR = 'files';
+const MULTI_ENTRY_PRODUCTS = new Set(['confluence', 'jira', 'jira-service-management']);
 class ModuleAddFileService {
     checkDependencies(template, force) {
         const cwd = process.cwd();
         const templateDependencies = template.dependencies ?? {};
@@ -53,9 +54,9 @@
                 scaffoldChanges,
                 warnings
             };
         }
-        this.collectScaffoldChanges(cwd, template, manifestChange, options, scaffoldChanges, warnings);
+        this.collectScaffoldChanges(cwd, template, variables, manifestChange, options, scaffoldChanges, warnings);
         this.assertNoTargetConflicts(cwd, plannedFiles, options);
         await this.copyTemplateFiles(cwd, template, variables);
         (0, manifest_merger_1.applyManifestChange)(manifestChange);
         for (const change of scaffoldChanges)
@@ -81,13 +82,32 @@
         if (unsupportedOps.length) {
             warnings.push(cli_shared_1.Text.module.add.warnUnsupportedFileOperations(unsupportedOps.map((op) => `${op.type} ${op.target}`)));
         }
     }
-    collectScaffoldChanges(cwd, template, manifestChange, options, scaffoldChanges, warnings) {
+    collectScaffoldChanges(cwd, template, variables, manifestChange, options, scaffoldChanges, warnings) {
         if (!manifestChange || template.uiFramework !== 'custom-ui')
             return;
         const beforeResources = (yaml_1.default.parse(manifestChange.before)?.resources ?? []);
         const afterResources = (yaml_1.default.parse(manifestChange.after)?.resources ?? []);
+        const beforeKeys = new Set(beforeResources.map((r) => r.key));
+        if (!MULTI_ENTRY_PRODUCTS.has(template.product)) {
+            const primaryKey = variables.resourceKey;
+            if (primaryKey && beforeKeys.has(primaryKey)) {
+                throw new Error(cli_shared_1.Text.module.add.errorDuplicateResource(primaryKey));
+            }
+            const newResources = afterResources.filter((r) => !beforeKeys.has(r.key));
+            for (const resource of newResources) {
+                const viteChange = (0, vite_scaffolder_1.planGenericViteConfig)(cwd, resource.key);
+                if (viteChange)
+                    scaffoldChanges.push(viteChange);
+                if (resource.key !== primaryKey) {
+                    const pkgPlan = (0, dependencies_merger_1.planFrontendPackageJson)(cwd, template, { ...variables, resourceKey: resource.key }, options.force === true);
+                    if (pkgPlan.packageJsonChange)
+                        scaffoldChanges.push(pkgPlan.packageJsonChange);
+                }
+            }
+            return;
+        }
         const beforeEntriesByKey = new Map(beforeResources.map((r) => [r.key, new Set(Object.keys(r.entry ?? {}))]));
         for (const resource of afterResources) {
             const beforeEntries = beforeEntriesByKey.get(resource.key) ?? new Set();
             const newEntries = Object.entries(resource.entry ?? {}).filter(([name]) => !beforeEntries.has(name));