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
This commit is contained in:
roncodes
2025-11-27 03:25:56 -05:00
parent d622b617c3
commit a1fc1e4ff8
5 changed files with 121 additions and 27 deletions

View File

@@ -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'
});
},
};

View File

@@ -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] ========================================');
}
}

View File

@@ -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] ========================================');
}
}

View File

@@ -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] ========================================');
}
/**

View File

@@ -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] ========================================');
}
}