@onurege3467/zerohelper
Version:
ZeroHelper is a versatile high-performance utility library and database framework for Node.js, fully written in TypeScript.
687 lines (686 loc) • 21.5 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ai_module = exports.toon_module = exports.worker_module = exports.security_module = exports.logger_module = exports.validation_module = exports.math_module = exports.crypto_module = exports.object_module = exports.array_module = exports.string_module = exports.random_module = exports.date_module = exports.http_module = exports.Logger = void 0;
exports.makeUniqueId = makeUniqueId;
exports.randomArray = randomArray;
exports.randomText = randomText;
exports.randomNumber = randomNumber;
exports.randomEmoji = randomEmoji;
exports.randomHex = randomHex;
exports.randomFloat = randomFloat;
exports.titleCase = titleCase;
exports.generateRandomString = generateRandomString;
exports.generateSlug = generateSlug;
exports.wordCount = wordCount;
exports.shuffleArray = shuffleArray;
exports.flattenArray = flattenArray;
exports.removeFalsyValues = removeFalsyValues;
exports.groupBy = groupBy;
exports.pluck = pluck;
exports.sortBy = sortBy;
exports.filterObjectByKey = filterObjectByKey;
exports.deepMerge = deepMerge;
exports.encryptText = encryptText;
exports.decryptText = decryptText;
exports.hashPassword = hashPassword;
exports.verifyPassword = verifyPassword;
exports.generateJWT = generateJWT;
exports.verifyJWT = verifyJWT;
exports.generateSalt = generateSalt;
exports.validateUUID = validateUUID;
exports.isPasswordStrong = isPasswordStrong;
exports.mean = mean;
exports.median = median;
exports.variance = variance;
exports.standardDeviation = standardDeviation;
exports.sum = sum;
exports.max = max;
exports.min = min;
exports.range = range;
exports.isPrime = isPrime;
exports.factorial = factorial;
exports.combination = combination;
exports.permutation = permutation;
exports.formatDate = formatDate;
exports.dateDifference = dateDifference;
exports.addDays = addDays;
exports.subtractDays = subtractDays;
exports.fetchData = fetchData;
exports.postData = postData;
exports.isEmail = isEmail;
exports.isPhone = isPhone;
exports.isURL = isURL;
exports.sanitizeHTML = sanitizeHTML;
exports.validateCreditCard = validateCreditCard;
exports.validateSchema = validateSchema;
exports.sanitizeInput = sanitizeInput;
exports.createLogger = createLogger;
exports.logInfo = logInfo;
exports.logError = logError;
exports.logWarn = logWarn;
exports.logDebug = logDebug;
const crypto_1 = __importDefault(require("crypto"));
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
const bcrypt_1 = __importDefault(require("bcrypt"));
const https_1 = __importDefault(require("https"));
const http_1 = __importDefault(require("http"));
const url_1 = require("url");
const security = __importStar(require("./security"));
const worker = __importStar(require("./worker"));
const toon = __importStar(require("./toon"));
const ai = __importStar(require("./ai"));
// Random İşlemler
function makeUniqueId() {
return Date.now().toString(36) + Math.random().toString(36).substr(2);
}
function randomArray(arr) {
return arr[Math.floor(Math.random() * arr.length)];
}
function randomText(length = 8) {
const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
return Array.from({ length }, () => characters.charAt(Math.floor(Math.random() * characters.length))).join("");
}
function randomNumber(min = 0, max = 9999999) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
function randomEmoji() {
const emojiler = ["😄", "😃", "😀", "😊", "😉", "😍", "😘", "😚", "😜", "😝", "😛", "😁"];
return emojiler[Math.floor(Math.random() * emojiler.length)];
}
function randomHex() {
return `#${Array.from({ length: 6 }, () => "0123456789ABCDEF".charAt(Math.floor(Math.random() * 16))).join("")}`;
}
function randomFloat(min, max) {
return Math.random() * (max - min) + min;
}
// String İşlemleri
function titleCase(sentence) {
return sentence
.toLowerCase()
.split(" ")
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
.join(" ");
}
function generateRandomString(length) {
return randomText(length);
}
function generateSlug(text) {
return text
.toLowerCase()
.replace(/[^a-z0-9]+/g, "-")
.replace(/^-+|-+$/g, "");
}
function wordCount(text) {
return text.trim().split(/\s+/).length;
}
// Array İşlemleri
function shuffleArray(array) {
const arr = [...array];
let currentIndex = arr.length;
while (currentIndex !== 0) {
const randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex--;
[arr[currentIndex], arr[randomIndex]] = [arr[randomIndex], arr[currentIndex]];
}
return arr;
}
function flattenArray(arr) {
return arr.reduce((flat, toFlatten) => flat.concat(Array.isArray(toFlatten) ? flattenArray(toFlatten) : toFlatten), []);
}
function removeFalsyValues(arr) {
return arr.filter(Boolean);
}
function groupBy(arr, key) {
return arr.reduce((result, item) => {
const group = String(item[key]);
if (!result[group])
result[group] = [];
result[group].push(item);
return result;
}, {});
}
function pluck(arr, key) {
return arr.map((item) => item[key]);
}
function sortBy(arr, key) {
return [...arr].sort((a, b) => (a[key] > b[key] ? 1 : -1));
}
// Object İşlemleri
function filterObjectByKey(obj, keys) {
return Object.fromEntries(Object.entries(obj).filter(([key]) => keys.includes(key)));
}
function deepMerge(obj1, obj2) {
const isObject = (obj) => obj && typeof obj === "object";
return Object.keys({ ...obj1, ...obj2 }).reduce((result, key) => {
result[key] =
isObject(obj1[key]) && isObject(obj2[key])
? deepMerge(obj1[key], obj2[key])
: obj2[key] ?? obj1[key];
return result;
}, {});
}
// Şifreleme ve Güvenlik
function getKeyFromSecret(secret) {
const salt = Buffer.from('some_fixed_salt_for_testing_only', 'utf8');
return crypto_1.default.pbkdf2Sync(secret, salt, 100000, 32, 'sha512');
}
function encryptText(text, secret) {
const key = getKeyFromSecret(secret);
const iv = crypto_1.default.randomBytes(16);
const cipher = crypto_1.default.createCipheriv("aes-256-cbc", key, iv);
let encrypted = cipher.update(text, "utf8", "hex");
encrypted += cipher.final("hex");
return { encryptedText: encrypted, iv: iv.toString('hex') };
}
function decryptText(encryptedText, secret, ivHex) {
const key = getKeyFromSecret(secret);
const iv = Buffer.from(ivHex, 'hex');
const decipher = crypto_1.default.createDecipheriv("aes-256-cbc", key, iv);
let decrypted = decipher.update(encryptedText, "hex", "utf8");
decrypted += decipher.final("utf8");
return decrypted;
}
function hashPassword(password) {
const saltRounds = 10;
return bcrypt_1.default.hashSync(password, saltRounds);
}
function verifyPassword(password, hash) {
return bcrypt_1.default.compareSync(password, hash);
}
function generateJWT(payload, secret) {
return jsonwebtoken_1.default.sign(payload, secret, { expiresIn: "1h" });
}
function verifyJWT(token, secret) {
try {
return jsonwebtoken_1.default.verify(token, secret);
}
catch {
return null;
}
}
function generateSalt() {
return crypto_1.default.randomBytes(16).toString("hex");
}
function validateUUID(uuid) {
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
return uuidRegex.test(uuid);
}
function isPasswordStrong(password) {
const strongPasswordRegex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/;
return strongPasswordRegex.test(password);
}
// Matematiksel İşlemler
function mean(arr) {
if (!arr.length)
return 0;
return arr.reduce((sum, num) => sum + num, 0) / arr.length;
}
function median(arr) {
if (!arr.length)
return 0;
const sorted = [...arr].sort((a, b) => a - b);
const mid = Math.floor(sorted.length / 2);
return sorted.length % 2 !== 0
? sorted[mid]
: (sorted[mid - 1] + sorted[mid]) / 2;
}
function variance(arr) {
if (!arr.length)
return 0;
const avg = mean(arr);
return arr.reduce((sum, num) => sum + Math.pow(num - avg, 2), 0) / arr.length;
}
function standardDeviation(arr) {
return Math.sqrt(variance(arr));
}
function sum(arr) {
return arr.reduce((total, num) => total + num, 0);
}
function max(arr) {
return Math.max(...arr);
}
function min(arr) {
return Math.min(...arr);
}
function range(start, end) {
if (start > end)
return [];
return Array.from({ length: end - start + 1 }, (_, i) => start + i);
}
function isPrime(num) {
if (num <= 1)
return false;
if (num <= 3)
return true;
if (num % 2 === 0 || num % 3 === 0)
return false;
for (let i = 5; i * i <= num; i += 6) {
if (num % i === 0 || num % (i + 2) === 0)
return false;
}
return true;
}
function factorial(n) {
if (n === 0 || n === 1)
return 1;
return n * factorial(n - 1);
}
function combination(n, r) {
return factorial(n) / (factorial(r) * factorial(n - r));
}
function permutation(n, r) {
return factorial(n) / factorial(n - r);
}
// Tarih ve Saat İşlemleri
function formatDate(date, format = "YYYY-MM-DD") {
const options = {
year: "numeric",
month: "2-digit",
day: "2-digit",
hour: "2-digit",
minute: "2-digit",
second: "2-digit",
hour12: false
};
const formattedDate = new Intl.DateTimeFormat("en-US", options).format(date);
const match = formattedDate.match(/\d+/g);
if (!match)
return "";
const [month, day, year, hour, minute, second] = match;
return format
.replace("YYYY", year)
.replace("MM", month)
.replace("DD", day)
.replace("HH", hour)
.replace("mm", minute)
.replace("ss", second);
}
function dateDifference(date1, date2) {
const diffTime = Math.abs(date2.getTime() - date1.getTime());
return Math.ceil(diffTime / (1000 * 60 * 60 * 24));
}
function addDays(date, days) {
const result = new Date(date);
result.setDate(result.getDate() + days);
return result;
}
function subtractDays(date, days) {
const result = new Date(date);
result.setDate(result.getDate() - days);
return result;
}
// HTTP İşlemleri
function fetchData(url) {
return new Promise((resolve, reject) => {
const client = url.startsWith("https") ? https_1.default : http_1.default;
client
.get(url, (response) => {
let data = "";
response.on("data", (chunk) => {
data += chunk;
});
response.on("end", () => {
try {
resolve(JSON.parse(data));
}
catch (error) {
resolve(data);
}
});
})
.on("error", (error) => {
reject(error);
});
});
}
function postData(url, data) {
return new Promise((resolve, reject) => {
const client = url.startsWith("https") ? https_1.default : http_1.default;
const parsedUrl = new url_1.URL(url);
const options = {
hostname: parsedUrl.hostname,
port: parsedUrl.port || (url.startsWith("https") ? 443 : 80),
path: parsedUrl.pathname,
method: "POST",
headers: {
"Content-Type": "application/json",
"Content-Length": Buffer.byteLength(JSON.stringify(data)),
},
};
const req = client.request(options, (response) => {
let responseData = "";
response.on("data", (chunk) => {
responseData += chunk;
});
response.on("end", () => {
try {
resolve(JSON.parse(responseData));
}
catch (error) {
resolve(responseData);
}
});
});
req.on("error", (error) => {
reject(error);
});
req.write(JSON.stringify(data));
req.end();
});
}
// Validasyon İşlemleri
function isEmail(email) {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return emailRegex.test(email);
}
function isPhone(phone) {
const phoneRegex = /^[\\+]?[1-9][\\d]{0,15}$/;
return phoneRegex.test(phone.replace(/[\\s\-\(\)]/g, ''));
}
function isURL(url) {
try {
new url_1.URL(url);
return true;
}
catch {
return false;
}
}
function sanitizeHTML(html) {
return html
.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '')
.replace(/<iframe\b[^<]*(?:(?!<\/iframe>)<[^<]*)*<\/iframe>/gi, '')
.replace(/javascript:/gi, '')
.replace(/on\w+\s*=/gi, '');
}
function validateCreditCard(cardNumber) {
const cleanNumber = cardNumber.replace(/\D/g, '');
if (cleanNumber.length < 13 || cleanNumber.length > 19)
return false;
let sum = 0;
let isEven = false;
for (let i = cleanNumber.length - 1; i >= 0; i--) {
let digit = parseInt(cleanNumber[i]);
if (isEven) {
digit *= 2;
if (digit > 9)
digit -= 9;
}
sum += digit;
isEven = !isEven;
}
return sum % 10 === 0;
}
function validateSchema(data, schema) {
const errors = [];
for (const [key, rules] of Object.entries(schema)) {
const value = data[key];
if (rules.required && (value === undefined || value === null || value === '')) {
errors.push(`${key} alanı zorunludur`);
continue;
}
if (value !== undefined && value !== null) {
if (rules.type && typeof value !== rules.type) {
errors.push(`${key} alanı ${rules.type} tipinde olmalıdır`);
}
if (rules.minLength && String(value).length < rules.minLength) {
errors.push(`${key} en az ${rules.minLength} karakter olmalıdır`);
}
if (rules.maxLength && String(value).length > rules.maxLength) {
errors.push(`${key} en fazla ${rules.maxLength} karakter olmalıdır`);
}
if (rules.pattern && !rules.pattern.test(String(value))) {
errors.push(`${key} geçerli formatta değil`);
}
if (rules.min && value < rules.min) {
errors.push(`${key} en az ${rules.min} olmalıdır`);
}
if (rules.max && value > rules.max) {
errors.push(`${key} en fazla ${rules.max} olmalıdır`);
}
}
}
return {
isValid: errors.length === 0,
errors
};
}
function sanitizeInput(input, options = {}) {
if (typeof input !== 'string')
return input;
let sanitized = input;
if (options.trim !== false) {
sanitized = sanitized.trim();
}
if (options.removeHTML) {
sanitized = sanitizeHTML(sanitized);
}
if (options.escape) {
sanitized = sanitized
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}
return sanitized;
}
class Logger {
constructor(options = {}) {
this.levels = {
error: 0,
warn: 1,
info: 2,
debug: 3
};
this.colors = {
error: '\x1b[31m',
warn: '\x1b[33m',
info: '\x1b[36m',
debug: '\x1b[35m',
reset: '\x1b[0m'
};
this.level = options.level || 'info';
this.enableColors = options.enableColors !== false;
this.enableTimestamp = options.enableTimestamp !== false;
this.logFile = options.logFile || null;
}
shouldLog(level) {
return this.levels[level] <= this.levels[this.level];
}
formatMessage(level, message, data) {
let formatted = '';
if (this.enableTimestamp) {
formatted += `[${new Date().toISOString()}] `;
}
if (this.enableColors) {
formatted += `${this.colors[level]}[${level.toUpperCase()}]${this.colors.reset} `;
}
else {
formatted += `[${level.toUpperCase()}] `;
}
formatted += message;
if (data !== undefined) {
formatted += ' ' + (typeof data === 'object' ? JSON.stringify(data, null, 2) : data);
}
return formatted;
}
writeToFile(message) {
if (this.logFile) {
const fs = require('fs');
const timestamp = new Date().toISOString();
const logEntry = `${timestamp} ${message}\n`;
try {
fs.appendFileSync(this.logFile, logEntry);
}
catch (error) {
console.error('Log dosyasına yazılamadı:', error.message);
}
}
}
log(level, message, data) {
if (!this.shouldLog(level))
return;
const formatted = this.formatMessage(level, message, data);
if (level === 'error') {
console.error(formatted);
}
else if (level === 'warn') {
console.warn(formatted);
}
else {
console.log(formatted);
}
this.writeToFile(formatted);
}
error(message, data) { this.log('error', message, data); }
warn(message, data) { this.log('warn', message, data); }
info(message, data) { this.log('info', message, data); }
debug(message, data) { this.log('debug', message, data); }
setLevel(level) {
if (this.levels.hasOwnProperty(level)) {
this.level = level;
}
else {
throw new Error(`Geçersiz log seviyesi: ${level}`);
}
}
getLevel() { return this.level; }
}
exports.Logger = Logger;
function createLogger(options = {}) {
return new Logger(options);
}
const defaultLogger = new Logger();
function logInfo(message, data) { defaultLogger.info(message, data); }
function logError(message, data) { defaultLogger.error(message, data); }
function logWarn(message, data) { defaultLogger.warn(message, data); }
function logDebug(message, data) { defaultLogger.debug(message, data); }
// Grouped exports
exports.http_module = {
fetchData,
postData,
};
exports.date_module = {
formatDate,
dateDifference,
addDays,
subtractDays,
};
exports.random_module = {
makeUniqueId,
randomArray,
randomText,
randomNumber,
randomEmoji,
randomHex,
randomFloat,
};
exports.string_module = {
titleCase,
generateRandomString,
generateSlug,
wordCount,
};
exports.array_module = {
shuffleArray,
flattenArray,
removeFalsyValues,
groupBy,
pluck,
sortBy,
};
exports.object_module = {
filterObjectByKey,
deepMerge,
};
exports.crypto_module = {
encryptText,
decryptText,
hashPassword,
verifyPassword,
generateJWT,
verifyJWT,
generateSalt,
validateUUID,
isPasswordStrong,
};
exports.math_module = {
mean,
median,
variance,
standardDeviation,
sum,
max,
min,
range,
isPrime,
combination,
permutation,
};
exports.validation_module = {
isEmail,
isPhone,
isURL,
sanitizeHTML,
validateCreditCard,
validateSchema,
sanitizeInput,
};
exports.logger_module = {
createLogger,
Logger,
info: logInfo,
error: logError,
warn: logWarn,
debug: logDebug,
};
exports.security_module = {
...security
};
exports.worker_module = {
...worker
};
exports.toon_module = {
stringify: toon.stringify,
parse: toon.parse
};
exports.ai_module = {
...ai
};