tspace-mysql
Version:
Tspace MySQL is a promise-based ORM for Node.js, designed with modern TypeScript and providing type safety for schema databases.
266 lines • 8.86 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.utils = void 0;
const typeOf = (data) => Object.prototype.toString.apply(data).slice(8, -1).toLocaleLowerCase();
const isDate = (data) => {
if (typeOf(data) === 'date')
return true;
return false;
};
const timestamp = (dateString) => {
const d = dateString == null ? new Date() : new Date(dateString);
const year = d.getFullYear();
const month = `0${(d.getMonth() + 1)}`.slice(-2);
const date = `0${(d.getDate())}`.slice(-2);
const hours = `0${(d.getHours())}`.slice(-2);
const minutes = `0${(d.getMinutes())}`.slice(-2);
const seconds = `0${(d.getSeconds())}`.slice(-2);
const ymd = `${[
year,
month,
date
].join('-')}`;
const his = `${[
hours,
minutes,
seconds
].join(':')}`;
return `${ymd} ${his}`;
};
const date = (value) => {
const d = value == null ? new Date() : new Date(value);
const year = d.getFullYear();
const month = `0${(d.getMonth() + 1)}`.slice(-2);
const date = `0${(d.getDate())}`.slice(-2);
const now = `${year}-${month}-${date}`;
return now;
};
const escape = (str, hard = false) => {
if (typeof str !== 'string')
return str;
if (str.includes('$RAW:') && !hard)
return str;
return str.replace(/[\0\b\t\n\r\x1a\'\\]/g, "\\'");
};
const escapeActions = (str) => {
if (typeof str !== 'string')
return str;
return str.replace(/[\0\b\r\x1a\'\\]/g, "\\'");
};
const escapeXSS = (str) => {
if (typeof str !== 'string')
return str;
return str
.replace(/[;\\]/gi, '')
.replace(/on\w+="[^"]+"/gi, '')
.replace(/\s+(onerror|onload)\s*=/gi, '')
.replace(/\s+alert*/gi, '')
.replace(/\([^)]*\) *=>/g, '')
.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '');
};
const columnRelation = (name) => {
var _a;
const matches = (_a = name === null || name === void 0 ? void 0 : name.match(/[A-Z]/g)) !== null && _a !== void 0 ? _a : [];
if (matches.length < 1)
return `${name.toLocaleLowerCase()}`;
return name.replace(matches[0], `_${matches[0].toUpperCase()}`);
};
const generateUUID = () => {
const date = +new Date();
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
let r = Math.random() * 16;
r = (date + r) % 16 | 0;
return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
});
};
const covertBooleanToNumber = (data) => {
if (typeOf(data) === 'boolean')
return +data;
return data;
};
const covertDateToDateString = (data) => {
if (typeOf(data) === 'date') {
return timestamp(data);
}
if (typeOf(data) === 'object') {
for (const key in data) {
const d = data[key];
if (!(typeOf(d) === 'date'))
continue;
data[key] = timestamp(d);
}
}
return data;
};
const snakeCase = (data) => {
try {
if (typeof (data) !== "object")
return data;
if (typeof data === 'string') {
return String(data).replace(/([A-Z])/g, (str) => `_${str.toLocaleLowerCase()}`);
}
Object.entries(data).forEach(([oldName, _]) => {
const newName = oldName.replace(/([A-Z])/g, (str) => `_${str.toLocaleLowerCase()}`);
if (newName !== oldName) {
if (data.hasOwnProperty(oldName)) {
data = Object.assign(Object.assign({}, data), { [newName]: data[oldName] });
delete data[oldName];
}
}
if (typeof (data[newName]) === "object")
data[newName] = snakeCase(data[newName]);
});
return data;
}
catch (e) {
return data;
}
};
const camelCase = (data) => {
try {
if (typeof (data) !== "object") {
return data;
}
if (typeof data === 'string') {
return String(data).replace(/(.(_|-|\s)+.)/g, (str) => str[0] + (str[str.length - 1].toUpperCase()));
}
Object.entries(data).forEach(([oldName]) => {
const newName = oldName.replace(/(.(_|-|\s)+.)/g, (str) => str[0] + (str[str.length - 1].toUpperCase()));
if (newName !== oldName) {
if (data.hasOwnProperty(oldName)) {
data = Object.assign(Object.assign({}, data), { [newName]: data[oldName] });
delete data[oldName];
}
}
if (typeof (data[newName]) === "object")
data[newName] = camelCase(data[newName]);
});
return data;
}
catch (e) {
return data;
}
};
const consoleDebug = (sql, retry = false) => {
if (typeof sql !== "string" || sql == null)
return;
if (!retry) {
console.log(`\n\x1b[34mQUERY:\x1b[0m \x1b[33m${sql.trim()};\x1b[0m`);
return;
}
console.log(`\n\x1b[31mRETRY QUERY:\x1b[0m \x1b[33m${sql.trim()};\x1b[0m`);
};
const consoleExec = (startTime, endTime) => {
const diffInMilliseconds = endTime - startTime;
const diffInSeconds = diffInMilliseconds / 1000;
console.log(`\x1b[34mDURATION:\x1b[0m \x1b[32m${diffInSeconds} sec\x1b[0m`);
};
const consoleCache = (provider) => {
console.log(`\x1b[34mCACHE:\x1b[0m \x1b[33m${provider}\x1b[0m\n`);
};
const randomString = (length = 100) => {
let str = '';
const salt = 3;
for (let i = 0; i < length / salt; i++) {
str += Math.random().toString(36).substring(salt);
}
return str.toLocaleLowerCase().replace(/'/g, '').slice(-length);
};
const faker = (value) => {
var _a, _b;
value = value.toLocaleLowerCase();
if (!value.search('uuid'))
return generateUUID();
if (!value.search('timestamp'))
return timestamp();
if (!value.search('datetime'))
return timestamp();
if (!value.search('date'))
return date();
if (!value.search('tinyint'))
return [true, false][Math.round(Math.random())];
if (!value.search('boolean'))
return [true, false][Math.round(Math.random())];
if (!value.search('longtext'))
return randomString(500);
if (!value.search('text'))
return randomString(500);
if (!value.search('int'))
return Number(Math.floor((Math.random() * 999) + 1));
if (!value.search('float'))
return Number((Math.random() * 100).toFixed(2));
if (!value.search('double'))
return Number((Math.random() * 100).toFixed(2));
if (!value.search('json')) {
return JSON.stringify({
id: Number(Math.floor(Math.random() * 1000)),
name: randomString(50)
});
}
if (!value.search('varchar')) {
const regex = /\d+/g;
const limit = Number((_b = (_a = value === null || value === void 0 ? void 0 : value.match(regex)) === null || _a === void 0 ? void 0 : _a.pop()) !== null && _b !== void 0 ? _b : 255);
return randomString(limit);
}
return 'fake data';
};
const hookHandle = (hooks, result) => __awaiter(void 0, void 0, void 0, function* () {
for (const hook of hooks)
yield hook(result);
return;
});
const chunkArray = (array, length) => {
const chunks = [];
for (let i = 0; i < array.length; i += length) {
chunks.push(array.slice(i, i + length));
}
return chunks;
};
const wait = (ms) => {
if (ms === 0)
return;
return new Promise(ok => setTimeout(ok, Number.isNaN(ms) ? 0 : ms));
};
const softNumber = (n) => {
const number = Number(n);
if (Number.isNaN(number)) {
return -1;
}
return number;
};
const utils = {
typeOf,
isDate,
consoleDebug,
consoleExec,
consoleCache,
faker,
columnRelation,
timestamp,
date,
escape,
escapeActions,
escapeXSS,
generateUUID,
covertBooleanToNumber,
covertDateToDateString,
snakeCase,
camelCase,
randomString,
hookHandle,
chunkArray,
wait,
softNumber
};
exports.utils = utils;
exports.default = utils;
//# sourceMappingURL=index.js.map