You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

94 lines
2.5 KiB
TypeScript

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);
}
};