处理了i18n的文件在node_modules/.../node_modules中多层级的问题

This commit is contained in:
Xu Chang 2024-02-29 22:04:59 +08:00
parent 479bbf1d92
commit e11e2d8cd7
1 changed files with 34 additions and 21 deletions

View File

@ -1,5 +1,5 @@
const fs = require('fs');
const { relative, resolve, join } = require('path');
const { relative, resolve, join, dirname } = require('path');
const t = require('@babel/types');
const assert = require('assert');
const { fork } = require('child_process');
@ -35,34 +35,47 @@ function parseFileModuleAndNs(cwd, filename) {
}
}
const relativePath = relative(cwd2, filename);
if (relativePath.startsWith('node_modules') || relativePath.startsWith('..')) { // 在测试环境下是相对路径
const moduleRelativePath = relativePath
.replace(/\\/g, '/')
.split('/')
.slice(0, 2);
const modulePath = join(cwd2, ...moduleRelativePath);
const moduleDir = moduleRelativePath[1];
// 寻找离filename最近层的package.json看作项目名称
// 用relativePath来递进查找在操作系统层面更安全
const fileDirPaths = relativePath.replace(/\\/g, '/').split('/');
let moduleName = ModuleDict[moduleDir];
if (!moduleName) {
const { name } = require(join(modulePath, 'package.json'));
ModuleDict[moduleDir] = name;
moduleName = name;
}
const rel2paths = relative(modulePath, filename)
.replace(/\\/g, '/')
.split('/');
let iter = fileDirPaths.length;
let filePrjRootPath = '';
let moduleName = '';
do {
filePrjRootPath = join(cwd2, ...fileDirPaths.slice(0, iter));
const pkgJsonPath = join(filePrjRootPath, 'package.json');
if (fs.existsSync(pkgJsonPath)) {
moduleName = ModuleDict[filePrjRootPath];
if (!moduleName) {
const { name } = require(pkgJsonPath);
moduleName = name;
ModuleDict[filePrjRootPath] = name;
}
break;
}
else {
assert(iter > 0);
iter--;
}
} while (true);
// 引用的第三方项目目前合法的只有components下的组件pages是容一些较早的遗留代码
const fileRelPathInPrj = relative(filePrjRootPath, filename).replace(/\\/g, '/').split('/');;
let ns;
switch (rel2paths[1]) {
switch (fileRelPathInPrj[1]) {
case 'pages': {
ns = `${moduleName}-p-${rel2paths.slice(2, rel2paths.length - 1).join('-')}`;
ns = `${moduleName}-p-${fileRelPathInPrj.slice(2, fileRelPathInPrj.length - 1).join('-')}`;
break;
}
default: {
assert(rel2paths[1] === 'components', rel2paths.join('//'));
ns = `${moduleName}-c-${rel2paths.slice(2, rel2paths.length - 1).join('-')}`;
if (fileRelPathInPrj[1] !== 'components') {
assert(false);
}
assert(fileRelPathInPrj[1] === 'components', fileRelPathInPrj.join('//'));
ns = `${moduleName}-c-${fileRelPathInPrj.slice(2, fileRelPathInPrj.length - 1).join('-')}`;
break;
}
}