UNPKG

@eggjs/tegg-common-util

Version:
322 lines 27.5 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; var _a, _ModuleConfigUtil_loadOne, _ModuleConfigUtil_loadJson, _ModuleConfigUtil_loadYaml, _ModuleConfigUtil_loadOneSync, _ModuleConfigUtil_loadJsonSync, _ModuleConfigUtil_loadYamlSync; Object.defineProperty(exports, "__esModule", { value: true }); exports.ModuleConfigUtil = exports.ModuleReferenceConfigHelp = void 0; const node_assert_1 = __importDefault(require("node:assert")); const node_fs_1 = __importStar(require("node:fs")); const node_path_1 = __importDefault(require("node:path")); const extend2_1 = __importDefault(require("extend2")); const globby_1 = __importDefault(require("globby")); const js_yaml_1 = __importDefault(require("js-yaml")); const FSUtil_1 = require("./FSUtil"); class ModuleReferenceConfigHelp { static isInlineModuleReference(moduleReference) { return !!moduleReference.path; } static isNpmModuleReference(moduleReference) { return !!moduleReference.package; } } exports.ModuleReferenceConfigHelp = ModuleReferenceConfigHelp; const DEFAULT_READ_MODULE_REF_OPTS = { deep: 10, }; class ModuleConfigUtil { static setConfigNames(configNames) { _a.configNames = configNames; } static readModuleReference(baseDir, options) { // 1. module.json exits use module.json as module reference // 1. module.json not exits scan baseDir get package.json to find modules const configDir = node_path_1.default.join(baseDir, 'config'); const moduleJsonPath = node_path_1.default.join(configDir, 'module.json'); if (node_fs_1.default.existsSync(moduleJsonPath)) { return this.readModuleReferenceFromModuleJson(configDir, moduleJsonPath, (options === null || options === void 0 ? void 0 : options.cwd) || baseDir); } return this.readModuleReferenceFromScan(baseDir, options); } static readModuleReferenceFromModuleJson(configDir, moduleJsonPath, cwd) { const moduleJsonContent = node_fs_1.default.readFileSync(moduleJsonPath, 'utf8'); const moduleJson = JSON.parse(moduleJsonContent); const moduleReferenceList = []; for (const moduleReferenceConfig of moduleJson) { let moduleReference; if (ModuleReferenceConfigHelp.isNpmModuleReference(moduleReferenceConfig)) { const options = cwd ? { paths: [cwd] } : {}; // path.posix for windows keep path as foo/package.json const pkgJson = node_path_1.default.posix.join(moduleReferenceConfig.package, 'package.json'); const file = require.resolve(pkgJson, options); const modulePath = node_path_1.default.dirname(file); moduleReference = { path: modulePath, name: _a.readModuleNameSync(modulePath), }; } else if (ModuleReferenceConfigHelp.isInlineModuleReference(moduleReferenceConfig)) { const modulePath = node_path_1.default.join(configDir, moduleReferenceConfig.path); moduleReference = { path: modulePath, name: _a.readModuleNameSync(modulePath), }; } else { throw new Error('unknown type of module reference config: ' + JSON.stringify(moduleReferenceConfig)); } moduleReferenceList.push(moduleReference); } return moduleReferenceList; } static readModuleReferenceFromScan(baseDir, options) { const ref = []; const realOptions = Object.assign({}, DEFAULT_READ_MODULE_REF_OPTS, options); const packagePaths = globby_1.default.sync([ '**/package.json', // not load node_modules '!**/node_modules', // not load files in .xxx/ '!**/+(.*)/**', // not load coverage '!**/coverage', ...(realOptions.extraFilePattern || []), ], { cwd: baseDir, deep: realOptions.deep, }); const moduleDirSet = new Set(); for (const packagePath of packagePaths) { const absolutePkgPath = node_path_1.default.join(baseDir, packagePath); let realPkgPath; try { realPkgPath = node_fs_1.default.realpathSync(absolutePkgPath); } catch (_) { continue; } const moduleDir = node_path_1.default.dirname(realPkgPath); // skip the symbolic link if (moduleDirSet.has(moduleDir)) { continue; } moduleDirSet.add(moduleDir); let name; try { name = this.readModuleNameSync(moduleDir); } catch (_) { continue; } ref.push({ path: moduleDir, name, }); } const moduleReferences = this.readModuleFromNodeModules(baseDir); for (const moduleReference of moduleReferences) { const moduleBasePath = node_path_1.default.basename(moduleReference.path); moduleDirSet.forEach(modulePath => { if (node_path_1.default.basename(modulePath) === moduleBasePath) { throw new Error('duplicate import of module reference: ' + moduleBasePath); } }); ref.push({ path: moduleReference.path, name: moduleReference.name, }); } return ref; } static readModuleFromNodeModules(baseDir) { const ref = []; let pkgContent; try { pkgContent = node_fs_1.default.readFileSync(node_path_1.default.join(baseDir, 'package.json'), 'utf8'); } catch (_) { return []; } const pkg = JSON.parse(pkgContent); for (const dependencyKey of Object.keys(pkg.dependencies || {})) { let packageJsonPath; try { // https://nodejs.org/api/packages.html#package-entry-points // ignore cases where the package entry is exports but package.json is not exported packageJsonPath = require.resolve(`${dependencyKey}/package.json`, { paths: [baseDir] }); } catch (_) { continue; } const absolutePkgPath = node_path_1.default.dirname(packageJsonPath); const realPkgPath = node_fs_1.default.realpathSync(absolutePkgPath); try { const name = this.readModuleNameSync(realPkgPath); ref.push({ path: realPkgPath, name, }); } catch (_) { continue; } } return ref; } static resolveModuleDir(moduleDir, baseDir) { if (node_path_1.default.isAbsolute(moduleDir)) { return moduleDir; } (0, node_assert_1.default)(baseDir, 'baseDir is required'); return node_path_1.default.join(baseDir, 'config', moduleDir); } static getModuleName(pkg) { (0, node_assert_1.default)(pkg.eggModule && pkg.eggModule.name, 'eggModule.name not found in package.json'); return pkg.eggModule.name; } static async readModuleName(baseDir, moduleDir) { moduleDir = _a.resolveModuleDir(moduleDir, baseDir); const pkgContent = await node_fs_1.promises.readFile(node_path_1.default.join(moduleDir, 'package.json'), 'utf8'); const pkg = JSON.parse(pkgContent); return _a.getModuleName(pkg); } static readModuleNameSync(moduleDir, baseDir) { moduleDir = _a.resolveModuleDir(moduleDir, baseDir); const pkgContent = node_fs_1.default.readFileSync(node_path_1.default.join(moduleDir, 'package.json'), 'utf8'); const pkg = JSON.parse(pkgContent); return _a.getModuleName(pkg); } static async loadModuleConfig(moduleDir, baseDir, env) { const modulePath = _a.resolveModuleDir(moduleDir, baseDir); let configNames; if (env) { configNames = ['module', `module.${env}`]; } else { // assert(ModuleConfigUtil.configNames, 'should setConfigNames before load module config'); configNames = _a.configNames || ['module']; } const target = {}; for (const configName of configNames) { let config = await __classPrivateFieldGet(_a, _a, "m", _ModuleConfigUtil_loadOne).call(_a, modulePath, configName); // both module.yml and module.default.yml are ok for default config if (configName === 'module.default' && !config) { config = await __classPrivateFieldGet(_a, _a, "m", _ModuleConfigUtil_loadOne).call(_a, modulePath, 'module'); } if (config) { (0, extend2_1.default)(true, target, config); } } return target; } static loadModuleConfigSync(moduleDir, baseDir, env) { const modulePath = _a.resolveModuleDir(moduleDir, baseDir); let configNames; if (env) { configNames = ['module', `module.${env}`]; } else { // assert(ModuleConfigUtil.configNames, 'should setConfigNames before load module config'); configNames = _a.configNames || ['module']; } const target = {}; for (const configName of configNames) { let config = __classPrivateFieldGet(_a, _a, "m", _ModuleConfigUtil_loadOneSync).call(_a, modulePath, configName); // both module.yml and module.default.yml are ok for default config if (configName === 'module.default' && !config) { config = __classPrivateFieldGet(_a, _a, "m", _ModuleConfigUtil_loadOneSync).call(_a, modulePath, 'module'); } if (config) { (0, extend2_1.default)(true, target, config); } } return target; } } exports.ModuleConfigUtil = ModuleConfigUtil; _a = ModuleConfigUtil, _ModuleConfigUtil_loadOne = async function _ModuleConfigUtil_loadOne(moduleDir, configName) { const yamlConfigPath = node_path_1.default.join(moduleDir, `${configName}.yml`); let config = await __classPrivateFieldGet(_a, _a, "m", _ModuleConfigUtil_loadYaml).call(_a, yamlConfigPath); if (!config) { const jsonConfigPath = node_path_1.default.join(moduleDir, `${configName}.json`); config = await __classPrivateFieldGet(_a, _a, "m", _ModuleConfigUtil_loadJson).call(_a, jsonConfigPath); } return config; }, _ModuleConfigUtil_loadJson = async function _ModuleConfigUtil_loadJson(moduleJsonPath) { const moduleJsonPathExists = await FSUtil_1.FSUtil.fileExists(moduleJsonPath); if (!moduleJsonPathExists) { return; } const moduleJsonContent = await node_fs_1.promises.readFile(moduleJsonPath, 'utf8'); const moduleJson = JSON.parse(moduleJsonContent); return moduleJson.config; }, _ModuleConfigUtil_loadYaml = async function _ModuleConfigUtil_loadYaml(moduleYamlPath) { const moduleYamlPathExists = await FSUtil_1.FSUtil.fileExists(moduleYamlPath); if (!moduleYamlPathExists) { return; } const moduleYamlContent = await node_fs_1.promises.readFile(moduleYamlPath, 'utf8'); return js_yaml_1.default.safeLoad(moduleYamlContent); }, _ModuleConfigUtil_loadOneSync = function _ModuleConfigUtil_loadOneSync(moduleDir, configName) { const yamlConfigPath = node_path_1.default.join(moduleDir, `${configName}.yml`); let config = __classPrivateFieldGet(_a, _a, "m", _ModuleConfigUtil_loadYamlSync).call(_a, yamlConfigPath); if (!config) { const jsonConfigPath = node_path_1.default.join(moduleDir, `${configName}.json`); config = __classPrivateFieldGet(_a, _a, "m", _ModuleConfigUtil_loadJsonSync).call(_a, jsonConfigPath); } return config; }, _ModuleConfigUtil_loadJsonSync = function _ModuleConfigUtil_loadJsonSync(moduleJsonPath) { const moduleJsonPathExists = node_fs_1.default.existsSync(moduleJsonPath); if (!moduleJsonPathExists) { return; } const moduleJsonContent = node_fs_1.default.readFileSync(moduleJsonPath, 'utf8'); const moduleJson = JSON.parse(moduleJsonContent); return moduleJson.config; }, _ModuleConfigUtil_loadYamlSync = function _ModuleConfigUtil_loadYamlSync(moduleYamlPath) { const moduleYamlPathExists = node_fs_1.default.existsSync(moduleYamlPath); if (!moduleYamlPathExists) { return; } const moduleYamlContent = node_fs_1.default.readFileSync(moduleYamlPath, 'utf8'); return js_yaml_1.default.safeLoad(moduleYamlContent); }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9kdWxlQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL01vZHVsZUNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw4REFBaUM7QUFDakMsbURBQW9EO0FBQ3BELDBEQUE2QjtBQUM3QixzREFBNkI7QUFDN0Isb0RBQTRCO0FBQzVCLHNEQUEyQjtBQVMzQixxQ0FBa0M7QUFFbEMsTUFBYSx5QkFBeUI7SUFDcEMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLGVBQXNDO1FBQ25FLE9BQU8sQ0FBQyxDQUFFLGVBQStDLENBQUMsSUFBSSxDQUFDO0lBQ2pFLENBQUM7SUFFRCxNQUFNLENBQUMsb0JBQW9CLENBQUMsZUFBc0M7UUFDaEUsT0FBTyxDQUFDLENBQUUsZUFBNEMsQ0FBQyxPQUFPLENBQUM7SUFDakUsQ0FBQztDQUNGO0FBUkQsOERBUUM7QUFFRCxNQUFNLDRCQUE0QixHQUFHO0lBQ25DLElBQUksRUFBRSxFQUFFO0NBQ1QsQ0FBQztBQUVGLE1BQWEsZ0JBQWdCO0lBR3BCLE1BQU0sQ0FBQyxjQUFjLENBQUMsV0FBaUM7UUFDNUQsRUFBZ0IsQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQzdDLENBQUM7SUFFTSxNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBZSxFQUFFLE9BQW9DO1FBQ3JGLDJEQUEyRDtRQUMzRCx5RUFBeUU7UUFDekUsTUFBTSxTQUFTLEdBQUcsbUJBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sY0FBYyxHQUFHLG1CQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUMzRCxJQUFJLGlCQUFFLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7WUFDbEMsT0FBTyxJQUFJLENBQUMsaUNBQWlDLENBQUMsU0FB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