Fix build release script

Signed-off-by: soupette <cyril@strapi.io>
This commit is contained in:
soupette 2021-11-18 12:59:05 +01:00
parent b4173b9281
commit 5f85849435
5 changed files with 179 additions and 3 deletions

View File

@ -9,4 +9,5 @@ yarn-error.log
npm-debug.log
.idea
.env
admin/src/plugins-dev.js
admin/src/plugins-dev.js
admin/src/plugins.js

View File

@ -9,7 +9,9 @@
"scripts": {
"prepublishOnly": "node ./scripts/build.js",
"test": "echo \"no tests yet\"",
"develop": "cross-env NODE_ENV=development webpack serve --config webpack.config.dev.js --progress profile",
"create:plugin-file": "node ./scripts/create-dev-plugins-file.js",
"dev": "cross-env NODE_ENV=development webpack serve --config webpack.config.dev.js --progress profile",
"develop": "yarn create:plugin-file && yarn dev",
"develop:ce": "STRAPI_DISABLE_EE=true webpack serve --config webpack.config.dev.js --progress profile",
"analyze:bundle": "ANALYZE_BUNDLE=true webpack --config webpack.config.dev.js",
"analyze:deps": "ANALYZE_DEPS=true webpack serve --config webpack.config.dev.js --progress profile"

View File

@ -3,16 +3,28 @@
const path = require('path');
const webpack = require('webpack');
const webpackConfig = require('../webpack.config');
const {
getCorePluginsPath,
getPluginToInstallPath,
createPluginsFile,
} = require('./create-plugins-file');
const PLUGINS_TO_INSTALL = ['i18n'];
const buildAdmin = async () => {
const entry = path.join(__dirname, '..', 'admin', 'src');
const dest = path.join(__dirname, '..', 'build');
const corePlugins = getCorePluginsPath();
const plugins = getPluginToInstallPath(PLUGINS_TO_INSTALL);
const allPlugins = { ...corePlugins, ...plugins };
await createPluginsFile(allPlugins);
const args = {
entry,
dest,
cacheDir: __dirname,
pluginsPath: [path.resolve(__dirname, '../../../..')],
pluginsPath: [path.resolve(__dirname, '../../../../packages')],
env: 'production',
optimize: true,
options: {

View File

@ -0,0 +1,69 @@
'use strict';
const { join, resolve, relative } = require('path');
const { promisify } = require('util');
// eslint-disable-next-line node/no-extraneous-require
const glob = promisify(require('glob').glob);
const fs = require('fs-extra');
const { getCorePluginsPath, createPluginsFile } = require('./create-plugins-file');
/**
* Retrieve all plugins that are inside the plugins folder
* @returns Object the plugins
*/
const getPluginsPackages = async () => {
const pathToPackages = resolve(__dirname, '..', '..', '..', 'plugins', '*');
const pluginsPackageDirs = await glob(pathToPackages);
return pluginsPackageDirs
.filter(pluginDir => {
return fs.existsSync(join(pluginDir, 'admin', 'src', 'index.js'));
})
.reduce((acc, current) => {
const depName = current
.replace(/\\/g, '/')
.split('/')
.slice(-1)[0];
const adminEntryPoint = resolve(join(__dirname, '..', 'admin', 'src'));
const pathToPlugin = join(relative(adminEntryPoint, current), 'admin', 'src').replace(
/\\/g,
'/'
);
acc[depName] = pathToPlugin;
return acc;
}, {});
};
/**
* Write the plugins.js file or copy the plugins-dev.js file if it exists
*/
const createFile = async () => {
const customPluginFile = join(__dirname, '..', 'admin', 'src', 'plugins-dev.js');
const pluginFileDest = resolve(__dirname, '..', 'admin', 'src', 'plugins.js');
if (fs.existsSync(customPluginFile)) {
await fs.copy(customPluginFile, pluginFileDest);
return;
}
const corePlugins = getCorePluginsPath();
const plugins = await getPluginsPackages();
const allPlugins = { ...corePlugins, ...plugins };
return createPluginsFile(allPlugins);
};
createFile()
.then(() => {
console.log('plugins.js file created');
process.exit();
})
.catch(err => {
console.error(err);
process.exit(1);
});

View File

@ -0,0 +1,92 @@
'use strict';
const { join, resolve, relative } = require('path');
const { camelCase } = require('lodash');
const fs = require('fs-extra');
const CORE_PLUGINS = ['content-type-builder', 'email', 'upload', 'i18n'];
/**
* Retrieve the core plugins path
* @returns {Object}
*/
const getCorePluginsPath = () => {
const corePlugins = {};
for (const dep of CORE_PLUGINS) {
const packageAdminPath = join(__dirname, '..', '..', dep, 'admin', 'src');
const adminEntryPoint = resolve(join(__dirname, '..', 'admin', 'src'));
const pathToPlugin = join(relative(adminEntryPoint, packageAdminPath)).replace(/\\/g, '/');
corePlugins[dep] = pathToPlugin;
}
return corePlugins;
};
/**
* Retrieve the plugins real path
* @param {Object[]} pluginsToInstall array of plugins located in the plugins folder
* @returns Object of plugin's paths
*/
const getPluginToInstallPath = pluginsToInstall => {
const plugins = {};
for (const dep of pluginsToInstall) {
const packageAdminPath = join(__dirname, '..', '..', '..', 'plugins', dep, 'admin', 'src');
const adminEntryPoint = resolve(join(__dirname, '..', 'admin', 'src'));
const pathToPlugin = join(relative(adminEntryPoint, packageAdminPath)).replace(/\\/g, '/');
plugins[dep] = pathToPlugin;
}
return plugins;
};
/**
* Write the plugins.js file
* @param {Object} plugins
*/
const createPluginsFile = async plugins => {
const pluginFileDest = resolve(__dirname, '..', 'admin', 'src', 'plugins.js');
const allPluginsArray = Object.entries(plugins).map(([plugin, pluginPath]) => {
return {
shortName: camelCase(plugin),
name: plugin,
pluginPath,
};
});
const content = `
// To override this file create a plugins-dev.js one and copy the content of the plugin.js one.
// When starting the app the script will copy the plugins-dev.js into this one instead.
${allPluginsArray
.map(({ shortName, pluginPath }) => {
const req = `'${pluginPath}'`;
return `import ${shortName} from ${req};`;
})
.join('\n')}
const plugins = {
${[...allPluginsArray]
.map(({ name, shortName }) => {
return ` '${name}': ${shortName},`;
})
.join('\n')}
};
export default plugins;
`;
return fs.writeFile(pluginFileDest, content);
};
module.exports = {
createPluginsFile,
getCorePluginsPath,
getPluginToInstallPath,
};