1
0
Fork 0
mirror of https://github.com/codex-team/codex.docs.git synced 2025-07-22 14:49:41 +02:00

Added ability to use custom favicon (#202)

* Added ability to change favicon in config

* Turned back version of icon in index.twig

* Added opportunity to upload favicon and route to get saved favicon

* Removed favicon from .codexdocsrc.sample

* Added docs to favicon route

* Replaced uploadFavicon to initiating /favicon route, updated function, added catching errors from uploadFile

* Updated Readme, added info about setting up app

* Updated Readme.md

* Some changes

* Favicon data saves to app.locals, replaced uploading favicon to app.ts

* Changed naming in config, from faviconURL to favicon, changed using app.locals variables

* Renamed uploadFavicon to downLoadFavicon, removed log in locals.ts

* Renamed favicon variable in app.ts

* Added checking favicon before uploading function, removed passing locals to views

* Added timeout for uploading favicon request and writeFileSync changed to writeFile

* Removed passing favicon locals and turned back removed variables

* Turned back variables

* Fixed duplicating os.tmpdir

* Fixed braces in objects, added new lines

* Added default favicon path, if favicon does not exists in config

* Updated docs, fixed using local favicon
This commit is contained in:
slaveeks 2022-07-10 15:21:32 +03:00 committed by GitHub
parent ac40723c16
commit 5c4183b717
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 23484 additions and 8 deletions

View file

@ -0,0 +1,85 @@
import path from 'path';
import fs from 'fs';
import fetch from 'node-fetch';
/**
* Uploaded favicon data
*/
export interface FaviconData {
// Uploaded favicon path
destination: string;
// File type
type: string;
}
// Initiate controller for aborting request
const controller = new AbortController();
/**
* Check if string is url
*
* @param str - string to check
*/
function checkIsUrl(str: string): boolean {
const re = new RegExp('https?://');
return re.test(str);
}
/**
* Upload favicon by url, or get it by path
*
* @param destination - url or path of favicon
* @param faviconFolder - folder to save favicon
* @returns { Promise<FaviconData> } - Promise with data about favicon
*/
export async function downloadFavicon(destination: string, faviconFolder: string): Promise<FaviconData> {
// Check of destination is empty
if (!destination) {
throw Error('Favicon destination is empty');
}
// Get file name by destination
const filename = destination.substring(destination.lastIndexOf('/')+1);
// Get file format
const format = filename.split('.')[1];
// Check if string is url
if (!checkIsUrl(destination)) {
return {
destination: `/${filename}`,
type: `image/${format}`,
} as FaviconData;
}
// Create timeout to abort request
const timeoutId = setTimeout(() => {
controller.abort();
console.log('Favicon request has timed out.');
}, 5000);
// Make get request to url
const res = await fetch(destination, { signal: controller.signal });
// Get buffer data from response
const fileData = await res.buffer();
// Clear timeout, if data was got
clearTimeout(timeoutId);
// Get file path in temporary directory
const filePath = path.join(faviconFolder, `favicon.${format}`);
// Save file
await fs.writeFile(filePath, fileData, (err) => {
if (err) {
console.log(err);
}
});
return {
destination: `/favicon/favicon.${format}`,
type: `image/${format}`,
} as FaviconData;
}