2022-05-19 00:40:55 +08:00
|
|
|
const { existsSync } = require('fs');
|
2022-12-01 23:44:02 +08:00
|
|
|
const { resolve, sep } = require('path');
|
2022-05-23 18:48:15 +08:00
|
|
|
const packageJson = require('./package.json');
|
2022-06-10 17:46:46 +08:00
|
|
|
const fs = require('fs');
|
2022-11-15 15:04:21 +08:00
|
|
|
const glob = require('glob');
|
2023-08-02 00:07:52 +08:00
|
|
|
const path = require('path');
|
2022-05-23 18:48:15 +08:00
|
|
|
|
2022-05-24 22:55:09 +08:00
|
|
|
console.log('VERSION: ', packageJson.version);
|
2022-05-19 00:40:55 +08:00
|
|
|
|
|
|
|
function getUmiConfig() {
|
|
|
|
const { APP_PORT, API_BASE_URL } = process.env;
|
|
|
|
const API_BASE_PATH = process.env.API_BASE_PATH || '/api/';
|
|
|
|
const PROXY_TARGET_URL = process.env.PROXY_TARGET_URL || `http://127.0.0.1:${APP_PORT}`;
|
|
|
|
const LOCAL_STORAGE_BASE_URL = process.env.LOCAL_STORAGE_BASE_URL || '/storage/uploads/';
|
|
|
|
|
|
|
|
function getLocalStorageProxy() {
|
|
|
|
if (LOCAL_STORAGE_BASE_URL.startsWith('http')) {
|
|
|
|
return {};
|
|
|
|
}
|
|
|
|
|
|
|
|
return {
|
|
|
|
[LOCAL_STORAGE_BASE_URL]: {
|
|
|
|
target: PROXY_TARGET_URL,
|
|
|
|
changeOrigin: true,
|
|
|
|
},
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
return {
|
2023-06-20 11:48:02 +08:00
|
|
|
alias: getPackagePaths().reduce((memo, item) => {
|
2023-08-02 00:07:52 +08:00
|
|
|
memo[item[0]] = item[1];
|
|
|
|
return memo;
|
2023-06-20 11:48:02 +08:00
|
|
|
}, {}),
|
2022-05-19 00:40:55 +08:00
|
|
|
define: {
|
|
|
|
'process.env.API_BASE_URL': API_BASE_URL || API_BASE_PATH,
|
2022-05-23 18:48:15 +08:00
|
|
|
'process.env.APP_ENV': process.env.APP_ENV,
|
2022-05-24 22:57:32 +08:00
|
|
|
'process.env.VERSION': packageJson.version,
|
2022-05-19 00:40:55 +08:00
|
|
|
},
|
|
|
|
// only proxy when using `umi dev`
|
|
|
|
// if the assets are built, will not proxy
|
|
|
|
proxy: {
|
|
|
|
[API_BASE_PATH]: {
|
|
|
|
target: PROXY_TARGET_URL,
|
|
|
|
changeOrigin: true,
|
|
|
|
pathRewrite: { [`^${API_BASE_PATH}`]: API_BASE_PATH },
|
|
|
|
},
|
|
|
|
// for local storage
|
|
|
|
...getLocalStorageProxy(),
|
|
|
|
},
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2022-11-04 21:23:02 +08:00
|
|
|
function getNamespace() {
|
|
|
|
const content = fs.readFileSync(resolve(process.cwd(), 'package.json'), 'utf-8');
|
|
|
|
const json = JSON.parse(content);
|
|
|
|
return json.name;
|
|
|
|
}
|
|
|
|
|
2022-11-15 15:04:21 +08:00
|
|
|
function getTsconfigPaths() {
|
|
|
|
const content = fs.readFileSync(resolve(process.cwd(), 'tsconfig.json'), 'utf-8');
|
|
|
|
const json = JSON.parse(content);
|
|
|
|
return json.compilerOptions.paths;
|
|
|
|
}
|
|
|
|
|
|
|
|
function getPackagePaths() {
|
|
|
|
const paths = getTsconfigPaths();
|
|
|
|
const pkgs = [];
|
|
|
|
for (const key in paths) {
|
|
|
|
if (Object.hasOwnProperty.call(paths, key)) {
|
|
|
|
const dir = paths[key][0];
|
|
|
|
if (dir.includes('*')) {
|
|
|
|
const files = glob.sync(dir);
|
|
|
|
for (const file of files) {
|
|
|
|
const dirname = resolve(process.cwd(), file);
|
|
|
|
if (existsSync(dirname)) {
|
|
|
|
const re = new RegExp(dir.replace('*', '(.+)'));
|
2023-08-02 00:07:52 +08:00
|
|
|
const p = dirname
|
|
|
|
.substring(process.cwd().length + 1)
|
|
|
|
.split(sep)
|
|
|
|
.join('/');
|
2022-12-01 23:44:02 +08:00
|
|
|
const match = re.exec(p);
|
2022-11-15 15:04:21 +08:00
|
|
|
pkgs.push([key.replace('*', match?.[1]), dirname]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
const dirname = resolve(process.cwd(), dir);
|
|
|
|
pkgs.push([key, dirname]);
|
2022-11-04 21:23:02 +08:00
|
|
|
}
|
|
|
|
}
|
2022-09-18 14:10:01 +08:00
|
|
|
}
|
2022-11-15 15:04:21 +08:00
|
|
|
return pkgs;
|
|
|
|
}
|
|
|
|
|
|
|
|
function resolveNocobasePackagesAlias(config) {
|
|
|
|
const pkgs = getPackagePaths();
|
|
|
|
for (const [pkg, dir] of pkgs) {
|
|
|
|
config.module.rules.get('ts-in-node_modules').include.add(dir);
|
|
|
|
config.resolve.alias.set(pkg, dir);
|
2022-11-03 15:56:27 +08:00
|
|
|
}
|
2022-05-19 00:40:55 +08:00
|
|
|
}
|
|
|
|
|
2023-08-02 00:07:52 +08:00
|
|
|
class IndexGenerator {
|
|
|
|
constructor(outputPath, pluginsPath) {
|
|
|
|
this.outputPath = outputPath;
|
|
|
|
this.pluginsPath = pluginsPath;
|
|
|
|
}
|
|
|
|
|
|
|
|
generate() {
|
|
|
|
this.generatePluginIndex();
|
|
|
|
if (process.env.NODE_ENV === 'production') return;
|
|
|
|
this.pluginsPath.forEach((pluginPath) => {
|
|
|
|
if (!fs.existsSync(pluginPath)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
fs.watch(pluginPath, { recursive: false }, () => {
|
|
|
|
this.generatePluginIndex();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
generatePluginIndex() {
|
|
|
|
if (!fs.existsSync(this.outputPath)) {
|
|
|
|
fs.mkdirSync(path.dirname(this.outputPath), { recursive: true });
|
|
|
|
fs.writeFileSync(this.outputPath, 'export default {}');
|
|
|
|
}
|
|
|
|
const validPluginPaths = this.pluginsPath.filter((pluginPath) => fs.existsSync(pluginPath));
|
|
|
|
if (!validPluginPaths.length) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (process.env.NODE_ENV === 'production') {
|
|
|
|
fs.writeFileSync(this.outputPath, 'export default {}');
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
const pluginInfo = validPluginPaths.map((pluginPath) => this.getContent(pluginPath));
|
|
|
|
const importContent = pluginInfo.map(({ indexContent }) => indexContent).join('\n');
|
|
|
|
const exportContent = pluginInfo.map(({ exportContent }) => exportContent).join('\n');
|
|
|
|
|
|
|
|
const fileContent = `${importContent}\n\nexport default {\n${exportContent}\n}`;
|
|
|
|
|
|
|
|
fs.writeFileSync(this.outputPath, fileContent);
|
|
|
|
}
|
|
|
|
|
|
|
|
getContent(pluginPath) {
|
|
|
|
const pluginFolders = fs.readdirSync(pluginPath);
|
|
|
|
const pluginImports = pluginFolders
|
|
|
|
.filter((folder) => {
|
|
|
|
const pluginPackageJsonPath = path.join(pluginPath, folder, 'package.json');
|
|
|
|
const pluginSrcClientPath = path.join(pluginPath, folder, 'src', 'client');
|
|
|
|
return fs.existsSync(pluginPackageJsonPath) && fs.existsSync(pluginSrcClientPath);
|
|
|
|
})
|
|
|
|
.map((folder, index) => {
|
|
|
|
const pluginPackageJsonPath = path.join(pluginPath, folder, 'package.json');
|
|
|
|
const pluginPackageJson = require(pluginPackageJsonPath);
|
|
|
|
const pluginSrcClientPath = path
|
|
|
|
.relative(path.dirname(this.outputPath), path.join(pluginPath, folder, 'src', 'client'))
|
|
|
|
.replaceAll('\\', '/');
|
|
|
|
const pluginName = `${folder.replaceAll('-', '_')}${index}`;
|
|
|
|
const importStatement = `const ${pluginName} = import('${pluginSrcClientPath}');`;
|
|
|
|
return { importStatement, pluginName, packageJsonName: pluginPackageJson.name };
|
|
|
|
});
|
|
|
|
|
|
|
|
const indexContent = pluginImports.map(({ importStatement }) => importStatement).join('\n');
|
|
|
|
|
|
|
|
const exportContent = pluginImports
|
|
|
|
.map(({ pluginName, packageJsonName }) => ` "${packageJsonName}": ${pluginName},`)
|
|
|
|
.join('\n');
|
|
|
|
|
|
|
|
return {
|
|
|
|
indexContent,
|
|
|
|
exportContent,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-05-19 00:40:55 +08:00
|
|
|
exports.getUmiConfig = getUmiConfig;
|
|
|
|
exports.resolveNocobasePackagesAlias = resolveNocobasePackagesAlias;
|
2023-08-02 00:07:52 +08:00
|
|
|
exports.IndexGenerator = IndexGenerator;
|