import { readJSONSync } from 'fs-extra'; import { globSync } from 'glob'; import { resolve } from 'node:path'; import { opimized, opimizedGif } from './optimized'; export const fixWinPath = (path: string) => path.replaceAll('\\', '/'); export const root = resolve(__dirname, '../..'); export const posts = globSync(fixWinPath(resolve(root, 'docs/changelog/*.mdx'))); interface ChangelogItem { date: string; id: string; image?: string; versionRange: string[]; } export const changelogIndexPath = resolve(root, 'docs/changelog/index.json'); export const changelogIndex: { cloud: ChangelogItem[]; community: ChangelogItem[]; } = readJSONSync(changelogIndexPath); export const extractHttpsLinks = (text: string) => { const regex = /https:\/\/[^\s"')>]+/g; const links = text.match(regex); return links || []; }; export const mergeAndDeduplicateArrays = (...arrays: string[][]) => { const combinedArray = arrays.flat(); const uniqueSet = new Set(combinedArray); return Array.from(uniqueSet); }; const mimeToExtensions = { 'image/gif': '.gif', // 图片类型 'image/jpeg': '.jpg', 'image/png': '.png', 'image/svg+xml': '.svg', 'image/webp': '.webp', // 视频类型 'video/mp4': '.mp4', 'video/mpeg': '.mpeg', 'video/ogg': '.ogv', 'video/quicktime': '.mov', 'video/webm': '.webm', 'video/x-flv': '.flv', 'video/x-matroska': '.mkv', 'video/x-ms-wmv': '.wmv', 'video/x-msvideo': '.avi', }; // @ts-ignore const getExtension = (type: string) => mimeToExtensions?.[type] || '.png'; export const fetchImageAsFile = async (url: string, width: number) => { try { // Step 1: Fetch the image const response = await fetch(url); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } // Step 2: Create a blob from the response data const blob = await response.blob(); let buffer: ArrayBuffer | Buffer = await blob.arrayBuffer(); let type = getExtension(blob.type); if (type === '.gif') { buffer = await opimizedGif(buffer); type = '.webp'; } else if (type === '.png' || type === '.jpg') { buffer = await opimized(buffer, width); type = '.webp'; } const filename = Date.now().toString() + type; // Step 3: Create a file from the blob const file: File = new File([buffer], filename, { lastModified: Date.now(), type: type === '.webp' ? 'image/webp' : blob.type, }); return file; } catch (error) { console.error('Error fetching image as file:', error); } };