mirror of
https://github.com/fleetbase/fleetbase.git
synced 2025-12-19 14:18:57 +00:00
feat: migrate from plugins to in-app-repo with build hooks
This commit is contained in:
@@ -2,6 +2,10 @@
|
||||
|
||||
/** eslint-disable node/no-unpublished-require */
|
||||
const EmberApp = require('ember-cli/lib/broccoli/ember-app');
|
||||
// const ExtensionDiscoveryPlugin = require('./lib/build-plugins/extension-discovery');
|
||||
// const ExtensionShimGeneratorPlugin = require('./lib/build-plugins/extension-shim-generator');
|
||||
// const ExtensionLoadersGeneratorPlugin = require('./lib/build-plugins/extension-loaders-generator');
|
||||
// const RouterGeneratorPlugin = require('./lib/build-plugins/router-generator');
|
||||
const Funnel = require('broccoli-funnel');
|
||||
const writeFile = require('broccoli-file-creator');
|
||||
const mergeTrees = require('broccoli-merge-trees');
|
||||
@@ -16,12 +20,6 @@ const tailwind = require('tailwindcss');
|
||||
const toBoolean = require('./config/utils/to-boolean');
|
||||
const environment = process.env.EMBER_ENV;
|
||||
|
||||
// Import Broccoli plugins
|
||||
const ExtensionDiscoveryPlugin = require('./lib/build-plugins/extension-discovery');
|
||||
const ExtensionShimGeneratorPlugin = require('./lib/build-plugins/extension-shim-generator');
|
||||
const ExtensionLoadersGeneratorPlugin = require('./lib/build-plugins/extension-loaders-generator');
|
||||
const RouterGeneratorPlugin = require('./lib/build-plugins/router-generator');
|
||||
|
||||
module.exports = function (defaults) {
|
||||
const app = new EmberApp(defaults, {
|
||||
storeConfigInMeta: false,
|
||||
@@ -65,104 +63,58 @@ module.exports = function (defaults) {
|
||||
|
||||
babel: {
|
||||
plugins: [require.resolve('ember-auto-import/babel-plugin')],
|
||||
},
|
||||
|
||||
autoImport: {
|
||||
allowAppImports: [
|
||||
'extensions/**',
|
||||
'utils/extension-loaders'
|
||||
]
|
||||
},
|
||||
});
|
||||
|
||||
// Step 1: Create extension discovery and generator instances
|
||||
const extensionDiscovery = new ExtensionDiscoveryPlugin([], {
|
||||
projectRoot: __dirname,
|
||||
annotation: "Discover Fleetbase Extensions",
|
||||
});
|
||||
|
||||
const extensionShims = new ExtensionShimGeneratorPlugin([extensionDiscovery], {
|
||||
projectRoot: __dirname,
|
||||
annotation: "Generate Extension Shims",
|
||||
});
|
||||
|
||||
const extensionLoaders = new ExtensionLoadersGeneratorPlugin([extensionDiscovery], {
|
||||
projectRoot: __dirname,
|
||||
annotation: "Generate Extension Loaders",
|
||||
});
|
||||
|
||||
const router = new RouterGeneratorPlugin([extensionDiscovery], {
|
||||
projectRoot: __dirname,
|
||||
annotation: "Generate Router with Extension Mounts",
|
||||
});
|
||||
|
||||
// Step 2: Build a "generated app" tree
|
||||
// The plugin outputs currently contain files relative to their own outputPath:
|
||||
// - extensionShims output: extensions/*.js
|
||||
// - extensionLoaders output: utils/extension-loaders.generated.js
|
||||
// - router output: router.js
|
||||
//
|
||||
// We want these to appear in the app source tree as:
|
||||
// - app/extensions/*.js
|
||||
// - app/utils/extension-loaders.generated.js
|
||||
// - app/router.js
|
||||
//
|
||||
// To achieve this, we build a merged tree whose paths mirror app/ structure:
|
||||
const generatedAppTree = mergeTrees(
|
||||
[
|
||||
// app/extensions/*.js
|
||||
// extensionShims writes to outputPath/extensions/*.js
|
||||
// We want these files at app/extensions/*.js in the final tree
|
||||
new Funnel(extensionShims, {
|
||||
srcDir: "extensions",
|
||||
destDir: "extensions",
|
||||
}),
|
||||
|
||||
// app/utils/extension-loaders.generated.js
|
||||
// extensionLoaders writes to outputPath/utils/*.js
|
||||
new Funnel(extensionLoaders, {
|
||||
srcDir: "utils",
|
||||
destDir: "utils",
|
||||
}),
|
||||
|
||||
// app/router.js
|
||||
// router writes to outputPath/router.js
|
||||
new Funnel(router, {
|
||||
srcDir: "/",
|
||||
destDir: "/",
|
||||
}),
|
||||
],
|
||||
{
|
||||
overwrite: true,
|
||||
annotation: "Merge Extension Generated Files into app tree",
|
||||
}
|
||||
);
|
||||
|
||||
// Step 3: Merge generatedAppTree into app.trees.app
|
||||
// Before calling app.toTree(), we must ensure that app.trees.app includes the generated files.
|
||||
app.trees.app = mergeTrees(
|
||||
[app.trees.app, generatedAppTree],
|
||||
{ overwrite: true }
|
||||
);
|
||||
|
||||
// This makes Ember treat the generated files as if they had been in the app/ directory from the beginning.
|
||||
|
||||
// Step 4: Expose extensions.json as dist/extensions.json
|
||||
// We also want the discovery manifest to be accessible at dist/extensions.json. To do this, we
|
||||
// funnel the discovery plugin output:
|
||||
const extensionManifestTree = new Funnel(extensionDiscovery, {
|
||||
srcDir: "/",
|
||||
files: ["extensions.json"],
|
||||
destDir: "/",
|
||||
});
|
||||
|
||||
// Now, extensionManifestTree will place extensions.json at the root of the final dist output.
|
||||
// const extensionDiscovery = new ExtensionDiscoveryPlugin([], {
|
||||
// projectRoot: __dirname,
|
||||
// annotation: 'Discover Fleetbase Extensions',
|
||||
// });
|
||||
|
||||
// Step 5: Final app.toTree() call
|
||||
// Instead of passing the "extensions" tree into app.toTree(), we now pass only the trees that
|
||||
// represent additional *top-level* output (such as the manifest and runtimeConfigTree).
|
||||
// const extensionShims = new ExtensionShimGeneratorPlugin([extensionDiscovery], {
|
||||
// projectRoot: __dirname,
|
||||
// annotation: 'Generate Extension Shims',
|
||||
// });
|
||||
|
||||
// const extensionLoaders = new ExtensionLoadersGeneratorPlugin([extensionDiscovery], {
|
||||
// projectRoot: __dirname,
|
||||
// annotation: 'Generate Extension Loaders',
|
||||
// });
|
||||
|
||||
// const router = new RouterGeneratorPlugin([extensionDiscovery], {
|
||||
// projectRoot: __dirname,
|
||||
// annotation: 'Generate Router with Extension Mounts',
|
||||
// });
|
||||
|
||||
// const generatedAppTree = mergeTrees(
|
||||
// [
|
||||
// new Funnel(extensionShims, {
|
||||
// srcDir: 'extensions',
|
||||
// destDir: 'extensions',
|
||||
// }),
|
||||
// new Funnel(extensionLoaders, {
|
||||
// srcDir: 'utils',
|
||||
// destDir: 'utils',
|
||||
// }),
|
||||
// new Funnel(router, {
|
||||
// srcDir: '/',
|
||||
// destDir: '/',
|
||||
// }),
|
||||
// ],
|
||||
// {
|
||||
// overwrite: true,
|
||||
// annotation: 'Merge Extension Generated Files into app tree',
|
||||
// }
|
||||
// );
|
||||
|
||||
// app.trees.app = mergeTrees([app.trees.app, generatedAppTree], { overwrite: true });
|
||||
|
||||
// const extensionManifestTree = new Funnel(extensionDiscovery, {
|
||||
// srcDir: '/',
|
||||
// files: ['extensions.json'],
|
||||
// destDir: '/',
|
||||
// });
|
||||
|
||||
// Runtime config
|
||||
let runtimeConfigTree;
|
||||
if (toBoolean(process.env.DISABLE_RUNTIME_CONFIG)) {
|
||||
runtimeConfigTree = writeFile('fleetbase.config.json', '{}');
|
||||
@@ -173,7 +125,5 @@ module.exports = function (defaults) {
|
||||
});
|
||||
}
|
||||
|
||||
return app.toTree(
|
||||
[extensionManifestTree, runtimeConfigTree].filter(Boolean)
|
||||
);
|
||||
return app.toTree([runtimeConfigTree].filter(Boolean));
|
||||
};
|
||||
|
||||
70
console/lib/fleetbase-extensions-generator/index.js
Normal file
70
console/lib/fleetbase-extensions-generator/index.js
Normal file
@@ -0,0 +1,70 @@
|
||||
'use strict';
|
||||
|
||||
const ExtensionDiscoveryPlugin = require('./plugins/extension-discovery');
|
||||
const ExtensionShimGeneratorPlugin = require('./plugins/extension-shim-generator');
|
||||
const ExtensionLoadersGeneratorPlugin = require('./plugins/extension-loaders-generator');
|
||||
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');
|
||||
module.exports = {
|
||||
name: 'fleetbase-extensions-generator',
|
||||
|
||||
isDevelopingAddon() {
|
||||
return true; // useful for live reload when developing
|
||||
},
|
||||
|
||||
treeForApp(appTree) {
|
||||
console.log(`[fleetbase-extensions-generator] treeForApp called`);
|
||||
// 1. run extension discovery + generation
|
||||
let extensionDiscovery = new ExtensionDiscoveryPlugin([], {
|
||||
projectRoot: this.project.root,
|
||||
annotation: 'Discover Fleetbase Extensions',
|
||||
});
|
||||
console.log(`[fleetbase-extensions-generator] extensionDiscovery`, extensionDiscovery);
|
||||
|
||||
let extensionShims = new ExtensionShimGeneratorPlugin([extensionDiscovery], {
|
||||
projectRoot: this.project.root,
|
||||
annotation: 'Generate extension shims',
|
||||
});
|
||||
console.log(`[fleetbase-extensions-generator] extensionShims`, extensionShims);
|
||||
|
||||
let extensionLoaders = new ExtensionLoadersGeneratorPlugin([extensionDiscovery], {
|
||||
projectRoot: this.project.root,
|
||||
annotation: 'Generate extension loaders module',
|
||||
});
|
||||
|
||||
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',
|
||||
});
|
||||
|
||||
// 3. merge with existing appTree
|
||||
return mergeTrees([appTree, generated], { overwrite: true });
|
||||
},
|
||||
|
||||
treeForPublic(publicTree) {
|
||||
console.log(`[fleetbase-extensions-generator] treeForPublic called`);
|
||||
// expose the extensions manifest to dist/
|
||||
let extensionDiscovery = new ExtensionDiscoveryPlugin([], {
|
||||
projectRoot: this.project.root,
|
||||
annotation: 'Discover Fleetbase Extensions (public)',
|
||||
});
|
||||
|
||||
// funnel just extensions.json to root
|
||||
let manifest = new Funnel(extensionDiscovery, {
|
||||
srcDir: '/',
|
||||
files: ['extensions.json'],
|
||||
destDir: '/',
|
||||
});
|
||||
|
||||
return publicTree ? mergeTrees([publicTree, manifest], { overwrite: true }) : manifest;
|
||||
},
|
||||
};
|
||||
15
console/lib/fleetbase-extensions-generator/package.json
Normal file
15
console/lib/fleetbase-extensions-generator/package.json
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"name": "fleetbase-extensions-generator",
|
||||
"version": "0.0.0",
|
||||
"private": true,
|
||||
"keywords": [
|
||||
"ember-addon"
|
||||
],
|
||||
"ember-addon": {
|
||||
"configPath": "tests/dummy/config"
|
||||
},
|
||||
"dependencies": {
|
||||
"broccoli-funnel": "^5.0.2",
|
||||
"broccoli-merge-trees": "^5.2.1"
|
||||
}
|
||||
}
|
||||
@@ -26,6 +26,11 @@
|
||||
"test": "concurrently \"npm:lint\" \"npm:test:*\" --names \"lint,test:\"",
|
||||
"test:ember": "ember test"
|
||||
},
|
||||
"ember-addon": {
|
||||
"paths": [
|
||||
"lib/fleetbase-extensions-generator"
|
||||
]
|
||||
},
|
||||
"dependencies": {
|
||||
"@ember/legacy-built-in-components": "^0.4.2",
|
||||
"@fleetbase/ember-core": "link:../packages/ember-core",
|
||||
|
||||
Reference in New Issue
Block a user