🎨 Configure standardJS

This commit is contained in:
divlo
2020-08-03 12:04:07 +02:00
parent e22e62a749
commit 58f47c7480
120 changed files with 12271 additions and 10025 deletions

View File

@ -1,44 +1,44 @@
const { randomNumberOutput } = require('./main/randomNumber');
const convertRomanArabicNumbersOutput = require('./main/convertRomanArabicNumbers');
const convertDistanceOutput = require('./main/convertDistance');
const convertTemperatureOutput = require('./main/convertTemperature');
const armstrongNumberOutput = require('./main/armstrongNumber');
const weatherRequestOutput = require('./main/weatherRequest');
const convertCurrencyOutput = require('./main/convertCurrency');
const calculateAgeOutput = require('./main/calculateAge');
const heapAlgorithmOutput = require('./main/heapAlgorithm');
const convertEncodingOutput = require('./main/convertEncoding');
const randomQuote = require('./main/randomQuote');
const linkShortener = require('./main/linkShortener');
const rightPriceOutput = require('./main/rightPrice');
const isPalindromeOutput = require('./main/isPalindrome');
const findLongestWordOutput = require('./main/findLongestWord');
const fibonacciOutput = require('./main/fibonacci');
const sortArrayOutput = require('./main/sortArray');
const { randomNumberOutput } = require('./main/randomNumber')
const convertRomanArabicNumbersOutput = require('./main/convertRomanArabicNumbers')
const convertDistanceOutput = require('./main/convertDistance')
const convertTemperatureOutput = require('./main/convertTemperature')
const armstrongNumberOutput = require('./main/armstrongNumber')
const weatherRequestOutput = require('./main/weatherRequest')
const convertCurrencyOutput = require('./main/convertCurrency')
const calculateAgeOutput = require('./main/calculateAge')
const heapAlgorithmOutput = require('./main/heapAlgorithm')
const convertEncodingOutput = require('./main/convertEncoding')
const randomQuote = require('./main/randomQuote')
const linkShortener = require('./main/linkShortener')
const rightPriceOutput = require('./main/rightPrice')
const isPalindromeOutput = require('./main/isPalindrome')
const findLongestWordOutput = require('./main/findLongestWord')
const fibonacciOutput = require('./main/fibonacci')
const sortArrayOutput = require('./main/sortArray')
const functionObject = {
randomNumber : randomNumberOutput,
convertRomanArabicNumbers: convertRomanArabicNumbersOutput,
convertDistance : convertDistanceOutput,
convertTemperature : convertTemperatureOutput,
armstrongNumber : armstrongNumberOutput,
weatherRequest : weatherRequestOutput,
convertCurrency : convertCurrencyOutput,
calculateAge : calculateAgeOutput,
heapAlgorithm : heapAlgorithmOutput,
convertEncoding : convertEncodingOutput,
randomQuote : randomQuote,
linkShortener : linkShortener,
rightPrice : rightPriceOutput,
isPalindrome : isPalindromeOutput,
findLongestWord : findLongestWordOutput,
fibonacci : fibonacciOutput,
sortArray : sortArrayOutput,
};
// Choisi la fonction à exécuter
function functionToExecute(option) {
return functionObject[option];
randomNumber: randomNumberOutput,
convertRomanArabicNumbers: convertRomanArabicNumbersOutput,
convertDistance: convertDistanceOutput,
convertTemperature: convertTemperatureOutput,
armstrongNumber: armstrongNumberOutput,
weatherRequest: weatherRequestOutput,
convertCurrency: convertCurrencyOutput,
calculateAge: calculateAgeOutput,
heapAlgorithm: heapAlgorithmOutput,
convertEncoding: convertEncodingOutput,
randomQuote: randomQuote,
linkShortener: linkShortener,
rightPrice: rightPriceOutput,
isPalindrome: isPalindromeOutput,
findLongestWord: findLongestWordOutput,
fibonacci: fibonacciOutput,
sortArray: sortArrayOutput
}
module.exports = functionToExecute;
// Choisi la fonction à exécuter
function functionToExecute (option) {
return functionObject[option]
}
module.exports = functionToExecute

View File

@ -1,46 +1,46 @@
const errorHandling = require('../../utils/errorHandling');
const { requiredFields } = require('../../config/errors');
const formatNumberResult = require('../secondary/formatNumberResult');
const errorHandling = require('../../utils/errorHandling')
const { requiredFields } = require('../../config/errors')
const formatNumberResult = require('../secondary/formatNumberResult')
/**
/**
* @description Vérifie si un nombre fait partie des nombres d'Armstrong.
* @param {Number} number - Le nombre à tester
* @returns {Object} Un objet contenant l'explication en html et le booléen si oui ou non c'est un nombre d'armstrong
* @examples armstrongNumber(153) → 153 est un nombre d'Armstrong, car 1<sup>3</sup> + 5<sup>3</sup> + 3<sup>3</sup> = 153.
*/
function armstrongNumber(number) {
let numberString = number.toString();
let numberStringLength = numberString.length;
*/
function armstrongNumber (number) {
const numberString = number.toString()
const numberStringLength = numberString.length
let result = 0;
let resultString = "";
for (let index = 0; index < numberStringLength; index++) {
result = result + parseInt(numberString[index]) ** numberStringLength;
resultString = resultString + " + " + numberString[index] + "<sup>" + numberStringLength + "</sup>";
}
let result = 0
let resultString = ''
for (let index = 0; index < numberStringLength; index++) {
result = result + parseInt(numberString[index]) ** numberStringLength
resultString = resultString + ' + ' + numberString[index] + '<sup>' + numberStringLength + '</sup>'
}
const formattedNumber = formatNumberResult(number);
const isArmstrongNumber = (result === number);
return {
isArmstrongNumber,
resultHTML: `<p>${formattedNumber} ${isArmstrongNumber ? "est" : "n'est pas"} un nombre d'Armstrong, car ${resultString.slice(2)} = ${formatNumberResult(result)}.</p>`
}
const formattedNumber = formatNumberResult(number)
const isArmstrongNumber = (result === number)
return {
isArmstrongNumber,
resultHTML: `<p>${formattedNumber} ${isArmstrongNumber ? 'est' : "n'est pas"} un nombre d'Armstrong, car ${resultString.slice(2)} = ${formatNumberResult(result)}.</p>`
}
}
/* OUTPUTS */
module.exports = armstrongNumberOutput = ({ res, next }, argsObject) => {
let { number } = argsObject;
// S'il n'y a pas les champs obligatoire
if (!(number)) {
return errorHandling(next, requiredFields);
}
module.exports = ({ res, next }, argsObject) => {
let { number } = argsObject
// Si ce n'est pas un nombre
number = parseInt(number);
if (isNaN(number) || number <= 0) {
return errorHandling(next, { message: "Veuillez rentré un nombre valide.", statusCode: 400 });
}
// S'il n'y a pas les champs obligatoire
if (!(number)) {
return errorHandling(next, requiredFields)
}
return res.status(200).json(armstrongNumber(number));
}
// Si ce n'est pas un nombre
number = parseInt(number)
if (isNaN(number) || number <= 0) {
return errorHandling(next, { message: 'Veuillez rentré un nombre valide.', statusCode: 400 })
}
return res.status(200).json(armstrongNumber(number))
}

View File

@ -1,50 +1,50 @@
const errorHandling = require('../../utils/errorHandling');
const moment = require('moment');
const { requiredFields } = require('../../config/errors');
const errorHandling = require('../../utils/errorHandling')
const moment = require('moment')
const { requiredFields } = require('../../config/errors')
function calculateAge(currentDate, { birthDateDay, birthDateMonth, birthDateYear }) {
const day = currentDate.getDate();
const month = currentDate.getMonth();
const currentDateMoment = moment([currentDate.getFullYear(), month, day]);
const birthDateMoment = moment([birthDateYear, birthDateMonth, birthDateDay]);
function calculateAge (currentDate, { birthDateDay, birthDateMonth, birthDateYear }) {
const day = currentDate.getDate()
const month = currentDate.getMonth()
const currentDateMoment = moment([currentDate.getFullYear(), month, day])
const birthDateMoment = moment([birthDateYear, birthDateMonth, birthDateDay])
// Calcule l'âge - Moment.js
const ageYears = currentDateMoment.diff(birthDateMoment, 'year');
birthDateMoment.add(ageYears, 'years');
const ageMonths = currentDateMoment.diff(birthDateMoment, 'months');
birthDateMoment.add(ageMonths, 'months');
const ageDays = currentDateMoment.diff(birthDateMoment, 'days');
// Calcule l'âge - Moment.js
const ageYears = currentDateMoment.diff(birthDateMoment, 'year')
birthDateMoment.add(ageYears, 'years')
const ageMonths = currentDateMoment.diff(birthDateMoment, 'months')
birthDateMoment.add(ageMonths, 'months')
const ageDays = currentDateMoment.diff(birthDateMoment, 'days')
const isBirthday = (birthDateDay === day && birthDateMonth === month);
return { ageYears, ageMonths, ageDays, isBirthday };
const isBirthday = (birthDateDay === day && birthDateMonth === month)
return { ageYears, ageMonths, ageDays, isBirthday }
}
/* OUTPUTS */
module.exports = calculateAgeOutput = ({ res, next }, argsObject) => {
let { birthDate } = argsObject;
// S'il n'y a pas les champs obligatoire
if (!(birthDate)) {
return errorHandling(next, requiredFields);
}
module.exports = ({ res, next }, argsObject) => {
const { birthDate } = argsObject
const birthDateDay = parseInt(birthDate.substring(0, 2));
const birthDateMonth = parseInt((birthDate.substring(3, 5)) - 1);
const birthDateYear = parseInt(birthDate.substring(6, 10));
// Si ce n'est pas une date valide
const currentDate = new Date();
const birthDateObject = new Date(birthDateYear, birthDateMonth, birthDateDay);
const result = calculateAge(currentDate, { birthDateYear, birthDateMonth, birthDateDay });
if ((currentDate < birthDateObject) || isNaN(result.ageYears)) {
return errorHandling(next, { message: "Veuillez rentré une date valide...", statusCode: 400 });
}
let resultHTML;
if (result.isBirthday) {
resultHTML = `<p>Vous avez ${result.ageYears} ans. Joyeux Anniversaire! 🥳</p>`;
} else {
resultHTML = `<p>Vous avez ${result.ageYears} ans, ${result.ageMonths} mois et ${result.ageDays} jour(s).</p>`;
}
return res.status(200).json({ ...result, resultHTML });
}
// S'il n'y a pas les champs obligatoire
if (!(birthDate)) {
return errorHandling(next, requiredFields)
}
const birthDateDay = parseInt(birthDate.substring(0, 2))
const birthDateMonth = parseInt((birthDate.substring(3, 5)) - 1)
const birthDateYear = parseInt(birthDate.substring(6, 10))
// Si ce n'est pas une date valide
const currentDate = new Date()
const birthDateObject = new Date(birthDateYear, birthDateMonth, birthDateDay)
const result = calculateAge(currentDate, { birthDateYear, birthDateMonth, birthDateDay })
if ((currentDate < birthDateObject) || isNaN(result.ageYears)) {
return errorHandling(next, { message: 'Veuillez rentré une date valide...', statusCode: 400 })
}
let resultHTML
if (result.isBirthday) {
resultHTML = `<p>Vous avez ${result.ageYears} ans. Joyeux Anniversaire! 🥳</p>`
} else {
resultHTML = `<p>Vous avez ${result.ageYears} ans, ${result.ageMonths} mois et ${result.ageDays} jour(s).</p>`
}
return res.status(200).json({ ...result, resultHTML })
}

View File

@ -1,37 +1,37 @@
const axios = require('axios');
const errorHandling = require('../../utils/errorHandling');
const { requiredFields } = require('../../config/errors');
const formatNumberResult = require('../secondary/formatNumberResult');
const axios = require('axios')
const errorHandling = require('../../utils/errorHandling')
const { requiredFields } = require('../../config/errors')
const formatNumberResult = require('../secondary/formatNumberResult')
/* OUTPUTS */
module.exports = convertCurrencyOutput = ({ res, next }, argsObject) => {
let { number, baseCurrency, finalCurrency } = argsObject;
// S'il n'y a pas les champs obligatoire
if (!(number && baseCurrency && finalCurrency)) {
return errorHandling(next, requiredFields);
}
module.exports = ({ res, next }, argsObject) => {
let { number, baseCurrency, finalCurrency } = argsObject
// Si ce n'est pas un nombre
number = parseFloat(number);
if (isNaN(number)) {
return errorHandling(next, { message: "Veuillez rentré un nombre valide.", statusCode: 400 });
}
// S'il n'y a pas les champs obligatoire
if (!(number && baseCurrency && finalCurrency)) {
return errorHandling(next, requiredFields)
}
axios.get(`https://api.exchangeratesapi.io/latest?base=${baseCurrency}`)
.then((response) => {
const rate = response.data.rates[finalCurrency];
if (!rate) {
return errorHandling(next, { message: "La devise n'existe pas.", statusCode: 404 });
}
const result = rate * number;
const dateObject = new Date(response.data.date);
const year = dateObject.getFullYear();
const day = ('0'+(dateObject.getDate())).slice(-2);
const month = ('0'+(dateObject.getMonth()+1)).slice(-2);
const date = `${day}/${month}/${year}`;
const resultHTML = `<p>${formatNumberResult(number)} ${response.data.base} = ${formatNumberResult(result.toFixed(2))} ${finalCurrency}</p><p>Dernier rafraîchissement du taux d'échange : ${date}</p>`;
return res.status(200).json({ date, result, resultHTML });
})
.catch(() => errorHandling(next, { message: "La devise n'existe pas.", statusCode: 404 }));
}
// Si ce n'est pas un nombre
number = parseFloat(number)
if (isNaN(number)) {
return errorHandling(next, { message: 'Veuillez rentré un nombre valide.', statusCode: 400 })
}
axios.get(`https://api.exchangeratesapi.io/latest?base=${baseCurrency}`)
.then((response) => {
const rate = response.data.rates[finalCurrency]
if (!rate) {
return errorHandling(next, { message: "La devise n'existe pas.", statusCode: 404 })
}
const result = rate * number
const dateObject = new Date(response.data.date)
const year = dateObject.getFullYear()
const day = ('0' + (dateObject.getDate())).slice(-2)
const month = ('0' + (dateObject.getMonth() + 1)).slice(-2)
const date = `${day}/${month}/${year}`
const resultHTML = `<p>${formatNumberResult(number)} ${response.data.base} = ${formatNumberResult(result.toFixed(2))} ${finalCurrency}</p><p>Dernier rafraîchissement du taux d'échange : ${date}</p>`
return res.status(200).json({ date, result, resultHTML })
})
.catch(() => errorHandling(next, { message: "La devise n'existe pas.", statusCode: 404 }))
}

View File

@ -1,10 +1,10 @@
const errorHandling = require('../../utils/errorHandling');
const { requiredFields, generalError } = require('../../config/errors');
const formatNumberResult = require('../secondary/formatNumberResult');
const errorHandling = require('../../utils/errorHandling')
const { requiredFields, generalError } = require('../../config/errors')
const formatNumberResult = require('../secondary/formatNumberResult')
const correspondancesDistance = ["pm", null, null, "nm", null, null, "µm", null, null, "mm", "cm", "dm", "m", "dam", "hm", "km", null, null, "Mm", null, null, "Gm", null, null, "Tm"];
const correspondancesDistance = ['pm', null, null, 'nm', null, null, 'µm', null, null, 'mm', 'cm', 'dm', 'm', 'dam', 'hm', 'km', null, null, 'Mm', null, null, 'Gm', null, null, 'Tm']
/**
/**
* @description Convertis la longueur (distance) avec les unités allant de picomètre au Téramètre.
* @requires {@link correspondancesDistance}
* @param {Number} firstValue - Le nombre que vous voulez convertir
@ -13,39 +13,39 @@ const correspondancesDistance = ["pm", null, null, "nm", null, null, "µm", null
* @returns {Object|Boolean} → false si arguments non valides et sinon un objet contenant la string et le nombre résultat
* @examples convertDistance(500, 'cm', 'm') → { resultNumber: 5, resultString: "5 m" }
*/
function convertDistance(firstValue, unitFirstValue, unitFinalValue) {
const index1 = correspondancesDistance.indexOf(unitFirstValue);
const index2 = correspondancesDistance.indexOf(unitFinalValue);
if (index1 !== -1 && index2 !== -1) {
const difference = index1 - index2;
const result = firstValue * Math.pow(10, difference);
return {
result,
resultHTML: `<p>${formatNumberResult(firstValue)} ${unitFirstValue} = ${formatNumberResult(result)} ${unitFinalValue}</p>`
};
function convertDistance (firstValue, unitFirstValue, unitFinalValue) {
const index1 = correspondancesDistance.indexOf(unitFirstValue)
const index2 = correspondancesDistance.indexOf(unitFinalValue)
if (index1 !== -1 && index2 !== -1) {
const difference = index1 - index2
const result = firstValue * Math.pow(10, difference)
return {
result,
resultHTML: `<p>${formatNumberResult(firstValue)} ${unitFirstValue} = ${formatNumberResult(result)} ${unitFinalValue}</p>`
}
return false;
}
return false
}
/* OUTPUTS */
module.exports = convertDistanceOutput = ({ res, next }, argsObject) => {
let { number, numberUnit, finalUnit } = argsObject;
// S'il n'y a pas les champs obligatoire
if (!(number && numberUnit && finalUnit)) {
return errorHandling(next, requiredFields);
}
module.exports = ({ res, next }, argsObject) => {
let { number, numberUnit, finalUnit } = argsObject
// Si ce n'est pas un nombre
number = parseFloat(number);
if (isNaN(number)) {
return errorHandling(next, { message: "Veuillez rentré un nombre valide.", statusCode: 400 });
}
// S'il n'y a pas les champs obligatoire
if (!(number && numberUnit && finalUnit)) {
return errorHandling(next, requiredFields)
}
const result = convertDistance(number, numberUnit, finalUnit);
if (!result) {
return errorHandling(next, generalError);
}
// Si ce n'est pas un nombre
number = parseFloat(number)
if (isNaN(number)) {
return errorHandling(next, { message: 'Veuillez rentré un nombre valide.', statusCode: 400 })
}
return res.status(200).json(result);
}
const result = convertDistance(number, numberUnit, finalUnit)
if (!result) {
return errorHandling(next, generalError)
}
return res.status(200).json(result)
}

View File

@ -1,242 +1,239 @@
const errorHandling = require('../../utils/errorHandling');
const { requiredFields, generalError } = require('../../config/errors');
const errorHandling = require('../../utils/errorHandling')
const { requiredFields, generalError } = require('../../config/errors')
/**
/**
* @description Convertis un nombre décimal en binaire.
* @param {String} value - Le nombre à convertir en string
* @returns {String} - Le nombre en binaire
* @examples decimalToBinary('2') → '10'
*/
function decimalToBinary(value) {
value = Number(value);
if (isNaN(value)) {
return false;
} else {
return value.toString(2);
}
}
function decimalToBinary (value) {
value = Number(value)
if (isNaN(value)) {
return false
} else {
return value.toString(2)
}
}
/**
/**
* @description Convertis un nombre binaire en décimal.
* @param {String} value - Le nombre à convertir
* @returns {(Number|String)} - Le nombre en décimal soit en nombre ou soit en string si supérieur à 1000 car pour 1000 par exemple formatNumberResult renvoie '1 000'
* @examples binaryToDecimal('10') → 2
*/
function binaryToDecimal(value) {
const result = parseInt(Number(value), 2);
if (isNaN(result)) {
return false;
} else {
return result;
}
}
function binaryToDecimal (value) {
const result = parseInt(Number(value), 2)
if (isNaN(result)) {
return false
} else {
return result
}
}
/**
/**
* @description Convertis un nombre décimal en hexadécimal.
* @param {String} value - Le nombre à convertir
* @param {String} value - Le nombre à convertir
* @returns {String} - Le nombre en hexadécimal
* @examples decimalToHexadecimal('15') → 'F'
*/
function decimalToHexadecimal(value) {
value = Number(value);
if (isNaN(value)) {
return false;
} else {
return value.toString(16).toUpperCase();
}
}
function decimalToHexadecimal (value) {
value = Number(value)
if (isNaN(value)) {
return false
} else {
return value.toString(16).toUpperCase()
}
}
/**
/**
* @description Convertis un nombre hexadécimal en décimal.
* @param {String} value - Le nombre à convertir
* @returns {(Number|String)} - Le nombre en décimal soit en nombre ou soit en string si supérieur à 1000 car pour 1000 par exemple formatNumberResult renvoie '1 000'
* @examples hexadecimalToDecimal('F') → 15
*/
function hexadecimalToDecimal(value) {
const result = parseInt(value, 16);
if (isNaN(result)) {
return false;
} else {
return result;
}
}
function hexadecimalToDecimal (value) {
const result = parseInt(value, 16)
if (isNaN(result)) {
return false
} else {
return result
}
}
/**
* @description Convertis un nombre binaire en hexadécimal.
/**
* @description Convertis un nombre binaire en hexadécimal.
* @param {String} value - Le nombre à convertir
* @returns {String} - Le nombre en hexadécimal
* @examples binaryToHexadecimal('1111') → 'F'
*/
function binaryToHexadecimal(value) {
value = Number(value);
value = parseInt(value, 2);
if (isNaN(value)) {
return false;
} else {
return parseInt(value).toString(16).toUpperCase();
}
*/
function binaryToHexadecimal (value) {
value = Number(value)
value = parseInt(value, 2)
if (isNaN(value)) {
return false
} else {
return parseInt(value).toString(16).toUpperCase()
}
}
/**
* @description Convertis un nombre hexadécimal en binaire.
/**
* @description Convertis un nombre hexadécimal en binaire.
* @param {String} value - Le nombre à convertir
* @returns {String} - Le nombre en binaire
* @examples hexadecimalToBinary('F') → '1111'
*/
function hexadecimalToBinary(value) {
value = parseInt(value, 16);
if (isNaN(value)) {
return false;
} else {
return parseInt(value).toString(2);
}
}
*/
function hexadecimalToBinary (value) {
value = parseInt(value, 16)
if (isNaN(value)) {
return false
} else {
return parseInt(value).toString(2)
}
}
// Convertis des nombres de différentes bases et convertis en UTF-8. (source : http://jsfiddle.net/47zwb41o)
/**
* @description Convertis chaque caractère d'une string en codePoint Unicode.
/**
* @description Convertis chaque caractère d'une string en codePoint Unicode.
* @param {String} value - La chaîne de caractère à convertir
* @returns {String}
* @examples textToNumberUnicode('abc') → '97 98 99'
*/
function textToNumberUnicode(string) {
try {
let resultat = "";
for (let index in string) {
resultat = resultat + string.codePointAt(index) + " ";
}
return resultat;
}
catch(error) {
return false;
*/
function textToNumberUnicode (string) {
try {
let resultat = ''
for (const index in string) {
resultat = resultat + string.codePointAt(index) + ' '
}
return resultat
} catch (error) {
return false
}
}
/**
* @description Convertis chaque codePoint Unicode en caractère.
/**
* @description Convertis chaque codePoint Unicode en caractère.
* @param {String} string - Nombre Unicode à convertir espacé par un espace à chaque fois
* @returns {String}
* @examples numberUnicodeToText('97 98 99') → 'abc'
*/
function numberUnicodeToText(string) {
try {
const array = string.split(" ");
let resultat = "";
for (let index in array) {
resultat += String.fromCodePoint(parseInt(array[index]).toString());
}
return resultat;
}
catch(error) {
return false;
*/
function numberUnicodeToText (string) {
try {
const array = string.split(' ')
let resultat = ''
for (const index in array) {
resultat += String.fromCodePoint(parseInt(array[index]).toString())
}
return resultat
} catch (error) {
return false
}
}
/**
/**
* @description Convertis un Texte en Binaire (UTF-8).
* @param {String} s - La chaîne de caractère à convertir
* @returns {String}
* @examples textToBinary('abc') → '01100001 01100010 01100011'
*/
function textToBinary(s) {
try {
s = unescape( encodeURIComponent(s));
let chr, i = 0, l = s.length, out = '';
for( ; i < l; i ++ ){
chr = s.charCodeAt( i ).toString(2);
while(chr.length % 8 != 0 ){ chr = '0' + chr; }
out += chr;
}
return out.replace(/(\d{8})/g, '$1 ').replace(/(^\s+|\s+$)/,'');
} catch (error) {
return false;
function textToBinary (s) {
try {
s = unescape(encodeURIComponent(s))
let chr; let i = 0; const l = s.length; let out = ''
for (; i < l; i++) {
chr = s.charCodeAt(i).toString(2)
while (chr.length % 8 !== 0) { chr = '0' + chr }
out += chr
}
return out.replace(/(\d{8})/g, '$1 ').replace(/(^\s+|\s+$)/, '')
} catch (error) {
return false
}
}
/**
/**
* @description Convertis du Binaire (UTF-8) en Texte.
* @param {String} s - La chaîne de caractère contenant tous les octets à convertir
* @returns {String}
* @examples binaryToText('01100001 01100010 01100011') → 'abc'
*/
function binaryToText(s){
try {
s = s.replace(/\s/g,'')
let i = 0, l = s.length, chr, out = '';
for( ; i < l; i += 8){
chr = parseInt( s.substr(i, 8 ), 2).toString(16);
out += '%' + ((chr.length % 2 == 0) ? chr : '0' + chr);
}
return decodeURIComponent(out);
} catch (error) {
return false;
function binaryToText (s) {
try {
s = s.replace(/\s/g, '')
let i = 0; const l = s.length; let chr; let out = ''
for (; i < l; i += 8) {
chr = parseInt(s.substr(i, 8), 2).toString(16)
out += '%' + ((chr.length % 2 === 0) ? chr : '0' + chr)
}
}
return decodeURIComponent(out)
} catch (error) {
return false
}
}
/**
/**
* @description Convertis un Texte en Hexadécimal (UTF-8).
* @param {String} s - La chaîne de caractère à convertir
* @returns {String}
* @examples textToHexadecimal('abc') → '61 62 63'
*/
function textToHexadecimal (s) {
try {
s = unescape( encodeURIComponent( s ) );
let chr, i = 0, l = s.length, out = '';
for( ; i < l; i++ ){
chr = s.charCodeAt( i ).toString( 16 );
out += ( chr.length % 2 == 0 ) ? chr : '0' + chr;
out += " ";
}
return out.toUpperCase();
}
catch (error) {
return false;
try {
s = unescape(encodeURIComponent(s))
let chr; let i = 0; const l = s.length; let out = ''
for (; i < l; i++) {
chr = s.charCodeAt(i).toString(16)
out += (chr.length % 2 === 0) ? chr : '0' + chr
out += ' '
}
return out.toUpperCase()
} catch (error) {
return false
}
}
/**
/**
* @description Convertis de l'Hexadécimal (UTF-8) en Texte.
* @param {String} s - La chaîne de caractère contenant tous les nombres Hexadécimal à convertir
* @returns {String}
* @examples hexadecimalToText('61 62 63') → 'abc'
*/
function hexadecimalToText (s) {
try {
s = s.replace(/\s/g,'');
return decodeURIComponent( s.replace( /../g, '%$&' ) );
}
catch (error) {
return false;
}
try {
s = s.replace(/\s/g, '')
return decodeURIComponent(s.replace(/../g, '%$&'))
} catch (error) {
return false
}
}
/* OUTPUTS */
const convertEncoding = { decimalToBinary, binaryToDecimal, decimalToHexadecimal, hexadecimalToDecimal, binaryToHexadecimal, hexadecimalToBinary, textToNumberUnicode, numberUnicodeToText, textToBinary, binaryToText, textToHexadecimal, hexadecimalToText };
function executeFunction(option, value) {
return convertEncoding[option](value);
const convertEncoding = { decimalToBinary, binaryToDecimal, decimalToHexadecimal, hexadecimalToDecimal, binaryToHexadecimal, hexadecimalToBinary, textToNumberUnicode, numberUnicodeToText, textToBinary, binaryToText, textToHexadecimal, hexadecimalToText }
function executeFunction (option, value) {
return convertEncoding[option](value)
}
module.exports = convertEncodingOutput = ({ res, next }, argsObject) => {
let { value, functionName } = argsObject;
// S'il n'y a pas les champs obligatoire
if (!(value && functionName)) {
return errorHandling(next, requiredFields);
}
module.exports = ({ res, next }, argsObject) => {
const { value, functionName } = argsObject
// Si la fonction n'existe pas
if (!convertEncoding.hasOwnProperty(functionName)) {
return errorHandling(next, { message: "Cette conversion n'existe pas.", statusCode: 400 });
}
// S'il n'y a pas les champs obligatoire
if (!(value && functionName)) {
return errorHandling(next, requiredFields)
}
const result = executeFunction(functionName, value);
// Si la fonction n'existe pas
// eslint-disable-next-line
if (!convertEncoding.hasOwnProperty(functionName)) {
return errorHandling(next, { message: "Cette conversion n'existe pas.", statusCode: 400 })
}
// Mauvaise valeur entrée
if (!result) {
return errorHandling(next, generalError);
}
const result = executeFunction(functionName, value)
return res.status(200).json({ result, resultHTML: `<p>${result}</p>` });
}
// Mauvaise valeur entrée
if (!result) {
return errorHandling(next, generalError)
}
return res.status(200).json({ result, resultHTML: `<p>${result}</p>` })
}

View File

@ -1,123 +1,122 @@
const errorHandling = require('../../utils/errorHandling');
const { requiredFields, generalError } = require('../../config/errors');
const formatNumberResult = require('../secondary/formatNumberResult');
const errorHandling = require('../../utils/errorHandling')
const { requiredFields, generalError } = require('../../config/errors')
const formatNumberResult = require('../secondary/formatNumberResult')
/* Variable pour convertRomanArabicNumbers */
const correspondancesRomainArabe = [
[1000, "M"],
[900, "CM"],
[500, "D"],
[400, "CD"],
[100, "C"],
[90, "XC"],
[50, "L"],
[40, "XL"],
[10, "X"],
[9, "IX"],
[5, "V"],
[4, "IV"],
[1, "I"],
];
[1000, 'M'],
[900, 'CM'],
[500, 'D'],
[400, 'CD'],
[100, 'C'],
[90, 'XC'],
[50, 'L'],
[40, 'XL'],
[10, 'X'],
[9, 'IX'],
[5, 'V'],
[4, 'IV'],
[1, 'I']
]
/**
/**
* @description Convertis un nombre arabe en nombre romain.
* @param {number} nombre - Le nombre arabe à convertir
* @returns {string}
* @examples convertArabicToRoman(24) → 'XXIV'
*/
function convertArabicToRoman(nombre) {
// Initialisation de la variable qui va contenir le résultat de la conversion
let chiffresRomains = "";
function convertArabicToRoman (nombre) {
// Initialisation de la variable qui va contenir le résultat de la conversion
let chiffresRomains = ''
function extraireChiffreRomain(valeurLettre, lettres) {
while (nombre >= valeurLettre) {
chiffresRomains = chiffresRomains + lettres;
nombre = nombre - valeurLettre;
}
function extraireChiffreRomain (valeurLettre, lettres) {
while (nombre >= valeurLettre) {
chiffresRomains = chiffresRomains + lettres
nombre = nombre - valeurLettre
}
}
correspondancesRomainArabe.forEach(correspondance => {
extraireChiffreRomain(correspondance[0], correspondance[1]);
});
correspondancesRomainArabe.forEach(correspondance => {
extraireChiffreRomain(correspondance[0], correspondance[1])
})
return chiffresRomains;
}
return chiffresRomains
}
/**
/**
* @description Convertis un nombre romain en nombre arabe.
* @param {string} string - Le nombre romain à convertir
* @return {number}
* @example convertRomanToArabic('XXIV') → 24
*/
function convertRomanToArabic(string) {
let result = 0;
correspondancesRomainArabe.forEach((correspondance) => {
while (string.indexOf(correspondance[1]) === 0) {
// Ajout de la valeur décimale au résultat
result += correspondance[0];
// Supprimer la lettre romaine correspondante du début
string = string.replace(correspondance[1], '');
}
});
if (string != '') {
result = 0;
function convertRomanToArabic (string) {
let result = 0
correspondancesRomainArabe.forEach((correspondance) => {
while (string.indexOf(correspondance[1]) === 0) {
// Ajout de la valeur décimale au résultat
result += correspondance[0]
// Supprimer la lettre romaine correspondante du début
string = string.replace(correspondance[1], '')
}
return result;
}
})
if (string !== '') {
result = 0
}
return result
}
/* OUTPUTS */
const convertRomanToArabicOutput = ({ res, next }, number) => {
// S'il n'y a pas les champs obligatoire
if (!(number)) {
return errorHandling(next, requiredFields);
}
// S'il n'y a pas les champs obligatoire
if (!(number)) {
return errorHandling(next, requiredFields)
}
// Formate le paramètre
number = number.toUpperCase();
// Formate le paramètre
number = number.toUpperCase()
const result = convertRomanToArabic(number);
if (result === 0) {
return errorHandling(next, generalError);
}
return res.status(200).json({ result, resultHTML: `<p><span class="important">${number}</span> s'écrit <span class="important">${result}</span> en chiffres arabes.</p>` });
const result = convertRomanToArabic(number)
if (result === 0) {
return errorHandling(next, generalError)
}
return res.status(200).json({ result, resultHTML: `<p><span class="important">${number}</span> s'écrit <span class="important">${result}</span> en chiffres arabes.</p>` })
}
const convertArabicToRomanOutput = ({ res, next }, number) => {
// S'il n'y a pas les champs obligatoire
if (!(number)) {
return errorHandling(next, requiredFields);
}
// Si ce n'est pas un nombre
number = parseInt(number);
if (isNaN(number)) {
return errorHandling(next, { message: "Veuillez rentré un nombre valide.", statusCode: 400 });
}
// S'il n'y a pas les champs obligatoire
if (!(number)) {
return errorHandling(next, requiredFields)
}
const result = convertArabicToRoman(number);
return res.status(200).json({ result, resultHTML: `<p><span class="important">${formatNumberResult(number)}</span> s'écrit <span class="important">${result}</span> en chiffres romains.</p>` });
// Si ce n'est pas un nombre
number = parseInt(number)
if (isNaN(number)) {
return errorHandling(next, { message: 'Veuillez rentré un nombre valide.', statusCode: 400 })
}
const result = convertArabicToRoman(number)
return res.status(200).json({ result, resultHTML: `<p><span class="important">${formatNumberResult(number)}</span> s'écrit <span class="important">${result}</span> en chiffres romains.</p>` })
}
const convertRomanArabicObject = { convertRomanToArabicOutput, convertArabicToRomanOutput };
function executeFunction(option, value, { res, next }) {
return convertRomanArabicObject[option]({ res, next}, value);
const convertRomanArabicObject = { convertRomanToArabicOutput, convertArabicToRomanOutput }
function executeFunction (option, value, { res, next }) {
return convertRomanArabicObject[option]({ res, next }, value)
}
module.exports = convertRomanArabicNumbersOutput = ({ res, next }, argsObject) => {
let { value, functionName } = argsObject;
module.exports = ({ res, next }, argsObject) => {
const { value, functionName } = argsObject
// S'il n'y a pas les champs obligatoire
if (!(value && functionName)) {
return errorHandling(next, requiredFields);
}
// S'il n'y a pas les champs obligatoire
if (!(value && functionName)) {
return errorHandling(next, requiredFields)
}
// Si la fonction n'existe pas
if (!convertRomanArabicObject.hasOwnProperty(functionName)) {
return errorHandling(next, { message: "Cette conversion n'existe pas.", statusCode: 400 });
}
// Si la fonction n'existe pas
// eslint-disable-next-line
if (!convertRomanArabicObject.hasOwnProperty(functionName)) {
return errorHandling(next, { message: "Cette conversion n'existe pas.", statusCode: 400 })
}
executeFunction(functionName, value, { res, next });
}
executeFunction(functionName, value, { res, next })
}

View File

@ -1,50 +1,48 @@
const errorHandling = require('../../utils/errorHandling');
const { requiredFields, generalError } = require('../../config/errors');
const formatNumberResult = require('../secondary/formatNumberResult');
const errorHandling = require('../../utils/errorHandling')
const { requiredFields, generalError } = require('../../config/errors')
const formatNumberResult = require('../secondary/formatNumberResult')
/**
/**
* @description Convertis des °C en °F et l'inverse aussi.
* @param {Number} degree - Nombre de degrès
* @param {String} unit - Unité du nombre (°C ou °F) après conversion
* @returns {Object} false si arguments non valides et sinon un objet contenant la string et le nombre résultat
* @examples convertTemperature(23, '°F') → { result: 73.4, resultHTML: "73.4 °F" }
*/
function convertTemperature(degree, unit) {
let temperatureValue = 0;
if (unit === "°C") {
temperatureValue = (degree - 32) * 5/9;
}
else if (unit === "°F") {
temperatureValue = ((degree * 9/5) + 32);
}
else {
return false;
}
return {
result: temperatureValue,
resultHTML: `<p>${formatNumberResult(degree)} ${(unit === '°C') ? "°F" : "°C"} = ${formatNumberResult(temperatureValue)} ${unit}</p>`
};
}
function convertTemperature (degree, unit) {
let temperatureValue = 0
if (unit === '°C') {
temperatureValue = (degree - 32) * 5 / 9
} else if (unit === '°F') {
temperatureValue = ((degree * 9 / 5) + 32)
} else {
return false
}
return {
result: temperatureValue,
resultHTML: `<p>${formatNumberResult(degree)} ${(unit === '°C') ? '°F' : '°C'} = ${formatNumberResult(temperatureValue)} ${unit}</p>`
}
}
/* OUTPUTS */
module.exports = convertTemperatureOutput = ({ res, next }, argsObject) => {
let { degree, unitToConvert } = argsObject;
// S'il n'y a pas les champs obligatoire
if (!(degree && unitToConvert)) {
return errorHandling(next, requiredFields);
}
// Si ce n'est pas un nombre
degree = parseFloat(degree);
if (isNaN(degree)) {
return errorHandling(next, { message: "Veuillez rentré un nombre valide.", statusCode: 400 });
}
module.exports = ({ res, next }, argsObject) => {
let { degree, unitToConvert } = argsObject
const result = convertTemperature(degree, unitToConvert);
if (!result) {
return errorHandling(next, generalError);
}
// S'il n'y a pas les champs obligatoire
if (!(degree && unitToConvert)) {
return errorHandling(next, requiredFields)
}
return res.status(200).json(result);
}
// Si ce n'est pas un nombre
degree = parseFloat(degree)
if (isNaN(degree)) {
return errorHandling(next, { message: 'Veuillez rentré un nombre valide.', statusCode: 400 })
}
const result = convertTemperature(degree, unitToConvert)
if (!result) {
return errorHandling(next, generalError)
}
return res.status(200).json(result)
}

View File

@ -1,46 +1,46 @@
const errorHandling = require('../../utils/errorHandling');
const { requiredFields } = require('../../config/errors');
const formatNumberResult = require('../secondary/formatNumberResult');
const errorHandling = require('../../utils/errorHandling')
const { requiredFields } = require('../../config/errors')
const formatNumberResult = require('../secondary/formatNumberResult')
/**
* @description Calcule les counter premiers nombres de la suite de fibonacci.
* @param {number} counter
* @param {number} counter
*/
function fibonacci(counter, result = [], a = 0, b = 1) {
if (counter === 0) {
return result;
}
counter--;
result.push(a);
return fibonacci(counter, result, b, a + b);
function fibonacci (counter, result = [], a = 0, b = 1) {
if (counter === 0) {
return result
}
counter--
result.push(a)
return fibonacci(counter, result, b, a + b)
}
/* OUTPUTS */
module.exports = fibonacciOutput = ({ res, next }, argsObject) => {
let { counter } = argsObject;
// S'il n'y a pas les champs obligatoire
if (!(counter)) {
return errorHandling(next, requiredFields);
}
// Si ce n'est pas un nombre
counter = parseInt(counter);
if (isNaN(counter)) {
return errorHandling(next, { message: "Veuillez rentré un nombre valide.", statusCode: 400 });
}
module.exports = ({ res, next }, argsObject) => {
let { counter } = argsObject
// Si le nombre dépasse LIMIT_COUNTER
const LIMIT_COUNTER = 51;
if (counter >= LIMIT_COUNTER) {
return errorHandling(next, { message: `Par souci de performance, vous ne pouvez pas exécuter cette fonction avec un compteur dépassant ${LIMIT_COUNTER - 1}.`, statusCode: 400 });
}
// S'il n'y a pas les champs obligatoire
if (!(counter)) {
return errorHandling(next, requiredFields)
}
const result = fibonacci(counter);
const resultFormatted = result.map((number) => formatNumberResult(number));
return res.status(200).json({
result,
resultFormatted,
resultHTML: `<p>Les ${counter} premiers nombres de la suite de fibonacci :<br/> ${resultFormatted.join(', ')}</p>`
});
}
// Si ce n'est pas un nombre
counter = parseInt(counter)
if (isNaN(counter)) {
return errorHandling(next, { message: 'Veuillez rentré un nombre valide.', statusCode: 400 })
}
// Si le nombre dépasse LIMIT_COUNTER
const LIMIT_COUNTER = 51
if (counter >= LIMIT_COUNTER) {
return errorHandling(next, { message: `Par souci de performance, vous ne pouvez pas exécuter cette fonction avec un compteur dépassant ${LIMIT_COUNTER - 1}.`, statusCode: 400 })
}
const result = fibonacci(counter)
const resultFormatted = result.map((number) => formatNumberResult(number))
return res.status(200).json({
result,
resultFormatted,
resultHTML: `<p>Les ${counter} premiers nombres de la suite de fibonacci :<br/> ${resultFormatted.join(', ')}</p>`
})
}

View File

@ -1,39 +1,39 @@
const errorHandling = require('../../utils/errorHandling');
const { requiredFields } = require('../../config/errors');
const errorHandling = require('../../utils/errorHandling')
const { requiredFields } = require('../../config/errors')
/**
* @description Renvoie le mot le plus long d'une chaîne de caractères
* @param {string} string
* @param {string} string
* @returns {string}
* @example findLongestWord('Chaîne de caractères') → 'caractères'
*/
function findLongestWord(string) {
const arrayString = string.split(" ");
let stringLength = 0;
let result = "";
function findLongestWord (string) {
const arrayString = string.split(' ')
let stringLength = 0
let result = ''
arrayString.forEach((element) => {
if (element.length > stringLength) {
result = element;
stringLength = element.length;
}
});
arrayString.forEach((element) => {
if (element.length > stringLength) {
result = element
stringLength = element.length
}
})
return result;
return result
}
/* OUTPUTS */
module.exports = findLongestWordOutput = ({ res, next }, argsObject) => {
const { string } = argsObject;
// S'il n'y a pas les champs obligatoire
if (!(string)) {
return errorHandling(next, requiredFields);
}
module.exports = ({ res, next }, argsObject) => {
const { string } = argsObject
const result = findLongestWord(string);
return res.status(200).json({
result,
resultHTML: `<p>Le mot le plus long est : <br/>"${result}"</p>`
});
}
// S'il n'y a pas les champs obligatoire
if (!(string)) {
return errorHandling(next, requiredFields)
}
const result = findLongestWord(string)
return res.status(200).json({
result,
resultHTML: `<p>Le mot le plus long est : <br/>"${result}"</p>`
})
}

View File

@ -1,52 +1,52 @@
const errorHandling = require('../../utils/errorHandling');
const { requiredFields } = require('../../config/errors');
const formatNumberResult = require('../secondary/formatNumberResult');
const errorHandling = require('../../utils/errorHandling')
const { requiredFields } = require('../../config/errors')
const formatNumberResult = require('../secondary/formatNumberResult')
/**
/**
* @description Retourne un tableau contenant toutes les possibilités d'anagramme d'un mot.
* @param {String} string - La chaîne de caractère à permuter
* @returns {Array}
* @examples heapAlgorithm('abc') → ["abc", "acb", "bac", "bca", "cab", "cba"]
*/
function heapAlgorithm(string) {
let results = [];
function heapAlgorithm (string) {
const results = []
if (string.length === 1) {
results.push(string);
return results;
}
if (string.length === 1) {
results.push(string)
return results
}
for (let indexString = 0; indexString < string.length; indexString++) {
const firstChar = string[indexString];
const charsLeft = string.substring(0, indexString) + string.substring(indexString + 1);
const innerPermutations = heapAlgorithm(charsLeft);
for (let indexPermutation = 0; indexPermutation < innerPermutations.length; indexPermutation++) {
results.push(firstChar + innerPermutations[indexPermutation]);
}
for (let indexString = 0; indexString < string.length; indexString++) {
const firstChar = string[indexString]
const charsLeft = string.substring(0, indexString) + string.substring(indexString + 1)
const innerPermutations = heapAlgorithm(charsLeft)
for (let indexPermutation = 0; indexPermutation < innerPermutations.length; indexPermutation++) {
results.push(firstChar + innerPermutations[indexPermutation])
}
return results;
}
}
return results
}
/* OUTPUTS */
module.exports = heapAlgorithmOutput = ({ res, next }, argsObject) => {
let { string } = argsObject;
// S'il n'y a pas les champs obligatoire
if (!(string)) {
return errorHandling(next, requiredFields);
}
module.exports = ({ res, next }, argsObject) => {
const { string } = argsObject
// Si la chaîne de caractère dépasse LIMIT_CHARACTERS caractères
const LIMIT_CHARACTERS = 7;
if (string.length > LIMIT_CHARACTERS) {
return errorHandling(next, { message: `Par souci de performance, vous ne pouvez pas exécuter cette fonction avec un mot dépassant ${LIMIT_CHARACTERS} caractères.`, statusCode: 400 });
}
// S'il n'y a pas les champs obligatoire
if (!(string)) {
return errorHandling(next, requiredFields)
}
const result = heapAlgorithm(string);
let resultHTML = `<p>Il y a ${formatNumberResult(result.length)} possibilités d'anagramme pour le mot "${string}" qui contient ${string.length} caractères, la liste : <br/><br/>`;
result.forEach((string) => {
resultHTML += string + "<br/>";
});
resultHTML += "</p>";
return res.status(200).json({ result, resultHTML });
}
// Si la chaîne de caractère dépasse LIMIT_CHARACTERS caractères
const LIMIT_CHARACTERS = 7
if (string.length > LIMIT_CHARACTERS) {
return errorHandling(next, { message: `Par souci de performance, vous ne pouvez pas exécuter cette fonction avec un mot dépassant ${LIMIT_CHARACTERS} caractères.`, statusCode: 400 })
}
const result = heapAlgorithm(string)
let resultHTML = `<p>Il y a ${formatNumberResult(result.length)} possibilités d'anagramme pour le mot "${string}" qui contient ${string.length} caractères, la liste : <br/><br/>`
result.forEach((string) => {
resultHTML += string + '<br/>'
})
resultHTML += '</p>'
return res.status(200).json({ result, resultHTML })
}

View File

@ -1,48 +1,48 @@
const errorHandling = require('../../utils/errorHandling');
const { requiredFields } = require('../../config/errors');
const errorHandling = require('../../utils/errorHandling')
const { requiredFields } = require('../../config/errors')
/**
* @description Inverse la chaîne de caractère
* @param {string} string
* @param {string} string
* @returns {string}
* @example reverseString('Hello') → 'olleH'
*/
function reverseString(string) {
return string.split("").reverse().join('');
function reverseString (string) {
return string.split('').reverse().join('')
}
/**
* @description Vérifie si un mot est un palindrome (un mot qui peut s'écrire dans les deux sens)
* @requires reverseString
* @param {string} string
* @param {string} string
* @param {string} reverseStringResult La chaîne de caractères inversée
* @returns {boolean}
* @example isPalindrome('kayak') → true
*/
function isPalindrome(string, reverseStringResult) {
return string === reverseStringResult;
function isPalindrome (string, reverseStringResult) {
return string === reverseStringResult
}
/* OUTPUTS */
module.exports = isPalindromeOutput = ({ res, next }, argsObject) => {
let { string } = argsObject;
// S'il n'y a pas les champs obligatoire
if (!(string)) {
return errorHandling(next, requiredFields);
}
module.exports = ({ res, next }, argsObject) => {
let { string } = argsObject
if (typeof string !== 'string') {
return errorHandling(next, { message: "Vous devez rentré une chaîne de caractère valide.", statusCode: 400 });
}
// S'il n'y a pas les champs obligatoire
if (!(string)) {
return errorHandling(next, requiredFields)
}
string = string.toLowerCase();
if (typeof string !== 'string') {
return errorHandling(next, { message: 'Vous devez rentré une chaîne de caractère valide.', statusCode: 400 })
}
const reverseStringResult = reverseString(string);
const isPalindromeResult = isPalindrome(string, reverseStringResult);
return res.status(200).json({
isPalindrome: isPalindromeResult,
reverseString: reverseStringResult,
resultHTML: `<p>"${string}" ${(isPalindromeResult) ? "est" : "n'est pas"} un palindrome car <br/> "${string}" ${(isPalindromeResult) ? "===" : "!=="} "${reverseStringResult}"</p>`
});
}
string = string.toLowerCase()
const reverseStringResult = reverseString(string)
const isPalindromeResult = isPalindrome(string, reverseStringResult)
return res.status(200).json({
isPalindrome: isPalindromeResult,
reverseString: reverseStringResult,
resultHTML: `<p>"${string}" ${(isPalindromeResult) ? 'est' : "n'est pas"} un palindrome car <br/> "${string}" ${(isPalindromeResult) ? '===' : '!=='} "${reverseStringResult}"</p>`
})
}

View File

@ -1,52 +1,52 @@
const validator = require('validator');
const errorHandling = require('../../utils/errorHandling');
const { requiredFields, serverError } = require('../../config/errors');
const Short_links = require('../../../models/short_links');
const validator = require('validator')
const errorHandling = require('../../utils/errorHandling')
const { requiredFields, serverError } = require('../../config/errors')
const shortLinks = require('../../../models/short_links')
module.exports = linkShortener = async ({ res, next }, argsObject) => {
let { url, shortcutName } = argsObject;
module.exports = async ({ res, next }, argsObject) => {
let { url, shortcutName } = argsObject
// S'il n'y a pas les champs obligatoire
if (!(url && shortcutName)) {
return errorHandling(next, requiredFields);
// S'il n'y a pas les champs obligatoire
if (!(url && shortcutName)) {
return errorHandling(next, requiredFields)
}
// Si ce n'est pas une url
if (!validator.isURL(url)) {
return errorHandling(next, { message: 'Veuillez entré une URL valide.', statusCode: 400 })
}
// Si ce n'est pas de type slug
if (!validator.isSlug(shortcutName)) {
return errorHandling(next, { message: "Le nom de votre raccourci doit être de type slug (ne pas contenir d'espaces, ni de caractères spéciaux).", statusCode: 400 })
}
// Sanitize shortcutName
shortcutName = validator.escape(shortcutName)
shortcutName = validator.trim(shortcutName)
shortcutName = validator.blacklist(shortcutName, ' ')
try {
// Si l'url a déjà été raccourcie
const urlInDatabase = await shortLinks.findOne({ where: { url } })
if (urlInDatabase) {
const urlShort = `https://short-links.divlo.fr/?q=${urlInDatabase.shortcut}`
return errorHandling(next, { message: `L'url a déjà été raccourcie... <br/> <br/> <a target="_blank" rel="noopener noreferrer" href="${urlShort}">${urlShort}</a>`, statusCode: 400 })
}
// Si ce n'est pas une url
if (!validator.isURL(url)) {
return errorHandling(next, { message: "Veuillez entré une URL valide.", statusCode: 400 });
// Si le nom du raccourci existe déjà
const shortcutInDatabase = await shortLinks.findOne({ where: { shortcut: shortcutName } })
if (shortcutInDatabase) {
const urlShort = `https://short-links.divlo.fr/?q=${shortcutInDatabase.shortcut}`
return errorHandling(next, { message: `Le nom du raccourci a déjà été utilisé... <br/> <br/> <a target="_blank" rel="noopener noreferrer" href="${urlShort}">${urlShort}</a>`, statusCode: 400 })
}
// Si ce n'est pas de type slug
if (!validator.isSlug(shortcutName)) {
return errorHandling(next, { message: "Le nom de votre raccourci doit être de type slug (ne pas contenir d'espaces, ni de caractères spéciaux).", statusCode: 400 });
}
// Sanitize shortcutName
shortcutName = validator.escape(shortcutName);
shortcutName = validator.trim(shortcutName);
shortcutName = validator.blacklist(shortcutName, ' ');
try {
// Si l'url a déjà été raccourcie
const urlInDatabase = await Short_links.findOne({ where: { url } });
if (urlInDatabase) {
const urlShort = `https://short-links.divlo.fr/?q=${urlInDatabase.shortcut}`;
return errorHandling(next, { message: `L'url a déjà été raccourcie... <br/> <br/> <a target="_blank" rel="noopener noreferrer" href="${urlShort}">${urlShort}</a>`, statusCode: 400 });
}
// Si le nom du raccourci existe déjà
const shortcutInDatabase = await Short_links.findOne({ where: { shortcut: shortcutName } });
if (shortcutInDatabase) {
const urlShort = `https://short-links.divlo.fr/?q=${shortcutInDatabase.shortcut}`;
return errorHandling(next, { message: `Le nom du raccourci a déjà été utilisé... <br/> <br/> <a target="_blank" rel="noopener noreferrer" href="${urlShort}">${urlShort}</a>`, statusCode: 400 });
}
// Ajout du lien raccourci
const result = await Short_links.create({ url, shortcut: shortcutName });
const shortcutLinkResult = `https://short-links.divlo.fr/?q=${result.shortcut}`;
return res.status(200).json({ resultHTML: `URL Raccourcie : <br/> <br/> <a target="_blank" rel="noopener noreferrer" href="${shortcutLinkResult}">${shortcutLinkResult}</a>`, result: shortcutLinkResult });
} catch {
console.log(error);
return errorHandling(next, serverError);
}
}
// Ajout du lien raccourci
const result = await shortLinks.create({ url, shortcut: shortcutName })
const shortcutLinkResult = `https://short-links.divlo.fr/?q=${result.shortcut}`
return res.status(200).json({ resultHTML: `URL Raccourcie : <br/> <br/> <a target="_blank" rel="noopener noreferrer" href="${shortcutLinkResult}">${shortcutLinkResult}</a>`, result: shortcutLinkResult })
} catch (error) {
console.log(error)
return errorHandling(next, serverError)
}
}

View File

@ -1,37 +1,37 @@
const errorHandling = require('../../utils/errorHandling');
const { requiredFields } = require('../../config/errors');
const formatNumberResult = require('../secondary/formatNumberResult');
const errorHandling = require('../../utils/errorHandling')
const { requiredFields } = require('../../config/errors')
const formatNumberResult = require('../secondary/formatNumberResult')
/**
* @description Génère un nombre aléatoire entre un minimum inclus et un maximum inclus.
* @param {Number} min Nombre Minimum
* @param {Number} max Nombre Maximum
* @returns {Number} Nombre aléatoire
/**
* @description Génère un nombre aléatoire entre un minimum inclus et un maximum inclus.
* @param {Number} min Nombre Minimum
* @param {Number} max Nombre Maximum
* @returns {Number} Nombre aléatoire
* @examples randomNumber(1, 2) → retourne soit 1 ou 2
*/
function randomNumber(min, max) {
return Math.floor(Math.random() * (max - min +1)) + min;
*/
function randomNumber (min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min
}
/* OUTPUTS */
const randomNumberOutput = ({ res, next }, argsObject) => {
let { min, max } = argsObject;
// S'il n'y a pas les champs obligatoire
if (!(min && max)) {
return errorHandling(next, requiredFields);
}
// Si ce ne sont pas des nombres
min = parseInt(min);
max = parseInt(max);
if (isNaN(min) || isNaN(max)) {
return errorHandling(next, { message: "Les paramètres min et max doivent être des nombres...", statusCode: 400 });
}
let { min, max } = argsObject
const result = randomNumber(min, max);
return res.status(200).json({ result, resultHTML: `<p>Nombre aléatoire compris entre ${min} inclus et ${max} inclus : <strong>${formatNumberResult(result)}</strong></p>` });
// S'il n'y a pas les champs obligatoire
if (!(min && max)) {
return errorHandling(next, requiredFields)
}
// Si ce ne sont pas des nombres
min = parseInt(min)
max = parseInt(max)
if (isNaN(min) || isNaN(max)) {
return errorHandling(next, { message: 'Les paramètres min et max doivent être des nombres...', statusCode: 400 })
}
const result = randomNumber(min, max)
return res.status(200).json({ result, resultHTML: `<p>Nombre aléatoire compris entre ${min} inclus et ${max} inclus : <strong>${formatNumberResult(result)}</strong></p>` })
}
exports.randomNumber = randomNumber;
exports.randomNumberOutput = randomNumberOutput;
exports.randomNumber = randomNumber
exports.randomNumberOutput = randomNumberOutput

View File

@ -1,26 +1,26 @@
const errorHandling = require('../../utils/errorHandling');
const { serverError } = require('../../config/errors');
const Quotes = require('../../../models/quotes');
const Users = require('../../../models/users');
const sequelize = require('../../utils/database');
const errorHandling = require('../../utils/errorHandling')
const { serverError } = require('../../config/errors')
const Quotes = require('../../../models/quotes')
const Users = require('../../../models/users')
const sequelize = require('../../utils/database')
module.exports = randomQuote = async ({ res, next }, _argsObject) => {
try {
const quote = await Quotes.findOne({
order: sequelize.random(),
include: [
{ model: Users, attributes: ["name", "logo"] }
],
attributes: {
exclude: ["isValidated"]
},
where: {
isValidated: 1,
}
});
return res.status(200).json(quote);
} catch (error) {
console.log(error);
return errorHandling(next, serverError);
}
}
module.exports = async ({ res, next }, _argsObject) => {
try {
const quote = await Quotes.findOne({
order: sequelize.random(),
include: [
{ model: Users, attributes: ['name', 'logo'] }
],
attributes: {
exclude: ['isValidated']
},
where: {
isValidated: 1
}
})
return res.status(200).json(quote)
} catch (error) {
console.log(error)
return errorHandling(next, serverError)
}
}

View File

@ -1,57 +1,57 @@
const { randomNumber } = require('./randomNumber');
const errorHandling = require('../../utils/errorHandling');
const { serverError } = require('../../config/errors');
const { SCRAPER_API_KEY } = require('../../config/config');
const axios = require('axios');
const { JSDOM } = require("jsdom");
const { randomNumber } = require('./randomNumber')
const errorHandling = require('../../utils/errorHandling')
const { serverError } = require('../../config/errors')
const { SCRAPER_API_KEY } = require('../../config/config')
const axios = require('axios')
const { JSDOM } = require('jsdom')
const subjectList = [
"smartphone",
"pc+gamer",
"pc+portable",
"TV",
"casque",
"clavier",
"souris",
"ecran",
"jeux+vidéos"
];
'smartphone',
'pc+gamer',
'pc+portable',
'TV',
'casque',
'clavier',
'souris',
'ecran',
'jeux+vidéos'
]
function getRandomArrayElement(array) {
return array[randomNumber(0, array.length - 1)];
function getRandomArrayElement (array) {
return array[randomNumber(0, array.length - 1)]
}
async function getAmazonProductList(subject) {
const url = `https://www.amazon.fr/s?k=${subject}`;
const { data } = await axios.get(`http://api.scraperapi.com/?api_key=${SCRAPER_API_KEY}&url=${url}`);
const { document } = (new JSDOM(data)).window;
const amazonProductList = document.querySelectorAll('.s-result-item');
const productsList = [];
for (let indexProduct in amazonProductList) {
try {
const elementProduct = amazonProductList[indexProduct];
const productImage = elementProduct.querySelector('.s-image');
const originalPrice = elementProduct.querySelector(".a-price-whole").innerHTML;
productsList.push({
name: productImage["alt"],
image: productImage["src"],
price: Number(originalPrice.replace(",", ".").replace(" ", ""))
});
} catch (_error) {
continue;
}
}
return productsList;
}
module.exports = rightPriceOutput = async ({ res, next }, _argsObject) => {
const subject = getRandomArrayElement(subjectList);
async function getAmazonProductList (subject) {
const url = `https://www.amazon.fr/s?k=${subject}`
const { data } = await axios.get(`http://api.scraperapi.com/?api_key=${SCRAPER_API_KEY}&url=${url}`)
const { document } = (new JSDOM(data)).window
const amazonProductList = document.querySelectorAll('.s-result-item')
const productsList = []
for (const indexProduct in amazonProductList) {
try {
const productsList = await getAmazonProductList(subject);
const randomProduct = getRandomArrayElement(productsList);
return res.status(200).json({ subject, ...randomProduct });
} catch (error) {
console.error(error);
return errorHandling(next, serverError);
const elementProduct = amazonProductList[indexProduct]
const productImage = elementProduct.querySelector('.s-image')
const originalPrice = elementProduct.querySelector('.a-price-whole').innerHTML
productsList.push({
name: productImage.alt,
image: productImage.src,
price: Number(originalPrice.replace(',', '.').replace(' ', ''))
})
} catch (_error) {
continue
}
}
}
return productsList
}
module.exports = async ({ res, next }, _argsObject) => {
const subject = getRandomArrayElement(subjectList)
try {
const productsList = await getAmazonProductList(subject)
const randomProduct = getRandomArrayElement(productsList)
return res.status(200).json({ subject, ...randomProduct })
} catch (error) {
console.error(error)
return errorHandling(next, serverError)
}
}

View File

@ -1,56 +1,56 @@
const errorHandling = require('../../utils/errorHandling');
const { requiredFields } = require('../../config/errors');
const formatNumberResult = require('../secondary/formatNumberResult');
const errorHandling = require('../../utils/errorHandling')
const { requiredFields } = require('../../config/errors')
const formatNumberResult = require('../secondary/formatNumberResult')
function minNumber(array) {
let minNumber = { index: 0, value: array[0] }
for (let index = 1; index < array.length; index++) {
const number = array[index];
if (number < minNumber.value) {
minNumber = { index: index, value: array[index] }
}
function minNumber (array) {
let minNumber = { index: 0, value: array[0] }
for (let index = 1; index < array.length; index++) {
const number = array[index]
if (number < minNumber.value) {
minNumber = { index: index, value: array[index] }
}
return minNumber;
}
return minNumber
}
function sortArray(array) {
const arrayDuplicated = [...array];
const resultArray = [];
while (array.length !== resultArray.length) {
const min = minNumber(arrayDuplicated);
resultArray.push(min.value);
arrayDuplicated.splice(min.index, 1);
}
return resultArray;
function sortArray (array) {
const arrayDuplicated = [...array]
const resultArray = []
while (array.length !== resultArray.length) {
const min = minNumber(arrayDuplicated)
resultArray.push(min.value)
arrayDuplicated.splice(min.index, 1)
}
return resultArray
}
/* OUTPUTS */
module.exports = sortArrayOutput = ({ res, next }, argsObject) => {
let { numbersList } = argsObject;
// S'il n'y a pas les champs obligatoire
if (!(numbersList)) {
return errorHandling(next, requiredFields);
}
module.exports = ({ res, next }, argsObject) => {
const { numbersList } = argsObject
const numbersListArray = numbersList.split(',').map((number) => number.trim().replace(' ', '')).map(Number);
// S'il n'y a pas les champs obligatoire
if (!(numbersList)) {
return errorHandling(next, requiredFields)
}
// Si ce n'est pas une liste de nombres
if (numbersListArray.includes(NaN)) {
return errorHandling(next, { message: "Vous devez rentrer une liste de nombres séparée par des virgules valide.", statusCode: 400 });
}
const numbersListArray = numbersList.split(',').map((number) => number.trim().replace(' ', '')).map(Number)
// Si la taille du tableau dépasse LIMIT_ARRAY_LENGTH
const LIMIT_ARRAY_LENGTH = 31;
if (numbersListArray.length >= LIMIT_ARRAY_LENGTH) {
return errorHandling(next, { message: `Par souci de performance, vous ne pouvez pas exécuter cette fonction avec une liste de nombres dépassant ${LIMIT_ARRAY_LENGTH - 1} nombres.`, statusCode: 400 });
}
// Si ce n'est pas une liste de nombres
if (numbersListArray.includes(NaN)) {
return errorHandling(next, { message: 'Vous devez rentrer une liste de nombres séparée par des virgules valide.', statusCode: 400 })
}
const result = sortArray(numbersListArray);
const resultFormatted = result.map((number) => formatNumberResult(number));
return res.status(200).json({
result,
resultFormatted,
resultHTML: `<p>La liste de nombres dans l'ordre croissant :<br/> ${resultFormatted.join(', ')}</p>`
});
}
// Si la taille du tableau dépasse LIMIT_ARRAY_LENGTH
const LIMIT_ARRAY_LENGTH = 31
if (numbersListArray.length >= LIMIT_ARRAY_LENGTH) {
return errorHandling(next, { message: `Par souci de performance, vous ne pouvez pas exécuter cette fonction avec une liste de nombres dépassant ${LIMIT_ARRAY_LENGTH - 1} nombres.`, statusCode: 400 })
}
const result = sortArray(numbersListArray)
const resultFormatted = result.map((number) => formatNumberResult(number))
return res.status(200).json({
result,
resultFormatted,
resultHTML: `<p>La liste de nombres dans l'ordre croissant :<br/> ${resultFormatted.join(', ')}</p>`
})
}

View File

@ -1,46 +1,46 @@
const axios = require('axios');
const Queue = require('smart-request-balancer');
const errorHandling = require('../../utils/errorHandling');
const { requiredFields } = require('../../config/errors');
const { WEATHER_API_KEY } = require('../../config/config');
const dateTimeUTC = require('../secondary/dateTimeManagement');
const capitalize = require('../secondary/capitalize');
const axios = require('axios')
const Queue = require('smart-request-balancer')
const errorHandling = require('../../utils/errorHandling')
const { requiredFields } = require('../../config/errors')
const { WEATHER_API_KEY } = require('../../config/config')
const dateTimeUTC = require('../secondary/dateTimeManagement')
const capitalize = require('../secondary/capitalize')
const queue = new Queue({
/*
/*
rate: number of requests
per
limit: number of seconds
*/
rules: {
weatherRequest: {
rate: 50,
limit: 60,
priority: 1
},
rules: {
weatherRequest: {
rate: 50,
limit: 60,
priority: 1
}
});
}
})
/* OUTPUTS */
module.exports = weatherRequestOutput = ({ res, next }, argsObject) => {
let { cityName } = argsObject;
module.exports = ({ res, next }, argsObject) => {
let { cityName } = argsObject
// S'il n'y a pas les champs obligatoire
if (!(cityName)) {
return errorHandling(next, requiredFields);
}
// S'il n'y a pas les champs obligatoire
if (!(cityName)) {
return errorHandling(next, requiredFields)
}
cityName = cityName.split(' ').join('+');
cityName = cityName.split(' ').join('+')
// Récupère les données météo grâce à l'API : openweathermap.org. (→ avec limite de 50 requêtes par minute)
queue.request(() => {
axios.get(`https://api.openweathermap.org/data/2.5/weather?q=${cityName}&lang=fr&units=metric&appid=${WEATHER_API_KEY}`)
.then((response) =>{
const json = response.data;
const showDateTimeValue = dateTimeUTC((json.timezone / 60 / 60).toString()).showDateTimeValue;
const resultHTML = `<p>🌎 Position : <a href="https://www.google.com/maps/search/?api=1&query=${json.coord.lat},${json.coord.lon}" rel="noopener noreferrer" target="_blank">${json.name}, ${json.sys.country}</a><br/>⏰ Date et heure : ${showDateTimeValue} <br/>☁️ Météo : ${capitalize(json.weather[0].description)}<br/>🌡️ Température : ${json.main.temp} °C<br/> 💧 Humidité : ${json.main.humidity}% <br/> <img src="https://openweathermap.org/img/wn/${json.weather[0].icon}@2x.png"/></p>`;
return res.status(200).json({ result: json, resultHTML });
})
.catch(() => errorHandling(next, { message: "La ville n'existe pas (dans l'API de openweathermap.org).", statusCode: 404 }));
}, 'everyone', 'weatherRequest');
}
// Récupère les données météo grâce à l'API : openweathermap.org. (→ avec limite de 50 requêtes par minute)
queue.request(() => {
axios.get(`https://api.openweathermap.org/data/2.5/weather?q=${cityName}&lang=fr&units=metric&appid=${WEATHER_API_KEY}`)
.then((response) => {
const json = response.data
const showDateTimeValue = dateTimeUTC((json.timezone / 60 / 60).toString()).showDateTimeValue
const resultHTML = `<p>🌎 Position : <a href="https://www.google.com/maps/search/?api=1&query=${json.coord.lat},${json.coord.lon}" rel="noopener noreferrer" target="_blank">${json.name}, ${json.sys.country}</a><br/>⏰ Date et heure : ${showDateTimeValue} <br/>☁️ Météo : ${capitalize(json.weather[0].description)}<br/>🌡️ Température : ${json.main.temp} °C<br/> 💧 Humidité : ${json.main.humidity}% <br/> <img src="https://openweathermap.org/img/wn/${json.weather[0].icon}@2x.png"/></p>`
return res.status(200).json({ result: json, resultHTML })
})
.catch(() => errorHandling(next, { message: "La ville n'existe pas (dans l'API de openweathermap.org).", statusCode: 404 }))
}, 'everyone', 'weatherRequest')
}

View File

@ -1,12 +1,12 @@
/**
/**
* @description Majuscule à la 1ère lettre d'une string.
* @param {String} s
* @returns {String}
* @param {String} s
* @returns {String}
* @examples capitalize('hello world!') → 'Hello world!'
*/
function capitalize(s) {
if (typeof s !== 'string') return ''
return s.charAt(0).toUpperCase() + s.slice(1)
function capitalize (s) {
if (typeof s !== 'string') return ''
return s.charAt(0).toUpperCase() + s.slice(1)
}
module.exports = capitalize;
module.exports = capitalize

View File

@ -1,43 +1,43 @@
/**
/**
* @description Donne la date et l'heure selon l'UTC (Universal Time Coordinated).
* @param {String} utc Heure de décalage par rapport à l'UTC
* @param {String} utc Heure de décalage par rapport à l'UTC
* @returns {Function} → showDateTime(enteredOffset) → Retourne l'exécution de la fonction showDateTime
* @examples dateTimeUTC('0')
*/
function dateTimeUTC(utc) {
const timeNow = new Date();
const utcOffset = timeNow.getTimezoneOffset();
timeNow.setMinutes(timeNow.getMinutes() + utcOffset);
const enteredOffset = parseFloat(utc)*60;
timeNow.setMinutes(timeNow.getMinutes() + enteredOffset);
return showDateTime(timeNow);
}
/**
* @description Affiche la date et l'heure (format : dd/mm/yyyy - 00:00:00).
* @requires {@link fonctions_annexes.js: showDateTime}
* @param {String} utc Heure de décalage par rapport à l'UTC
* @returns {Object} Retourne un objet contenant l'année, le mois, le jour, l'heure, les minutes, les secondes et la date formaté
* @examples dateTimeUTC('0') → dateTimeUTC vous renvoie l'exécution de showDateTime
*/
function showDateTime(timeNow) {
const year = timeNow.getFullYear();
const month = ('0'+(timeNow.getMonth()+1)).slice(-2);
const day = ('0'+timeNow.getDate()).slice(-2);
const hour = ('0'+timeNow.getHours()).slice(-2);
const minute = ('0'+timeNow.getMinutes()).slice(-2);
const second = ('0'+timeNow.getSeconds()).slice(-2);
const showDateTimeValue = day + "/" + month + "/" + year + " - " + hour + ":" + minute + ":" + second;
const objectDateTime = {
year: year,
month: month,
day: day,
hour: hour,
minute: minute,
second: second,
showDateTimeValue: showDateTimeValue
};
return objectDateTime;
* @examples dateTimeUTC('0')
*/
function dateTimeUTC (utc) {
const timeNow = new Date()
const utcOffset = timeNow.getTimezoneOffset()
timeNow.setMinutes(timeNow.getMinutes() + utcOffset)
const enteredOffset = parseFloat(utc) * 60
timeNow.setMinutes(timeNow.getMinutes() + enteredOffset)
return showDateTime(timeNow)
}
module.exports = dateTimeUTC;
/**
* @description Affiche la date et l'heure (format : dd/mm/yyyy - 00:00:00).
* @requires {@link fonctions_annexes.js: showDateTime}
* @param {String} utc Heure de décalage par rapport à l'UTC
* @returns {Object} Retourne un objet contenant l'année, le mois, le jour, l'heure, les minutes, les secondes et la date formaté
* @examples dateTimeUTC('0') → dateTimeUTC vous renvoie l'exécution de showDateTime
*/
function showDateTime (timeNow) {
const year = timeNow.getFullYear()
const month = ('0' + (timeNow.getMonth() + 1)).slice(-2)
const day = ('0' + timeNow.getDate()).slice(-2)
const hour = ('0' + timeNow.getHours()).slice(-2)
const minute = ('0' + timeNow.getMinutes()).slice(-2)
const second = ('0' + timeNow.getSeconds()).slice(-2)
const showDateTimeValue = day + '/' + month + '/' + year + ' - ' + hour + ':' + minute + ':' + second
const objectDateTime = {
year: year,
month: month,
day: day,
hour: hour,
minute: minute,
second: second,
showDateTimeValue: showDateTimeValue
}
return objectDateTime
}
module.exports = dateTimeUTC

View File

@ -1,14 +1,14 @@
/**
/**
* @description Formate un nombre avec des espaces.
* @param {Number} number
* @param {String} separator Le séparateur utilisé pour la virgule (exemple: "." ou ",")
* @returns {String} - Le nombre formaté
* @returns {String} - Le nombre formaté
* @examples formatNumberResult(76120) → '76 120'
*/
function formatNumberResult(number, separator = ".") {
let parts = number.toString().split(separator);
parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, " ");
return parts.join(separator);
*/
function formatNumberResult (number, separator = '.') {
const parts = number.toString().split(separator)
parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ' ')
return parts.join(separator)
}
module.exports = formatNumberResult;
module.exports = formatNumberResult