@fastify-core/base 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +3 -1
- package/dist/index.mjs +1 -1
- package/package.json +2 -8
- package/scripts/postinstall.cjs +0 -80
package/dist/index.d.mts
CHANGED
|
@@ -629,7 +629,9 @@ declare class FileUpload {
|
|
|
629
629
|
//#region src/JWTApp.d.ts
|
|
630
630
|
declare class JWTApp {
|
|
631
631
|
static createToken(user: any, req: any): string;
|
|
632
|
-
static verifyToken(req: FastifyRequest
|
|
632
|
+
static verifyToken(req: FastifyRequest & {
|
|
633
|
+
cookies?: Record<string, string | undefined>;
|
|
634
|
+
}, isCookie?: boolean): any;
|
|
633
635
|
static checkSecretKey(key: string): void;
|
|
634
636
|
}
|
|
635
637
|
//#endregion
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import e from"argon2";import{format as t}from"date-fns-tz";import*as n from"decimal.js";import r from"fs";import i from"path";import{format as a,isValid as o,parseISO as s}from"date-fns";import{pipeline as c}from"stream/promises";import l from"jsonwebtoken";var u=class e{md;constructor(e){this.md=e}errors=[];async runValidate(e,t={}){if(Object.entries(t).length===0)return;let n=[];for(let r in t){if(!Object.prototype.hasOwnProperty.call(t,r))continue;let i=t[r],a=e?.id||0,o=e?.[r]??``,s=this?.md?.fieldName(r)??r;n.push({field:r,value:o,rules:i,fieldName:s,id:a})}if(n.length&&(await this.validate(n),this.getErrors().length)){let e=this.getErrors().join(`, `);throw Error(e)}}async validate(e,t=!1){let n=!0;for await(let r of e){let e=r.filed,i=r.id,a=r.fieldName,o=r.value,s=r.rules;s=s.split(`|`);for await(let r of s){let s=r,c=[];if(this.isruleHasArgs(r)?(s=this.getRuleName(r),c=this.getRuleArgs(r)):c=e,!(s in this))throw Error(`Method doesnt exists: `+s);if(!await this[s](o,c,i)&&(this.addError(s,a,o,c),n=!1,t))return!1}}return n}isruleHasArgs(e){return e.split(`(`)[1]!==void 0}getRuleName(e){return e.split(`(`)[0]}getRuleArgs(e){e=e.trim();let t=e.split(`(`)[1];return t=t.endsWith(`)`)?t.slice(0,-1):t,t.split(`,`)}addError(t,n,r,i=[]){if(t){let a=e.defaultMessages(t);a?a.trim()!==``&&(r=typeof r==`string`?r:``,a=a.replace(`{placeholder}`,n),a=a.replace(`{value}`,r),i=typeof i==`string`?[i]:i,i.forEach((e,t)=>{a=a.replace(`{${t}}`,e)}),this.errors.push(a)):this.errors.push(`The value you entered for `+n+` is invalid`)}}passes(){return this.errors.length===0}getErrors(){return this.errors}clearErrors(){this.errors=[]}required(e){return e==null?!1:typeof e!=`string`||e.trim()!==``}requiredId(e){if(e==null)return!1;if(typeof e==`string`){if(e.trim()===``)return!1}else if(typeof e==`number`&&e===0)return!1;return!0}minLen(e,t){return e.length>=parseInt(t[0])}equalLen(e,t){return e.length===parseInt(t[0])}maxLen(e,t){return e.length<=parseInt(t[0])}rangeNum(e,t){return e>=parseInt(t[0])&&e<=parseInt(t[1])}max(e,t){return e<=Number(t[0])}min(e,t){return e>=Number(t[0])}integer(e){return!Number.isNaN(parseInt(e))}inArray(e,t){if(typeof e==`object`){for(let n in e)if(!(n in t))return!1;return!0}return e in t}inArrayNumber(e,t){let n=t.map(Number);return typeof e==`object`?e.every(e=>n.includes(e)):n.includes(e)}alphaNum(e){return!e||/^[a-z0-9]+$/i.test(e)}number(e){if(typeof e==`number`&&(e>2**53-1||e<-(2**53-1)))throw Error(`INVALID_SAFE_NUMBER`);return typeof e==`number`}alphaNumWithSpaces(e){return!e||/^[a-z0-9 ]+$/i.test(e)}password(e){return!e||/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#!%^&*])[0-9a-zA-Z@#!%^&*.]{8,32}/.test(e)}phoneVn(e){return!e||/^[03|05|07|08|09]{2}[0-9]{8}/.test(e)}equals(e,t){return e===t[0]}notEqual(e,t){return e!==t[0]}email(e){return!e||/^([A-Za-z0-9_.-])+@([A-Za-z0-9_.-]+)\.([A-Za-z]{2,4})$/.test(e)}async unique(e,t,n){try{if(!this.md)throw Error(`invalid_md`);let r=`SELECT id FROM \`${t[0].trim()}\` WHERE \`${t[1].trim()}\` = ?`,i=[e];this.md.isDeleted&&(r+=` AND isDeleted = 0`),n&&(r+=` AND id != ?`,i.push(n));let[a]=await this.md.query(r,i);return a.length===0}catch(e){return console.log(e),!1}}static defaultMessages(e){return{required:`{placeholder} không thể trống`,requiredId:`{placeholder} không hợp lệ`,minLen:`{placeholder} không thể nhỏ hơn {0} ký tự`,equalLen:`{placeholder} phải có {0} ký tự`,phoneVn:`{placeholder} không phải thuê bao Việt Nam`,findOne:`{placeholder} không tồn tại`,maxLen:`{placeholder} không thể lớn hơn {0} ký tự`,min:`{placeholder} không thể nhỏ hơn {0}`,max:`{placeholder} không thể lớn hơn {0}`,rangeNum:`{placeholder} phải nằm trong khoản từ {0} đến {1}`,integer:`{placeholder} phải là số`,number:`{placeholder} không đúng định dạng`,inArray:`{placeholder} không hợp lệ`,inArrayNumber:`{placeholder} không hợp lệ`,alphaNum:`Chỉ cho phép chữ cái và số cho {placeholder}`,alphaNumWithSpaces:`Chỉ cho phép chữ cái, số và khoảng trắng cho {placeholder}`,password:`Vui lòng nhập mật khẩu dài 8-32 ký tự, có ký tự chữ số, chữ hoa và chữ thường, ký tự @#$!%^&*`,equals:`{placeholder} không đúng`,notEqual:`{placeholder} không thể bằng {0}`,email:`Email không đúng định dạng`,unique:`{placeholder} đã được sử dụng`}[e]??null}},d=class{pool;isDeleted=!1;errors=[];vdObject;modifieds;constructor(e){this.pool=e}fieldName(e){return e}getErrors(){return this.errors}async getConnection(){return await this.pool.getConnection()}async validate(e,t={}){await new u(this).runValidate(e,t)}async query(e,t,n){return n?n.query(e,t):this.pool.query(e,t)}async modifiedSync(e){if(!this.modifieds)return e;for(let t in this.modifieds){let{smodel:n,tkey:r,skey:i,fmap:a}=this.modifieds[t];if(!e[r])continue;let o=await n.findOne({[i]:e[r]});o&&(e[t]=o[a]||``)}return e}buildWhere(e,t){let n={...e};this.isDeleted&&n.isDeleted===void 0?n.isDeleted=0:this.isDeleted||delete n.isDeleted;let r=[],i=e=>e.split(`.`).map(e=>`\`${e}\``).join(`.`),a=e=>typeof e==`boolean`?+!!e:e,o=e=>{let n=[];for(let s in e){let c=e[s];if(s===`$or`&&Array.isArray(c)){let e=c.map(e=>o(e)).filter(Boolean).map(e=>`(${e})`);e.length&&n.push(`(${e.join(` OR `)})`);continue}if(s===`$and`&&Array.isArray(c)){let e=c.map(e=>o(e)).filter(Boolean).map(e=>`(${e})`);e.length&&n.push(`(${e.join(` AND `)})`);continue}let l=t?`${i(t)}.${i(s)}`:i(s);if(c===null){n.push(`${l} IS NULL`);continue}if(typeof c==`object`&&c&&!Array.isArray(c)){let e=[];for(let t in c){let n=c[t];switch(t){case`$in`:n.length?(e.push(`${l} IN (${n.map(()=>`?`).join(`,`)})`),r.push(...n.map(a))):e.push(`1=0`);break;case`$nin`:n.length?(e.push(`${l} NOT IN (${n.map(()=>`?`).join(`,`)})`),r.push(...n.map(a))):e.push(`1=1`);break;case`$ne`:n===null?e.push(`${l} IS NOT NULL`):(e.push(`${l} <> ?`),r.push(a(n)));break;case`$gt`:e.push(`${l} > ?`),r.push(a(n));break;case`$gte`:e.push(`${l} >= ?`),r.push(a(n));break;case`$lt`:e.push(`${l} < ?`),r.push(a(n));break;case`$lte`:e.push(`${l} <= ?`),r.push(a(n));break;case`$between`:if(!Array.isArray(n)||n.length!==2)throw Error(`$between requires [min, max]`);e.push(`${l} BETWEEN ? AND ?`),r.push(a(n[0]),a(n[1]));break;case`$like`:e.push(`${l} LIKE ?`),r.push(`%${n}%`);break;case`$likeIn`:if(!n.length)e.push(`1=0`);else{let t=n.map(()=>`${l} LIKE ?`).join(` OR `);e.push(`(${t})`),r.push(...n.map(e=>`%${e}%`))}break;default:throw Error(`Unsupported operator: ${t}`)}}e.length&&n.push(`(${e.join(` AND `)})`)}else n.push(`${l} = ?`),r.push(a(c))}return n.join(` AND `)};return{sql:o(n)||`1=1`,params:r}}async count(e={}){let t=`SELECT COUNT(*) AS total FROM \`${this.table}\``,n=[],r=this.buildWhere(e);r.sql&&(t+=` WHERE ${r.sql}`,n=r.params);let[i]=await this.query(t,n);return i?.[0]?.total??0}async insert(e,t){let n=Object.keys(e),r=Object.values(e),i=Array(n.length).fill(`?`).join(`, `),a=`INSERT INTO \`${this.table}\` (\`${n.join("`, `")}\`) VALUES (${i})`,[o]=await this.query(a,r,t);return o.insertId}async update(e,t,n){let r=Object.keys(e),i=Object.keys(t);if(r.length===0)return 0;if(i.length===0)throw Error(`Điều kiện lọc (filter) không được rỗng.`);let a=Object.values(e),o=r.map(e=>`\`${e}\`=?`).join(`, `),s=Object.values(t),c=i.map(e=>`\`${e}\`=?`).join(` AND `),l=[...a,...s],u=`UPDATE \`${this.table}\` SET ${o} WHERE ${c}`,[d]=await this.query(u,l,n);return d.affectedRows}async updateAdv(e={},t={},n){try{if(!Object.keys(e).length)return;let r=this.buildWhere(t),i=[],a=[];for(let[t,n]of Object.entries(e))i.push(`\`${t}\` = ?`),a.push(n);let o=`UPDATE \`${this.table}\` SET ${i.join(`, `)}`;r.sql&&(o+=` WHERE ${r.sql}`,a.push(...r.params));let[s]=await this.query(o,a,n);return s.affectedRows}catch(e){throw console.log(e.message),Error(`invalid_update_is_deleted`)}}async save(e,t){try{if(e.id){let n={...e};if(delete n.id,Object.keys(n).length===0)return e;let r={id:e.id};return await this.update(n,r,t),e}{let n=e;return e.id=await this.insert(n,t),e}}catch(e){return console.log(e.message),this.errors.push(e.message),!1}}async vdSave(e,t=!1,n){e=await this.modifiedSync(e),t&&await this.validate(e,t);let r=await this.save(e,n);if(!r){let e=this.getErrors().join(`, `);throw Error(e)}return r}async updateMany(e,t,n){if(e.length)try{let r=Object.keys(e[0]).filter(e=>e!==t),i=e.map(e=>e[t]),a=r.map(n=>`\`${n}\` = CASE \`${t}\` ${e.map(e=>`WHEN ? THEN ?`).join(` `)} ELSE \`${n}\` END`).join(`, `),o=[];r.forEach(n=>{e.forEach(e=>{o.push(e[t]),o.push(e[n])})}),o.push(...i);let s=`UPDATE \`${this.table}\` SET ${a} WHERE \`${t}\` IN (${i.map(()=>`?`).join(`,`)});`;await this.query(s,o,n)}catch(e){throw console.log(e.message),Error(`invalid_update_many`)}}async updateAndCreateMany(e,t,n){if(e.length)try{let r=Object.keys(e[0]),i=r.map(e=>`\`${e}\``),a=e.map(()=>`(${r.map(()=>`?`).join(`,`)})`).join(`,`),o=e.flatMap(e=>r.map(t=>e[t])),s=r.filter(e=>e!==t).map(e=>`\`${e}\` = VALUES(\`${e}\`)`).join(`, `),c=`INSERT INTO \`${this.table}\` (${i.join(`,`)}) VALUES ${a}`;s&&(c+=` ON DUPLICATE KEY UPDATE ${s}`),c+=`;`,await this.query(c,o,n)}catch(e){throw console.log(e.message),Error(`invalid_update_and_create`)}}async find(e={},t=!1,n=!1,r=!1,i=0){let a=`SELECT * FROM \`${this.table}\``,o=[];if(n){let e=Array.isArray(n)?n:[n],t=[];for(let n of e){let e=n.type?n.type.toUpperCase():`LEFT JOIN`;a+=` ${e} \`${n.table}\` ON ${n.on}`,n.fields&&n.fields.length&&t.push(n.fields.map(e=>`\`${n.table}\`.${e} AS ${n.table}_${e}`).join(`, `))}t.length&&(a=a.replace(`SELECT *`,`SELECT \`${this.table}\`.*, ${t.join(`, `)}`))}let s=this.buildWhere(e);if(s.sql&&(a+=` WHERE ${s.sql}`,o=o.concat(s.params)),r&&(Array.isArray(r)&&(r=r.join(`, `)),a=a.replace(`SELECT *`,`SELECT ${r}`)),t){let e=Object.entries(t).map(([e,t])=>`${e} ${t.toUpperCase()}`);e.length&&(a+=` ORDER BY ${e.join(`, `)}`)}i&&(a+=` LIMIT ?`,o.push(i));let[c]=await this.query(a,o);return c}async findOne(e={},t=!1,n=!1,r=!1){let i=await this.find(e,t,n,r,1);return i&&i.length?i[0]:null}async findById(e,t={}){return t.id=e,await this.findOne(t)}async deleteOne(e,t){return await this.deleteMany(e,1,t)}async deleteById(e,t){let n={};return n.id=e,await this.deleteOne(n,t)}async deleteMany(e,t=0,n){let r=this.buildWhere(e);if(!r.sql)throw Error(`deleteMany requires a filter condition`);let i=`DELETE FROM \`${this.table}\` WHERE ${r.sql}`;t&&(i+=` LIMIT `+t);let[a]=await this.query(i,r.params,n);return!!a.affectedRows&&a.affectedRows>0}async isField(e,t=this.table){return(await this.query(`SHOW COLUMNS FROM \`${t}\` LIKE '${e}'`)).length>0}async isFields(e=[]){if(!e.length)return[];let t=(await this.query(`SHOW COLUMNS FROM \`${this.table}\``)).map(e=>e.Field);if(e.filter(e=>!t.includes(e)).length>0)throw Error(`invalid_fields`);return e}async getMapName(e,t,n,r,i=`name`){if(t&&t!==r?.[e]){let r=await n.findOne({[e]:t});return r&&r[i]?r[i]:``}return``}async findWithPagination(e={},t=!1,n=!1,r=!1,i=1,a=10){i=Math.max(1,i);let o=(i-1)*a,s=`FROM \`${this.table}\``,c=[],l=`SELECT \`${this.table}\`.*`;if(n){let e=Array.isArray(n)?n:[n],t=[];for(let n of e){let e=n.type?n.type.toUpperCase():`LEFT JOIN`;s+=` ${e} \`${n.table}\` ON ${n.on}`,n.fields?.length&&t.push(n.fields.map(e=>`\`${n.table}\`.${e} AS ${n.table}_${e}`).join(`, `))}t.length&&(l=`SELECT \`${this.table}\`.*, ${t.join(`, `)}`)}let u=this.buildWhere(e);u.sql&&(s+=` WHERE ${u.sql}`,c=c.concat(u.params)),r&&(Array.isArray(r)&&(r=r.join(`, `)),l=`SELECT ${r}`);let d=`SELECT COUNT(*) AS total ${s}`,[f]=await this.query(d,c),p=f?.[0]?.total||0,m=`${l} ${s}`;if(t){let e=Object.entries(t).map(([e,t])=>`${e} ${t.toUpperCase()}`);e.length&&(m+=` ORDER BY ${e.join(`, `)}`)}m+=` LIMIT ? OFFSET ?`;let h=c.concat([a,o]),[g]=await this.query(m,h);return{page:i,length:a,pageTotal:Math.ceil(p/a),recordTotal:p,items:g||[]}}};async function f(t){return await e.hash(t)}async function p(t,n){return await e.verify(n,t)}function m(e,t=!1){let n=``,r=`0123456789`;r=t?`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz`+r:r;for(let t=0;t<e;t++)n+=r.charAt(Math.floor(Math.random()*r.length));return n}function h(e){return e?String(e).normalize(`NFD`).replace(/[\u0300-\u036f]/g,``).replace(/đ/g,`d`).replace(/Đ/g,`D`).toLowerCase():``}function g(e){return e.toString().toLowerCase().normalize(`NFD`).replace(/[\u0300-\u036f]/g,``).replace(/[^a-z0-9\s-]/g,``).trim().replace(/\s+/g,`-`).replace(/-+/g,`-`)}async function _(e,t={},n=`POST`,r=`application/json`,i={}){let a={method:n,headers:{"Content-Type":r,...i}};return n===`POST`&&(a.body=JSON.stringify(t)),await(await fetch(e,a)).json()}function v(e=``){return e?e.toLowerCase().replace(/[^a-z0-9\s]/g,``).split(/\s+/).filter((e,t,n)=>e.length>2&&n.indexOf(e)===t).join(`, `):``}function y(e){let t=e instanceof Date?e:new Date(e);if(isNaN(t.getTime()))throw Error(`Ngày không hợp lệ: `+e);return t}function b(e,t=`YYYY-MM-DD HH:mm:ss`){if(!e)return``;let n=typeof e==`string`?new Date(e):e;if(isNaN(n.getTime()))return``;let r=e=>e.toString().padStart(2,`0`),i={YYYY:n.getFullYear().toString(),MM:r(n.getMonth()+1),DD:r(n.getDate()),HH:r(n.getHours()),mm:r(n.getMinutes()),ss:r(n.getSeconds())};return t.replace(/YYYY|MM|DD|HH|mm|ss/g,e=>i[e])}function x(e,t){return{start:new Date(e,t-1,1),end:new Date(e,t,0,23,59,59,999)}}function S(e,t){let n=new Date(e,t,0).getDate();return Array.from({length:n},(e,t)=>t+1)}function C(){return t(new Date,`yyyy-MM-dd HH:mm:ss`,{timeZone:`Asia/Ho_Chi_Minh`})}function w(e,t,n=``){return e?.[t]===void 0?n:e[t]}function T(e,t){return e?.reduce((e,n)=>e+(n[t]??0),0)||0}function E(e){let t=[{value:1e3,numeral:`M`},{value:900,numeral:`CM`},{value:500,numeral:`D`},{value:400,numeral:`CD`},{value:100,numeral:`C`},{value:90,numeral:`XC`},{value:50,numeral:`L`},{value:40,numeral:`XL`},{value:10,numeral:`X`},{value:9,numeral:`IX`},{value:5,numeral:`V`},{value:4,numeral:`IV`},{value:1,numeral:`I`}],n=``;for(let{value:r,numeral:i}of t)for(;e>=r;)n+=i,e-=r;return n}function D(e,t=!1){let n=[{id:1,name:`Hoạt động`,color:`success`},{id:0,name:`Khóa`,color:`danger`}];if(e===!1)return n;let r=n.find(t=>t.id===e);return r?t?`<span class="badge badge-sm bg-gradient-${r.color}">${r.name}</span>`:r.name:``}function O(e,t=!1){let n=[{id:1,name:`Xuất bản`,color:`success`},{id:0,name:`Nháp`,color:`danger`}];if(e===!1)return n;let r=n.find(t=>t.id===e);return r?t?`<span class="badge badge-sm bg-gradient-${r.color}">${r.name}</span>`:r.name:``}function k(e,t=!1){let n=[{id:1,name:`Có`,color:`success`},{id:0,name:`Không`,color:`secondary`}];if(e===!1)return n;let r=n.find(t=>t.id===e);return r?t?`<span class="badge badge-sm bg-gradient-${r.color}">${r.name}</span>`:r.name:``}function A(e,t){let n=new Set(e),r=new Set(t);return[...e.filter(e=>!r.has(e)),...t.filter(e=>!n.has(e))]}function j(e,t){let n=new Set(t);return e.every(e=>n.has(e))}function M(e,t){if(!Array.isArray(e)||!Array.isArray(t))return[];let n=new Set(t);return e.filter(e=>!n.has(e))}function N(e,t){if(!Array.isArray(e)||e.length===0)return[];if(!t)return e;let n=Array(e.length);for(let r=0;r<e.length;r++){let i=e[r];n[r]=i&&typeof i==`object`?i[t]:void 0}return n}function P(e,t,n){return e.reduce((e,r)=>{let i=!0;if(n&&(i=Object.entries(n).every(([e,t])=>r[e]===t)),i){let n=r[t];return e+(typeof n==`number`?n:0)}return e},0)}function F(e){let t=String(e).replace(/[^\d.]/g,``);return t?new n.Decimal(t):new n.Decimal(0)}function I(e,t={}){if(Array.isArray(e)||typeof e==`object`&&e)return e;if(typeof e==`number`)return t;if(typeof e==`string`)try{let n=JSON.parse(e);return Array.isArray(n)||typeof n==`object`&&n?n:t}catch(e){return console.log(e),t}return t}function L(e=!1){let t=[{id:1,name:`Tiếng Việt`}];return e===!1?t:t.filter(t=>e.includes(t.id))}const R=new Set([`POST`,`PUT`,`PATCH`,`DELETE`]);function z(e){return R.has(String(e).toUpperCase())}function B(e){let t=e?.headers?.[`x-csrf-token`]||e?.headers?.[`X-CSRF-Token`],n=e?.body?.csrfToken||e?.body?.csrf_token;return t||n||``}function V(e,t,n={}){if(!z(e?.method||`GET`))return{allowed:!0,reason:null};let r=t?.csrfToken||n.expectedToken||``,i=B(e);return!r||!i||r!==i?{allowed:!1,reason:`missing_csrf_token`}:{allowed:!0,reason:null}}var H=class e{files;uploadType=`static`;constructor(e,t=`static`){this.files=e,this.uploadType=t}async copyFiles(t){if(t.length){let n=e.getUploadDir(this.uploadType);for await(let e of t){let t=i.join(n,e.src);if(r.existsSync(t)){let a=i.join(n,e.dist);await r.promises.copyFile(t,a)}}}}async uploadFile(e=`filedname`,t=``){try{let n=this.files[e];return!n||!n[0]?!1:await this.upload(n[0],t)}catch(e){throw Error(e)}}async uploadFiles(e=`filedname`,t=``){try{let n=[],r=this.files[e];if(!r||!r.length)return[];for await(let e of r){let r=await this.upload(e,t);r&&n.push(r)}return n}catch(e){throw Error(e)}}async upload(t,n=``){try{let a=Date.now()+`___`+t.filename,o=e.getUploadDir(this.uploadType),s=n?i.join(o,n):o;r.existsSync(s)||r.mkdirSync(s,{recursive:!0});let c=i.join(s,a);return r.existsSync(t.path)?(await r.promises.rename(t.path,c),n?i.posix.join(n,a):a):!1}catch(e){throw Error(e)}}async checkFile(t=`file`,n=`OfficeFile`){try{let r=this.files[t];if(!r)return;for await(let t of r){let r=`check`+n;if(!(r in e))throw Error(`Method does not exist: `+r);e[r](t.filename,t.mimetype);return}return}catch(e){throw Error(e)}}static removeFiles=(e,t=`static`)=>{if(e===!1||!Array.isArray(e))return!1;for(let n of e)this.removeFile(n,t);return!0};static removeFile=(t,n=`static`)=>{if(!t)return!1;let a=i.join(e.getUploadDir(n),t);return r.existsSync(a)&&r.unlinkSync(a),!0};static renameFile=e=>{let t=i.extname(e);return`${i.basename(e,t)}_${Date.now()}${t}`};static getUploadDir(e=`static`){return e==`static`?i.join(i.resolve(),`public`,`static`):e==`public`?i.join(i.resolve(),`public`):e==`uploads`?i.join(i.resolve(),`uploads`):``}static checkDefFile(e,t,n=!0){if(!/(.*)\.(png|jpeg|jpg|ico|pdf|xls|xlsx|doc|docx|ppt|pptx)$/i.test(e)){if(n)throw Error(`Định dạng tập tin ${e} không được phép`);return!1}if(![`image/x-icon`,`image/jpeg`,`image/png`,`image/jpg`,`application/pdf`,`application/msword`,`application/vnd.ms-excel`,`application/vnd.ms-powerpoint`,`application/vnd.openxmlformats-officedocument.presentationml.presentation`,`application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`,`application/vnd.openxmlformats-officedocument.wordprocessingml.document`].includes(t)){if(n)throw Error(`Định dạng tập tin ${e} không được phép`);return!1}return!0}static checkOfficeFile(e,t){try{if(!/(.*)\.(pdf|xls|xlsx|doc|docx|ppt|pptx)$/i.test(e)||![`application/pdf`,`application/msword`,`application/vnd.ms-excel`,`application/vnd.ms-powerpoint`,`application/vnd.openxmlformats-officedocument.presentationml.presentation`,`application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`,`application/vnd.openxmlformats-officedocument.wordprocessingml.document`].includes(t))throw Error(`Tập tin ${e} không đúng định dạng (.pdf,.xls,.xlsx,.doc,.docx,.ppt,.pptx)`)}catch(e){throw Error(e)}}static checkImgFile(e,t){try{if(!/(.*)\.(png|jpeg|jpg|ico)$/i.test(e)||![`image/jpeg`,`image/png`,`image/jpg`,`image/x-icon`].includes(t))throw Error(`Ảnh ${e} không đúng định dạng (.png,.jpeg,.jpg,.ico)`)}catch(e){throw Error(e)}}static checkVideoFile(e,t){try{if(!/(.*)\.(mp4|mkv|webm|mov|avi)$/i.test(e)||![`video/mp4`,`video/mkv`,`video/webm`,`video/mov`,`video/avi`].includes(t))throw Error(`Video ${e} không đúng định dạng (.mp4,.mkv,.webm,.mov,.avi)`)}catch(e){throw Error(e)}}},U=class e{req;body={};files={};constructor(e){this.req=e}start=async()=>{if(this.req.body)this.body=this.req.body;else if(this.req.isMultipart()){let e=i.join(i.resolve(),`uploads`,`tmb`);r.existsSync(e)||r.mkdirSync(e,{recursive:!0});for await(let t of this.req.parts())if(t.type===`field`)this.body[t.fieldname]===void 0?this.body[t.fieldname]=t.value:Array.isArray(this.body[t.fieldname])?this.body[t.fieldname].push(t.value):this.body[t.fieldname]=[this.body[t.fieldname],t.value];else if(H.checkDefFile(t.filename,t.mimetype,!1)){let n=i.extname(t.filename),a=g(i.basename(t.filename,n)),o=a+n,s=i.join(e,o);try{await c(t.file,r.createWriteStream(s))}catch(e){e.code===`ABORT_ERR`?console.error(`Người dùng hủy upload.`):e.code===`ERR_STREAM_PREMATURE_CLOSE`?console.error(`Stream đóng sớm bất thường.`):console.error(`Lỗi upload:`,e.message)}this.files[t.fieldname]===void 0&&(this.files[t.fieldname]=[]),this.files[t.fieldname].push({filename:o,basename:a,path:s,mimetype:t.mimetype,ext:n})}}};end=async()=>{let e=Object.values(this.files);for await(let t of e)for await(let e of t)r.existsSync(e.path)&&r.unlinkSync(e.path)};isPost(){return this.req.method===`POST`}isGet(){return this.req.method===`GET`}isAjax(){return this.req.headers[`x-requested-with`]===`XMLHttpRequest`}getPost(t=``,n=``,r=`stripTags`){if(t===``)return this.body;if(!this.hasPost(t))return n;let i=this.body[t];return i?.value!==void 0&&(i=i.value),e.filterSafeData(i,r,n)}getLangPost(t,n=``,r=`stripTags`){if(!t)return n;let i=t.match(/^([^{]+)\{([^}]+)\}$/);if(!i)return n;let a=i[1],o=i[2],s=this.body?.[a];typeof s==`string`&&(s=I(s));let c=s?.[o];return e.filterSafeData(c,r,n)}getParam(t,n=null,r=`stripTags`){let i=this.req.params;return!i||!i[t]?n:e.filterSafeData(i[t],r)}get(t=``,n=``,r=`stripTags`){let i=this.req.query;return t===``?i:this.has(t)?e.filterSafeData(i[t],r):n}has(e){let t=this.req.query;return Array.isArray(e)?e.every(e=>t[e]!==void 0):t[e]!==void 0}hasPost(e){return Array.isArray(e)?e.every(e=>this.body[e]!==void 0):this.body[e]!==void 0}getHeader(e){return this.req.headers[e.toLowerCase()]?.toString()||``}static filterSafeData(t,n=`stripTags`,r=``){if(typeof t==`number`)return t;if(n===`ids`)return Array.isArray(t)?e.filterIds(t):e.filterIds([t]);if(n===`stringIds`)return Array.isArray(t)?e.filterStringIds(t):e.filterStringIds([t]);if(n===`strings`)return Array.isArray(t)?e.filterStrings(t):e.filterStrings([t]);if(n===`dQuoteIds`)return Array.isArray(t)?e.filterDQuoteIds(t):e.filterDQuoteIds([t]);if(n===`int`||n===`number`){let e=Number(t);if(e>2**53-1)throw Error(`invalid_max_safe_integer`);if(e<-(2**53-1))throw Error(`invalid_min_safe_integer`);return Number.isNaN(e)?r:n===`int`?Math.trunc(e):e}if(n===`decimal`)return F(t);if(typeof t==`string`){if(n===`stripTags`)return t.replace(/<[^>]*>?/gm,``).trim();if(n===`html`)return e.filterHtml(t);if(n===`date`||n===`datetime`){let e=s(t);return o(e)?a(e,n===`date`?`yyyy-MM-dd`:`yyyy-MM-dd HH:mm:ss`):null}}return n===`raw`?e.parseRawInput(t):typeof t===n?t:``}static parseRawInput(e){if(typeof e!=`string`)return e;try{return JSON.parse(e)}catch{return e}}static filterHtml(e){return typeof e==`string`?e.replace(/<(script|style|meta)[^>]*>[\s\S]*?<\/\1>|<(script|style|meta)[^>]*\/?>/gi,``):``}static filterIds(e){if(typeof e==`string`){let t=I(e,void 0);if(Array.isArray(t))e=t;else if(!Number.isNaN(Number(e)))e=[Number(e)];else return[]}return Array.isArray(e)?[...new Set(e.map(e=>Number(e)).filter(e=>!Number.isNaN(e)))]:[]}static filterStringIds(e){return typeof e==`string`&&(e=I(e,[])),Array.isArray(e)?this.filterIds(e).map(e=>e.toString()):[]}static filterStrings(e){return[...new Set(e.map(e=>this.filterSafeData(e,`stripTags`)))]}static filterDQuoteIds(e){return this.filterIds(e).map(e=>`%"${e}"%`)}},W=class{static createToken(e,t){let{JWT_KEY:n,JWT_AUD:r,JWT_ISS:i}=process.env,a=Number(process.env.JWT_TIMEOUT||3600),o=t.ip,s=t.headers[`user-agent`],c=Math.floor(Date.now()/1e3),u={iss:i,aud:r,sub:e.id,name:e.fullname,ip:o,us:s,iat:c,exp:c+a,expired:(c+a)*1e3};return l.sign(u,n||``,{algorithm:`HS256`})}static verifyToken(e,t=!1){let{JWT_KEY:n}=process.env,r;if(t){if(r=e.cookies?.accessToken,!r)throw Error(`invalid_cookie_access_token`)}else{let t=e.headers.authorization;if(!t)throw Error(`missing_authorization`);let[n,i]=t.split(` `);if(n!==`Bearer`||!i)throw Error(`invalid_authorization`);r=i}let i=l.verify(r,n||``,{ignoreExpiration:!0});if(!i?.sub)throw Error(`invalid_userId_access_token`);let a=e.headers[`user-agent`]||`unknown`;if(i.us!==a)throw Error(`invalid_us_access_token`);if(i.ip&&i.ip!==e.ip)throw Error(`invalid_ip_access_token`);return i.accessToken=r,i}static checkSecretKey(e){if(!process.env.JWT_SECRET_KEY)throw Error(`missing_jwt_secret_key`);if(e!=process.env.JWT_SECRET_KEY)throw Error(`invalid_secret_key`)}};let G=null;function K(e,t){return Object.fromEntries(Object.entries(e).map(([e,n])=>[e,new n(t)]))}function q(e,t){return G||=K(e,t),G}function J(){if(!G)throw Error(`Models chưa init`);return G}var Y=class{pool;constructor(e){this.pool=e}async get(e,t){try{let[n]=await this.pool.query(`SELECT data FROM sessions WHERE sid = ?`,[e]);if(!n.length)return t(null,null);t(null,JSON.parse(n[0].data))}catch(e){t(e)}}async set(e,t,n){try{let r=JSON.stringify(t);await this.pool.query(`INSERT INTO sessions (sid, data, expires) VALUES (?, ?, DATE_ADD(NOW(), INTERVAL 14 DAY)) ON DUPLICATE KEY UPDATE data = VALUES(data), expires = VALUES(expires)`,[e,r]),n(null)}catch(e){n(e)}}async destroy(e,t){try{await this.pool.query(`DELETE FROM sessions WHERE sid = ?`,[e]),t(null)}catch(e){t(e)}}},X=class{routes=[];static getMethod(e){return e.method?e.method:`get`}add(e,t=[]){let n=[];t.forEach(t=>{t.link=e+t.link,n.push(t)}),this.routes=this.routes.length?[...this.routes,...n]:n}addGS(e,t,n){let r=[{link:e+`/getList`,module:n,controller:t,action:`index`},{link:e+`/detail/:code([0-9]+)`,module:n,controller:t,action:`detail`},{link:e+`/create`,module:n,controller:t,action:`update`,method:`post`},{link:e+`/edit/:code([0-9]+)`,module:n,controller:t,action:`update`,method:`post`},{link:e+`/copy`,module:n,controller:t,action:`copy`,method:`post`},{link:e+`/import`,module:n,controller:t,action:`import`,method:`post`},{link:e+`/export`,module:n,controller:t,action:`export`},{link:e+`/delete/:code([0-9]+)`,module:n,controller:t,action:`deleteOne`},{link:e+`/delete`,module:n,controller:t,action:`delete`,method:`post`}];this.routes=this.routes.length?[...this.routes,...r]:r}getRouter(){return this.routes}};const Z=new Set([`password`,`token`,`accessToken`,`refreshToken`,`secret`,`apiKey`,`authorization`]);function Q(e,t=``){return e==null||typeof e==`string`||typeof e==`number`||typeof e==`boolean`?e:Array.isArray(e)?e.map(e=>Q(e,t)):typeof e==`object`?Object.entries(e).reduce((e,[t,n])=>{let r=t.toLowerCase();return Z.has(r)||r.includes(`password`)||r.includes(`token`)||r.includes(`secret`)||(e[t]=Q(n,t)),e},{}):e}function $(e,t,n=[]){let r=new Set([...n,`updatedAt`,`createdAt`,`__v`]),i={},a={};return Object.keys(e??{}).forEach(n=>{if(r.has(n))return;let o=t?.[n],s=e?.[n];o!==s&&(i[n]={old:o,new:s}),a[n]=s}),{difference:Q(i),item:Q(a)}}function ee(e,t){return e.length>0?e:!t}export{d as BaseModel,U as FastRequest,H as FileUpload,W as JWTApp,Y as MySQLSessionStore,X as Route,u as Validation,$ as buildAuditLogData,_ as callFetchApi,p as checkPassword,K as createModels,F as decimalNumber,V as ensureCsrfProtection,b as formatDate,v as generateKeywords,D as getActiveStatus,N as getArrColumn,M as getArrOnlyInFirst,ee as getCorsOriginPolicy,B as getCsrfTokenFromRequest,S as getDaysInMonth,A as getDiffArr,L as getLangs,J as getModels,x as getMonthRange,O as getPublishStatus,k as getTrueFlaseStatus,w as getValue,q as initModels,z as isStateChangingMethod,j as isSubArr,f as makePassword,y as parseDate,m as randomText,h as removeVietnameseTones,Q as sanitizeAuditPayload,g as slugify,I as stringToJson,T as sumArrCol,P as sumArrColumn,C as toMySQLDateNowVN,E as toRoman};
|
|
1
|
+
import e from"argon2";import{format as t}from"date-fns-tz";import*as n from"decimal.js";import r from"fs";import i from"path";import{format as a,isValid as o,parseISO as s}from"date-fns";import{pipeline as c}from"stream/promises";import l from"jsonwebtoken";var u=class e{md;constructor(e){this.md=e}errors=[];async runValidate(e,t={}){if(Object.entries(t).length===0)return;let n=[];for(let r in t){if(!Object.prototype.hasOwnProperty.call(t,r))continue;let i=t[r],a=e?.id||0,o=e?.[r]??``,s=this?.md?.fieldName(r)??r;n.push({field:r,value:o,rules:i,fieldName:s,id:a})}if(n.length&&(await this.validate(n),this.getErrors().length)){let e=this.getErrors().join(`, `);throw Error(e)}}async validate(e,t=!1){let n=!0;for await(let r of e){let e=r.filed,i=r.id,a=r.fieldName,o=r.value,s=r.rules;s=s.split(`|`);for await(let r of s){let s=r,c=[];if(this.isruleHasArgs(r)?(s=this.getRuleName(r),c=this.getRuleArgs(r)):c=e,!(s in this))throw Error(`Method doesnt exists: `+s);if(!await this[s](o,c,i)&&(this.addError(s,a,o,c),n=!1,t))return!1}}return n}isruleHasArgs(e){return e.split(`(`)[1]!==void 0}getRuleName(e){return e.split(`(`)[0]}getRuleArgs(e){e=e.trim();let t=e.split(`(`)[1];return t=t.endsWith(`)`)?t.slice(0,-1):t,t.split(`,`)}addError(t,n,r,i=[]){if(t){let a=e.defaultMessages(t);a?a.trim()!==``&&(r=typeof r==`string`?r:``,a=a.replace(`{placeholder}`,n),a=a.replace(`{value}`,r),i=typeof i==`string`?[i]:i,i.forEach((e,t)=>{a=a.replace(`{${t}}`,e)}),this.errors.push(a)):this.errors.push(`The value you entered for `+n+` is invalid`)}}passes(){return this.errors.length===0}getErrors(){return this.errors}clearErrors(){this.errors=[]}required(e){return!(e==null||typeof e==`string`&&e.trim()===``)}requiredId(e){if(e==null)return!1;if(typeof e==`string`){if(e.trim()===``)return!1}else if(typeof e==`number`&&e===0)return!1;return!0}minLen(e,t){return e.length>=parseInt(t[0])}equalLen(e,t){return e.length===parseInt(t[0])}maxLen(e,t){return e.length<=parseInt(t[0])}rangeNum(e,t){return e>=parseInt(t[0])&&e<=parseInt(t[1])}max(e,t){return e<=Number(t[0])}min(e,t){return e>=Number(t[0])}integer(e){return!Number.isNaN(parseInt(e))}inArray(e,t){if(typeof e==`object`){for(let n in e)if(!(n in t))return!1;return!0}return e in t}inArrayNumber(e,t){let n=t.map(Number);return typeof e==`object`?e.every(e=>n.includes(e)):n.includes(e)}alphaNum(e){return!e||/^[a-z0-9]+$/i.test(e)}number(e){if(typeof e==`number`&&(e>2**53-1||e<-(2**53-1)))throw Error(`INVALID_SAFE_NUMBER`);return typeof e==`number`}alphaNumWithSpaces(e){return!e||/^[a-z0-9 ]+$/i.test(e)}password(e){return!e||/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#!%^&*])[0-9a-zA-Z@#!%^&*.]{8,32}/.test(e)}phoneVn(e){return!e||/^[03|05|07|08|09]{2}[0-9]{8}/.test(e)}equals(e,t){return e===t[0]}notEqual(e,t){return e!==t[0]}email(e){return!e||/^([A-Za-z0-9_.-])+@([A-Za-z0-9_.-]+)\.([A-Za-z]{2,4})$/.test(e)}async unique(e,t,n){try{if(!this.md)throw Error(`invalid_md`);let r=`SELECT id FROM \`${t[0].trim()}\` WHERE \`${t[1].trim()}\` = ?`,i=[e];this.md.isDeleted&&(r+=` AND isDeleted = 0`),n&&(r+=` AND id != ?`,i.push(n));let[a]=await this.md.query(r,i);return a.length===0}catch(e){return console.log(e),!1}}static defaultMessages(e){return{required:`{placeholder} không thể trống`,requiredId:`{placeholder} không hợp lệ`,minLen:`{placeholder} không thể nhỏ hơn {0} ký tự`,equalLen:`{placeholder} phải có {0} ký tự`,phoneVn:`{placeholder} không phải thuê bao Việt Nam`,findOne:`{placeholder} không tồn tại`,maxLen:`{placeholder} không thể lớn hơn {0} ký tự`,min:`{placeholder} không thể nhỏ hơn {0}`,max:`{placeholder} không thể lớn hơn {0}`,rangeNum:`{placeholder} phải nằm trong khoản từ {0} đến {1}`,integer:`{placeholder} phải là số`,number:`{placeholder} không đúng định dạng`,inArray:`{placeholder} không hợp lệ`,inArrayNumber:`{placeholder} không hợp lệ`,alphaNum:`Chỉ cho phép chữ cái và số cho {placeholder}`,alphaNumWithSpaces:`Chỉ cho phép chữ cái, số và khoảng trắng cho {placeholder}`,password:`Vui lòng nhập mật khẩu dài 8-32 ký tự, có ký tự chữ số, chữ hoa và chữ thường, ký tự @#$!%^&*`,equals:`{placeholder} không đúng`,notEqual:`{placeholder} không thể bằng {0}`,email:`Email không đúng định dạng`,unique:`{placeholder} đã được sử dụng`}[e]??null}},d=class{pool;isDeleted=!1;errors=[];vdObject;modifieds;constructor(e){this.pool=e}fieldName(e){return e}getErrors(){return this.errors}async getConnection(){return await this.pool.getConnection()}async validate(e,t={}){await new u(this).runValidate(e,t)}async query(e,t,n){return n?n.query(e,t):this.pool.query(e,t)}async modifiedSync(e){if(!this.modifieds)return e;for(let t in this.modifieds){let{smodel:n,tkey:r,skey:i,fmap:a}=this.modifieds[t];if(!e[r])continue;let o=await n.findOne({[i]:e[r]});o&&(e[t]=o[a]||``)}return e}buildWhere(e,t){let n={...e};this.isDeleted&&n.isDeleted===void 0?n.isDeleted=0:this.isDeleted||delete n.isDeleted;let r=[],i=e=>e.split(`.`).map(e=>`\`${e}\``).join(`.`),a=e=>typeof e==`boolean`?+!!e:e,o=e=>{let n=[];for(let s in e){let c=e[s];if(s===`$or`&&Array.isArray(c)){let e=c.map(e=>o(e)).filter(Boolean).map(e=>`(${e})`);e.length&&n.push(`(${e.join(` OR `)})`);continue}if(s===`$and`&&Array.isArray(c)){let e=c.map(e=>o(e)).filter(Boolean).map(e=>`(${e})`);e.length&&n.push(`(${e.join(` AND `)})`);continue}let l=t?`${i(t)}.${i(s)}`:i(s);if(c===null){n.push(`${l} IS NULL`);continue}if(typeof c==`object`&&c&&!Array.isArray(c)){let e=[];for(let t in c){let n=c[t];switch(t){case`$in`:n.length?(e.push(`${l} IN (${n.map(()=>`?`).join(`,`)})`),r.push(...n.map(a))):e.push(`1=0`);break;case`$nin`:n.length?(e.push(`${l} NOT IN (${n.map(()=>`?`).join(`,`)})`),r.push(...n.map(a))):e.push(`1=1`);break;case`$ne`:n===null?e.push(`${l} IS NOT NULL`):(e.push(`${l} <> ?`),r.push(a(n)));break;case`$gt`:e.push(`${l} > ?`),r.push(a(n));break;case`$gte`:e.push(`${l} >= ?`),r.push(a(n));break;case`$lt`:e.push(`${l} < ?`),r.push(a(n));break;case`$lte`:e.push(`${l} <= ?`),r.push(a(n));break;case`$between`:if(!Array.isArray(n)||n.length!==2)throw Error(`$between requires [min, max]`);e.push(`${l} BETWEEN ? AND ?`),r.push(a(n[0]),a(n[1]));break;case`$like`:e.push(`${l} LIKE ?`),r.push(`%${n}%`);break;case`$likeIn`:if(!n.length)e.push(`1=0`);else{let t=n.map(()=>`${l} LIKE ?`).join(` OR `);e.push(`(${t})`),r.push(...n.map(e=>`%${e}%`))}break;default:throw Error(`Unsupported operator: ${t}`)}}e.length&&n.push(`(${e.join(` AND `)})`)}else n.push(`${l} = ?`),r.push(a(c))}return n.join(` AND `)};return{sql:o(n)||`1=1`,params:r}}async count(e={}){let t=`SELECT COUNT(*) AS total FROM \`${this.table}\``,n=[],r=this.buildWhere(e);r.sql&&(t+=` WHERE ${r.sql}`,n=r.params);let[i]=await this.query(t,n);return i?.[0]?.total??0}async insert(e,t){let n=Object.keys(e),r=Object.values(e),i=Array(n.length).fill(`?`).join(`, `),a=`INSERT INTO \`${this.table}\` (\`${n.join("`, `")}\`) VALUES (${i})`,[o]=await this.query(a,r,t);return o.insertId}async update(e,t,n){let r=Object.keys(e),i=Object.keys(t);if(r.length===0)return 0;if(i.length===0)throw Error(`Điều kiện lọc (filter) không được rỗng.`);let a=Object.values(e),o=r.map(e=>`\`${e}\`=?`).join(`, `),s=Object.values(t),c=i.map(e=>`\`${e}\`=?`).join(` AND `),l=[...a,...s],u=`UPDATE \`${this.table}\` SET ${o} WHERE ${c}`,[d]=await this.query(u,l,n);return d.affectedRows}async updateAdv(e={},t={},n){try{if(!Object.keys(e).length)return;let r=this.buildWhere(t),i=[],a=[];for(let[t,n]of Object.entries(e))i.push(`\`${t}\` = ?`),a.push(n);let o=`UPDATE \`${this.table}\` SET ${i.join(`, `)}`;r.sql&&(o+=` WHERE ${r.sql}`,a.push(...r.params));let[s]=await this.query(o,a,n);return s.affectedRows}catch(e){throw console.log(e.message),Error(`invalid_update_is_deleted`)}}async save(e,t){try{if(e.id){let n={...e};if(delete n.id,Object.keys(n).length===0)return e;let r={id:e.id};return await this.update(n,r,t),e}{let n=e;return e.id=await this.insert(n,t),e}}catch(e){return console.log(e.message),this.errors.push(e.message),!1}}async vdSave(e,t=!1,n){e=await this.modifiedSync(e),t&&await this.validate(e,t);let r=await this.save(e,n);if(!r){let e=this.getErrors().join(`, `);throw Error(e)}return r}async updateMany(e,t,n){if(e.length)try{let r=Object.keys(e[0]).filter(e=>e!==t),i=e.map(e=>e[t]),a=r.map(n=>`\`${n}\` = CASE \`${t}\` ${e.map(e=>`WHEN ? THEN ?`).join(` `)} ELSE \`${n}\` END`).join(`, `),o=[];r.forEach(n=>{e.forEach(e=>{o.push(e[t]),o.push(e[n])})}),o.push(...i);let s=`UPDATE \`${this.table}\` SET ${a} WHERE \`${t}\` IN (${i.map(()=>`?`).join(`,`)});`;await this.query(s,o,n)}catch(e){throw console.log(e.message),Error(`invalid_update_many`)}}async updateAndCreateMany(e,t,n){if(e.length)try{let r=Object.keys(e[0]),i=r.map(e=>`\`${e}\``),a=e.map(()=>`(${r.map(()=>`?`).join(`,`)})`).join(`,`),o=e.flatMap(e=>r.map(t=>e[t])),s=r.filter(e=>e!==t).map(e=>`\`${e}\` = VALUES(\`${e}\`)`).join(`, `),c=`INSERT INTO \`${this.table}\` (${i.join(`,`)}) VALUES ${a}`;s&&(c+=` ON DUPLICATE KEY UPDATE ${s}`),c+=`;`,await this.query(c,o,n)}catch(e){throw console.log(e.message),Error(`invalid_update_and_create`)}}async find(e={},t=!1,n=!1,r=!1,i=0){let a=`SELECT * FROM \`${this.table}\``,o=[];if(n){let e=Array.isArray(n)?n:[n],t=[];for(let n of e){let e=n.type?n.type.toUpperCase():`LEFT JOIN`;a+=` ${e} \`${n.table}\` ON ${n.on}`,n.fields&&n.fields.length&&t.push(n.fields.map(e=>`\`${n.table}\`.${e} AS ${n.table}_${e}`).join(`, `))}t.length&&(a=a.replace(`SELECT *`,`SELECT \`${this.table}\`.*, ${t.join(`, `)}`))}let s=this.buildWhere(e);if(s.sql&&(a+=` WHERE ${s.sql}`,o=o.concat(s.params)),r&&(Array.isArray(r)&&(r=r.join(`, `)),a=a.replace(`SELECT *`,`SELECT ${r}`)),t){let e=Object.entries(t).map(([e,t])=>`${e} ${t.toUpperCase()}`);e.length&&(a+=` ORDER BY ${e.join(`, `)}`)}i&&(a+=` LIMIT ?`,o.push(i));let[c]=await this.query(a,o);return c}async findOne(e={},t=!1,n=!1,r=!1){let i=await this.find(e,t,n,r,1);return i&&i.length?i[0]:null}async findById(e,t={}){return t.id=e,await this.findOne(t)}async deleteOne(e,t){return await this.deleteMany(e,1,t)}async deleteById(e,t){let n={};return n.id=e,await this.deleteOne(n,t)}async deleteMany(e,t=0,n){let r=this.buildWhere(e);if(!r.sql)throw Error(`deleteMany requires a filter condition`);let i=`DELETE FROM \`${this.table}\` WHERE ${r.sql}`;t&&(i+=` LIMIT `+t);let[a]=await this.query(i,r.params,n);return!!a.affectedRows&&a.affectedRows>0}async isField(e,t=this.table){return(await this.query(`SHOW COLUMNS FROM \`${t}\` LIKE '${e}'`)).length>0}async isFields(e=[]){if(!e.length)return[];let t=(await this.query(`SHOW COLUMNS FROM \`${this.table}\``)).map(e=>e.Field);if(e.filter(e=>!t.includes(e)).length>0)throw Error(`invalid_fields`);return e}async getMapName(e,t,n,r,i=`name`){if(t&&t!==r?.[e]){let r=await n.findOne({[e]:t});return r&&r[i]?r[i]:``}return``}async findWithPagination(e={},t=!1,n=!1,r=!1,i=1,a=10){i=Math.max(1,i);let o=(i-1)*a,s=`FROM \`${this.table}\``,c=[],l=`SELECT \`${this.table}\`.*`;if(n){let e=Array.isArray(n)?n:[n],t=[];for(let n of e){let e=n.type?n.type.toUpperCase():`LEFT JOIN`;s+=` ${e} \`${n.table}\` ON ${n.on}`,n.fields?.length&&t.push(n.fields.map(e=>`\`${n.table}\`.${e} AS ${n.table}_${e}`).join(`, `))}t.length&&(l=`SELECT \`${this.table}\`.*, ${t.join(`, `)}`)}let u=this.buildWhere(e);u.sql&&(s+=` WHERE ${u.sql}`,c=c.concat(u.params)),r&&(Array.isArray(r)&&(r=r.join(`, `)),l=`SELECT ${r}`);let d=`SELECT COUNT(*) AS total ${s}`,[f]=await this.query(d,c),p=f?.[0]?.total||0,m=`${l} ${s}`;if(t){let e=Object.entries(t).map(([e,t])=>`${e} ${t.toUpperCase()}`);e.length&&(m+=` ORDER BY ${e.join(`, `)}`)}m+=` LIMIT ? OFFSET ?`;let h=c.concat([a,o]),[g]=await this.query(m,h);return{page:i,length:a,pageTotal:Math.ceil(p/a),recordTotal:p,items:g||[]}}};async function f(t){return await e.hash(t)}async function p(t,n){return await e.verify(n,t)}function m(e,t=!1){let n=``,r=`0123456789`;r=t?`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz`+r:r;for(let t=0;t<e;t++)n+=r.charAt(Math.floor(Math.random()*r.length));return n}function h(e){return e?String(e).normalize(`NFD`).replace(/[\u0300-\u036f]/g,``).replace(/đ/g,`d`).replace(/Đ/g,`D`).toLowerCase():``}function g(e){return e.toString().toLowerCase().normalize(`NFD`).replace(/[\u0300-\u036f]/g,``).replace(/[^a-z0-9\s-]/g,``).trim().replace(/\s+/g,`-`).replace(/-+/g,`-`)}async function _(e,t={},n=`POST`,r=`application/json`,i={}){let a={method:n,headers:{"Content-Type":r,...i}};return n===`POST`&&(a.body=JSON.stringify(t)),await(await fetch(e,a)).json()}function v(e=``){return e?e.toLowerCase().replace(/[^a-z0-9\s]/g,``).split(/\s+/).filter((e,t,n)=>e.length>2&&n.indexOf(e)===t).join(`, `):``}function y(e){let t=e instanceof Date?e:new Date(e);if(isNaN(t.getTime()))throw Error(`Ngày không hợp lệ: `+e);return t}function b(e,t=`YYYY-MM-DD HH:mm:ss`){if(!e)return``;let n=typeof e==`string`?new Date(e):e;if(isNaN(n.getTime()))return``;let r=e=>e.toString().padStart(2,`0`),i={YYYY:n.getFullYear().toString(),MM:r(n.getMonth()+1),DD:r(n.getDate()),HH:r(n.getHours()),mm:r(n.getMinutes()),ss:r(n.getSeconds())};return t.replace(/YYYY|MM|DD|HH|mm|ss/g,e=>i[e])}function x(e,t){return{start:new Date(e,t-1,1),end:new Date(e,t,0,23,59,59,999)}}function S(e,t){let n=new Date(e,t,0).getDate();return Array.from({length:n},(e,t)=>t+1)}function C(){return t(new Date,`yyyy-MM-dd HH:mm:ss`,{timeZone:`Asia/Ho_Chi_Minh`})}function w(e,t,n=``){return e?.[t]===void 0?n:e[t]}function T(e,t){return e?.reduce((e,n)=>e+(n[t]??0),0)||0}function E(e){let t=[{value:1e3,numeral:`M`},{value:900,numeral:`CM`},{value:500,numeral:`D`},{value:400,numeral:`CD`},{value:100,numeral:`C`},{value:90,numeral:`XC`},{value:50,numeral:`L`},{value:40,numeral:`XL`},{value:10,numeral:`X`},{value:9,numeral:`IX`},{value:5,numeral:`V`},{value:4,numeral:`IV`},{value:1,numeral:`I`}],n=``;for(let{value:r,numeral:i}of t)for(;e>=r;)n+=i,e-=r;return n}function D(e,t=!1){let n=[{id:1,name:`Hoạt động`,color:`success`},{id:0,name:`Khóa`,color:`danger`}];if(e===!1)return n;let r=n.find(t=>t.id===e);return r?t?`<span class="badge badge-sm bg-gradient-${r.color}">${r.name}</span>`:r.name:``}function O(e,t=!1){let n=[{id:1,name:`Xuất bản`,color:`success`},{id:0,name:`Nháp`,color:`danger`}];if(e===!1)return n;let r=n.find(t=>t.id===e);return r?t?`<span class="badge badge-sm bg-gradient-${r.color}">${r.name}</span>`:r.name:``}function k(e,t=!1){let n=[{id:1,name:`Có`,color:`success`},{id:0,name:`Không`,color:`secondary`}];if(e===!1)return n;let r=n.find(t=>t.id===e);return r?t?`<span class="badge badge-sm bg-gradient-${r.color}">${r.name}</span>`:r.name:``}function A(e,t){let n=new Set(e),r=new Set(t);return[...e.filter(e=>!r.has(e)),...t.filter(e=>!n.has(e))]}function j(e,t){let n=new Set(t);return e.every(e=>n.has(e))}function M(e,t){if(!Array.isArray(e)||!Array.isArray(t))return[];let n=new Set(t);return e.filter(e=>!n.has(e))}function N(e,t){if(!Array.isArray(e)||e.length===0)return[];if(!t)return e;let n=Array(e.length);for(let r=0;r<e.length;r++){let i=e[r];n[r]=i&&typeof i==`object`?i[t]:void 0}return n}function P(e,t,n){return e.reduce((e,r)=>{let i=!0;if(n&&(i=Object.entries(n).every(([e,t])=>r[e]===t)),i){let n=r[t];return e+(typeof n==`number`?n:0)}return e},0)}function F(e){let t=String(e).replace(/[^\d.]/g,``);return t?new n.Decimal(t):new n.Decimal(0)}function I(e,t={}){if(Array.isArray(e)||typeof e==`object`&&e)return e;if(typeof e==`number`)return t;if(typeof e==`string`)try{let n=JSON.parse(e);return Array.isArray(n)||typeof n==`object`&&n?n:t}catch(e){return console.log(e),t}return t}function L(e=!1){let t=[{id:1,name:`Tiếng Việt`}];return e===!1?t:t.filter(t=>e.includes(t.id))}const R=new Set([`POST`,`PUT`,`PATCH`,`DELETE`]);function z(e){return R.has(String(e).toUpperCase())}function B(e){let t=e?.headers?.[`x-csrf-token`]||e?.headers?.[`X-CSRF-Token`],n=e?.body?.csrfToken||e?.body?.csrf_token;return t||n||``}function V(e,t,n={}){if(!z(e?.method||`GET`))return{allowed:!0,reason:null};let r=t?.csrfToken||n.expectedToken||``,i=B(e);return!r||!i||r!==i?{allowed:!1,reason:`missing_csrf_token`}:{allowed:!0,reason:null}}var H=class e{files;uploadType=`static`;constructor(e,t=`static`){this.files=e,this.uploadType=t}async copyFiles(t){if(t.length){let n=e.getUploadDir(this.uploadType);for await(let e of t){let t=i.join(n,e.src);if(r.existsSync(t)){let a=i.join(n,e.dist);await r.promises.copyFile(t,a)}}}}async uploadFile(e=`filedname`,t=``){try{let n=this.files[e];return!n||!n[0]?!1:await this.upload(n[0],t)}catch(e){throw Error(e)}}async uploadFiles(e=`filedname`,t=``){try{let n=[],r=this.files[e];if(!r||!r.length)return[];for await(let e of r){let r=await this.upload(e,t);r&&n.push(r)}return n}catch(e){throw Error(e)}}async upload(t,n=``){try{let a=Date.now()+`___`+t.filename,o=e.getUploadDir(this.uploadType),s=n?i.join(o,n):o;r.existsSync(s)||r.mkdirSync(s,{recursive:!0});let c=i.join(s,a);return r.existsSync(t.path)?(await r.promises.rename(t.path,c),n?i.posix.join(n,a):a):!1}catch(e){throw Error(e)}}async checkFile(t=`file`,n=`OfficeFile`){try{let r=this.files[t];if(!r)return;for await(let t of r){let r=`check`+n;if(!(r in e))throw Error(`Method does not exist: `+r);e[r](t.filename,t.mimetype);return}return}catch(e){throw Error(e)}}static removeFiles=(e,t=`static`)=>{if(e===!1||!Array.isArray(e))return!1;for(let n of e)this.removeFile(n,t);return!0};static removeFile=(t,n=`static`)=>{if(!t)return!1;let a=i.join(e.getUploadDir(n),t);return r.existsSync(a)&&r.unlinkSync(a),!0};static renameFile=e=>{let t=i.extname(e);return`${i.basename(e,t)}_${Date.now()}${t}`};static getUploadDir(e=`static`){return e==`static`?i.join(i.resolve(),`public`,`static`):e==`public`?i.join(i.resolve(),`public`):e==`uploads`?i.join(i.resolve(),`uploads`):``}static checkDefFile(e,t,n=!0){if(!/(.*)\.(png|jpeg|jpg|ico|pdf|xls|xlsx|doc|docx|ppt|pptx)$/i.test(e)){if(n)throw Error(`Định dạng tập tin ${e} không được phép`);return!1}if(![`image/x-icon`,`image/jpeg`,`image/png`,`image/jpg`,`application/pdf`,`application/msword`,`application/vnd.ms-excel`,`application/vnd.ms-powerpoint`,`application/vnd.openxmlformats-officedocument.presentationml.presentation`,`application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`,`application/vnd.openxmlformats-officedocument.wordprocessingml.document`].includes(t)){if(n)throw Error(`Định dạng tập tin ${e} không được phép`);return!1}return!0}static checkOfficeFile(e,t){try{if(!/(.*)\.(pdf|xls|xlsx|doc|docx|ppt|pptx)$/i.test(e)||![`application/pdf`,`application/msword`,`application/vnd.ms-excel`,`application/vnd.ms-powerpoint`,`application/vnd.openxmlformats-officedocument.presentationml.presentation`,`application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`,`application/vnd.openxmlformats-officedocument.wordprocessingml.document`].includes(t))throw Error(`Tập tin ${e} không đúng định dạng (.pdf,.xls,.xlsx,.doc,.docx,.ppt,.pptx)`)}catch(e){throw Error(e)}}static checkImgFile(e,t){try{if(!/(.*)\.(png|jpeg|jpg|ico)$/i.test(e)||![`image/jpeg`,`image/png`,`image/jpg`,`image/x-icon`].includes(t))throw Error(`Ảnh ${e} không đúng định dạng (.png,.jpeg,.jpg,.ico)`)}catch(e){throw Error(e)}}static checkVideoFile(e,t){try{if(!/(.*)\.(mp4|mkv|webm|mov|avi)$/i.test(e)||![`video/mp4`,`video/mkv`,`video/webm`,`video/mov`,`video/avi`].includes(t))throw Error(`Video ${e} không đúng định dạng (.mp4,.mkv,.webm,.mov,.avi)`)}catch(e){throw Error(e)}}},U=class e{req;body={};files={};constructor(e){this.req=e}start=async()=>{if(this.req.body)this.body=this.req.body;else if(this.req.isMultipart()){let e=i.join(i.resolve(),`uploads`,`tmb`);r.existsSync(e)||r.mkdirSync(e,{recursive:!0});for await(let t of this.req.parts())if(t.type===`field`)this.body[t.fieldname]===void 0?this.body[t.fieldname]=t.value:Array.isArray(this.body[t.fieldname])?this.body[t.fieldname].push(t.value):this.body[t.fieldname]=[this.body[t.fieldname],t.value];else if(H.checkDefFile(t.filename,t.mimetype,!1)){let n=i.extname(t.filename),a=g(i.basename(t.filename,n)),o=a+n,s=i.join(e,o);try{await c(t.file,r.createWriteStream(s))}catch(e){e.code===`ABORT_ERR`?console.error(`Người dùng hủy upload.`):e.code===`ERR_STREAM_PREMATURE_CLOSE`?console.error(`Stream đóng sớm bất thường.`):console.error(`Lỗi upload:`,e.message)}this.files[t.fieldname]===void 0&&(this.files[t.fieldname]=[]),this.files[t.fieldname].push({filename:o,basename:a,path:s,mimetype:t.mimetype,ext:n})}}};end=async()=>{let e=Object.values(this.files);for await(let t of e)for await(let e of t)r.existsSync(e.path)&&r.unlinkSync(e.path)};isPost(){return this.req.method===`POST`}isGet(){return this.req.method===`GET`}isAjax(){return this.req.headers[`x-requested-with`]===`XMLHttpRequest`}getPost(t=``,n=``,r=`stripTags`){if(t===``)return this.body;if(!this.hasPost(t))return n;let i=this.body[t];return i?.value!==void 0&&(i=i.value),e.filterSafeData(i,r,n)}getLangPost(t,n=``,r=`stripTags`){if(!t)return n;let i=t.match(/^([^{]+)\{([^}]+)\}$/);if(!i)return n;let a=i[1],o=i[2],s=this.body?.[a];typeof s==`string`&&(s=I(s));let c=s?.[o];return e.filterSafeData(c,r,n)}getParam(t,n=null,r=`stripTags`){let i=this.req.params;return!i||!i[t]?n:e.filterSafeData(i[t],r)}get(t=``,n=``,r=`stripTags`){let i=this.req.query;return t===``?i:this.has(t)?e.filterSafeData(i[t],r):n}has(e){let t=this.req.query;return Array.isArray(e)?e.every(e=>t[e]!==void 0):t[e]!==void 0}hasPost(e){return Array.isArray(e)?e.every(e=>this.body[e]!==void 0):this.body[e]!==void 0}getHeader(e){return this.req.headers[e.toLowerCase()]?.toString()||``}static filterSafeData(t,n=`stripTags`,r=``){if(typeof t==`number`)return t;if(n===`ids`)return Array.isArray(t)?e.filterIds(t):e.filterIds([t]);if(n===`stringIds`)return Array.isArray(t)?e.filterStringIds(t):e.filterStringIds([t]);if(n===`strings`)return Array.isArray(t)?e.filterStrings(t):e.filterStrings([t]);if(n===`dQuoteIds`)return Array.isArray(t)?e.filterDQuoteIds(t):e.filterDQuoteIds([t]);if(n===`int`||n===`number`){let e=Number(t);if(e>2**53-1)throw Error(`invalid_max_safe_integer`);if(e<-(2**53-1))throw Error(`invalid_min_safe_integer`);return Number.isNaN(e)?r:n===`int`?Math.trunc(e):e}if(n===`decimal`)return F(t);if(typeof t==`string`){if(n===`stripTags`)return t.replace(/<[^>]*>?/gm,``).trim();if(n===`html`)return e.filterHtml(t);if(n===`date`||n===`datetime`){let e=s(t);return o(e)?a(e,n===`date`?`yyyy-MM-dd`:`yyyy-MM-dd HH:mm:ss`):null}}return n===`raw`?e.parseRawInput(t):typeof t===n?t:``}static parseRawInput(e){if(typeof e!=`string`)return e;try{return JSON.parse(e)}catch{return e}}static filterHtml(e){return typeof e==`string`?e.replace(/<(script|style|meta)[^>]*>[\s\S]*?<\/\1>|<(script|style|meta)[^>]*\/?>/gi,``):``}static filterIds(e){if(typeof e==`string`){let t=I(e,void 0);if(Array.isArray(t))e=t;else if(!Number.isNaN(Number(e)))e=[Number(e)];else return[]}return Array.isArray(e)?[...new Set(e.map(e=>Number(e)).filter(e=>!Number.isNaN(e)))]:[]}static filterStringIds(e){return typeof e==`string`&&(e=I(e,[])),Array.isArray(e)?this.filterIds(e).map(e=>e.toString()):[]}static filterStrings(e){return[...new Set(e.map(e=>this.filterSafeData(e,`stripTags`)))]}static filterDQuoteIds(e){return this.filterIds(e).map(e=>`%"${e}"%`)}},W=class{static createToken(e,t){let{JWT_KEY:n,JWT_AUD:r,JWT_ISS:i}=process.env,a=Number(process.env.JWT_TIMEOUT||3600),o=t.ip,s=t.headers[`user-agent`],c=Math.floor(Date.now()/1e3),u={iss:i,aud:r,sub:e.id,name:e.fullname,ip:o,us:s,iat:c,exp:c+a,expired:(c+a)*1e3};return l.sign(u,n||``,{algorithm:`HS256`})}static verifyToken(e,t=!1){let{JWT_KEY:n}=process.env,r;if(t){if(r=e.cookies?.accessToken,!r)throw Error(`invalid_cookie_access_token`)}else{let t=e.headers.authorization;if(!t)throw Error(`missing_authorization`);let[n,i]=t.split(` `);if(n!==`Bearer`||!i)throw Error(`invalid_authorization`);r=i}let i=l.verify(r,n||``,{ignoreExpiration:!0});if(!i?.sub)throw Error(`invalid_userId_access_token`);let a=e.headers[`user-agent`]||`unknown`;if(i.us!==a)throw Error(`invalid_us_access_token`);if(i.ip&&i.ip!==e.ip)throw Error(`invalid_ip_access_token`);return i.accessToken=r,i}static checkSecretKey(e){if(!process.env.JWT_SECRET_KEY)throw Error(`missing_jwt_secret_key`);if(e!=process.env.JWT_SECRET_KEY)throw Error(`invalid_secret_key`)}};let G=null;function K(e,t){return Object.fromEntries(Object.entries(e).map(([e,n])=>[e,new n(t)]))}function q(e,t){return G||=K(e,t),G}function J(){if(!G)throw Error(`Models chưa init`);return G}var Y=class{pool;constructor(e){this.pool=e}async get(e,t){try{let[n]=await this.pool.query(`SELECT data FROM sessions WHERE sid = ?`,[e]);if(!n.length)return t(null,null);t(null,JSON.parse(n[0].data))}catch(e){t(e)}}async set(e,t,n){try{let r=JSON.stringify(t);await this.pool.query(`INSERT INTO sessions (sid, data, expires) VALUES (?, ?, DATE_ADD(NOW(), INTERVAL 14 DAY)) ON DUPLICATE KEY UPDATE data = VALUES(data), expires = VALUES(expires)`,[e,r]),n(null)}catch(e){n(e)}}async destroy(e,t){try{await this.pool.query(`DELETE FROM sessions WHERE sid = ?`,[e]),t(null)}catch(e){t(e)}}},X=class{routes=[];static getMethod(e){return e.method?e.method:`get`}add(e,t=[]){let n=[];t.forEach(t=>{t.link=e+t.link,n.push(t)}),this.routes=this.routes.length?[...this.routes,...n]:n}addGS(e,t,n){let r=[{link:e+`/getList`,module:n,controller:t,action:`index`},{link:e+`/detail/:code([0-9]+)`,module:n,controller:t,action:`detail`},{link:e+`/create`,module:n,controller:t,action:`update`,method:`post`},{link:e+`/edit/:code([0-9]+)`,module:n,controller:t,action:`update`,method:`post`},{link:e+`/copy`,module:n,controller:t,action:`copy`,method:`post`},{link:e+`/import`,module:n,controller:t,action:`import`,method:`post`},{link:e+`/export`,module:n,controller:t,action:`export`},{link:e+`/delete/:code([0-9]+)`,module:n,controller:t,action:`deleteOne`},{link:e+`/delete`,module:n,controller:t,action:`delete`,method:`post`}];this.routes=this.routes.length?[...this.routes,...r]:r}getRouter(){return this.routes}};const Z=new Set([`password`,`token`,`accessToken`,`refreshToken`,`secret`,`apiKey`,`authorization`]);function Q(e,t=``){return e==null||typeof e==`string`||typeof e==`number`||typeof e==`boolean`?e:Array.isArray(e)?e.map(e=>Q(e,t)):typeof e==`object`?Object.entries(e).reduce((e,[t,n])=>{let r=t.toLowerCase();return Z.has(r)||r.includes(`password`)||r.includes(`token`)||r.includes(`secret`)||(e[t]=Q(n,t)),e},{}):e}function $(e,t,n=[]){let r=new Set([...n,`updatedAt`,`createdAt`,`__v`]),i={},a={};return Object.keys(e??{}).forEach(n=>{if(r.has(n))return;let o=t?.[n],s=e?.[n];o!==s&&(i[n]={old:o,new:s}),a[n]=s}),{difference:Q(i),item:Q(a)}}function ee(e,t){return e.length>0?e:!t}export{d as BaseModel,U as FastRequest,H as FileUpload,W as JWTApp,Y as MySQLSessionStore,X as Route,u as Validation,$ as buildAuditLogData,_ as callFetchApi,p as checkPassword,K as createModels,F as decimalNumber,V as ensureCsrfProtection,b as formatDate,v as generateKeywords,D as getActiveStatus,N as getArrColumn,M as getArrOnlyInFirst,ee as getCorsOriginPolicy,B as getCsrfTokenFromRequest,S as getDaysInMonth,A as getDiffArr,L as getLangs,J as getModels,x as getMonthRange,O as getPublishStatus,k as getTrueFlaseStatus,w as getValue,q as initModels,z as isStateChangingMethod,j as isSubArr,f as makePassword,y as parseDate,m as randomText,h as removeVietnameseTones,Q as sanitizeAuditPayload,g as slugify,I as stringToJson,T as sumArrCol,P as sumArrColumn,C as toMySQLDateNowVN,E as toRoman};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fastify-core/base",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.4",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -12,22 +12,18 @@
|
|
|
12
12
|
},
|
|
13
13
|
"files": [
|
|
14
14
|
"dist",
|
|
15
|
-
"scripts/postinstall.cjs",
|
|
16
15
|
"README.md"
|
|
17
16
|
],
|
|
18
17
|
"scripts": {
|
|
19
18
|
"test": "tsc --noEmit && oxlint .",
|
|
20
19
|
"build": "tsdown",
|
|
21
20
|
"pack": "npm run build && npm pack",
|
|
22
|
-
"prepublishOnly": "npm run build"
|
|
23
|
-
"postinstall": "node scripts/postinstall.cjs"
|
|
21
|
+
"prepublishOnly": "npm run build"
|
|
24
22
|
},
|
|
25
23
|
"keywords": [],
|
|
26
24
|
"author": "MIT",
|
|
27
25
|
"license": "ISC",
|
|
28
26
|
"peerDependencies": {
|
|
29
|
-
"@fastify/cookie": "^11.1.2",
|
|
30
|
-
"@fastify/mysql": "^5.0.2",
|
|
31
27
|
"@fastify/session": "^11.1.2",
|
|
32
28
|
"argon2": "^0.45.0",
|
|
33
29
|
"date-fns": "^4.4.0",
|
|
@@ -39,8 +35,6 @@
|
|
|
39
35
|
"mysql2": "^3.23.3"
|
|
40
36
|
},
|
|
41
37
|
"devDependencies": {
|
|
42
|
-
"@fastify/cookie": "^11.1.2",
|
|
43
|
-
"@fastify/mysql": "^5.0.2",
|
|
44
38
|
"@fastify/session": "^11.1.2",
|
|
45
39
|
"argon2": "^0.45.0",
|
|
46
40
|
"date-fns": "^4.4.0",
|
package/scripts/postinstall.cjs
DELETED
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
const fs = require('fs');
|
|
2
|
-
const path = require('path');
|
|
3
|
-
const { spawn } = require('child_process');
|
|
4
|
-
|
|
5
|
-
try {
|
|
6
|
-
// 1. Xác định thư mục gốc dự án
|
|
7
|
-
const projectRoot = process.env.INIT_CWD || (() => {
|
|
8
|
-
let currentDir = __dirname;
|
|
9
|
-
while (currentDir !== path.parse(currentDir).root) {
|
|
10
|
-
if (path.basename(currentDir) === 'node_modules') {
|
|
11
|
-
return path.dirname(currentDir);
|
|
12
|
-
}
|
|
13
|
-
currentDir = path.dirname(currentDir);
|
|
14
|
-
}
|
|
15
|
-
return null;
|
|
16
|
-
})();
|
|
17
|
-
|
|
18
|
-
if (projectRoot) {
|
|
19
|
-
const projectPackageJsonPath = path.join(projectRoot, 'package.json');
|
|
20
|
-
|
|
21
|
-
// 🌟 THAY ĐỔI Ở ĐÂY: Nếu file package.json KHÔNG tồn tại, tự động tạo mới một file rỗng hợp lệ
|
|
22
|
-
if (!fs.existsSync(projectPackageJsonPath)) {
|
|
23
|
-
const defaultPkg = {
|
|
24
|
-
name: path.basename(projectRoot) || "my-admin-project",
|
|
25
|
-
version: "1.0.0",
|
|
26
|
-
private: true,
|
|
27
|
-
dependencies: {}
|
|
28
|
-
};
|
|
29
|
-
fs.writeFileSync(projectPackageJsonPath, JSON.stringify(defaultPkg, null, 2), 'utf-8');
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// 2. Đọc peerDependencies của thư viện
|
|
33
|
-
const myPackageJsonPath = path.resolve(__dirname, '../package.json');
|
|
34
|
-
const myPackageJson = JSON.parse(fs.readFileSync(myPackageJsonPath, 'utf-8'));
|
|
35
|
-
const peerDeps = myPackageJson.peerDependencies || {};
|
|
36
|
-
const peerDepsStr = JSON.stringify(peerDeps);
|
|
37
|
-
|
|
38
|
-
// 3. Tách một tiến trình độc lập chạy bằng Node.js ngầm
|
|
39
|
-
const child = spawn('node', ['-e', `
|
|
40
|
-
setTimeout(() => {
|
|
41
|
-
const fs = require('fs');
|
|
42
|
-
try {
|
|
43
|
-
const targetPath = '${projectPackageJsonPath.replace(/\\/g, '\\\\')}';
|
|
44
|
-
|
|
45
|
-
// Đọc file (lúc này chắc chắn đã tồn tại vì ta đã tạo ở tiến trình cha)
|
|
46
|
-
let projectPkg = {};
|
|
47
|
-
if (fs.existsSync(targetPath)) {
|
|
48
|
-
projectPkg = JSON.parse(fs.readFileSync(targetPath, 'utf-8'));
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
if (!projectPkg.dependencies) projectPkg.dependencies = {};
|
|
52
|
-
|
|
53
|
-
const peerDeps = ${peerDepsStr};
|
|
54
|
-
let hasChanged = false;
|
|
55
|
-
|
|
56
|
-
Object.keys(peerDeps).forEach((dep) => {
|
|
57
|
-
const inDeps = projectPkg.dependencies && projectPkg.dependencies[dep];
|
|
58
|
-
const inDevDeps = projectPkg.devDependencies && projectPkg.devDependencies[dep];
|
|
59
|
-
if (!inDeps && !inDevDeps) {
|
|
60
|
-
projectPkg.dependencies[dep] = peerDeps[dep];
|
|
61
|
-
hasChanged = true;
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
if (hasChanged) {
|
|
66
|
-
fs.writeFileSync(targetPath, JSON.stringify(projectPkg, null, 2), 'utf-8');
|
|
67
|
-
console.log('\\n\\x1b[32m%s\\x1b[0m', '✅ [MaterialUI Admin] Đã tự động tạo và chèn các dependencies thành công!');
|
|
68
|
-
}
|
|
69
|
-
} catch(e) {}
|
|
70
|
-
}, 1500);
|
|
71
|
-
`], {
|
|
72
|
-
detached: true,
|
|
73
|
-
stdio: 'ignore'
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
child.unref();
|
|
77
|
-
}
|
|
78
|
-
} catch (error) {
|
|
79
|
-
// Bỏ qua lỗi dev
|
|
80
|
-
}
|