First commit
This commit is contained in:
30
modules/errors.js
Normal file
30
modules/errors.js
Normal file
@@ -0,0 +1,30 @@
|
||||
function $default(res, errorDetails) {
|
||||
return res.status(400).json({
|
||||
status: "error",
|
||||
message: "Validation Failed",
|
||||
details: errorDetails
|
||||
})
|
||||
}
|
||||
|
||||
function legacy(res, errorDetails) {
|
||||
return res.status(200).json({
|
||||
success: false,
|
||||
code: 900,
|
||||
err_msg: errorDetails
|
||||
})
|
||||
}
|
||||
|
||||
function minimal(res, errorDetails) {
|
||||
return res.status(400).send(`ERR:${JSON.stringify(errorDetails)}`)
|
||||
}
|
||||
|
||||
function secure(res, errorDetails) {
|
||||
return res.status(401).json({ error: "Unauthorized or Invalid Request" })
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
default: $default,
|
||||
legacy,
|
||||
minimal,
|
||||
secure
|
||||
}
|
||||
53
modules/loader.js
Normal file
53
modules/loader.js
Normal file
@@ -0,0 +1,53 @@
|
||||
const fs = require("node:fs")
|
||||
const path = require("node:path")
|
||||
|
||||
function getRecursiveFiles(dir) {
|
||||
let results = []
|
||||
|
||||
if (!fs.existsSync(dir)) {
|
||||
return results
|
||||
}
|
||||
|
||||
const list = fs.readdirSync(dir)
|
||||
|
||||
for (const file of list) {
|
||||
const fullPath = path.join(dir, file)
|
||||
const stat = fs.statSync(fullPath)
|
||||
|
||||
if (stat && stat.isDirectory()) {
|
||||
results = results.concat(getRecursiveFiles(fullPath))
|
||||
} else {
|
||||
if (fullPath.endsWith(".js")) {
|
||||
results.push(fullPath)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return results
|
||||
}
|
||||
|
||||
function computeRoutePath(baseDir, filePath) {
|
||||
const relativePath = path.relative(baseDir, filePath)
|
||||
const normalizedPath = relativePath.replace(/\\/g, "/")
|
||||
|
||||
let route = "/" + normalizedPath
|
||||
|
||||
if (route.endsWith("index.js")) {
|
||||
route = route.replace("index.js", "")
|
||||
} else {
|
||||
route = route.replace(".js", "")
|
||||
}
|
||||
|
||||
route = route.replace(/\/{2,}/g, "/")
|
||||
|
||||
if (route.length > 1 && route.endsWith('/')) {
|
||||
route = route.slice(0, -1)
|
||||
}
|
||||
|
||||
return route
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
getRecursiveFiles,
|
||||
computeRoutePath
|
||||
}
|
||||
85
modules/logger.js
Normal file
85
modules/logger.js
Normal file
@@ -0,0 +1,85 @@
|
||||
const fs = require("node:fs")
|
||||
const path = require("node:path")
|
||||
require("colors")
|
||||
require("dotenv").config({
|
||||
quiet: true
|
||||
})
|
||||
|
||||
function cleanup($stream) {
|
||||
if (!$stream.destroyed) {
|
||||
$stream.end()
|
||||
}
|
||||
}
|
||||
|
||||
function write($stream, level, color, content, extraLabels = []) {
|
||||
const date = new Date().toISOString()
|
||||
const message = typeof content === "string" ? content : JSON.stringify(content, null, 2)
|
||||
|
||||
let consoleLabels = ""
|
||||
let fileLabels = ""
|
||||
|
||||
if (Array.isArray(extraLabels) && extraLabels.length > 0) {
|
||||
for (let i = 0; i < extraLabels.length; i += 2) {
|
||||
const labelName = extraLabels[i]
|
||||
const labelColor = extraLabels[i + 1]
|
||||
if (labelName) {
|
||||
fileLabels += ` [${labelName}]`
|
||||
if (labelColor && labelName[labelColor]) {
|
||||
consoleLabels += ` [${labelName[labelColor]}]`
|
||||
} else {
|
||||
consoleLabels += ` [${labelName.white}]`
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`[${date}] `.magenta + `[${level}]`[color] + consoleLabels + " " + message)
|
||||
$stream.write(`[${date}] [${level}]${fileLabels} ${stripColors(message)}\n`)
|
||||
}
|
||||
|
||||
function createLogger(root) {
|
||||
const fileName = (/false/).test(process.env.IS_PROD.toLowerCase()) ? new Date().toLocaleString("fr-FR", { timeZone: "UTC" }).replace(/[\/:]/g, "-").replace(/ /g, "_") : "DEV-LOG"
|
||||
|
||||
const logsDir = path.join(root, "logs")
|
||||
|
||||
if (!fs.existsSync(logsDir)) {
|
||||
fs.mkdirSync(logsDir, { recursive: true })
|
||||
}
|
||||
|
||||
const stream = fs.createWriteStream(path.join(logsDir, `${fileName}.log`), { flags: "a" })
|
||||
|
||||
process.on("exit", () => {
|
||||
cleanup(stream)
|
||||
})
|
||||
|
||||
process.on("SIGINT", () => {
|
||||
cleanup(stream)
|
||||
process.exit()
|
||||
})
|
||||
|
||||
return {
|
||||
log: (content, labels) => {
|
||||
write(stream, "INFO", "green", content, labels)
|
||||
},
|
||||
error: (content, labels) => {
|
||||
write(stream, "ERROR", "red", content, labels)
|
||||
},
|
||||
warn: (content, labels) => {
|
||||
write(stream, "WARN", "yellow", content, labels)
|
||||
},
|
||||
debug: (content, labels) => {
|
||||
write(stream, "DEBUG", "white", content, labels)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function stripColors(string) {
|
||||
if (!string || typeof string !== "string") {
|
||||
return string
|
||||
}
|
||||
return string.replace(/\x1B\[[0-9;]*[mK]/g, "")
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
createLogger
|
||||
}
|
||||
Reference in New Issue
Block a user