2022-02-16 11:20:17 +08:00

156 lines
4.4 KiB
TypeScript

import { COMMON_CHUNK_NAME, DEFAULT_LINK_AFTER } from '../../const/generator';
import {
BuilderComponentPlugin,
BuilderComponentPluginFactory,
ChunkType,
FileType,
ICodeStruct,
IUtilInfo,
} from '../../types';
const pluginFactory: BuilderComponentPluginFactory<string> = (baseFramework?: string) => {
const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {
const framework = baseFramework || 'react';
const next: ICodeStruct = {
...pre,
};
const ir = next.ir as IUtilInfo;
next.chunks.push({
type: ChunkType.STRING,
fileType: FileType.JS,
name: COMMON_CHUNK_NAME.ExternalDepsImport,
content: `
import { createRef } from '${framework}';
`,
linkAfter: [],
});
next.chunks.push({
type: ChunkType.STRING,
fileType: FileType.JS,
name: COMMON_CHUNK_NAME.FileUtilDefine,
content: `
export class RefsManager {
constructor() {
this.refInsStore = {};
}
clearNullRefs() {
Object.keys(this.refInsStore).forEach((refName) => {
const filteredInsList = this.refInsStore[refName].filter(insRef => !!insRef.current);
if (filteredInsList.length > 0) {
this.refInsStore[refName] = filteredInsList;
} else {
delete this.refInsStore[refName];
}
});
}
get(refName) {
this.clearNullRefs();
if (this.refInsStore[refName] && this.refInsStore[refName].length > 0) {
return this.refInsStore[refName][0].current;
}
return null;
}
getAll(refName) {
this.clearNullRefs();
if (this.refInsStore[refName] && this.refInsStore[refName].length > 0) {
return this.refInsStore[refName].map(i => i.current);
}
return [];
}
linkRef(refName) {
const refIns = createRef();
this.refInsStore[refName] = this.refInsStore[refName] || [];
this.refInsStore[refName].push(refIns);
return refIns;
}
}
`,
linkAfter: [...DEFAULT_LINK_AFTER[COMMON_CHUNK_NAME.FileUtilDefine]],
});
if (ir.utils) {
next.chunks.push({
type: ChunkType.STRING,
fileType: FileType.JS,
name: COMMON_CHUNK_NAME.FileExport,
content: `
export default {
`,
linkAfter: [
COMMON_CHUNK_NAME.ExternalDepsImport,
COMMON_CHUNK_NAME.InternalDepsImport,
COMMON_CHUNK_NAME.ImportAliasDefine,
COMMON_CHUNK_NAME.FileVarDefine,
COMMON_CHUNK_NAME.FileUtilDefine,
COMMON_CHUNK_NAME.FileMainContent,
],
});
ir.utils.forEach((util) => {
if (util.type === 'function') {
next.chunks.push({
type: ChunkType.STRING,
fileType: FileType.JS,
name: COMMON_CHUNK_NAME.FileVarDefine,
content: `
const ${util.name} = ${util.content.value};
`,
linkAfter: [
COMMON_CHUNK_NAME.ExternalDepsImport,
COMMON_CHUNK_NAME.InternalDepsImport,
COMMON_CHUNK_NAME.ImportAliasDefine,
],
});
}
next.chunks.push({
type: ChunkType.STRING,
fileType: FileType.JS,
name: COMMON_CHUNK_NAME.FileExport,
content: `${util.name},`,
linkAfter: [
COMMON_CHUNK_NAME.ExternalDepsImport,
COMMON_CHUNK_NAME.InternalDepsImport,
COMMON_CHUNK_NAME.ImportAliasDefine,
COMMON_CHUNK_NAME.FileVarDefine,
COMMON_CHUNK_NAME.FileUtilDefine,
COMMON_CHUNK_NAME.FileMainContent,
],
});
});
next.chunks.push({
type: ChunkType.STRING,
fileType: FileType.JS,
name: COMMON_CHUNK_NAME.FileExport,
content: `
};
`,
linkAfter: [
COMMON_CHUNK_NAME.ExternalDepsImport,
COMMON_CHUNK_NAME.InternalDepsImport,
COMMON_CHUNK_NAME.ImportAliasDefine,
COMMON_CHUNK_NAME.FileVarDefine,
COMMON_CHUNK_NAME.FileUtilDefine,
COMMON_CHUNK_NAME.FileMainContent,
],
});
}
return next;
};
return plugin;
};
export default pluginFactory;