@lcap/nasl
Version:
NetEase Application Specific Language
114 lines (112 loc) • 4.46 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.genSimpleBundleFile = void 0;
const nasl_unified_frontend_generator_1 = require("@lcap/nasl-unified-frontend-generator");
const genBundleFiles_1 = require("./genBundleFiles");
/**
* 只用于 NASL 沙箱简单打包用
*/
function genSimpleBundleFile(app, frontend, options) {
const views = frontend.views;
const routes = [];
const files = {};
let importStr = '';
const typeKeyMap = {};
const enumMap = {};
app.enums.forEach((enumItem) => {
enumMap['app.enums.' + enumItem.name] = true;
});
app.dataSources[0]?.entities.forEach((entity) => {
typeKeyMap[entity.name] = typeKeyMap[entity.name] || {};
entity.properties.forEach((property) => {
typeKeyMap[entity.name][property.name] = property.typeAnnotation?.typeKey;
});
});
function traverseView(view, prefixName = '', parentPath = '') {
const isRootView = view.parentNode?.concept !== 'View';
let path = isRootView ? `${frontend.prefixPath}/${view.name}` : view.name;
let prefixPath = parentPath ? `${parentPath}/${view.name}` : view.name;
let fullName = prefixName ? `${prefixName}_${view.name}` : view.name;
let content = view.toVue({ isComposition: true, creatorDevMode: true });
// naslJSON 有标注就不需要这个了
// content = content
// .replace(
// /(:text="\$utils\['ToString'\]\('undefined', \$utils\['EnumItemToText'\]\()('([^']+)', )?current\?\.item\?\.(\w+)(?:\?\.(\w+))?\)/g,
// (m, $1, $2, $3, $4, $5) => {
// let typeKey = '';
// if ($5) {
// const entityName = upperFirst($4);
// typeKey = typeKeyMap[entityName]?.[$5];
// } else {
// typeKey = `app.enums.${upperFirst($4).replace(/\d+$/, '')}`;
// }
// if (typeKey && enumMap[typeKey])
// return `${$1}'${typeKey}', current?.item?.${$4}${$5 ? `?.${$5}` : ''})`;
// return m;
// }
// )
// .replace(
// /('ListTransform'\]\(.+?, \(item\) => \(\$utils\['EnumItemToText'\]\()('([^']+)', )?item\?\.(\w+)(?:\?\.(\w+))?\)\)/g,
// (m, $1, $2, $3, $4, $5) => {
// let typeKey = '';
// if ($5) {
// const entityName = upperFirst($4);
// typeKey = typeKeyMap[entityName]?.[$5];
// } else {
// typeKey = `app.enums.${upperFirst($4).replace(/\d+$/, '')}`;
// }
// if (typeKey && enumMap[typeKey])
// return `${$1}'${typeKey}', item?.${$4}${$5 ? `?.${$5}` : ''}))`;
// return m;
// }
// );
const fileName = `/${fullName}.vue`;
files[fileName] = { code: content };
importStr += `const ${fullName} = () => import('.${fileName}');\n`;
const children = [];
view.children.forEach((child) => {
children.push(traverseView(child, fullName, prefixPath));
});
const route = {
path,
component: `##${fullName}##`,
meta: view.getRouteMeta(),
children,
};
if (route.meta.first) {
route.redirect = `/${prefixPath}/${route.meta.first}`;
}
return route;
}
views.forEach((view) => {
routes.push(traverseView(view));
if (view.isIndex) {
routes.push({
path: frontend.prefixPath ? frontend.prefixPath : '/',
redirect: `${frontend.prefixPath}/${view.name}`,
});
}
});
routes.push({
path: '/:pathMatch(.*)*',
redirect: options?.notFoundRedirect || '/notFound',
});
const routesStr = JSON.stringify(routes).replace(/"##|##"/g, '');
const metaData = (0, nasl_unified_frontend_generator_1.genMetaData)(app, frontend, undefined);
const metaDataStr = (0, genBundleFiles_1.stringifyMetaData)(metaData);
files['/router.js'] = {
code: `
${importStr}
export const routes = ${routesStr};
export const metaData = ${metaDataStr};
`,
};
files['/index.css'] = {
code: frontend.genThemeCSS(),
};
return {
files,
};
}
exports.genSimpleBundleFile = genSimpleBundleFile;
//# sourceMappingURL=genSimpleBundleFile.js.map