Merge pull request #11622 from strapi/v4/fix-release-script

[V4] Prebuild the admin panel.
This commit is contained in:
cyril lopez 2021-11-19 09:04:29 +01:00 committed by GitHub
commit cc03c09253
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 180 additions and 25 deletions

View File

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

View File

@ -2,6 +2,7 @@ import ReactDOM from 'react-dom';
import { Components, Fields, Middlewares, Reducers } from './core/apis'; import { Components, Fields, Middlewares, Reducers } from './core/apis';
import { axiosInstance } from './core/utils'; import { axiosInstance } from './core/utils';
import appCustomisations from './app'; import appCustomisations from './app';
// eslint-disable-next-line import/extensions
import plugins from './plugins'; import plugins from './plugins';
import appReducers from './reducers'; import appReducers from './reducers';

View File

@ -1,22 +0,0 @@
// // TODO temp file
import documentationPlugin from '../../../../plugins/documentation/admin/src';
// import graphqlPlugin from '../../../../plugins/graphql/admin/src';
// import sentryPlugin from '../../../../plugins/sentry/admin/src';
import i18nPlugin from '../../../../plugins/i18n/strapi-admin';
import usersPermissionsPlugin from '../../../../plugins/users-permissions/strapi-admin';
import ctbPlugin from '../../../content-type-builder/strapi-admin';
import emailPlugin from '../../../email/strapi-admin';
import uploadPlugin from '../../../upload/strapi-admin';
const plugins = {
'@strapi/plugin-content-type-builder': ctbPlugin,
'@strapi/plugin-i18n': i18nPlugin,
'@strapi/plugin-email': emailPlugin,
'@strapi/plugin-upload': uploadPlugin,
'@strapi/plugin-users-permissions': usersPermissionsPlugin,
'@strapi/plugin-documentation': documentationPlugin,
// '@strapi/plugin-graphql': graphqlPlugin,
// '@strapi/plugin-sentry': sentryPlugin,
};
export default plugins;

View File

@ -9,8 +9,9 @@
"scripts": { "scripts": {
"prepublishOnly": "node ./scripts/build.js", "prepublishOnly": "node ./scripts/build.js",
"test": "echo \"no tests yet\"", "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",
"develop:ce": "STRAPI_DISABLE_EE=true webpack serve --config webpack.config.dev.js --progress profile", "develop:webpack": "cross-env NODE_ENV=development webpack serve --config webpack.config.dev.js --progress profile",
"develop": "yarn create:plugin-file && yarn develop:webpack",
"analyze:bundle": "ANALYZE_BUNDLE=true webpack --config webpack.config.dev.js", "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" "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 path = require('path');
const webpack = require('webpack'); const webpack = require('webpack');
const webpackConfig = require('../webpack.config'); const webpackConfig = require('../webpack.config');
const {
getCorePluginsPath,
getPluginToInstallPath,
createPluginsFile,
} = require('./create-plugins-file');
const PLUGINS_TO_INSTALL = ['i18n', 'users-permissions'];
const buildAdmin = async () => { const buildAdmin = async () => {
const entry = path.join(__dirname, '..', 'admin', 'src'); const entry = path.join(__dirname, '..', 'admin', 'src');
const dest = path.join(__dirname, '..', 'build'); const dest = path.join(__dirname, '..', 'build');
const corePlugins = getCorePluginsPath();
const plugins = getPluginToInstallPath(PLUGINS_TO_INSTALL);
const allPlugins = { ...corePlugins, ...plugins };
await createPluginsFile(allPlugins);
const args = { const args = {
entry, entry,
dest, dest,
cacheDir: __dirname, cacheDir: __dirname,
pluginsPath: [path.resolve(__dirname, '../../../..')], pluginsPath: [path.resolve(__dirname, '../../../../packages')],
env: 'production', env: 'production',
optimize: true, optimize: true,
options: { 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 = 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 = join(__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'];
/**
* 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,
};