dbtabla 2.2.1 → 2.2.2

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/index.mjs ADDED
@@ -0,0 +1,4 @@
1
+ import dbTabla from './index.js';
2
+
3
+ export default dbTabla;
4
+ export const { Connect, dbResult, dbRow, dbTablaError, procesingSql } = dbTabla;
package/lib/Connect.js CHANGED
@@ -1,12 +1,12 @@
1
- const fs=require("fs")
2
- const path=require("path")
3
- const dbTablaModel=require("tabla-model")
4
- const dbTabla=require(__dirname+"/dbTabla.js")
5
- const procesingSql = require('./procesingSql')
6
- /**
7
- * Connect
8
- * clase abstracta para crear la clase de conexion a la base de datos
9
- */
1
+ const fs = require("fs")
2
+ const path = require("path")
3
+ const dbTablaModel = require("tabla-model")
4
+ const dbTabla = require(__dirname + "/dbTabla.js")
5
+ const procesingSql = require('./procesingSql')
6
+ /**
7
+ * Connect
8
+ * clase abstracta para crear la clase de conexion a la base de datos
9
+ */
10
10
  class Connect {
11
11
  _escapeChar;
12
12
  _reserveIdentifiers;
@@ -17,248 +17,248 @@ class Connect {
17
17
  _models;
18
18
  _caheTablas;
19
19
  _createdTables;
20
- _escapeString;
21
- /**
22
- * constructor de la clase
23
- * @param {object} params - parametros de conexion
24
- */
25
- constructor(params,typeDB="")
26
- {
27
- this.config=params
28
- this._escapeChar=""
29
- this._reserveIdentifiers=["*"]
30
- this._ar_aliased_tables=[]
31
- this._dbprefix=""
32
- this._swap_pre=""
33
- this._information_schema = " "
34
- this._models={}
35
- this.typeDB=typeDB
36
- this._caheTablas={}
37
- }
38
- /**
39
- * retorna la configuracion para los helpers
40
- * @return {object}
41
- */
42
- helpersConf()
43
- {
44
- return {
45
- escapeChar:this._escapeChar,
46
- reserveIdentifiers:this._reserveIdentifiers,
47
- ar_aliased_tables:this._ar_aliased_tables,
48
- dbprefix:this._dbprefix,
49
- swap_pre:this._swap_pre,
50
- typeDB:this.typeDB,
51
- escapeString:typeof this._escapeString==="function"?e=>this._escapeString(e):null
52
- }
53
- }
54
- /**
55
- * retorna el modelo asociado a la tabla
56
- * @param {string} tabla - nombre de la tabla
57
- * @return {dbTablaModel|boolean} - si el modelo no existe retorna false
58
- */
59
- model(tabla)
60
- {
61
-
62
- return this._models[tabla] instanceof dbTablaModel?this._models[tabla]:false
63
- }
64
- /**
65
- * agrega un modelo a la lista de modelos interna
66
- * @param {sqlModel|object|string} model - objeto modelo
67
- */
68
- addModel(model)
69
- {
70
- if(model instanceof dbTablaModel)
71
- {
72
- this._models[model.tabla]=model
73
- }else if(typeof model==="object" && model!==null){
74
- this._models[model.tabla]= new dbTablaModel(model.tabla,model)
75
- }else {
76
- this._models[model.tabla]= new dbTablaModel(model,this.helpersConf().escapeChar)
77
- }
78
-
79
- }
80
- /**
81
- * agrega todos los modelos existentes en un directorio a la lista interna
82
- * @param {string} pathModel - directorio de modelos
83
- */
84
- pathModels(pathModel)
85
- {
86
- let files=fs.readdirSync(pathModel)
87
- for(let i in files)
88
- {
89
-
90
- if(/(\.js)$/i.test(files[i]))
91
- {
92
- let model=require(path.join(pathModel,files[i]))
93
- if(model instanceof dbTablaModel)
94
- {
95
- this.addModel(model)
96
- }
97
-
98
- }
99
-
100
- }
101
-
102
- }
103
- /**
104
- * metodo abstracto en su redefinicion debere generar una
105
- * consulta a la base de datos y debe retornar una promesa
106
- * @param {string} query - consulta sql
107
- * @return {Promise}
108
- */
109
- query(query)
110
- {
111
- return new Promise((res)=>
112
- {
113
- res(query)
114
- })
115
- }
116
- /**
117
- * construlle un objeto dbtabla asociado a el nombre
118
- * de la tabla del primer parametro
119
- * @param {string} tabla - nombre de la tabla en la base de datos
120
- * @param {function} callback - funcion anomina que se ejecutara cuando se verifique la existencia de la tabla
121
- * @param {boolean} verify - indicara si se verificara la existencia de la tabla o se esperara a la primera consulta
122
- * @return {dbTabla}
123
- */
124
- tabla(tabla,callback,verify=false)
125
- {
126
- if(typeof this._caheTablas[tabla]!=="undefined")
127
- {
128
- typeof callback==="function"?callback(this._caheTablas[tabla]):null
129
- return this._caheTablas[tabla]
130
- }
131
- return this._caheTablas[tabla] = new dbTabla({
132
- tabla:tabla,
133
- connection:this,
134
- callback:callback,
135
- config:this.helpersConf()
136
- },verify)
137
- //console.log(config)
138
-
139
- }
140
- /**
141
- * metodo abstracto que escapara el texto sql
142
- * @param {string} str - texto
143
- * @return {string}
144
- */
145
- /*__escapeString(str)
146
- {
147
- return str
148
- }*/
149
-
150
-
151
- /**
152
- * metodo abstracto que verificara la existencia de la tabla
153
- * en la base de datos y retornar una promesa
154
- * el valor de la promesa debe ser en el siguiente formato
155
- * {
156
- * tabla:{string} - nombre de la tabla
157
- * colums:{array} - columnas de la tabla
158
- * }
159
- * @param {string} table - nombre de la tabla
160
- * @return {Promise}
161
- */
162
- _keysInTable(table)
163
- {
164
- return new Promise((res)=>
165
- {
166
- res({
167
- tabla:table,
168
- colums:[]
169
- })
170
- })
171
- }
172
- /**
173
- * Verifica si la tabla esta representada en un modelo si el parametro create es true
174
- * se intentara crear la tabla e inicializarla retorna una promesa si no existe el modelo
175
- * lanzara un catch
176
- *
177
- * @param {string} tabla - nombre de la tabla
178
- * @param {boolean} create - existencia en la base de datos
179
- * @return {Promise}
180
- */
181
- inModel(tabla,create)
182
- {
183
- return new Promise((res,rej)=>{
184
- if(!this.model(tabla))
185
- {
186
- rej()
187
- }else
188
- {
189
-
190
- if(create)
191
- {
192
-
193
- this._createTable(this.model(tabla))
194
- .then(res).catch(rej)
195
- }else
196
- {
197
- res(this.model(tabla).getData())
198
- }
199
- }
200
- })
201
- }
202
- /**
203
- * crea una tabla en la base de datos apartir de un modelo
204
- * si la tabla tiene claves foraneas intentara crear primero
205
- * las tablas a las que apuntan
206
- * @param {dbTablaModel} model - objeto del modelo
207
- * @return {Promise}
208
- */
209
- _createTable(model)
210
- {
211
-
212
- return new Promise((res,rej)=>
213
- {
214
- this._createdTables={}
215
- let rescursive=(foreingKey,i)=>
216
- {
217
-
218
- if(foreingKey[i]!==undefined)
219
- {
220
- try
221
- {
222
- this.tabla(foreingKey[i].reference,(t)=>
223
- {
224
- rescursive(foreingKey,++i)
225
- },true)
226
- }catch(e){rej(e)}
227
- }else {
228
-
229
- this.query(model.sql(this)).then(()=>{
230
- this._createdTables[model.tabla]=true
231
- this._initializeTable(model.tabla).then(()=>
232
- {
233
-
234
- res(model.getData())
235
- }).catch(rej)
236
- }).catch(rej)
237
- }
238
- }
239
- rescursive(model.foreingKey(),0)
240
- })
241
- }
242
- _initializeTable(tab)
243
- {
244
- return new Promise(async(res)=>
245
- {
246
-
247
- let sql=new procesingSql(this.model(tab).getData(),this.helpersConf())
248
- let init=this.model(tab).getData().init
249
-
250
- if(init.length<1)
251
- {
252
- return res()
253
- }
254
- for(let item of init)
255
- {
256
- await this.query(sql.insert(item))
257
- }
258
- res()
259
-
260
- })
261
-
262
- }
263
- }
264
- module.exports=Connect
20
+ _escapeString;
21
+ /**
22
+ * constructor de la clase
23
+ * @param {object} params - parametros de conexion
24
+ */
25
+ constructor(params, typeDB = "") {
26
+ this.config = params
27
+ this._escapeChar = ""
28
+ this._reserveIdentifiers = ["*"]
29
+ this._ar_aliased_tables = []
30
+ this._dbprefix = ""
31
+ this._swap_pre = ""
32
+ this._information_schema = " "
33
+ this._models = {}
34
+ this.typeDB = typeDB
35
+ this._caheTablas = {}
36
+ }
37
+ /**
38
+ * retorna la configuracion para los helpers
39
+ * @return {object}
40
+ */
41
+ helpersConf() {
42
+ return {
43
+ escapeChar: this._escapeChar,
44
+ reserveIdentifiers: this._reserveIdentifiers,
45
+ ar_aliased_tables: this._ar_aliased_tables,
46
+ dbprefix: this._dbprefix,
47
+ swap_pre: this._swap_pre,
48
+ typeDB: this.typeDB,
49
+ escapeString: typeof this._escapeString === "function" ? e => this._escapeString(e) : null
50
+ }
51
+ }
52
+ /**
53
+ * retorna el modelo asociado a la tabla
54
+ * @param {string} tabla - nombre de la tabla
55
+ * @return {dbTablaModel|boolean} - si el modelo no existe retorna false
56
+ */
57
+ model(tabla) {
58
+
59
+ return this._models[tabla] instanceof dbTablaModel ? this._models[tabla] : false
60
+ }
61
+ /**
62
+ * agrega un modelo a la lista de modelos interna
63
+ * @param {sqlModel|object|string} model - objeto modelo
64
+ */
65
+ addModel(model) {
66
+ if (model instanceof dbTablaModel) {
67
+ this._models[model.tabla] = model
68
+ } else if (typeof model === "object" && model !== null) {
69
+ this._models[model.tabla] = new dbTablaModel(model.tabla, model)
70
+ } else {
71
+ this._models[model.tabla] = new dbTablaModel(model, this.helpersConf().escapeChar)
72
+ }
73
+
74
+ }
75
+ /**
76
+ * agrega todos los modelos existentes en un directorio a la lista interna
77
+ * @param {string} pathModel - directorio de modelos
78
+ */
79
+ pathModels(pathModel) {
80
+ const { pathToFileURL } = require('url')
81
+ let files = fs.readdirSync(pathModel)
82
+
83
+ let isEsmProject = false
84
+ try {
85
+ const pkgPath = path.join(process.cwd(), 'package.json')
86
+ if (fs.existsSync(pkgPath)) {
87
+ isEsmProject = JSON.parse(fs.readFileSync(pkgPath, 'utf8')).type === 'module'
88
+ }
89
+ } catch (e) { }
90
+
91
+ for (let i in files) {
92
+
93
+ if (/(\.js|\.mjs|\.cjs)$/i.test(files[i])) {
94
+ let filePath = path.join(pathModel, files[i])
95
+
96
+ if (isEsmProject || /\.mjs$/i.test(files[i])) {
97
+ import(pathToFileURL(filePath).href).then(module => {
98
+ let model = module.default || module
99
+ if (model instanceof dbTablaModel) {
100
+ this.addModel(model)
101
+ }
102
+ }).catch(e => console.error(`Error loading ESM model ${files[i]}:`, e))
103
+ } else {
104
+ try {
105
+ let model = require(filePath)
106
+ if (model && model.default) model = model.default
107
+ if (model instanceof dbTablaModel) {
108
+ this.addModel(model)
109
+ }
110
+ } catch (e) {
111
+ import(pathToFileURL(filePath).href).then(module => {
112
+ let model = module.default || module
113
+ if (model instanceof dbTablaModel) {
114
+ this.addModel(model)
115
+ }
116
+ }).catch(err => console.error(`Error loading model ${files[i]}:`, err))
117
+ }
118
+ }
119
+
120
+ }
121
+
122
+ }
123
+
124
+ }
125
+ /**
126
+ * metodo abstracto en su redefinicion debere generar una
127
+ * consulta a la base de datos y debe retornar una promesa
128
+ * @param {string} query - consulta sql
129
+ * @return {Promise}
130
+ */
131
+ query(query) {
132
+ return new Promise((res) => {
133
+ res(query)
134
+ })
135
+ }
136
+ /**
137
+ * construlle un objeto dbtabla asociado a el nombre
138
+ * de la tabla del primer parametro
139
+ * @param {string} tabla - nombre de la tabla en la base de datos
140
+ * @param {function} callback - funcion anomina que se ejecutara cuando se verifique la existencia de la tabla
141
+ * @param {boolean} verify - indicara si se verificara la existencia de la tabla o se esperara a la primera consulta
142
+ * @return {dbTabla}
143
+ */
144
+ tabla(tabla, callback, verify = false) {
145
+ if (typeof this._caheTablas[tabla] !== "undefined") {
146
+ typeof callback === "function" ? callback(this._caheTablas[tabla]) : null
147
+ return this._caheTablas[tabla]
148
+ }
149
+ return this._caheTablas[tabla] = new dbTabla({
150
+ tabla: tabla,
151
+ connection: this,
152
+ callback: callback,
153
+ config: this.helpersConf()
154
+ }, verify)
155
+ //console.log(config)
156
+
157
+ }
158
+ /**
159
+ * metodo abstracto que escapara el texto sql
160
+ * @param {string} str - texto
161
+ * @return {string}
162
+ */
163
+ /*__escapeString(str)
164
+ {
165
+ return str
166
+ }*/
167
+
168
+
169
+ /**
170
+ * metodo abstracto que verificara la existencia de la tabla
171
+ * en la base de datos y retornar una promesa
172
+ * el valor de la promesa debe ser en el siguiente formato
173
+ * {
174
+ * tabla:{string} - nombre de la tabla
175
+ * colums:{array} - columnas de la tabla
176
+ * }
177
+ * @param {string} table - nombre de la tabla
178
+ * @return {Promise}
179
+ */
180
+ _keysInTable(table) {
181
+ return new Promise((res) => {
182
+ res({
183
+ tabla: table,
184
+ colums: []
185
+ })
186
+ })
187
+ }
188
+ /**
189
+ * Verifica si la tabla esta representada en un modelo si el parametro create es true
190
+ * se intentara crear la tabla e inicializarla retorna una promesa si no existe el modelo
191
+ * lanzara un catch
192
+ *
193
+ * @param {string} tabla - nombre de la tabla
194
+ * @param {boolean} create - existencia en la base de datos
195
+ * @return {Promise}
196
+ */
197
+ inModel(tabla, create) {
198
+ return new Promise((res, rej) => {
199
+ if (!this.model(tabla)) {
200
+ rej()
201
+ } else {
202
+
203
+ if (create) {
204
+
205
+ this._createTable(this.model(tabla))
206
+ .then(res).catch(rej)
207
+ } else {
208
+ res(this.model(tabla).getData())
209
+ }
210
+ }
211
+ })
212
+ }
213
+ /**
214
+ * crea una tabla en la base de datos apartir de un modelo
215
+ * si la tabla tiene claves foraneas intentara crear primero
216
+ * las tablas a las que apuntan
217
+ * @param {dbTablaModel} model - objeto del modelo
218
+ * @return {Promise}
219
+ */
220
+ _createTable(model) {
221
+
222
+ return new Promise((res, rej) => {
223
+ this._createdTables = {}
224
+ let rescursive = (foreingKey, i) => {
225
+
226
+ if (foreingKey[i] !== undefined) {
227
+ try {
228
+ this.tabla(foreingKey[i].reference, (t) => {
229
+ rescursive(foreingKey, ++i)
230
+ }, true)
231
+ } catch (e) { rej(e) }
232
+ } else {
233
+
234
+ this.query(model.sql(this)).then(() => {
235
+ this._createdTables[model.tabla] = true
236
+ this._initializeTable(model.tabla).then(() => {
237
+
238
+ res(model.getData())
239
+ }).catch(rej)
240
+ }).catch(rej)
241
+ }
242
+ }
243
+ rescursive(model.foreingKey(), 0)
244
+ })
245
+ }
246
+ _initializeTable(tab) {
247
+ return new Promise(async (res) => {
248
+
249
+ let sql = new procesingSql(this.model(tab).getData(), this.helpersConf())
250
+ let init = this.model(tab).getData().init
251
+
252
+ if (init.length < 1) {
253
+ return res()
254
+ }
255
+ for (let item of init) {
256
+ await this.query(sql.insert(item))
257
+ }
258
+ res()
259
+
260
+ })
261
+
262
+ }
263
+ }
264
+ module.exports = Connect
@@ -530,6 +530,7 @@ class prosesingSql {
530
530
  if (!(campos instanceof Array) || campos===[])
531
531
  {
532
532
  return this.#helpers.campos([ this.tabla + ".*"])
533
+
533
534
  }
534
535
  return this.#helpers.campos(campos)
535
536
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dbtabla",
3
- "version": "2.2.1",
3
+ "version": "2.2.2",
4
4
  "description": "interface de alto nivel para sql",
5
5
  "license": "MIT",
6
6
  "author": "enyerverfranco@gmail.com",
@@ -9,9 +9,15 @@
9
9
  "url": "git+https://github.com/ever23/dbtabla.git"
10
10
  },
11
11
  "main": "index.js",
12
+ "exports": {
13
+ ".": {
14
+ "require": "./index.js",
15
+ "import": "./index.mjs"
16
+ }
17
+ },
12
18
  "scripts": {
13
19
  "lint": "eslint ./index.js ./lib",
14
- "test": "node --test ./test/index.js"
20
+ "test": "node --test ./test/"
15
21
  },
16
22
  "keywords": [
17
23
  "sql",
@@ -1,36 +0,0 @@
1
- const fs = require('fs');
2
- const path = require('path');
3
-
4
- const libDir = 'c:/programacion/dbtabla/dbtabla/lib';
5
-
6
- // 1. Refactor Connect.js
7
- let connectFile = path.join(libDir, 'Connect.js');
8
- let connectCode = fs.readFileSync(connectFile, 'utf8');
9
- connectCode = connectCode.replace(/class Connect\s*\{/, 'class Connect {\n #escapeChar;\n #reserveIdentifiers;\n #ar_aliased_tables;\n #dbprefix;\n #swap_pre;\n #information_schema;\n #models;\n #caheTablas;\n #createdTables;\n #escapeString;');
10
- connectCode = connectCode.replace(/this\.__/g, 'this.#');
11
- connectCode = connectCode.replace(/^(\s*)__([a-zA-Z0-9_]+)\s*\(/gm, '$1#$2(');
12
- fs.writeFileSync(connectFile, connectCode);
13
-
14
- // 2. Refactor dbTabla.js
15
- let dbTablaFile = path.join(libDir, 'dbTabla.js');
16
- let dbTablaCode = fs.readFileSync(dbTablaFile, 'utf8');
17
- dbTablaCode = dbTablaCode.replace(/class dbTabla\s*\{/, 'class dbTabla {\n #connection;\n #lastSql;\n #keys;\n #callbackKey;\n #config;\n\n get lastSql() { return this.#lastSql; }\n');
18
- dbTablaCode = dbTablaCode.replace(/this\.__/g, 'this.#');
19
- dbTablaCode = dbTablaCode.replace(/^(\s*)__([a-zA-Z0-9_]+)\s*\(/gm, '$1#$2(');
20
- fs.writeFileSync(dbTablaFile, dbTablaCode);
21
-
22
- // 3. Refactor procesingSql.js
23
- let procesingSqlFile = path.join(libDir, 'procesingSql.js');
24
- let procesingSqlCode = fs.readFileSync(procesingSqlFile, 'utf8');
25
- procesingSqlCode = procesingSqlCode.replace(/class prosesingSql\s*\{/, 'class prosesingSql {\n #helpers;');
26
- procesingSqlCode = procesingSqlCode.replace(/this\.__/g, 'this.#');
27
- procesingSqlCode = procesingSqlCode.replace(/^(\s*)__([a-zA-Z0-9_]+)\s*\(/gm, '$1#$2(');
28
- fs.writeFileSync(procesingSqlFile, procesingSqlCode);
29
-
30
- // 4. Refactor dbResult.js (read exposed property)
31
- let dbResultFile = path.join(libDir, 'dbResult.js');
32
- let dbResultCode = fs.readFileSync(dbResultFile, 'utf8');
33
- dbResultCode = dbResultCode.replace(/dbTabla\.__lastSql/g, 'dbTabla.lastSql');
34
- fs.writeFileSync(dbResultFile, dbResultCode);
35
-
36
- console.log('Refactoring completed successfully.');
package/test_results.txt DELETED
@@ -1,65 +0,0 @@
1
- 
2
- > dbtabla@2.1.1 test
3
- > node --test ./test/index.js
4
-
5
- ÔûÂ test de dbTabla
6
- ÔûÂ Test de la clase prosessingSql
7
- Ô£ö verificacion de metodos (1.2094ms)
8
- Ô£ö metodo busqueda (2.2858ms)
9
- Ô£ö metodo select (1.1186ms)
10
- Ô£ö metodo select (0.2998ms)
11
- Ô£ö metodo insert (0.6902ms)
12
- Ô£ö metodo update (0.4324ms)
13
- Ô£ö metodo delete (0.3132ms)
14
- Ô£ö Test de la clase prosessingSql (7.4947ms)
15
- ÔûÂ Test de la clase Connect
16
- Ô£ö verificacion de metodos (0.2097ms)
17
- Ô£ö verificacion de modelos (2.2262ms)
18
- Ô£ö verificacion de tabla (0.3958ms)
19
- Ô£ö Test de la clase Connect (3.0674ms)
20
- ÔûÂ Test de la clase dbRow
21
- Ô£ö verificacion de metodos (0.2598ms)
22
- Ô£û metodo update (1.4786ms)
23
- Ô£ö metodo update sin claves primarias (0.367ms)
24
- Ô£û metodo delete (0.6469ms)
25
- Ô£ö metodo delete sin claves primarias (0.246ms)
26
- Ô£û Test de la clase dbRow (3.3226ms)
27
- Ô£û test de dbTabla (14.5938ms)
28
- Ôä╣ tests 15
29
- Ôä╣ suites 4
30
- Ôä╣ pass 13
31
- Ôä╣ fail 2
32
- Ôä╣ cancelled 0
33
- Ôä╣ skipped 0
34
- Ôä╣ todo 0
35
- Ôä╣ duration_ms 168.9837
36
-
37
- Ô£û failing tests:
38
-
39
- test at test\dbRow.js:74:5
40
- Ô£û metodo update (1.4786ms)
41
- AssertionError [ERR_ASSERTION]: "UPDATE test1 SET col1=2343 WHERE id=1 AND col1=234 AND col2='row';" == 'UPDATE test1 SET col1=2343 WHERE id=1;'
42
- at C:\programacion\dbtabla\dbtabla\test\dbRow.js:90:20
43
- at async Test.run (node:internal/test_runner/test:1125:7)
44
- at async Suite.processPendingSubtests (node:internal/test_runner/test:787:7) {
45
- generatedMessage: true,
46
- code: 'ERR_ASSERTION',
47
- actual: "UPDATE test1 SET col1=2343 WHERE id=1 AND col1=234 AND col2='row';",
48
- expected: 'UPDATE test1 SET col1=2343 WHERE id=1;',
49
- operator: '==',
50
- diff: 'simple'
51
- }
52
-
53
- test at test\dbRow.js:111:5
54
- Ô£û metodo delete (0.6469ms)
55
- AssertionError [ERR_ASSERTION]: "DELETE FROM test1 WHERE id=1 AND col1=234 AND col2='row';" == 'DELETE FROM test1 WHERE id=1;'
56
- at C:\programacion\dbtabla\dbtabla\test\dbRow.js:122:20
57
- at async Test.run (node:internal/test_runner/test:1125:7)
58
- at async Suite.processPendingSubtests (node:internal/test_runner/test:787:7) {
59
- generatedMessage: true,
60
- code: 'ERR_ASSERTION',
61
- actual: "DELETE FROM test1 WHERE id=1 AND col1=234 AND col2='row';",
62
- expected: 'DELETE FROM test1 WHERE id=1;',
63
- operator: '==',
64
- diff: 'simple'
65
- }