@lark-project/cli
Version:
飞书项目插件开发工具
152 lines (151 loc) • 6.95 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 (isFilter) {
continue;
}
if (entry.name.endsWith('.ejs')) {
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 remoteWebResourceId2Mode = remoteConfig.features.reduce((pre, cur) => {
var _a, _b;
if (cur.extension) {
const item = cur.extension.find(item => item.ext_subType === 'point_run_mode');
pre[(_b = (_a = cur.web) === null || _a === void 0 ? void 0 : _a.resourceId) === null || _b === void 0 ? void 0 : _b.resource] = (item === null || item === void 0 ? void 0 : item.ext_config) || 'ui';
}
return pre;
}, {});
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`;
let mode = 'ui';
if (remoteWebResourceId2Mode[resourceId]) {
mode = remoteWebResourceId2Mode[resourceId];
}
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), { mode,
entryPath }),
filter: (entry) => (mode === 'script' ? entry.includes('.css') : false),
});
});
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;