mirror of
https://github.com/fleetbase/fleetbase.git
synced 2025-12-19 14:18:57 +00:00
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:
@@ -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'
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
@@ -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] ========================================');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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] ========================================');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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] ========================================');
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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] ========================================');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user