Updated download functions & added CSV serializer
All checks were successful
Build / Build NPM Project (push) Successful in 25s
Build / Tag Version (push) Successful in 6s

This commit is contained in:
Zakary Timson 2024-09-22 03:35:12 -04:00
parent 3bf8c7bd09
commit 51549db3d9
5 changed files with 59 additions and 28 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "@ztimson/utils", "name": "@ztimson/utils",
"version": "0.16.0", "version": "0.16.1",
"description": "Utility library", "description": "Utility library",
"author": "Zak Timson", "author": "Zak Timson",
"license": "MIT", "license": "MIT",

26
src/csv.ts Normal file
View File

@ -0,0 +1,26 @@
import {dotNotation, flattenObj} from './objects.ts';
/**
* Convert an object to a CSV string
*
* @param {any[]} target Array of objects to create CSV from
* @param {boolean} flatten Should nested object be flattened or treated as values
* @return {string} CSV string
*/
export function csv(target: any[], flatten=true) {
const headers = target.reduce((acc, row) => {
Object.keys(flatten ? flattenObj(row) : row)
.forEach(key => { if(!acc.includes(key)) acc.push(key); });
return acc;
}, []);
return [
headers.join(','),
...target.map(row => headers.map((h: string) => {
const value = dotNotation<any>(row, h);
const type = typeof value;
if(type == 'string' && value.includes(',')) return `"${value}"`;
if(type == 'object') return `"${JSON.stringify(value)}"`;
return value;
}).join(','))
].join('\n');
}

View File

@ -1,33 +1,35 @@
import {makeArray} from './array.ts';
import {JSONAttemptParse} from './objects.ts'; import {JSONAttemptParse} from './objects.ts';
import {PromiseProgress} from './promise-progress'; import {PromiseProgress} from './promise-progress';
/**
* Download a file from a URL
*
* @param href URL that will be downloaded
* @param {string} name Override download name
*/
export function download(href: any, name?: string) {
const a = document.createElement('a');
a.href = href;
a.download = name || href.split('/').pop();
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
}
/** /**
* Download blob as a file * Download blob as a file
* *
* @param {Blob} blob File as a blob * @param {Blob} blob File as a blob
* @param {string} name Name blob will be downloaded as * @param {string} name Name blob will be downloaded as
*/ */
export function downloadBlob(blob: Blob, name: string) { export function downloadFile(blob: Blob | string | string[], name: string) {
if(!(blob instanceof Blob)) blob = new Blob(makeArray(blob));
const url = URL.createObjectURL(blob); const url = URL.createObjectURL(blob);
download(url, name); downloadUrl(url, name);
URL.revokeObjectURL(url); URL.revokeObjectURL(url);
} }
/**
* Download a file from a URL
*
* @param href URL that will be downloaded
* @param {string} name Override download name
*/
export function downloadUrl(href: any, name?: string) {
const a = document.createElement('a');
a.href = href;
a.download = name || href.split('/').pop();
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
}
/** /**
* Open filebrowser & return selected file * Open filebrowser & return selected file
* *

View File

@ -1,5 +1,6 @@
export * from './array'; export * from './array';
export * from './aset'; export * from './aset';
export * from './csv';
export * from './files'; export * from './files';
export * from './emitter'; export * from './emitter';
export * from './errors'; export * from './errors';

View File

@ -1,3 +1,5 @@
import {dotNotation, flattenObj} from './objects.ts';
/** /**
* String of all letters * String of all letters
*/ */
@ -18,16 +20,6 @@ const SYMBOL_LIST = '~`!@#$%^&*()_-+={[}]|\\:;"\'<,>.?/';
*/ */
const CHAR_LIST = LETTER_LIST + NUMBER_LIST + SYMBOL_LIST; const CHAR_LIST = LETTER_LIST + NUMBER_LIST + SYMBOL_LIST;
/**
* Generate a random hexadecimal value
*
* @param {number} length Number of hexadecimal place values
* @return {string} Hexadecimal number as a string
*/
export function randomHex(length: number) {
return Array(length).fill(null).map(() => Math.round(Math.random() * 0xF).toString(16)).join('');
}
/** /**
* Convert number of bytes into a human-readable size * Convert number of bytes into a human-readable size
* *
@ -95,6 +87,16 @@ export function pad(text: any, length: number, char: string = ' ', start = true)
return text.toString().padEnd(length, char); return text.toString().padEnd(length, char);
} }
/**
* Generate a random hexadecimal value
*
* @param {number} length Number of hexadecimal place values
* @return {string} Hexadecimal number as a string
*/
export function randomHex(length: number) {
return Array(length).fill(null).map(() => Math.round(Math.random() * 0xF).toString(16)).join('');
}
/** /**
* Generate a string of random characters. * Generate a string of random characters.
* *