97 lines
3.1 KiB
TypeScript

/*
* Tencent is pleased to support the open source community by making MagicEditor available.
*
* Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import path from 'path';
import axios from 'axios';
import { createWriteStream, emptyDir } from 'fs-extra';
import momentTimezone from 'moment-timezone';
import serialize from 'serialize-javascript';
import uglifyJS from 'uglify-js';
import type { UiConfig } from '@src/typings';
import { babelTransform } from '@src/utils/transform';
/**
* 格式化配置内容
* @param {string} value 待格式化内容
* @returns {string} 格式化结果
*/
const serializeConfig = function (value: UiConfig): string {
return serialize(value, {
space: 2,
unsafe: true,
}).replace(/"(\w+)":\s/g, '$1: ');
};
/**
* 将srccode转换为distcode
* @param {string} srcCode srcCode
* @returns {string} distcode
*/
const configTransformDist = (srcCode: string): string => {
let babelCode: string = babelTransform(`window.uiConfig=[${srcCode}]`);
babelCode = babelCode.replace('window.uiConfig = [', '');
return babelCode.substring(0, babelCode.length - 2);
};
/**
* uglifyJS处理distcode
* @param {string} transConfig transConfig
* @returns {string} 处理结果
*/
const processTransConfig = (transConfig) => {
const code = `window.magicDSL = [${transConfig}]`;
return uglifyJS.minify(`${code}`).code;
};
/**
* 下载文件到本地
* @param {string} url 文件下载地址
* @param {string} filePath 文件保存目录
* @param {string} fileName 文件名
* @returns {Promise} 处理结果
*/
const getFileFromUrl = async ({ url, filePath, fileName }) => {
// 1. 文件夹清空并重新创建
await emptyDir(filePath);
const distPath = path.resolve(filePath, fileName);
const writer = createWriteStream(distPath);
const response = await axios({
url,
method: 'GET',
responseType: 'stream',
});
response.data.pipe(writer);
return new Promise((resolve, reject) => {
writer.on('finish', resolve);
writer.on('error', reject);
});
};
/**
* 格式化时间(上海时区)
* @param {string} [time] 待转换时间戳,不传则获取当前时间
* @param {string} [formatTmp] 转换格式,不传则默认使用'YYYY-MM-DD HH:mm:ss'
* @returns {string} 格式化之后的时间
*/
const getFormatTime = (time: string | number = Date.now(), formatTmp = 'YYYY-MM-DD HH:mm:ss') =>
momentTimezone.tz(time, 'Asia/Shanghai').format(formatTmp);
export { serializeConfig, configTransformDist, processTransConfig, getFileFromUrl, getFormatTime };