From a1fc1e4ff884525244c979303f4135377e3963fd Mon Sep 17 00:00:00 2001 From: roncodes <816371+roncodes@users.noreply.github.com> Date: Thu, 27 Nov 2025 03:25:56 -0500 Subject: [PATCH] fix: Correct Funnel srcDir configuration and add improved logging - Fix BroccoliMergeTrees error by adding srcDir to Funnel calls - extensionShims: srcDir 'extensions' (files in outputPath/extensions/) - extensionLoaders: srcDir 'utils' (files in outputPath/utils/) - routerGen: srcDir '/' (files at outputPath root) - Add comprehensive debug logging to all plugins - Add detailed logging to in-repo addon index.js - Improves debugging and troubleshooting of build process --- .../fleetbase-extensions-generator/index.js | 94 ++++++++++++++++--- .../plugins/extension-discovery.js | 15 ++- .../plugins/extension-loaders-generator.js | 11 ++- .../plugins/extension-shim-generator.js | 15 ++- .../plugins/router-generator.js | 13 ++- 5 files changed, 121 insertions(+), 27 deletions(-) diff --git a/console/lib/fleetbase-extensions-generator/index.js b/console/lib/fleetbase-extensions-generator/index.js index c47301ba..3e3bbc5c 100644 --- a/console/lib/fleetbase-extensions-generator/index.js +++ b/console/lib/fleetbase-extensions-generator/index.js @@ -7,7 +7,8 @@ const RouterGeneratorPlugin = require('./plugins/router-generator'); const Funnel = require('broccoli-funnel'); const mergeTrees = require('broccoli-merge-trees'); -console.log('[fleetbase-extensions-generator] loaded at startup'); +console.log('[fleetbase-extensions-generator] Addon loaded at startup'); + module.exports = { name: 'fleetbase-extensions-generator', @@ -16,55 +17,118 @@ module.exports = { }, treeForApp(appTree) { - console.log(`[fleetbase-extensions-generator] treeForApp called`); - // 1. run extension discovery + generation + console.log('[fleetbase-extensions-generator] treeForApp() called'); + console.log('[fleetbase-extensions-generator] Project root:', this.project.root); + + // Step 1: Create Broccoli plugin instances + console.log('[fleetbase-extensions-generator] Creating ExtensionDiscoveryPlugin...'); let extensionDiscovery = new ExtensionDiscoveryPlugin([], { projectRoot: this.project.root, annotation: 'Discover Fleetbase Extensions', }); - console.log(`[fleetbase-extensions-generator] extensionDiscovery`, extensionDiscovery); + console.log('[fleetbase-extensions-generator] Creating ExtensionShimGeneratorPlugin...'); let extensionShims = new ExtensionShimGeneratorPlugin([extensionDiscovery], { projectRoot: this.project.root, annotation: 'Generate extension shims', }); - console.log(`[fleetbase-extensions-generator] extensionShims`, extensionShims); + console.log('[fleetbase-extensions-generator] Creating ExtensionLoadersGeneratorPlugin...'); let extensionLoaders = new ExtensionLoadersGeneratorPlugin([extensionDiscovery], { projectRoot: this.project.root, annotation: 'Generate extension loaders module', }); + console.log('[fleetbase-extensions-generator] Creating RouterGeneratorPlugin...'); let routerGen = new RouterGeneratorPlugin([extensionDiscovery], { projectRoot: this.project.root, annotation: 'Generate router with extension mounts', }); - // 2. funnel outputs into proper subpaths mimicking app/ - let generated = mergeTrees([new Funnel(extensionShims, { destDir: 'extensions' }), new Funnel(extensionLoaders, { destDir: 'utils' }), new Funnel(routerGen, { destDir: '' })], { - overwrite: true, - annotation: 'Merge generated extension files into app tree', + // Step 2: Funnel plugin outputs into proper app/ structure + // + // Plugin outputs: + // - extensionShims: outputPath/extensions/*.js + // - extensionLoaders: outputPath/utils/extension-loaders.generated.js + // - routerGen: outputPath/router.js + // + // We want these in the app tree as: + // - app/extensions/*.js + // - app/utils/extension-loaders.generated.js + // - app/router.js + + console.log('[fleetbase-extensions-generator] Funneling extension shims from extensions/ to app/extensions/'); + let shimsFunneled = new Funnel(extensionShims, { + srcDir: 'extensions', // Files are in outputPath/extensions/ + destDir: 'extensions', // Place at app/extensions/ in final tree + annotation: 'Funnel extension shims' }); - // 3. merge with existing appTree - return mergeTrees([appTree, generated], { overwrite: true }); + console.log('[fleetbase-extensions-generator] Funneling extension loaders from utils/ to app/utils/'); + let loadersFunneled = new Funnel(extensionLoaders, { + srcDir: 'utils', // Files are in outputPath/utils/ + destDir: 'utils', // Place at app/utils/ in final tree + annotation: 'Funnel extension loaders' + }); + + console.log('[fleetbase-extensions-generator] Funneling router.js to app/router.js'); + let routerFunneled = new Funnel(routerGen, { + srcDir: '/', // Files are at outputPath root + destDir: '', // Place at app/ root in final tree + annotation: 'Funnel router.js' + }); + + // Step 3: Merge all generated files into a single tree + console.log('[fleetbase-extensions-generator] Merging generated files into single tree'); + let generated = mergeTrees( + [shimsFunneled, loadersFunneled, routerFunneled], + { + overwrite: true, + annotation: 'Merge generated extension files', + } + ); + + // Step 4: Merge with existing appTree + console.log('[fleetbase-extensions-generator] Merging generated tree with existing app tree'); + if (!appTree) { + console.log('[fleetbase-extensions-generator] No existing appTree, returning generated tree only'); + return generated; + } + + return mergeTrees([appTree, generated], { + overwrite: true, + annotation: 'Merge app tree with generated extensions' + }); }, treeForPublic(publicTree) { - console.log(`[fleetbase-extensions-generator] treeForPublic called`); - // expose the extensions manifest to dist/ + console.log('[fleetbase-extensions-generator] treeForPublic() called'); + + // Expose the extensions manifest to dist/extensions.json + console.log('[fleetbase-extensions-generator] Creating ExtensionDiscoveryPlugin for public tree...'); let extensionDiscovery = new ExtensionDiscoveryPlugin([], { projectRoot: this.project.root, annotation: 'Discover Fleetbase Extensions (public)', }); - // funnel just extensions.json to root + // Funnel just extensions.json to dist root + console.log('[fleetbase-extensions-generator] Funneling extensions.json to dist/'); let manifest = new Funnel(extensionDiscovery, { srcDir: '/', files: ['extensions.json'], destDir: '/', + annotation: 'Funnel extensions.json manifest' }); - return publicTree ? mergeTrees([publicTree, manifest], { overwrite: true }) : manifest; + if (!publicTree) { + console.log('[fleetbase-extensions-generator] No existing publicTree, returning manifest only'); + return manifest; + } + + console.log('[fleetbase-extensions-generator] Merging manifest with existing public tree'); + return mergeTrees([publicTree, manifest], { + overwrite: true, + annotation: 'Merge public tree with extensions manifest' + }); }, }; diff --git a/console/lib/fleetbase-extensions-generator/plugins/extension-discovery.js b/console/lib/fleetbase-extensions-generator/plugins/extension-discovery.js index 2ebee880..1e38fb76 100644 --- a/console/lib/fleetbase-extensions-generator/plugins/extension-discovery.js +++ b/console/lib/fleetbase-extensions-generator/plugins/extension-discovery.js @@ -98,7 +98,10 @@ class ExtensionDiscoveryPlugin extends Plugin { } async build() { - console.log('[ExtensionDiscovery] Discovering Fleetbase extensions...'); + console.log('[ExtensionDiscovery] ========================================'); + console.log('[ExtensionDiscovery] Starting extension discovery...'); + console.log('[ExtensionDiscovery] Project root:', this.projectRoot); + console.log('[ExtensionDiscovery] Output path:', this.outputPath); const extensions = await this.discoverExtensions(); @@ -110,12 +113,14 @@ class ExtensionDiscoveryPlugin extends Plugin { 'utf8' ); - console.log(`[ExtensionDiscovery] Found ${extensions.length} extensions`); - - // Log discovered extensions + console.log('[ExtensionDiscovery] ========================================'); + console.log('[ExtensionDiscovery] ✓ Discovery complete'); + console.log('[ExtensionDiscovery] Found', extensions.length, 'extension(s):'); extensions.forEach(ext => { - console.log(` - ${ext.name}@${ext.version}`); + console.log('[ExtensionDiscovery] -', ext.name + '@' + ext.version); }); + console.log('[ExtensionDiscovery] Wrote extensions.json to:', cacheFile); + console.log('[ExtensionDiscovery] ========================================'); } } diff --git a/console/lib/fleetbase-extensions-generator/plugins/extension-loaders-generator.js b/console/lib/fleetbase-extensions-generator/plugins/extension-loaders-generator.js index 682ed51a..feb77737 100644 --- a/console/lib/fleetbase-extensions-generator/plugins/extension-loaders-generator.js +++ b/console/lib/fleetbase-extensions-generator/plugins/extension-loaders-generator.js @@ -89,7 +89,10 @@ class ExtensionLoadersGeneratorPlugin extends Plugin { } async build() { - console.log('[ExtensionLoadersGenerator] Generating extension-loaders.generated.js...'); + console.log('[ExtensionLoadersGenerator] ========================================'); + console.log('[ExtensionLoadersGenerator] Starting loaders generation...'); + console.log('[ExtensionLoadersGenerator] Project root:', this.projectRoot); + console.log('[ExtensionLoadersGenerator] Output path:', this.outputPath); // Read discovered extensions from cache const extensionsCacheFile = path.join(this.inputPaths[0], 'extensions.json'); @@ -112,7 +115,11 @@ class ExtensionLoadersGeneratorPlugin extends Plugin { fs.writeFileSync(outputPath, content, 'utf8'); - console.log(`[ExtensionLoadersGenerator] Generated extension-loaders.generated.js with ${count} loaders`); + console.log('[ExtensionLoadersGenerator] ========================================'); + console.log('[ExtensionLoadersGenerator] ✓ Loaders generation complete'); + console.log('[ExtensionLoadersGenerator] Generated extension-loaders.generated.js with', count, 'loader(s)'); + console.log('[ExtensionLoadersGenerator] Output file:', outputPath); + console.log('[ExtensionLoadersGenerator] ========================================'); } } diff --git a/console/lib/fleetbase-extensions-generator/plugins/extension-shim-generator.js b/console/lib/fleetbase-extensions-generator/plugins/extension-shim-generator.js index d6eeca5b..2dd574f8 100644 --- a/console/lib/fleetbase-extensions-generator/plugins/extension-shim-generator.js +++ b/console/lib/fleetbase-extensions-generator/plugins/extension-shim-generator.js @@ -23,9 +23,14 @@ class ExtensionShimGeneratorPlugin extends Plugin { this.projectRoot = options.projectRoot || process.cwd(); } - build() { - const extensionsJsonPath = path.join(this.inputPaths[0], 'extensions.json'); + async build() { + console.log('[ExtensionShimGenerator] ========================================'); + console.log('[ExtensionShimGenerator] Starting shim generation...'); + console.log('[ExtensionShimGenerator] Project root:', this.projectRoot); + console.log('[ExtensionShimGenerator] Output path:', this.outputPath); + const extensionsJsonPath = path.join(this.inputPaths[0], 'extensions.json'); + console.log('[ExtensionShimGenerator] Reading extensions from:', extensionsJsonPath); // Check if extensions.json exists if (!fs.existsSync(extensionsJsonPath)) { console.warn('[ExtensionShimGenerator] extensions.json not found, skipping'); @@ -96,7 +101,11 @@ ${extensionCode} } } - console.log(`[ExtensionShimGenerator] Generated ${shimCount} extension shim files`); + console.log('[ExtensionShimGenerator] ========================================'); + console.log('[ExtensionShimGenerator] ✓ Shim generation complete'); + console.log('[ExtensionShimGenerator] Generated', shimCount, 'extension shim file(s)'); + console.log('[ExtensionShimGenerator] Output directory:', path.join(this.outputPath, 'extensions')); + console.log('[ExtensionShimGenerator] ========================================'); } /** diff --git a/console/lib/fleetbase-extensions-generator/plugins/router-generator.js b/console/lib/fleetbase-extensions-generator/plugins/router-generator.js index c9450778..3e55241b 100644 --- a/console/lib/fleetbase-extensions-generator/plugins/router-generator.js +++ b/console/lib/fleetbase-extensions-generator/plugins/router-generator.js @@ -167,7 +167,10 @@ class RouterGeneratorPlugin extends Plugin { } async build() { - console.log('[RouterGenerator] Generating app/router.js...'); + console.log('[RouterGenerator] ========================================'); + console.log('[RouterGenerator] Starting router generation...'); + console.log('[RouterGenerator] Project root:', this.projectRoot); + console.log('[RouterGenerator] Output path:', this.outputPath); // Read discovered extensions from cache const extensionsCacheFile = path.join(this.inputPaths[0], 'extensions.json'); @@ -208,7 +211,13 @@ class RouterGeneratorPlugin extends Plugin { const outputPath = path.join(this.outputPath, 'router.js'); fs.writeFileSync(outputPath, output, 'utf8'); - console.log(`[RouterGenerator] Generated app/router.js (${consoleAdded} console mounts, ${rootAdded} root mounts)`); + console.log('[RouterGenerator] ========================================'); + console.log('[RouterGenerator] ✓ Router generation complete'); + console.log('[RouterGenerator] Generated app/router.js'); + console.log('[RouterGenerator] - Console mounts:', consoleAdded); + console.log('[RouterGenerator] - Root mounts:', rootAdded); + console.log('[RouterGenerator] Output file:', outputPath); + console.log('[RouterGenerator] ========================================'); } }