@lark-project/cli
Version:
飞书项目插件开发工具
127 lines (126 loc) • 6.14 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateResourceCode = exports.getDocs = exports.copyProjectWithTemplate = void 0;
const path_1 = __importDefault(require("path"));
const fs_extra_1 = require("fs-extra");
const ejs_1 = __importDefault(require("ejs"));
const fs_1 = __importDefault(require("fs"));
const globby_1 = __importDefault(require("globby"));
async function copyProjectWithTemplate({ templateTargetDir, templateId, targetDir, renderCtx, filter, }) {
const globbyCWD = path_1.default.join(templateTargetDir, templateId ? `project/${templateId}` : '');
const entries = await (0, globby_1.default)(['**'], {
cwd: globbyCWD,
objectMode: true,
dot: true,
});
for (const entry of entries) {
const absolutePath = path_1.default.resolve(globbyCWD, entry.path);
const isFilter = filter ? filter(entry.path) : false;
if (entry.name.endsWith('.ejs') && !isFilter) {
const templateFile = (0, fs_extra_1.readFileSync)(absolutePath);
const compiledFileContent = ejs_1.default.render(templateFile.toString(), renderCtx);
const pathWithoutEJS = path_1.default.parse(entry.path).name;
(0, fs_extra_1.writeFileSync)(path_1.default.resolve(targetDir, pathWithoutEJS), compiledFileContent);
}
else {
// 模板描述文件不复制
if (entry.name !== 'tempale-meta.json') {
const targetFilePath = path_1.default.resolve(targetDir, entry.path);
(0, fs_extra_1.copySync)(absolutePath, targetFilePath);
}
}
}
}
exports.copyProjectWithTemplate = copyProjectWithTemplate;
const getDocs = (domain) => ([{
url: `${domain}/openapp/start_guide`,
text: 'Get Started',
type: 'primary',
}, {
url: `${domain}/b/helpcenter/1p8d7djs/x4l57qtx`,
text: 'Client API',
type: 'secondary',
}, {
url: `${domain}/b/helpcenter/1p8d7djs/aa6btca8`,
text: 'Client Component',
type: 'secondary',
}]);
exports.getDocs = getDocs;
const generateResourceCode = async ({ localConfig, remoteConfig, targetDir, siteDomain }) => {
var _a;
const localResourceIds = (_a = ((localConfig === null || localConfig === void 0 ? void 0 : localConfig.resources) || [])) === null || _a === void 0 ? void 0 : _a.map((item) => item.id);
const remoteWebResourceIds = remoteConfig.features.map((item) => { var _a, _b; return (_b = (_a = item.web) === null || _a === void 0 ? void 0 : _a.resourceId) === null || _b === void 0 ? void 0 : _b.resource; }).filter(Boolean);
const remoteAddWebResourceIds = remoteWebResourceIds.filter((item) => item && !localResourceIds.includes(item));
const remoteMobileResourceIds = remoteConfig.features.map((item) => { var _a, _b; return (_b = (_a = item.mobile) === null || _a === void 0 ? void 0 : _a.resourceId) === null || _b === void 0 ? void 0 : _b.resource; }).filter(Boolean);
const remoteAddMobileResourceIds = remoteMobileResourceIds.filter((item) => item && !localResourceIds.includes(item));
const needRemoveResourceIds = localResourceIds.filter((item) => !remoteWebResourceIds.includes(item) && !remoteMobileResourceIds.includes(item));
const renderCtx = {
pluginName: remoteConfig.name,
pluginIcon: remoteConfig.icon,
docs: (0, exports.getDocs)(siteDomain),
};
const featureDir = path_1.default.join(targetDir, './src/features/');
if (!fs_1.default.existsSync(featureDir)) {
fs_1.default.mkdirSync(featureDir);
}
const newResourceRelation = [];
const syncResourceIds = [];
const unSyncResourceIds = [];
const templateWebTargetDir = path_1.default.join(targetDir, './.template/project/react-initialized/src/features/web');
const templateMobileTargetDir = path_1.default.join(targetDir, './.template/project/react-initialized/src/features/mobile');
const webList = remoteAddWebResourceIds.map((resourceId) => {
const entryPath = `./src/features/${resourceId}/index.tsx`;
if (fs_1.default.existsSync(path_1.default.join(featureDir, resourceId))) {
newResourceRelation.push({
id: resourceId,
entry: '',
});
unSyncResourceIds.push(resourceId);
return;
}
fs_1.default.mkdirSync(`${targetDir}/src/features/${resourceId}`);
syncResourceIds.push(resourceId);
newResourceRelation.push({
id: resourceId,
entry: entryPath,
});
return copyProjectWithTemplate({
templateTargetDir: templateWebTargetDir,
targetDir: `${targetDir}/src/features/${resourceId}`,
renderCtx: Object.assign(Object.assign({}, renderCtx), { entryPath }),
});
});
const mobileList = remoteAddMobileResourceIds.map((resourceId) => {
const entryPath = `./src/features/${resourceId}/index.tsx`;
if (fs_1.default.existsSync(path_1.default.join(featureDir, resourceId))) {
newResourceRelation.push({
id: resourceId,
entry: '',
});
unSyncResourceIds.push(resourceId);
return;
}
fs_1.default.mkdirSync(`${targetDir}/src/features/${resourceId}`);
syncResourceIds.push(resourceId);
newResourceRelation.push({
id: resourceId,
entry: entryPath,
});
return copyProjectWithTemplate({
templateTargetDir: templateMobileTargetDir,
targetDir: `${targetDir}/src/features/${resourceId}`,
renderCtx: Object.assign(Object.assign({}, renderCtx), { entryPath }),
});
});
return {
list: [...webList, ...mobileList],
newResourceRelation,
syncResourceIds,
unSyncResourceIds,
needRemoveResourceIds,
};
};
exports.generateResourceCode = generateResourceCode;