tool.ts 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. export const PREFIX = 'i18n';
  2. export function flatRecordKeys(
  3. record: Record<string, any>,
  4. parent: string[] = [],
  5. result: Record<string, string> = {}
  6. ) {
  7. if (record && typeof record === 'object') {
  8. for (const [key, value] of Object.entries(record)) {
  9. if (Array.isArray(value)) value.forEach((v, i) => {
  10. const keys = [...parent, `${key}[${i}]`];
  11. flatRecordKeys(v, keys, result);
  12. }); else {
  13. const keys = [...parent, key];
  14. flatRecordKeys(value, keys, result);
  15. }
  16. }
  17. } else if (['string', 'boolean', 'number'].includes(typeof record)) result[parent.join('.')] = record;
  18. return result;
  19. }
  20. type FormatData = { key: string; value: string; }[];
  21. export function formatRecord(record: Record<string, any> | string[]) {
  22. if (Array.isArray(record)) return [record.map(key => ({ key, value: '' })), null] as const;
  23. let reset: FormatData = [];
  24. const gather: FormatData = [];
  25. const result = flatRecordKeys(record);
  26. for (let [key, value] of Object.entries(result)) {
  27. if (typeof value === 'string') {
  28. value = value?.replace(/^_/, '').replace(/\\_/, '_') ?? ''
  29. if (value) reset.push({ key, value });
  30. }
  31. gather.push({ key, value });
  32. }
  33. return [gather, formatData(reset)] as const;
  34. }
  35. export function formatData(data?: FormatData, get?: (key: string) => string) {
  36. return data?.reduce((set, { key, value }) => {
  37. const _key = PREFIX ? `${PREFIX}.${key}` : key;
  38. return (set[_key] = get?.(key) ?? value ?? '', set);
  39. }, {} as Record<string, string>) ?? null;
  40. }