Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 | 1x 1x 1x 1x 2x 2x 2x 6x 6x 4x 4x 2x 4x 2x 2x 4x 4x 2x 4x 4x 2x 4x 1x 6x 1x 5x 1x 1x 1x 1x 1x 1x | import { checkFolderWithoutRemove, writeEnums, writePermissions } from './files';
import * as path from 'path';
import { registerHandlebarTemplates } from './registerTemplates';
/**
* @description 生成的单个枚举数据结构
*/
interface EnumsItem {
label: string;
value: string;
}
/**
* @description 枚举数据源应符合的结构
*/
export type Enums = Record<
string,
Record<string, string> | Record<string, string>[]
>;
interface EnumsTemplateData {
name: string;
enums: EnumsItem[];
}
export interface Permission {
/**
* @description 中文描述
*/
label: string;
/**
* @description 大写格式化的code
*/
value: string;
code: string;
}
/**
* @description 数组格式下,格式化结构的函数
* @params { enums } 单项枚举
*/
export type Formatter = (enums: Record<string, string>) => EnumsItem;
export interface GeneratorEnumsOptions {
enums: Enums;
formatter?: Formatter;
/**
* @description 权限字段的key
*/
permissionKey?: string;
}
export function generatorEnums({
enums,
formatter,
permissionKey,
}:GeneratorEnumsOptions): {
enumsArray: EnumsTemplateData[];
permissions: Permission[];
} {
const enumsArray: EnumsTemplateData[] = [];
let permissions: Permission[];
const enumsKeys: string[] = Object.keys(enums);
enumsKeys.forEach((enumsKey) => {
Iif (/^\d+$/.test(enumsKey)) return
/**
* @notice 权限应该是[key,value]对象
* 我们会自动过滤数字命名的key
*/
if (enumsKey === permissionKey) {
permissions = Object.entries(enums[enumsKey]).map((enumsItem) => ({
label: enumsItem[1],
value: codeSplitTransfer(enumsItem[0]).toUpperCase(),
code: enumsItem[0],
})).filter(enumsItem => isNaN(Number(enumsItem.value)))
return;
}
/**
* @notice sometime wo create enums as a array
*/
if (Array.isArray(enums[enumsKey])) {
const formatterFn =
formatter ||
function (enums) {
return { label: enums.label, value: enums.value.toUpperCase() };
};
enumsArray.push({
name: addEnumTail(enumsKey),
// @ts-ignore
enums: enums[enumsKey].map(
enumsItem => formatterFn(enumsItem)
).filter(enumsItem => isNaN(Number(enumsItem[0]))),
});
} else {
enumsArray.push({
name: addEnumTail(enumsKey),
enums: Object.entries(enums[enumsKey]).map((enumsItem) => ({
label: enumsItem[1],
value: enumsItem[0].toUpperCase(),
})).filter(enumsItem => isNaN(Number(enumsItem.value))),
});
}
});
return {
enumsArray: enumsArray.filter(enumItem => enumItem.enums.length),
permissions,
};
}
/**
* @description add Enum string tail for name
* @param name string
* @returns string
*/
export function addEnumTail(name: string): string {
return name.endsWith('Enum') ? name : name + 'Enum';
}
/**
* @description 处理权限码中的分割标志: . - -> 变成下划线
*/
export function codeSplitTransfer(code: string) {
return code.replace(/(\:|\,|\.|\-|->)/g, '_');
}
interface GenerateEnums {
enums: Enums;
outputPath: string;
formatterFn?: Formatter;
permissionKey?: string;
}
/**
* @description 自动化生成枚举
* @param enums
* @param outputPath
*/
export async function generateEnums({
enums,
outputPath,
formatterFn,
permissionKey,
}: GenerateEnums) {
const folder = path.resolve(process.cwd(), outputPath);
await checkFolderWithoutRemove(folder);
const { enumsArray, permissions } = generatorEnums({
enums,
formatter: formatterFn,
permissionKey,
});
const templates = registerHandlebarTemplates();
await Promise.all([
writeEnums(folder, enumsArray, templates),
permissions
? writePermissions(permissions, folder, templates)
: Promise.resolve(),
]);
}
|