UNPKG

@epmkit/cra-template-epm-plugin

Version:

The base template for EPM plugins.

95 lines (81 loc) 2.83 kB
'use strict'; const path = require('path'); const fs = require('fs'); const getPublicUrlOrPath = require('react-dev-utils/getPublicUrlOrPath'); const appDirectory = fs.realpathSync(process.cwd()); const resolveApp = relativePath => path.resolve(appDirectory, relativePath); const publicUrlOrPath = getPublicUrlOrPath( process.env.NODE_ENV === 'development', require(resolveApp('package.json')).homepage, process.env.PUBLIC_URL ); const buildPath = process.env.BUILD_PATH || 'build'; const moduleFileExtensions = [ 'web.mjs', 'mjs', 'web.js', 'js', 'web.ts', 'ts', 'web.tsx', 'tsx', 'json', 'web.jsx', 'jsx', ]; // 按照 webpack 的顺序解析文件路径 const resolveModule = (resolveFn, filePath) => { const extension = moduleFileExtensions.find(extension => fs.existsSync(resolveFn(`${filePath}.${extension}`)) ); if (extension) { return resolveFn(`${filePath}.${extension}`); } return resolveFn(`${filePath}.js`); }; // 解析插件文件的入口路径 const resolveModulePath = (resolveFn, filePath) => { let result = {}; const files = fs.readdirSync(filePath); files.forEach((file) => { const fullPath = path.join(filePath, file); const stat = fs.statSync(fullPath); const isDirectory = stat.isDirectory(); if (isDirectory) { result = Object.assign(result, resolveModulePath(resolveFn, fullPath)); } else { const ext = path.extname(fullPath).slice(1); let filename = path.basename(fullPath, `.${ext}`); if (filename === 'bootstrap' && moduleFileExtensions.includes(ext)) { filename = path.basename(path.dirname(fullPath)); if (result[filename]) { throw new Error(`Two plugins has the same name ${filename}: ${result[filename]} and ${resolveFn(fullPath)}.`); } result[filename] = resolveFn(fullPath); } } }); return result; } module.exports = { dotenv: resolveApp('.env'), appPath: resolveApp('.'), appBuild: resolveApp(buildPath), appPublic: resolveApp('public'), appHtml: resolveApp('public/index.html'), appIndexJs: resolveModule(resolveApp, 'src/bootstrap'), pluginJs: resolveModulePath(resolveApp, 'src/plugin/'), appPackageJson: resolveApp('package.json'), appSrc: resolveApp('src'), appTsConfig: resolveApp('tsconfig.json'), appJsConfig: resolveApp('jsconfig.json'), yarnLockFile: resolveApp('yarn.lock'), testsSetup: resolveModule(resolveApp, 'src/setupTests'), proxySetup: resolveApp('src/setupProxy.js'), appNodeModules: resolveApp('node_modules'), appWebpackCache: resolveApp('node_modules/.cache'), appTsBuildInfoFile: resolveApp('node_modules/.cache/tsconfig.tsbuildinfo'), swSrc: resolveModule(resolveApp, 'src/service-worker'), publicUrlOrPath, }; module.exports.moduleFileExtensions = moduleFileExtensions;