import { get } from "lodash";
// format html`...` by vscode lit-html
function html(strings, ...values) {
let output = "";
let index;
for (index = 0; index < values.length; index += 1) {
output += strings[index] + values[index];
}
output += strings[index];
return output;
}
// format %
function persentFormat(number) {
return `${parseFloat(number * 100).toFixed(2)} %`;
}
// format bytes
function bytesFormat(bytes) {
if (isNaN(bytes)) {
return "";
}
var symbols = ["bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
var exp = Math.floor(Math.log(bytes) / Math.log(2));
if (exp < 1) {
exp = 0;
}
var i = Math.floor(exp / 10);
bytes = bytes / Math.pow(2, 10 * i);
if (bytes.toString().length > bytes.toFixed(2).toString().length) {
bytes = bytes.toFixed(2);
}
return bytes + " " + symbols[i];
}
// string format
function format(template, ...args) {
const formatRegExp = /%[sdj%]/g;
let counter = 0;
return template.replace(formatRegExp, (match) => {
const index = counter;
counter += 1;
if (match === "%%") {
return "%";
}
if (index > args.length - 1) {
return match;
}
if (match === "%s") {
return String(args[index]);
}
if (match === "%d") {
return Number(args[index]);
}
if (match === "%j") {
return JSON.stringify(args[index]);
}
return match;
});
}
function schemaToModel(schema) {
const entity = {};
Object.keys(schema.properties).forEach((propertyName) => {
const property = schema.properties[propertyName];
if (property.type === "object") {
entity[propertyName] = schemaToModel(property);
} else if ("default" in property) {
entity[propertyName] = property.default;
} else if (property.type === "array") {
entity[propertyName] = [];
} else if (property.type === "boolean") {
entity[propertyName] = property.nullable ? null : false;
} else if (property.type === "number" || property.type === "integer") {
entity[propertyName] = property.nullable ? null : 0;
} else if (property.type === "string") {
entity[propertyName] = null;
} else {
entity[propertyName] = null;
}
});
return entity;
}
function listToTree(list, func) {
const tree = [];
list.forEach((item) => {
if (!item.parentId) {
tree.push(item);
} else {
const parent = list.find((node) => node.id === item.parentId);
if (parent) {
parent.children = parent.children || [];
parent.children.push(item);
}
}
if (func) {
func(item);
}
});
return tree;
}
function treeToList(tree, list = []) {
tree.forEach((o) => {
list.push(o);
if (o.children?.length) {
treeToList(o.children, list);
}
});
return list;
}
function getProp(instance, propPath) {
return get(instance, propPath);
}
function getFileName(contentDisposition) {
return decodeURIComponent(/filename\*=UTF-8''([\w%\-\.]+)(?:; ?|$)/i.exec(contentDisposition)[1]);
}
async function importModule(input) {
const dataUri = `data:text/javascript;charset=utf-8,${encodeURIComponent(input)}`;
const result = await import(dataUri /* @vite-ignore */);
return result.default;
}
// await importFunction('()=>console.log(123)');
async function importFunction(input) {
const src = input ?? `()=>{}`;
const result = await importModule(`export default ${src}`);
return result;
}
export default html;
export {
persentFormat,
bytesFormat,
format,
schemaToModel,
listToTree,
treeToList,
getProp,
getFileName,
importFunction,
};