@eggjs/tegg-common-util
Version:
common util for tegg
322 lines • 27.5 kB
JavaScript
;
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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