@aicblock/emysql 1.3.0

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 dpapejs
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.en.md ADDED
@@ -0,0 +1,71 @@
1
+ # @aicblock/emysql
2
+
3
+ ![npm](https://img.shields.io/npm/v/@aicblock/emysql)
4
+ ![npm](https://img.shields.io/npm/dm/@aicblock/emysql)
5
+ ![NPM](https://img.shields.io/npm/l/@aicblock/emysql)
6
+
7
+ #### Description
8
+
9
+ 🛠️ Based on the basic secondary package of `mysql`, the pursuit of creating a simple and easy to use `mysql-ORM` library.
10
+
11
+ #### Installation
12
+
13
+ ```sh
14
+ npm i @aicblock/emysql@latest -S
15
+ ```
16
+
17
+ #### Instructions
18
+
19
+ ```ts
20
+ import emysql, { DefineTable } from '@aicblock/emysql' // Reference library
21
+ // Function instantiation
22
+ const mysql = new emysql({
23
+ password: '[database login password]',
24
+ user: '[database login username]',
25
+ database: 'database name'
26
+ })
27
+ // Create table structure
28
+ const createTable = DefineTable({
29
+ tableName: 'create_table',
30
+ columns: [
31
+ {
32
+ name: 'id',
33
+ dataType: 'INT',
34
+ primaryKey: true,
35
+ autoIncrement: true,
36
+ comments: '主键id'
37
+ },
38
+ {
39
+ name: 'name',
40
+ dataType: 'VARCHAR',
41
+ length: 45,
42
+ notNull: true,
43
+ comments: '名称'
44
+ },
45
+ {
46
+ name: 'create_at',
47
+ dataType: 'DATETIME',
48
+ notNull: true,
49
+ comments: '创建时间'
50
+ }
51
+ ]
52
+ }
53
+ })
54
+ // Initialize database
55
+ await mysql.init()
56
+ // Create table
57
+ await mysql.table.create([createTable])
58
+ // Insert data
59
+ const now = new Date()
60
+ await mysql.change.insert({
61
+ t: createTable,
62
+ params: { name: 'test', create_at: now }
63
+ })
64
+ // Query data
65
+ const list = await mysql.query({
66
+ t: createTable,
67
+ fields: ['name', 'id'],
68
+ condition: { id: 1 }
69
+ })
70
+ console.log(list) // [{id:1,name:"test"}]
71
+ ```
package/README.md ADDED
@@ -0,0 +1,71 @@
1
+ # @aicblock/emysql
2
+
3
+ ![npm](https://img.shields.io/npm/v/@aicblock/emysql)
4
+ ![npm](https://img.shields.io/npm/dm/@aicblock/emysql)
5
+ ![NPM](https://img.shields.io/npm/l/@aicblock/emysql)
6
+
7
+ #### 介绍
8
+
9
+ 🛠️ 基于 `mysql` 基础二次封装,追求打造简单、好用的 `mysql-ORM` 库.
10
+
11
+ #### 安装教程
12
+
13
+ ```sh
14
+ npm i @aicblock/emysql@latest -S
15
+ ```
16
+
17
+ #### 使用说明
18
+
19
+ ```ts
20
+ import emysql, { DefineTable } from '@aicblock/emysql' // 引用库
21
+ // 函数实例化
22
+ const mysql = new emysql({
23
+ password: '[database login password]',
24
+ user: '[database login username]',
25
+ database: 'database name'
26
+ })
27
+
28
+ // 创建表结构
29
+ const createTable = DefineTable({
30
+ tableName: 'create_table',
31
+ columns: [
32
+ {
33
+ name: 'id',
34
+ dataType: 'INT',
35
+ primaryKey: true,
36
+ autoIncrement: true,
37
+ comments: '主键id'
38
+ },
39
+ {
40
+ name: 'name',
41
+ dataType: 'VARCHAR',
42
+ length: 45,
43
+ notNull: true,
44
+ comments: '名称'
45
+ },
46
+ {
47
+ name: 'create_at',
48
+ dataType: 'DATETIME',
49
+ notNull: true,
50
+ comments: '创建时间'
51
+ }
52
+ ]
53
+ })
54
+ // 初始化数据库
55
+ await mysql.init()
56
+ // 创建表
57
+ await mysql.table.create([createTable])
58
+ // 插入数据
59
+ const now = new Date()
60
+ await mysql.change.insert({
61
+ t: createTable,
62
+ params: { name: 'test', create_at: now }
63
+ })
64
+ // 查询数据
65
+ const list = await mysql.query({
66
+ t: createTable,
67
+ fields: ['name', 'id'],
68
+ condition: { id: 1 }
69
+ })
70
+ console.log(list) // [{id:1,name:"test"}]
71
+ ```
package/lib/index.d.ts ADDED
@@ -0,0 +1,35 @@
1
+ /// <reference types="./types" />
2
+ import type { QueryResult, ResultSetHeader } from 'mysql2/promise';
3
+ import mysql from 'mysql2/promise';
4
+ declare class emysql {
5
+ db?: string;
6
+ log: 'none' | 'error' | 'warn' | 'info' | 'debug';
7
+ private pool?;
8
+ private conf;
9
+ constructor(param: EMsqlInstantiate & {
10
+ connConfig: mysql.PoolOptions;
11
+ });
12
+ private check_db;
13
+ init(): Promise<void>;
14
+ private create_conn;
15
+ detail(param: ExecQueryBaseParam): Promise<Record<string, any>>;
16
+ query(param: ExecQueryParam): Promise<Record<string, any>[]>;
17
+ count(param: QueryCountParam): Promise<number>;
18
+ change: {
19
+ insert: (v: InsertParam) => Promise<ResultSetHeader>;
20
+ delete: (v: DeleteParam) => Promise<ResultSetHeader>;
21
+ update: (v: UpdateParam) => Promise<ResultSetHeader>;
22
+ batchUpdate: (v: BatchUpdateParam<DuplicateUpdateParam | ConditionBatchUpdateParam>) => Promise<ResultSetHeader>;
23
+ };
24
+ transaction(exec: (v: TransactionParams<DuplicateUpdateParam | ConditionBatchUpdateParam, ResultSetHeader, QueryResult>) => Promise<any>): Promise<any>;
25
+ table: {
26
+ create: (v: DefineTableResult | DefineTableResult[]) => Promise<void>;
27
+ truncate: (name: string) => Promise<void>;
28
+ drop: (name: string) => Promise<void>;
29
+ exist: (name: string) => Promise<boolean>;
30
+ };
31
+ close(): Promise<void>;
32
+ }
33
+ export declare const DefineTable: (param: DefineTableParam) => DefineTableResult;
34
+ export declare const version: string;
35
+ export default emysql;
package/lib/index.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";var oe=Object.create;var $=Object.defineProperty;var se=Object.getOwnPropertyDescriptor;var ae=Object.getOwnPropertyNames;var ie=Object.getPrototypeOf,ce=Object.prototype.hasOwnProperty;var le=(r,t)=>{for(var e in t)$(r,e,{get:t[e],enumerable:!0})},G=(r,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ae(t))!ce.call(r,o)&&o!==e&&$(r,o,{get:()=>t[o],enumerable:!(n=se(t,o))||n.enumerable});return r};var ue=(r,t,e)=>(e=r!=null?oe(ie(r)):{},G(t||!r||!r.__esModule?$(e,"default",{value:r,enumerable:!0}):e,r)),pe=r=>G($({},"__esModule",{value:!0}),r);var Oe={};le(Oe,{DefineTable:()=>Ie,default:()=>Fe,version:()=>Ce});module.exports=pe(Oe);var K=ue(require("mysql2/promise")),me=async r=>{try{let t=K.default.createPool(r);return process.on("SIGINT",async()=>{t==null||t.end(),process.env.NODE_ENV!=="test"&&process.exit(0)}),(await t.getConnection()).release(),t}catch(t){return Promise.reject(t)}},Q=me;var J=(m=>(m.EQUAL="=",m.IN="IN",m.NOT_IN="NOT IN",m.LIKE="LIKE",m.LIKE_UPPER="LIKE",m.LIKE_LOWER="LIKE",m.NOT="!=",m.IS_NOT_NULL="IS NOT NULL",m.IS_NULL="IS NULL",m.GREATER_THAN_OR_EQUAL=">=",m.GREATER_THAN=">",m.LESS_THAN_OR_EQUAL="<=",m.LESS_THAN="<",m))(J||{}),V=(n=>(n["="]="?",n.IN="(?)",n["NOT IN"]="(?)",n.LIKE="?",n.NOT="?",n[">="]="?",n[">"]="?",n["<="]="?",n["<"]="?",n))(V||{});function S(r){let t=Array.isArray(r)&&r.length!==0,e=!Array.isArray(r)&&r!==void 0&&r!==null&&r!=="";return t||e}function W(r,t){let e=[`\`${r}\``];typeof t=="string"?e.push(`\`${t}\``):e.push(`\`${t.name}\``);let n=[e.join(".")];return typeof t!="string"&&t.alias&&n.push("AS",`\`${t.alias}\``),n.join(" ")}function he(r,t){let e=["SELECT"],n=de(t.fields);e.push(n.join(",")),e.push("FROM");let o=fe(r,t.t);e.push(o);let{where:s,values:a}=t.condition&&x(r,t.condition)||{};return t.join&&e.push(ye(r,t.join).join(`
2
+ `)),s&&(s==null?void 0:s.length)>0&&e.push("WHERE",...s),t.orderBy&&e.push(...Y(t.orderBy)),t.limit&&e.push(...D(t.limit)),{sql:e.join(" "),values:a}}function x(r,t){let e=[],n=[],o=[],s=[],a=Object.keys(t),c=(p,d)=>{let i=typeof d=="string"?{value:d}:d,{value:f,type:m,or:g,t:j,subquery:q}=i,R;if(q){let E=q.fields||[p],{sql:h,values:y}=he(r,Object.assign({},q,{fields:E}));o.push(...y),R=h}else if(!["IS_NOT_NULL","IS_NULL"].includes(m||""))if((m==="IN"||m==="NOT_IN")&&Array.isArray(f)){let E=f;g?s.push(...E):o.push(...E)}else g?s.push(f):m!=="TO_DAYS"&&o.push(f);let b=[],_=j&&`\`${j}\`.\`${p}\``||`\`${p}\``;if(m==="TO_DAYS")b.push(`TO_DAYS(${_})`,"=","TO_DAYS(NOW())");else{let E=m&&J[m]||"=";if(b.push(_,E),!["IS_NOT_NULL","IS_NULL"].includes(m||""))if(R)b.push(`(${R})`);else if((m==="IN"||m==="NOT_IN")&&Array.isArray(f)){let h=f.map(()=>"?").join(",");b.push(`(${h})`)}else b.push(V[E]||"?")}let A=b.join(" ");g&&n.push(A)||e.push(A)};a.forEach(p=>{let d=t[p];(typeof d!=="object"?[{value:d,type:"EQUAL"}]:Array.isArray(d)?d:[d]).forEach(m=>c(p,m))});let u=[e.join(" AND ")];return n.length>0&&(e.length>0&&n.length>1&&u.push(" AND "),e.length>0&&n.length===1&&u.push(" OR "),u.push(`(${n.join(" OR ")})`)),{where:u.filter(p=>S(p)),values:o.concat(s)}}function de(r){return r?(Array.isArray(r)?r:[r]).map(n=>{let o=typeof n=="string"?{name:n}:n,a=[o.t?`\`${o.t}\`.\`${o.name}\``:`\`${o.name}\``];return o.alias&&a.push("AS",`\`${o.alias}\``),a.join(" ")}):["*"]}function fe(r,t){return(Array.isArray(t)?t:[t]).map(o=>W(r,o)).join(",")}function ye(r,t){return(Array.isArray(t)?t:[t]).map(o=>{let{type:s,on:a}=o,{name:c,alias:u}=typeof o.t=="string"?{name:o.t,alias:void 0}:o.t,p=W(r,o.t),d=s==="LEFT"?"LEFT JOIN":s==="RIGHT"?"RIGHT JOIN":"INNER JOIN",i=u?[`\`${u}\``,`\`${a.joinField}\``]:[`\`${c}\``,`\`${a.joinField}\``],f=[`\`${a.mainTable}\``,`\`${a.mainField}\``];return[d,p,"ON",i.join("."),"=",f.join(".")].join(" ")})}function Y(r){let{field:t,type:e,t:n}=r,o=["ORDER BY"];return n?o.push([l(n),l(t)].join(".")):o.push(t),e&&o.push(e),o}var D=r=>["LIMIT",[r.start.toString(),",",r.length.toFixed()].join("")],l=r=>`\`${r}\``;function _e(r){let e=Object.assign({},{charset:"utf8mb4",collate:"utf8mb4_0900_bin",engine:"InnoDB"},r),n=[],{tableName:o,columns:s,engine:a,charset:c,collate:u}=e;n.push(l(o));let p=s.filter(i=>i.primaryKey),d=s.map(i=>{let f=[];f.push(l(i.name));let m=i.dataType,g=m;if(m==="DECIMAL"&&i.length&&i.point?g=`${m}(${i.length},${i.point})`:i.length&&(g=`${m}(${i.length})`),f.push(g),i.primaryKey&&(p.length===1?f.push("PRIMARY KEY","NOT NULL"):f.push("NOT NULL")),i.autoIncrement&&f.push("AUTO_INCREMENT"),i.notNull&&!i.primaryKey&&f.push("NOT NULL"),i.unique&&f.push("UNIQUE"),S(i.defaultValue)){let j=i.defaultValue,q=typeof j=="string"&&!j.startsWith("CURRENT_")?`'${j}'`:j;f.push("DEFAULT",q)}return S(i.comments)&&f.push(`COMMENT '${i.comments}'`),f.join(" ")});return p.length>1&&d.push(["PRIMARY KEY",`(${p.map(i=>l(i.name)).join(",")})`].join(" ")),n.push(`(${d.join(",")})`),n.push(`ENGINE=${a}`),n.push(`DEFAULT CHARSET=${c}`),n.push(`COLLATE=${u}`),n.join(" ")}async function X(r,t,e){try{let s=["TRUNCATE TABLE",[l(r),l(e)].join(".")].join(" ");return await t.query(s),Promise.resolve()}catch(n){return t.release(),Promise.reject(n)}}async function z(r,t,e){try{let s=["DROP TABLE IF EXISTS",[l(r),l(e)].join(".")].join(" ");return await t.query(s),Promise.resolve()}catch(n){return t.release(),Promise.reject(n)}}async function Z(r,t,e){try{let n=`SHOW TABLES IN ${l(r)} LIKE ?`,o=[e],[s]=await t.query({sql:n,values:o});return s.length===0?Promise.resolve(!1):Promise.resolve(!0)}catch(n){return t.release(),Promise.reject(n)}}var v=async(r,t,e)=>{try{let o=(Array.isArray(e)?e:[e]).map(a=>{let c=["CREATE TABLE IF NOT EXISTS"];return c.push([l(r),a.createSQL].join(".")),c.join(" ")}),s=a=>t.query(a);await Promise.all(o.map(s))}catch(n){return t.release(),Promise.reject(n)}},ee=r=>{let{tableName:t}=r,e=r.columns.map(u=>u.name),n={charset:"utf8mb4",collate:"utf8mb4_0900_bin",engine:"InnoDB"},{charset:o,collate:s,engine:a}=Object.assign({},n,r);return{name:t,createSQL:_e(r),fields:e,columns:r.columns,tableCharacter:{charset:o,collate:s,engine:a}}};var te=r=>(Array.isArray(r)?r:[r]).map(n=>{let o=typeof n=="string"?{name:n}:n,s=[];o.t&&s.push(o.t),s.push(o.name);let c=[s.map(l).join(".")];return o.alias&&c.push("AS",l(o.alias)),c.join(" ")}),P=(r,t)=>{let e=[];return(Array.isArray(t)?t:[t]).forEach(o=>{let a=[[l(r),l(o.name)].join(".")];o.alias&&a.push("AS",l(o.alias)),e.push(a.join(" "))}),e.join(",")},ge=(r,t)=>{let e=Array.isArray(t)?t:[t],n=[];return e.forEach(o=>{let{type:s,t:a,on:c}=o,u=s==="LEFT"?"LEFT JOIN":s==="RIGHT"?"RIGHT JOIN":"INNER JOIN",p=P(r,a),d=[u,p,"ON"],i=[];i.push(a.alias?l(a.alias):l(a.name),l(c.joinField)),d.push(i.join("."),"=");let f=[];f.push(c.mainTable.alias?l(c.mainTable.alias):l(c.mainTable.name),l(c.mainField)),d.push(f.join(".")),n.push(d.join(" "))}),n};function w(r){let t=["SELECT"];t.push(r.escape_fields.join(",")),t.push("FROM"),t.push(P(r.db,r.t));let e,n;if(r.condition&&Object.keys(r.condition).length>0){let s=x(r.db,r.condition);e=s.where,n=s.values}return r.join&&t.push(ge(r.db,r.join).join(`
3
+ `)),e&&e.length>0&&t.push("WHERE",...e),r.orderBy&&t.push(...Y(r.orderBy)),r.limit&&t.push(...D(r.limit)),{sql:t.join(" "),values:n}}var Pe=async(r,t,e)=>{try{let[n,o]=await r.query({sql:t,values:e});return{data:n,fields:o}}catch(n){return r.release(),Promise.reject(n)}},I=Pe;var je=(r,t,e)=>{let n=[],o=Array.isArray(r)?r:[r];if(o.forEach(c=>{n.push(...c.fields.map(u=>{let p=[];return(o.length>1||e)&&p.push(l(c.alias||c.name)),p.push(l(u)),p.join(".")}))}),e&&(Array.isArray(e)?e:[e]).forEach(u=>{let p=u.t;typeof p!="string"&&p.fields&&n.push(...p.fields.map(d=>{let i=[];return i.push(l(p.alias||p.name)),i.push(l(d)),i.join(".")}))}),!t)return n;if(!(Array.isArray(t)?t:[t]).every(c=>{let u=typeof c=="string"?{name:c}:c,p=[];u.t&&p.push(u.t),p.push(u.name);let d=p.map(l).join(".");return n.includes(d)}))throw new Error("fields not found");return te(t)},qe=async(r,t,e)=>{try{let n=je(e.t,e.fields,e.join),{sql:o,values:s}=w({...e,db:t,escape_fields:n});console.info("[info] sql query::",o);let{data:a}=await I(r,o,s);return a}catch(n){return r.release(),Promise.reject(n)}},L=qe;var H=r=>{let t=Array.isArray(r)?r:[r],e=Array.from(new Set(t.map(o=>Object.keys(o)).flat())).map(o=>l(o)),n=t.map(o=>e.map(s=>{let a=s.replace(/`/g,"");return a in o?o[a]:null}));return{fields:e,values:n}},Ee=(r,t)=>{let e=["INSERT INTO"],n="table"in t.t?t.t.table.name:t.t.name,o=[l(r),l(n)];e.push(o.join("."));let s="table"in t.t?t.t.alias:void 0;s&&e.push("AS",l(s));let{fields:a,values:c}=H(t.params),u=["("].concat(a.join(",")).concat(")");return e.push(u.join(""),"VALUES"),e.push("?"),{sql:e.join(" "),values:[c]}},be=async(r,t,e)=>{try{let{sql:n,values:o}=Ee(r,e);console.info("[info] sql insert::",n);let[s]=await t.query({sql:n,values:o});return s}catch(n){return t.release(),Promise.reject(n)}},C=be;var Te=async(r,t,e)=>{var n,o;try{let s=typeof e.field=="string"?e.field:((n=e.field)==null?void 0:n.name)||"id",a=[];typeof e.field=="object"&&e.field.t&&(e.field.t.alias?a.push(l(e.field.t.alias)):a.push(l(e.field.t.name))),a.push(l(s));let c=[`COUNT(${a.join(".")}) AS total`],{sql:u,values:p}=w({...e,db:t,escape_fields:c});console.info("[info] sql query::",u);let{data:d}=await I(r,u,p);return((o=d[0])==null?void 0:o.total)||0}catch(s){return r.release(),Promise.reject(s)}},F=Te;var Re=async(r,t,e)=>{try{if(!e.condition||Object.keys(e.condition).length===0)throw Error("The deletion condition cannot be empty.");let n=["DELETE FROM",P(r,e.t)],{where:o,values:s}=x(r,e.condition),a=n.concat("WHERE").concat(o).join(" ");console.info("[info] sql delte::",a);let[c]=await t.execute({sql:a,values:s});return c}catch(n){return t.release(),Promise.reject(n)}},O=Re;var Ae=async(r,t,e)=>{try{if(!e.params||Object.keys(e.params).length===0)throw Error("The update params cannot be empty.");if(!e.condition||Object.keys(e.condition).length===0)throw Error("The update condition cannot be empty.");let n=["UPDATE",P(r,e.t),"SET"],{fields:o,values:s}=H(e.params);n.push(o.map(i=>`${i}=?`).join(","));let{where:a,values:c}=x(r,e.condition),u=n.concat("WHERE").concat(a).join(" ");console.info("[info] sql update::",u);let p=[...s[0],...c],[d]=await t.query({sql:u,values:p});return d}catch(n){return t.release(),Promise.reject(n)}},U=Ae;var Se=(r,t)=>{let{t:e,unique:n,excludeField:o}=t,s=t.data,a=["INSERT INTO",P(r,e)],c=Array.isArray(s),u=Array.isArray(s)?s:[s],d=Array.from(new Set(u.map(_=>Object.keys(_)).flat())).map(_=>l(_)),i=u.map(_=>d.map(A=>{let E=A.replace(/`/g,"");return E in _?_[E]:null})),f=["("].concat(d.join(","),")");a.push(f.join(""),"VALUES");let m=d.map(()=>"?"),g=["("].concat(m.join(",")).concat(")");c?a.push("?"):a.push(g.join(""));let j=[n||"id"].concat(o||[]),q=d.filter(_=>{let A=_.replace(/`/g,"");return!j.includes(A)}).map(_=>`${_} = VALUES(${_})`).join(",");a.push("ON DUPLICATE KEY UPDATE",q);let R=a.join(" "),b=c?[i]:i[0];return{sql:R,values:b}},xe=(r,t)=>{let{t:e,conditionField:n}=t,o=t.data,s=["UPDATE",P(r,e),"SET"],a={},c=[];Array.from(new Set(o.map(i=>Object.keys(i)).flat())).filter(i=>i!==n).forEach(i=>{let f=[];o.forEach(m=>{i in m&&(f.push(["WHEN","?","THEN","?"]),c.push(m[n],m[i]))}),a[i]=f}),Object.keys(a).forEach((i,f,m)=>{let g=a[i].map(q=>q.join(" ")).join(" "),j=[l(i),"=","CASE",n,g,"END"];m.length-1!==f&&j.push(","),s.push(...j)}),s.push("WHERE",n,"IN","?");let p=o.map(i=>i[n]);c.push([p]);let d=s.join(" ");return{values:c,sql:d}},Le=(r,t)=>{let{t:e}=t,{charset:n,collate:o,engine:s}=e.tableCharacter,a=t.data;if(!t.conditionField)throw Error("PARAM_ERROR::[CONDITIONFIELD] IS NOT NULL");let c=["temp_",e.name].join(""),u=Array.from(new Set(a.map(h=>Object.keys(h)).flat()));console.info("[info] allFields::",u);let p=u.map(h=>e.columns.find(y=>y.name===h)).filter(h=>h!==void 0),d=p.filter(h=>h.primaryKey),i=p.map(h=>{let y=[];y.push(l(h.name));let T=h.dataType,M=T;if(T==="DECIMAL"&&h.length&&h.point?M=`${T}(${h.length},${h.point})`:h.length&&(M=`${T}(${h.length})`),y.push(M),h.primaryKey&&(d.length===1?y.push("PRIMARY KEY","NOT NULL"):y.push("NOT NULL")),h.autoIncrement&&y.push("AUTO_INCREMENT"),h.notNull&&!h.primaryKey&&y.push("NOT NULL"),h.unique&&y.push("UNIQUE"),S(h.defaultValue)){let N=h.defaultValue,ne=typeof N=="string"&&!N.startsWith("CURRENT_")?`'${N}'`:N;y.push("DEFAULT",ne)}return S(h.comments)&&y.push(`COMMENT '${h.comments}'`),y.join(" ")}),f=["CREATE TEMPORARY TABLE IF NOT EXISTS",l(c),`(${i.join(",")})`,`ENGINE=${s}`,`DEFAULT CHARSET=${n}`,`COLLATE=${o}`].join(" ");console.info("[info] sql create temporary table::",f);let m={name:c,createSQL:f,fields:u,columns:e.columns,tableCharacter:{charset:n,collate:o,engine:s}},g=["INSERT INTO",l(c)],j=u.map(h=>l(h)).join(",");g.push("(",j,") VALUES");let q=a.map(h=>`(${u.map(T=>T in h?h[T]:null).map(()=>"?").join(",")})`).join(",");g.push(q);let R=a.flatMap(h=>u.map(y=>y in h?h[y]:null)),b={sql:g.join(" "),values:R},_=["UPDATE",P(r,e),"JOIN",P(r,m),"ON",`${P(r,e)}.${l(t.conditionField)}`,"=",`${P(r,m)}.${l(t.conditionField)}`,"SET"];return u.filter(h=>h!==t.conditionField).forEach((h,y,T)=>{_.push(`${P(r,e)}.${l(h)}`,"=",`${P(r,m)}.${l(h)}`),T.length-1!==y&&_.push(",")}),{create:{values:[],sql:f},insert:b,update:{values:[],sql:_.join(" ")},drop:{values:[],sql:["DROP TEMPORARY TABLE IF EXISTS",l(c)].join(" ")}}},we=async(r,t,e)=>{try{if(!e.params)throw new Error("params is required");if(e.type==="TEMPORARY"){let a=e.params,{create:c,insert:u,update:p,drop:d}=Le(r,a);console.info("[info] sql temporary batch create::",c.sql),await t.query(c),console.info("[info] sql temporary batch insert::",u.sql),await t.query(u),console.info("[info] sql temporary batch update::",p.sql);let[i]=await t.query(p);return await t.query(d),i}let{values:n,sql:o}=e.type==="DUPLICATE"?Se(r,e.params):xe(r,e.params);console.info("[info] sql batch update::",o);let[s]=await t.query({sql:o,values:n});return s}catch(n){return t.release(),Promise.reject(n)}},B=we;var Ne=(r,t)=>{let e=async(o,s,a)=>{try{console.info("[info] trx::sql query::",s);let[c]=await o.query(s,a);return c}catch(c){return Promise.reject(c)}};return{sql:(o,s)=>e(t,o,s),query:o=>L(t,r,o),detail:async o=>{try{return(await L(t,r,Object.assign({},o,{limit:{start:0,length:1}})))[0]}catch(s){return Promise.reject(s)}},count:o=>F(t,r,o),change:{insert:o=>C(r,t,o),batchUpdate:o=>B(r,t,o),delete:o=>O(r,t,o),update:o=>U(r,t,o)}}},$e=async(r,t,e)=>{try{await t.beginTransaction();let n=Ne(r,t);console.info("[info] transaction exec list");let o=await e(n);return await t.commit(),o}catch(n){return await t.rollback(),t.release(),Promise.reject(n)}},re=$e;var k=class{constructor(t){this.log="none";this.pool=void 0;this.conf={};this.change={insert:async t=>{try{this.check_db();let e=await this.create_conn(),n=await C(this.db,e,t);return e.release(),n}catch(e){return this.log==="error"&&console.error(e),Promise.reject(e)}},delete:async t=>{try{this.check_db();let e=await this.create_conn(),n=await O(this.db,e,t);return e.release(),n}catch(e){return this.log==="error"&&console.error(e),Promise.reject(e)}},update:async t=>{try{this.check_db();let e=await this.create_conn(),n=await U(this.db,e,t);return e.release(),n}catch(e){return this.log==="error"&&console.error(e),Promise.reject(e)}},batchUpdate:async t=>{try{this.check_db();let e=await this.create_conn(),n=await B(this.db,e,t);return e.release(),n}catch(e){return this.log==="error"&&console.error(e),Promise.reject(e)}}};this.table={create:async t=>{try{let e=await this.create_conn();return this.check_db(),await v(this.db,e,t),e.release(),Promise.resolve()}catch(e){return this.log==="error"&&console.error(e),Promise.reject(e)}},truncate:async t=>{try{this.check_db();let e=await this.create_conn();return await X(this.db,e,t),e.release(),Promise.resolve()}catch(e){return this.log==="error"&&console.error(e),Promise.reject(e)}},drop:async t=>{try{this.check_db();let e=await this.create_conn();return await z(this.db,e,t),e.release(),Promise.resolve()}catch(e){return this.log==="error"&&console.error(e),Promise.reject(e)}},exist:async t=>{try{this.check_db();let e=await this.create_conn(),n=await Z(this.db,e,t);return e.release(),Promise.resolve(n)}catch(e){return this.log==="error"&&console.error(e),Promise.reject(e)}}};if(this.log=t.log||"none",!t.connConfig)throw Error("CONN_CONFIG_REQUIRED");this.db=t.connConfig.database,this.conf=t.connConfig}check_db(){if(!this.db)throw this.log==="error"&&console.error("The database name is not initialized. Procedure"),Error("DB_UNINITIALIZED")}async init(){try{if(this.pool)return;this.pool=await Q(this.conf)}catch(t){throw this.log==="error"&&console.error(t),Error("CREATE_POOL_FAILED")}}async create_conn(){try{return this.pool?await this.pool.getConnection():(this.log==="error"&&console.error("The connection pool is not initialized. Procedure"),Promise.reject("POOL_UNINITIALIZED"))}catch(t){return Promise.reject(t)}}async detail(t){try{this.check_db();let e=await this.create_conn(),n=await L(e,this.db,Object.assign({},t,{limit:{start:0,length:1}}));return e.release(),n[0]}catch(e){return this.log==="error"&&console.error(e),Promise.reject(e)}}async query(t){try{this.check_db();let e=await this.create_conn(),n=await L(e,this.db,t);return e.release(),n}catch(e){return this.log==="error"&&console.error(e),Promise.reject(e)}}async count(t){try{this.check_db();let e=await this.create_conn(),n=await F(e,this.db,t);return e.release(),n}catch(e){return this.log==="error"&&console.error(e),Promise.reject(e)}}async transaction(t){try{this.check_db();let e=await this.create_conn(),n=await re(this.db,e,t);return e.release(),n}catch(e){return this.log==="error"&&console.error(e),Promise.reject(e)}}async close(){var t;try{return await((t=this.pool)==null?void 0:t.end()),this.pool=void 0,Promise.resolve()}catch(e){return this.log==="error"&&console.error(e),Promise.reject(e)}}},Ie=ee,Ce=`1.3.0:${Date.now()}`,Fe=k;0&&(module.exports={DefineTable,version});
package/lib/types.d.ts ADDED
@@ -0,0 +1,537 @@
1
+ /**
2
+ * 表参数配置
3
+ */
4
+ interface TableConfig {
5
+ /**
6
+ * 表名
7
+ */
8
+ name: string
9
+ /**
10
+ * 表别名
11
+ */
12
+ alias?: string
13
+ }
14
+
15
+ /**
16
+ * 表信息类型
17
+ */
18
+ type TABLE_TYPE = DefineTableResult & { alias?: string }
19
+
20
+ /**
21
+ * 表信息配置项
22
+ */
23
+ type TABLE_OPTION = TABLE_TYPE | TABLE_TYPE[]
24
+
25
+ /**
26
+ * 查询等式类型
27
+ */
28
+ type CONDITION_EQUATION_TYPE =
29
+ | 'EQUAL' // 等于
30
+ | 'TO_DAYS' // 转换为天数
31
+ | 'IN' // 包含
32
+ | 'NOT_IN' // 不包含
33
+ | 'LIKE' // 模糊查询
34
+ | 'LIKE_UPPER' // 转大写查询
35
+ | 'LIKE_LOWER' // 转小写查询
36
+ | 'NOT' // 不等于
37
+ | 'IS_NOT_NULL' // 不为空
38
+ | 'IS_NULL' // 为空
39
+ | 'GREATER_THAN_OR_EQUAL' // 大于等于
40
+ | 'GREATER_THAN' // 大于
41
+ | 'LESS_THAN_OR_EQUAL' // 小于等于
42
+ | 'LESS_THAN' // 小于
43
+ | 'LESS_THAN' // 小于
44
+
45
+ /**
46
+ * 值类型
47
+ */
48
+ type VALUE_TYPE = string | number | Date | boolean | VALUE_TYPE[]
49
+
50
+ interface ConditionOption {
51
+ /**
52
+ * 匹配值
53
+ */
54
+ value?: VALUE_TYPE
55
+ /**
56
+ * 等式类型
57
+ */
58
+ type?: CONDITION_EQUATION_TYPE
59
+ /**
60
+ * 是否为或语句
61
+ */
62
+ or?: boolean
63
+ /**
64
+ * 表名或表别名
65
+ */
66
+ t?: string
67
+ /**
68
+ * 子查询
69
+ */
70
+ subquery?: ExecQueryParam
71
+ }
72
+
73
+ /**
74
+ * 查询条件配置项
75
+ */
76
+ type CONDITION_TYPE = Record<
77
+ string,
78
+ VALUE_TYPE | ConditionOption | ConditionOption[]
79
+ >
80
+
81
+ /**
82
+ * 查询条目区间配置项
83
+ */
84
+ interface LIMIT_PARAM {
85
+ /**
86
+ * 开始位置
87
+ */
88
+ start: number
89
+ /**
90
+ * 查询数量
91
+ */
92
+ length: number
93
+ }
94
+
95
+ /**
96
+ * 表连接查询配置项
97
+ */
98
+ interface JOIN_PARAM_TYPE {
99
+ /**
100
+ * 连接方式,默认:INNER JOIN
101
+ */
102
+ type?: 'LEFT' | 'RIGHT' | 'INNER'
103
+ /**
104
+ * 连接表配置信息
105
+ */
106
+ t: TABLE_TYPE
107
+ /**
108
+ * 连接条件配置信息
109
+ */
110
+ on: {
111
+ /**
112
+ * 连接字段名
113
+ */
114
+ joinField: string
115
+ /**
116
+ * 主表字段名
117
+ */
118
+ mainField: string
119
+ /**
120
+ * 主表表名或表别名
121
+ */
122
+ mainTable: TABLE_TYPE
123
+ }
124
+ }
125
+
126
+ /**
127
+ * 排序配置项
128
+ */
129
+ interface OrderByParam {
130
+ /**
131
+ * 数据库字段名
132
+ */
133
+ field: string
134
+ /**
135
+ * 排序类型
136
+ * ASC | 升序
137
+ * DESC | 降序
138
+ */
139
+ type?: 'ASC' | 'DESC'
140
+ /**
141
+ * 表名或表别名
142
+ */
143
+ t?: string
144
+ }
145
+
146
+ /**
147
+ * 字段配置项
148
+ */
149
+ interface FIELD_OPTION {
150
+ /**
151
+ * 字段名
152
+ */
153
+ name: string
154
+ /**z
155
+ * 字段别名
156
+ */
157
+ alias?: string
158
+ /**
159
+ * 表名或表别名
160
+ */
161
+ t?: string
162
+ }
163
+
164
+ /**
165
+ * 字段配置类型
166
+ */
167
+ type FIELDS_OPTION = string | FIELD_OPTION | (FIELD_OPTION | string)[]
168
+
169
+ interface ExecQueryBaseParam {
170
+ /**
171
+ * 表信息
172
+ */
173
+ t: TABLE_OPTION
174
+ /**
175
+ * 查询条件
176
+ */
177
+ condition?: CONDITION_TYPE
178
+ /**
179
+ * 查询字段
180
+ */
181
+ fields?: FIELDS_OPTION
182
+ /**
183
+ * 表连接查询配置信息
184
+ */
185
+ join?: JOIN_PARAM_TYPE | JOIN_PARAM_TYPE[]
186
+ /**
187
+ * 排序
188
+ */
189
+ orderBy?: OrderByParam
190
+ }
191
+
192
+ /**
193
+ * 查询字段配置
194
+ */
195
+ interface COUNT_FIELD_OPTION {
196
+ /**
197
+ * 字段名
198
+ */
199
+ name: string
200
+ /**
201
+ * 表名或表别名
202
+ */
203
+ t?: TABLE_TYPE
204
+ }
205
+
206
+ interface QueryCountParam {
207
+ /**
208
+ * 表信息
209
+ */
210
+ t: TABLE_OPTION
211
+ /**
212
+ * 查询条件
213
+ */
214
+ condition?: CONDITION_TYPE
215
+ /**
216
+ * 统计字段
217
+ */
218
+ field?: string | COUNT_FIELD_OPTION
219
+ /**
220
+ * 表连接查询配置信息
221
+ */
222
+ join?: JOIN_PARAM_TYPE | JOIN_PARAM_TYPE[]
223
+ }
224
+
225
+ /**
226
+ * 执行查询参数
227
+ */
228
+ interface ExecQueryParam extends ExecQueryBaseParam {
229
+ /**
230
+ * 查询条目区间
231
+ */
232
+ limit?: LIMIT_PARAM
233
+ }
234
+
235
+ /**
236
+ * SQL查询语句转换参数
237
+ */
238
+ interface SQLConvertQueryParam extends ExecQueryParam {
239
+ /**
240
+ * 数据库名称
241
+ */
242
+ db: string
243
+ }
244
+
245
+ interface EMsqlInstantiate {
246
+ /**
247
+ * 日志等级
248
+ */
249
+ log?: 'none' | 'error' | 'warn' | 'info' | 'debug'
250
+ }
251
+
252
+ /**
253
+ * 表字段类型
254
+ */
255
+ type COLUMN_DATA_TYPE =
256
+ | 'INT'
257
+ | 'BINARY'
258
+ | 'BIGINT'
259
+ | 'BIT'
260
+ | 'BLOB'
261
+ | 'CHAR'
262
+ | 'DATE'
263
+ | 'DATETIME'
264
+ | 'DECIMAL'
265
+ | 'DOUBLE'
266
+ | 'ENUM'
267
+ | 'FLOAT'
268
+ | 'GEOMETRY'
269
+ | 'GEOMETRYCOLLECTION'
270
+ | 'INTEGER'
271
+ | 'JSON'
272
+ | 'LINESTRING'
273
+ | 'LONGBLOB'
274
+ | 'LONGTEXT'
275
+ | 'MEDIUMBLOB'
276
+ | 'MEDIUMINT'
277
+ | 'MEDIUMTEXT'
278
+ | 'MULTILINESTRING'
279
+ | 'MULTIPOINT'
280
+ | 'MULTIPOLYGON'
281
+ | 'NUMERIC'
282
+ | 'POINT'
283
+ | 'POLYGON'
284
+ | 'REAL'
285
+ | 'SET'
286
+ | 'SMALLINT'
287
+ | 'TEXT'
288
+ | 'TIME'
289
+ | 'TIMESTAMP'
290
+ | 'TINYBLOB'
291
+ | 'TINYINT'
292
+ | 'TINYTEXT'
293
+ | 'VARBINARY'
294
+ | 'VARCHAR'
295
+ | 'YEAR'
296
+
297
+ /**
298
+ * 表字段配置信息
299
+ */
300
+ interface ColumnOption {
301
+ name: string
302
+ dataType: COLUMN_DATA_TYPE
303
+ length?: number
304
+ point?: number
305
+ primaryKey?: boolean
306
+ notNull?: boolean
307
+ unique?: boolean
308
+ unsigned?: boolean
309
+ zeroFill?: boolean
310
+ autoIncrement?: boolean
311
+ comments?: string
312
+ defaultValue?: any
313
+ }
314
+
315
+ /**
316
+ * mysql 存储引擎
317
+ */
318
+ type TABLE_ENGINE =
319
+ | 'InnoDB'
320
+ | 'MyISAM'
321
+ | 'MEMORY'
322
+ | 'PERFORMANCE_SCHEMA'
323
+ | 'MRG_MYISAM'
324
+ | 'BLACKHOLE'
325
+ | 'CSV'
326
+ | 'ARCHIVE'
327
+
328
+ /**
329
+ * 定义数据表参数
330
+ */
331
+ interface DefineTableParam {
332
+ /**
333
+ * 表名
334
+ */
335
+ tableName: string
336
+ /**
337
+ * 表字段
338
+ */
339
+ columns: ColumnOption[]
340
+ /**
341
+ * 定义存储文本数据时使用的编码. default: utf8mb4
342
+ */
343
+ charset?: string
344
+ /**
345
+ * 定义字符排序和比较规则的关键字. default: utf8mb4_0900_bin
346
+ */
347
+ collate?: string
348
+ /**
349
+ * 存储引擎. default: InnoDB
350
+ */
351
+ engine?: TABLE_ENGINE
352
+ }
353
+
354
+ interface tableCharacterParam {
355
+ charset: string
356
+ collate: string
357
+ engine: TABLE_ENGINE
358
+ }
359
+ interface DefineTableResult {
360
+ /**
361
+ * 表名
362
+ */
363
+ name: string
364
+ /**
365
+ * 创建表语句
366
+ */
367
+ createSQL: string
368
+ /**
369
+ * 表字段列表
370
+ */
371
+ fields: string[]
372
+ /**
373
+ * 表字段配置信息
374
+ */
375
+ columns: ColumnOption[]
376
+ /**
377
+ * 表字符集配置
378
+ */
379
+ tableCharacter: tableCharacterParam
380
+ }
381
+
382
+ interface InsertParam {
383
+ /**
384
+ * 表信息
385
+ */
386
+ t: DefineTableResult | { table: DefineTableResult; alias?: string }
387
+ /**
388
+ * 插入数据
389
+ */
390
+ params: Record<string, any> | Record<string, any>[]
391
+ }
392
+
393
+ interface DeleteParam {
394
+ /**
395
+ * 表名
396
+ */
397
+ t: TABLE_TYPE
398
+ /**
399
+ * 删除条件
400
+ */
401
+ condition: CONDITION_TYPE
402
+ }
403
+
404
+ interface UpdateParam {
405
+ /**
406
+ * 表信息
407
+ */
408
+ t: TABLE_TYPE
409
+ /**
410
+ * 更新数据
411
+ */
412
+ params: Record<string, any>
413
+ /**
414
+ * 更新条件
415
+ */
416
+ condition: CONDITION_TYPE
417
+ }
418
+
419
+ /**
420
+ * 批量更新参数|唯一索引键更新
421
+ */
422
+ interface DuplicateUpdateParam {
423
+ /**
424
+ * 表信息
425
+ */
426
+ t: TABLE_TYPE
427
+ /**
428
+ * 配置参数
429
+ */
430
+ data: Record<string, any>[]
431
+ /**
432
+ * 唯一索引字段名
433
+ */
434
+ unique?: string
435
+ /**
436
+ * 不更新字段
437
+ */
438
+ excludeField?: string | string[]
439
+ /**
440
+ * 更新条件
441
+ */
442
+ condition?: CONDITION_TYPE
443
+ }
444
+
445
+ /**
446
+ * 批量更新参数|条件更新
447
+ */
448
+ interface ConditionBatchUpdateParam {
449
+ /**
450
+ * 表信息
451
+ */
452
+ t: TABLE_TYPE
453
+ /**
454
+ * 条件字段
455
+ */
456
+ conditionField: string
457
+ /**
458
+ * 数据
459
+ */
460
+ data: Record<string, any>[]
461
+ }
462
+
463
+ interface BatchUpdateParam<
464
+ T extends DuplicateUpdateParam | ConditionBatchUpdateParam
465
+ > {
466
+ type: 'DUPLICATE' | 'CASE_WHEN' | 'TEMPORARY'
467
+ params: T
468
+ }
469
+
470
+ interface TransactionChange<T, ResultSetHeader> {
471
+ /**
472
+ * 执行数据插入语句
473
+ *
474
+ * Execute the data insert statement
475
+ */
476
+ insert(v: InsertParam): Promise<ResultSetHeader>
477
+ /**
478
+ * 执行数据批量更新语句
479
+ *
480
+ * Execute data batch update statements
481
+ */
482
+ batchUpdate(v: T): Promise<ResultSetHeader>
483
+ /**
484
+ * 执行数据删除语句
485
+ *
486
+ * Execute a data delete statement
487
+ */
488
+ delete(v: DeleteParam): Promise<ResultSetHeader>
489
+ /**
490
+ * 执行数据更新语句
491
+ *
492
+ * Execute the data update statement
493
+ */
494
+ update(v: UpdateParam): Promise<ResultSetHeader>
495
+ }
496
+
497
+ /**
498
+ * 事务参数配置
499
+ */
500
+ interface TransactionParams<
501
+ T extends DuplicateUpdateParam | ConditionBatchUpdateParam,
502
+ ResultSetHeader,
503
+ QueryResult
504
+ > {
505
+ /**
506
+ * 执行原SQL语句
507
+ *
508
+ * Execute query statement
509
+ * @param param 参数值
510
+ * @returns
511
+ */
512
+ sql(sql: string, param?: VALUE_TYPE): Promise<QueryResult>
513
+ /**
514
+ * 执行查询语句
515
+ *
516
+ * Execute query statement
517
+ * @param v 配置参数信息
518
+ * @returns
519
+ */
520
+ query(v: ExecQueryParam): Promise<Record<string, any>[]>
521
+ /**
522
+ * 执行查询数据详情语句
523
+ *
524
+ * Execute the statement to query data details
525
+ * @param v 参数信息
526
+ */
527
+ detail(v: ExecQueryBaseParam): Promise<Record<string, any> | undefined>
528
+ /**
529
+ * 获取数据总数
530
+ * @param v 参数信息
531
+ */
532
+ count(v: QueryCountParam): Promise<number>
533
+ /**
534
+ * 数据更新函数
535
+ */
536
+ change: TransactionChange<BatchUpdateParam<T>, ResultSetHeader>
537
+ }
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "@aicblock/emysql",
3
+ "version": "1.3.0",
4
+ "description": "🛠️ Based on the basic secondary package of `mysql`, the pursuit of creating a simple and easy to use `mysql-ORM` library.",
5
+ "main": "lib/index.js",
6
+ "scripts": {
7
+ "package": "ts-node ./scripts/build.ts",
8
+ "doc": "npm run -C ./doc dev",
9
+ "doc:build": "npm run -C ./doc build",
10
+ "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 1",
11
+ "test": "jest --coverage",
12
+ "prepare": "husky"
13
+ },
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "https://gitee.com/aiclouddigit/e-mysql"
17
+ },
18
+ "homepage": "http://emysql.aicblock.cn/",
19
+ "keywords": [
20
+ "MYSQL",
21
+ "AICBLOCKCN",
22
+ "ORM",
23
+ "nodejs",
24
+ "mysql-orm"
25
+ ],
26
+ "files": [
27
+ "lib"
28
+ ],
29
+ "author": "jieyang;damon;",
30
+ "license": "MIT",
31
+ "devDependencies": {
32
+ "@commitlint/cli": "^19.6.0",
33
+ "@commitlint/config-conventional": "^19.6.0",
34
+ "@dpapejs/node-utils": "^0.1.0",
35
+ "@types/jest": "^27.5.2",
36
+ "@types/node": "^16.4.10",
37
+ "conventional-changelog-cli": "^5.0.0",
38
+ "esbuild": "^0.21.3",
39
+ "husky": "^9.1.7",
40
+ "jest": "^27.5.1",
41
+ "ts-jest": "^27.1.3",
42
+ "ts-node": "^10.9.2"
43
+ },
44
+ "husky": {
45
+ "hooks": {
46
+ "commit-msg": "commitlint -E HUSKY_GIT_PARAMS,"
47
+ }
48
+ },
49
+ "dependencies": {
50
+ "mysql2": "^3.14.1"
51
+ }
52
+ }