lupine.api 1.1.57 → 1.1.59

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.
Files changed (137) hide show
  1. package/README.md +3 -3
  2. package/admin/admin-about.tsx +12 -16
  3. package/admin/admin-config.tsx +47 -44
  4. package/admin/admin-css.tsx +3 -3
  5. package/admin/admin-db.tsx +75 -75
  6. package/admin/admin-frame-helper.tsx +364 -364
  7. package/admin/admin-frame.tsx +164 -164
  8. package/admin/admin-index.tsx +65 -65
  9. package/admin/admin-login.tsx +111 -111
  10. package/admin/admin-menu-edit.tsx +637 -637
  11. package/admin/admin-menu-list.tsx +87 -87
  12. package/admin/admin-page-edit.tsx +564 -564
  13. package/admin/admin-page-list.tsx +83 -83
  14. package/admin/admin-performance.tsx +28 -28
  15. package/admin/admin-release.tsx +427 -404
  16. package/admin/admin-resources.tsx +382 -382
  17. package/admin/admin-shell.tsx +89 -89
  18. package/admin/admin-table-data.tsx +146 -146
  19. package/admin/admin-table-list.tsx +230 -230
  20. package/admin/admin-test-animations.tsx +395 -395
  21. package/admin/admin-test-component.tsx +823 -808
  22. package/admin/admin-test-edit.tsx +319 -319
  23. package/admin/admin-test-themes.tsx +56 -56
  24. package/admin/admin-tokens.tsx +338 -338
  25. package/admin/design/admin-design.tsx +174 -174
  26. package/admin/design/block-grid.tsx +36 -36
  27. package/admin/design/block-grid1.tsx +21 -21
  28. package/admin/design/block-paragraph.tsx +19 -19
  29. package/admin/design/block-title.tsx +19 -19
  30. package/admin/design/design-block-box.tsx +140 -140
  31. package/admin/design/drag-data.tsx +24 -24
  32. package/admin/index.ts +9 -9
  33. package/admin/package.json +15 -15
  34. package/admin/tsconfig.json +127 -127
  35. package/dev/copy-folder.js +32 -32
  36. package/dev/cp-index-html.js +69 -69
  37. package/dev/file-utils.js +12 -12
  38. package/dev/index.js +18 -19
  39. package/dev/package.json +12 -12
  40. package/dev/plugin-ifelse.js +168 -168
  41. package/dev/plugin-ifelse.test.js +37 -37
  42. package/dev/run-cmd.js +14 -14
  43. package/dev/send-request.js +12 -12
  44. package/package.json +55 -55
  45. package/src/admin-api/admin-api-helper.ts +210 -205
  46. package/src/admin-api/admin-api.ts +65 -65
  47. package/src/admin-api/admin-auth.ts +152 -146
  48. package/src/admin-api/admin-config.ts +94 -84
  49. package/src/admin-api/admin-csv.ts +94 -94
  50. package/src/admin-api/admin-db.ts +269 -269
  51. package/src/admin-api/admin-menu.ts +135 -135
  52. package/src/admin-api/admin-page.ts +135 -135
  53. package/src/admin-api/admin-performance.ts +128 -128
  54. package/src/admin-api/admin-release.ts +703 -700
  55. package/src/admin-api/admin-resources.ts +318 -318
  56. package/src/admin-api/admin-token-helper.ts +82 -79
  57. package/src/admin-api/admin-tokens.ts +90 -90
  58. package/src/admin-api/index.ts +2 -2
  59. package/src/admin-api/web-config-api.ts +19 -19
  60. package/src/api/api-cache.ts +103 -103
  61. package/src/api/api-helper.ts +44 -44
  62. package/src/api/api-module.ts +67 -60
  63. package/src/api/api-router.ts +177 -177
  64. package/src/api/api-shared-storage.ts +64 -64
  65. package/src/api/async-storage.ts +5 -5
  66. package/src/api/debug-service.ts +56 -56
  67. package/src/api/encode-html.ts +27 -27
  68. package/src/api/handle-status.ts +75 -75
  69. package/src/api/index.ts +15 -16
  70. package/src/api/mini-web-socket.ts +270 -270
  71. package/src/api/server-content-type.ts +82 -82
  72. package/src/api/server-render.ts +235 -215
  73. package/src/api/shell-service.ts +74 -74
  74. package/src/api/simple-storage.ts +80 -80
  75. package/src/api/static-server.ts +128 -125
  76. package/src/api/to-client-delivery.ts +26 -26
  77. package/src/app/app-cache.ts +55 -55
  78. package/src/app/app-helper.ts +62 -62
  79. package/src/app/app-message.ts +109 -109
  80. package/src/app/app-shared-storage.ts +363 -363
  81. package/src/app/app-start.ts +136 -136
  82. package/src/app/cleanup-exit.ts +16 -16
  83. package/src/app/host-to-path.ts +38 -38
  84. package/src/app/index.ts +11 -11
  85. package/src/app/process-dev-requests.ts +130 -130
  86. package/src/app/web-listener.ts +294 -294
  87. package/src/app/web-processor.ts +47 -42
  88. package/src/app/web-server.ts +100 -100
  89. package/src/common-js/web-env.js +104 -104
  90. package/src/index.ts +7 -7
  91. package/src/lang/api-lang-en.ts +26 -26
  92. package/src/lang/api-lang-zh-cn.ts +27 -27
  93. package/src/lang/index.ts +2 -2
  94. package/src/lang/lang-helper.ts +76 -76
  95. package/src/lang/lang-props.ts +6 -6
  96. package/src/lib/db/db-helper.ts +23 -23
  97. package/src/lib/db/db-mysql.ts +249 -250
  98. package/src/lib/db/db-sqlite.ts +101 -101
  99. package/src/lib/db/db.spec.ts +28 -28
  100. package/src/lib/db/db.ts +325 -325
  101. package/src/lib/db/index.ts +5 -5
  102. package/src/lib/index.ts +3 -3
  103. package/src/lib/logger.spec.ts +214 -214
  104. package/src/lib/logger.ts +281 -281
  105. package/src/lib/runtime-require.ts +37 -37
  106. package/src/lib/utils/cookie-util.ts +34 -34
  107. package/src/lib/utils/crypto.ts +58 -58
  108. package/src/lib/utils/date-utils.ts +317 -317
  109. package/src/lib/utils/deep-merge.ts +37 -37
  110. package/src/lib/utils/delay.ts +12 -12
  111. package/src/lib/utils/file-setting.ts +55 -55
  112. package/src/lib/utils/format-bytes.ts +11 -11
  113. package/src/lib/utils/fs-utils.ts +158 -158
  114. package/src/lib/utils/get-env.ts +27 -27
  115. package/src/lib/utils/index.ts +12 -12
  116. package/src/lib/utils/is-type.ts +48 -48
  117. package/src/lib/utils/load-env.ts +14 -14
  118. package/src/lib/utils/pad.ts +6 -6
  119. package/src/models/api-base.ts +5 -5
  120. package/src/models/api-module-props.ts +10 -11
  121. package/src/models/api-router-props.ts +26 -26
  122. package/src/models/app-cache-props.ts +33 -33
  123. package/src/models/app-data-props.ts +10 -10
  124. package/src/models/app-helper-props.ts +6 -6
  125. package/src/models/app-shared-storage-props.ts +38 -38
  126. package/src/models/app-start-props.ts +18 -18
  127. package/src/models/async-storage-props.ts +13 -13
  128. package/src/models/db-config.ts +30 -30
  129. package/src/models/host-to-path-props.ts +12 -12
  130. package/src/models/index.ts +16 -16
  131. package/src/models/json-object.ts +8 -8
  132. package/src/models/locals-props.ts +36 -36
  133. package/src/models/logger-props.ts +84 -84
  134. package/src/models/simple-storage-props.ts +13 -14
  135. package/src/models/to-client-delivery-props.ts +6 -6
  136. package/tsconfig.json +115 -115
  137. package/dev/plugin-gen-versions.js +0 -20
package/src/lib/db/db.ts CHANGED
@@ -1,325 +1,325 @@
1
- import { Logger } from '../logger';
2
- import { DbConfig } from '../../models/db-config';
3
-
4
- // Instead, Boolean values are stored as integers 0 (false) and 1 (true).
5
- export type DbFieldExprssionProps = { exprssion: string; params?: (string | number)[] };
6
- export type DbFieldValue = { [key: string]: string | number };
7
- export type DbFieldExpression = { [key: string]: string | number | DbFieldExprssionProps };
8
- const isDbFieldExprssion = (value: any): value is DbFieldExprssionProps => {
9
- return value && typeof value === 'object' && 'exprssion' in value;
10
- };
11
-
12
- const logger = new Logger('db');
13
- export class Db {
14
- type: string;
15
- tablePrefix: string;
16
-
17
- constructor(option: DbConfig) {
18
- console.log(
19
- `init Db, type: ${option.type}, host: ${option.host}:${option.port}, user: ${option.user}, database: ${option.database}, filename: ${option.filename}`
20
- );
21
-
22
- this.type = option.type;
23
- this.tablePrefix = option.tablePrefix || 'tbl_';
24
- }
25
-
26
- public close() {
27
- throw new Error('Method not implemented');
28
- }
29
-
30
- public connect() {
31
- throw new Error('Method not implemented');
32
- }
33
-
34
- // public async createTable(table: string, fields: string[]): Promise<any> {
35
- // throw new Error('Method not implemented');
36
- // }
37
-
38
- public async getAllTables(addCount = false): Promise<any> {
39
- throw new Error('Method not implemented');
40
- }
41
-
42
- public async getAllTableNames(): Promise<string[]> {
43
- const result = await this.getAllTables(false);
44
- return result.map((item: any) => item.name);
45
- }
46
-
47
- public async getTableInfo(table: string): Promise<any> {
48
- throw new Error('Method not implemented');
49
- }
50
-
51
- // can be used like this: order by ${db.getRandomOrder()}
52
- // MySQL / MariaDB: RAND()
53
- // PostgreSQL, SQLite: RANDOM()
54
- // SQL Server: NEWID()
55
- public getRandomOrder(): string {
56
- if (this.type === 'mysql' || this.type === 'mariadb') {
57
- return 'RAND()';
58
- }
59
- if (this.type === 'postgres' || this.type === 'sqlite') {
60
- return 'RANDOM()';
61
- }
62
- if (this.type === 'sqlserver') {
63
- return 'NEWID()';
64
- }
65
- throw new Error(`Unsupported database type: ${this.type}`);
66
- }
67
-
68
- protected nativeQuery(sql: string, params?: any, isSelect?: boolean): Promise<any> {
69
- throw new Error('Method not implemented');
70
- }
71
-
72
- public async truncateTable(tableName: string): Promise<any> {
73
- throw new Error('Method not implemented');
74
- }
75
-
76
- public async select(sql: string, params?: any) {
77
- const fixedSql = this.replacePrefix(sql);
78
- return await this.nativeQuery(fixedSql, params, true);
79
- }
80
- public async execute(sql: string, params?: any) {
81
- const fixedSql = this.replacePrefix(sql);
82
- return await this.nativeQuery(fixedSql, params, false);
83
- }
84
- // public async query(sql: string, params?: any, addReturning?: boolean) {
85
- // try {
86
- // const fixedSql = this.replacePrefix(sql);
87
- // return await this.nativeQuery(fixedSql, params, addReturning);
88
- // } catch (err) {
89
- // console.log(err);
90
- // throw err;
91
- // }
92
- // }
93
-
94
- // public replacePrefixXX(tableName: string, fromPrefix?: string) {
95
- // if (!fromPrefix) {
96
- // fromPrefix = '$__';
97
- // }
98
-
99
- // if (tableName.startsWith(fromPrefix)) {
100
- // return this.tablePrefix + tableName.substring(fromPrefix.length);
101
- // }
102
- // return tableName;
103
- // }
104
-
105
- public replacePrefix(sql: string, fromPrefix?: string) {
106
- if (!fromPrefix || typeof fromPrefix === 'undefined') {
107
- fromPrefix = '$__';
108
- }
109
-
110
- var escaped = false;
111
- var quoteChar = '';
112
- sql = sql.trim();
113
- var n = sql.length;
114
-
115
- var startPos = 0;
116
- var literal = '';
117
- while (startPos < n) {
118
- var ip = sql.indexOf(fromPrefix, startPos);
119
- if (ip < 0) {
120
- break;
121
- }
122
-
123
- var j = sql.indexOf("'", startPos);
124
- var k = sql.indexOf('"', startPos);
125
- if (k >= 0 && (k < j || j < 0)) {
126
- quoteChar = '"';
127
- j = k;
128
- } else {
129
- quoteChar = "'";
130
- }
131
-
132
- if (j < 0) {
133
- j = n;
134
- }
135
- //literal += sql.substring(startPos, j).replace(prefix, this.tableprefix);
136
- literal += sql.substring(startPos, j).split(fromPrefix).join(this.tablePrefix);
137
- startPos = j;
138
-
139
- j = startPos + 1;
140
-
141
- if (j >= n) {
142
- break;
143
- }
144
-
145
- // quote comes first, find end of quote
146
- while (true) {
147
- k = sql.indexOf(quoteChar, j);
148
- escaped = false;
149
- if (k < 0) {
150
- break;
151
- }
152
- let l = k - 1;
153
- while (l >= 0 && sql.substring(l, l + 1) == '\\') {
154
- l--;
155
- escaped = !escaped;
156
- }
157
- if (escaped) {
158
- j = k + 1;
159
- continue;
160
- }
161
- break;
162
- }
163
- if (k < 0) {
164
- // error in the query - no end quote; ignore it
165
- break;
166
- }
167
- literal += sql.substring(startPos, k + 1);
168
- startPos = k + 1;
169
- }
170
- if (startPos < n) {
171
- literal += sql.substring(startPos, n);
172
- }
173
- return literal;
174
- }
175
-
176
- // public escapeId(field) {
177
- // return field;
178
- // }
179
-
180
- // public escape(field) {
181
- // return field;
182
- // }
183
-
184
- private selectBaseSql(table: string, fields?: string[], whereFieldValues?: DbFieldValue, orderSql?: string) {
185
- table = this.replacePrefix(table);
186
- let sql = 'SELECT ';
187
- if (fields && fields.length > 0) {
188
- sql += fields.join(',');
189
- } else {
190
- sql += '*';
191
- }
192
-
193
- sql += ' FROM ' + table;
194
- let params: any[] = [];
195
- if (whereFieldValues && Object.keys(whereFieldValues).length > 0) {
196
- sql +=
197
- ' WHERE ' +
198
- Object.keys(whereFieldValues)
199
- .map((item) => `${item}=?`)
200
- .join(' AND ');
201
- params = Object.values(whereFieldValues);
202
- }
203
- if (orderSql) {
204
- sql += ' ORDER BY ' + orderSql;
205
- }
206
- return { sql, params };
207
- }
208
-
209
- public async selectObject(
210
- table: string,
211
- fields?: string[],
212
- whereFieldValues?: DbFieldValue,
213
- orderSql?: string,
214
- limit?: number,
215
- offset?: number
216
- ) {
217
- const base = this.selectBaseSql(table, fields, whereFieldValues, orderSql);
218
- if (limit && limit > 0) {
219
- base.sql += ' LIMIT ' + limit;
220
- }
221
- if (typeof offset === 'number' && !isNaN(offset)) {
222
- base.sql += ' OFFSET ' + offset;
223
- }
224
- return await this.select(base.sql, base.params);
225
- }
226
-
227
- public async selectOneRow(
228
- table: string,
229
- fields?: string[],
230
- whereFieldValues?: DbFieldValue,
231
- orderSql?: string,
232
- offset?: number
233
- ) {
234
- const result = await this.selectObject(table, fields, whereFieldValues, orderSql, 1, offset);
235
- if (result && Array.isArray(result)) {
236
- return result[0];
237
- }
238
- return undefined;
239
- }
240
-
241
- public async selectOneResult(table: string, field: string, whereFieldValues?: DbFieldValue) {
242
- const base = this.selectBaseSql(table, [field], whereFieldValues);
243
- const result = await this.select(base.sql, base.params);
244
- if (result && Array.isArray(result)) {
245
- return result[0][Object.keys(result[0])[0]];
246
- }
247
- return undefined;
248
- }
249
-
250
- // return ids
251
- public async insertObject(table: string, fieldValues: DbFieldValue) {
252
- table = this.replacePrefix(table);
253
- const fields = Object.keys(fieldValues);
254
- const values = Array(fields.length).fill('?').join(',');
255
- let sql = 'INSERT INTO ' + table + ' (' + fields.join(',') + ') VALUES (' + values + ')';
256
- const params = Object.values(fieldValues);
257
- return await this.execute(sql, params);
258
- }
259
-
260
- public async updateObject(table: string, updateFieldValues: DbFieldExpression, whereFieldValues: DbFieldValue) {
261
- table = this.replacePrefix(table);
262
- const fields = Object.keys(updateFieldValues);
263
- const setClauseParts: string[] = [];
264
- const params: (string | number)[] = [];
265
- // let sql = 'UPDATE ' + table + ' SET ' + fields.map((item) => `${item}=?`).join(',');
266
- // const params = Object.values(updateFieldValues);
267
- for (const field of fields) {
268
- const value = updateFieldValues[field];
269
-
270
- // expression
271
- if (isDbFieldExprssion(value)) {
272
- setClauseParts.push(`${field} = ${value.exprssion}`);
273
- if (value.params) params.push(...value.params);
274
- } else {
275
- // static value
276
- setClauseParts.push(`${field} = ?`);
277
- params.push(value);
278
- }
279
- }
280
-
281
- let sql = `UPDATE ${table} SET ${setClauseParts.join(', ')}`;
282
- if (whereFieldValues && Object.keys(whereFieldValues).length > 0) {
283
- sql +=
284
- ' WHERE ' +
285
- Object.keys(whereFieldValues)
286
- .map((item) => `${item}=?`)
287
- .join(' AND ');
288
- params.push(...Object.values(whereFieldValues));
289
- }
290
- return await this.execute(sql, params);
291
- }
292
-
293
- public async deleteObject(table: string, whereFieldValues: DbFieldValue) {
294
- table = this.replacePrefix(table);
295
- let sql =
296
- 'DELETE FROM ' +
297
- table +
298
- ' WHERE ' +
299
- Object.keys(whereFieldValues)
300
- .map((item) => `${item}=?`)
301
- .join(' AND ');
302
- const params = Object.values(whereFieldValues);
303
-
304
- return await this.execute(sql, params);
305
- }
306
-
307
- // public async hasTable(table: string): Promise<boolean> {
308
- // table = this.replacePrefix(table);
309
- // return await this.knex.schema.hasTable(table);
310
- // }
311
-
312
- // public async createTable(table: string, funCallback: (tableBuilder: Knex.CreateTableBuilder) => any) {
313
- // table = this.replacePrefix(table);
314
- // return await this.knex.schema.createTable(table, funCallback);
315
- // }
316
-
317
- // public async dropTable(table: string) {
318
- // table = this.replacePrefix(table);
319
- // return await this.knex.schema.dropTableIfExists(table);
320
- // }
321
-
322
- public async testConnection() {
323
- return await this.select('select 1+1 as result');
324
- }
325
- }
1
+ import { Logger } from '../logger';
2
+ import { DbConfig } from '../../models/db-config';
3
+
4
+ // Instead, Boolean values are stored as integers 0 (false) and 1 (true).
5
+ export type DbFieldExprssionProps = { exprssion: string; params?: (string | number)[] };
6
+ export type DbFieldValue = { [key: string]: string | number };
7
+ export type DbFieldExpression = { [key: string]: string | number | DbFieldExprssionProps };
8
+ const isDbFieldExprssion = (value: any): value is DbFieldExprssionProps => {
9
+ return value && typeof value === 'object' && 'exprssion' in value;
10
+ };
11
+
12
+ const logger = new Logger('db');
13
+ export class Db {
14
+ type: string;
15
+ tablePrefix: string;
16
+
17
+ constructor(option: DbConfig) {
18
+ console.log(
19
+ `init Db, type: ${option.type}, host: ${option.host}:${option.port}, user: ${option.user}, database: ${option.database}, filename: ${option.filename}`
20
+ );
21
+
22
+ this.type = option.type;
23
+ this.tablePrefix = option.tablePrefix || 'tbl_';
24
+ }
25
+
26
+ public close() {
27
+ throw new Error('Method not implemented');
28
+ }
29
+
30
+ public connect() {
31
+ throw new Error('Method not implemented');
32
+ }
33
+
34
+ // public async createTable(table: string, fields: string[]): Promise<any> {
35
+ // throw new Error('Method not implemented');
36
+ // }
37
+
38
+ public async getAllTables(addCount = false): Promise<any> {
39
+ throw new Error('Method not implemented');
40
+ }
41
+
42
+ public async getAllTableNames(): Promise<string[]> {
43
+ const result = await this.getAllTables(false);
44
+ return result.map((item: any) => item.name);
45
+ }
46
+
47
+ public async getTableInfo(table: string): Promise<any> {
48
+ throw new Error('Method not implemented');
49
+ }
50
+
51
+ // can be used like this: order by ${db.getRandomOrder()}
52
+ // MySQL / MariaDB: RAND()
53
+ // PostgreSQL, SQLite: RANDOM()
54
+ // SQL Server: NEWID()
55
+ public getRandomOrder(): string {
56
+ if (this.type === 'mysql' || this.type === 'mariadb') {
57
+ return 'RAND()';
58
+ }
59
+ if (this.type === 'postgres' || this.type === 'sqlite') {
60
+ return 'RANDOM()';
61
+ }
62
+ if (this.type === 'sqlserver') {
63
+ return 'NEWID()';
64
+ }
65
+ throw new Error(`Unsupported database type: ${this.type}`);
66
+ }
67
+
68
+ protected nativeQuery(sql: string, params?: any, isSelect?: boolean): Promise<any> {
69
+ throw new Error('Method not implemented');
70
+ }
71
+
72
+ public async truncateTable(tableName: string): Promise<any> {
73
+ throw new Error('Method not implemented');
74
+ }
75
+
76
+ public async select(sql: string, params?: any) {
77
+ const fixedSql = this.replacePrefix(sql);
78
+ return await this.nativeQuery(fixedSql, params, true);
79
+ }
80
+ public async execute(sql: string, params?: any) {
81
+ const fixedSql = this.replacePrefix(sql);
82
+ return await this.nativeQuery(fixedSql, params, false);
83
+ }
84
+ // public async query(sql: string, params?: any, addReturning?: boolean) {
85
+ // try {
86
+ // const fixedSql = this.replacePrefix(sql);
87
+ // return await this.nativeQuery(fixedSql, params, addReturning);
88
+ // } catch (err) {
89
+ // console.log(err);
90
+ // throw err;
91
+ // }
92
+ // }
93
+
94
+ // public replacePrefixXX(tableName: string, fromPrefix?: string) {
95
+ // if (!fromPrefix) {
96
+ // fromPrefix = '$__';
97
+ // }
98
+
99
+ // if (tableName.startsWith(fromPrefix)) {
100
+ // return this.tablePrefix + tableName.substring(fromPrefix.length);
101
+ // }
102
+ // return tableName;
103
+ // }
104
+
105
+ public replacePrefix(sql: string, fromPrefix?: string) {
106
+ if (!fromPrefix || typeof fromPrefix === 'undefined') {
107
+ fromPrefix = '$__';
108
+ }
109
+
110
+ var escaped = false;
111
+ var quoteChar = '';
112
+ sql = sql.trim();
113
+ var n = sql.length;
114
+
115
+ var startPos = 0;
116
+ var literal = '';
117
+ while (startPos < n) {
118
+ var ip = sql.indexOf(fromPrefix, startPos);
119
+ if (ip < 0) {
120
+ break;
121
+ }
122
+
123
+ var j = sql.indexOf("'", startPos);
124
+ var k = sql.indexOf('"', startPos);
125
+ if (k >= 0 && (k < j || j < 0)) {
126
+ quoteChar = '"';
127
+ j = k;
128
+ } else {
129
+ quoteChar = "'";
130
+ }
131
+
132
+ if (j < 0) {
133
+ j = n;
134
+ }
135
+ //literal += sql.substring(startPos, j).replace(prefix, this.tableprefix);
136
+ literal += sql.substring(startPos, j).split(fromPrefix).join(this.tablePrefix);
137
+ startPos = j;
138
+
139
+ j = startPos + 1;
140
+
141
+ if (j >= n) {
142
+ break;
143
+ }
144
+
145
+ // quote comes first, find end of quote
146
+ while (true) {
147
+ k = sql.indexOf(quoteChar, j);
148
+ escaped = false;
149
+ if (k < 0) {
150
+ break;
151
+ }
152
+ let l = k - 1;
153
+ while (l >= 0 && sql.substring(l, l + 1) == '\\') {
154
+ l--;
155
+ escaped = !escaped;
156
+ }
157
+ if (escaped) {
158
+ j = k + 1;
159
+ continue;
160
+ }
161
+ break;
162
+ }
163
+ if (k < 0) {
164
+ // error in the query - no end quote; ignore it
165
+ break;
166
+ }
167
+ literal += sql.substring(startPos, k + 1);
168
+ startPos = k + 1;
169
+ }
170
+ if (startPos < n) {
171
+ literal += sql.substring(startPos, n);
172
+ }
173
+ return literal;
174
+ }
175
+
176
+ // public escapeId(field) {
177
+ // return field;
178
+ // }
179
+
180
+ // public escape(field) {
181
+ // return field;
182
+ // }
183
+
184
+ private selectBaseSql(table: string, fields?: string[], whereFieldValues?: DbFieldValue, orderSql?: string) {
185
+ table = this.replacePrefix(table);
186
+ let sql = 'SELECT ';
187
+ if (fields && fields.length > 0) {
188
+ sql += fields.join(',');
189
+ } else {
190
+ sql += '*';
191
+ }
192
+
193
+ sql += ' FROM ' + table;
194
+ let params: any[] = [];
195
+ if (whereFieldValues && Object.keys(whereFieldValues).length > 0) {
196
+ sql +=
197
+ ' WHERE ' +
198
+ Object.keys(whereFieldValues)
199
+ .map((item) => `${item}=?`)
200
+ .join(' AND ');
201
+ params = Object.values(whereFieldValues);
202
+ }
203
+ if (orderSql) {
204
+ sql += ' ORDER BY ' + orderSql;
205
+ }
206
+ return { sql, params };
207
+ }
208
+
209
+ public async selectObject(
210
+ table: string,
211
+ fields?: string[],
212
+ whereFieldValues?: DbFieldValue,
213
+ orderSql?: string,
214
+ limit?: number,
215
+ offset?: number
216
+ ) {
217
+ const base = this.selectBaseSql(table, fields, whereFieldValues, orderSql);
218
+ if (limit && limit > 0) {
219
+ base.sql += ' LIMIT ' + limit;
220
+ }
221
+ if (typeof offset === 'number' && !isNaN(offset)) {
222
+ base.sql += ' OFFSET ' + offset;
223
+ }
224
+ return await this.select(base.sql, base.params);
225
+ }
226
+
227
+ public async selectOneRow(
228
+ table: string,
229
+ fields?: string[],
230
+ whereFieldValues?: DbFieldValue,
231
+ orderSql?: string,
232
+ offset?: number
233
+ ) {
234
+ const result = await this.selectObject(table, fields, whereFieldValues, orderSql, 1, offset);
235
+ if (result && Array.isArray(result)) {
236
+ return result[0];
237
+ }
238
+ return undefined;
239
+ }
240
+
241
+ public async selectOneResult(table: string, field: string, whereFieldValues?: DbFieldValue) {
242
+ const base = this.selectBaseSql(table, [field], whereFieldValues);
243
+ const result = await this.select(base.sql, base.params);
244
+ if (result && Array.isArray(result)) {
245
+ return result[0][Object.keys(result[0])[0]];
246
+ }
247
+ return undefined;
248
+ }
249
+
250
+ // return ids
251
+ public async insertObject(table: string, fieldValues: DbFieldValue) {
252
+ table = this.replacePrefix(table);
253
+ const fields = Object.keys(fieldValues);
254
+ const values = Array(fields.length).fill('?').join(',');
255
+ let sql = 'INSERT INTO ' + table + ' (' + fields.join(',') + ') VALUES (' + values + ')';
256
+ const params = Object.values(fieldValues);
257
+ return await this.execute(sql, params);
258
+ }
259
+
260
+ public async updateObject(table: string, updateFieldValues: DbFieldExpression, whereFieldValues: DbFieldValue) {
261
+ table = this.replacePrefix(table);
262
+ const fields = Object.keys(updateFieldValues);
263
+ const setClauseParts: string[] = [];
264
+ const params: (string | number)[] = [];
265
+ // let sql = 'UPDATE ' + table + ' SET ' + fields.map((item) => `${item}=?`).join(',');
266
+ // const params = Object.values(updateFieldValues);
267
+ for (const field of fields) {
268
+ const value = updateFieldValues[field];
269
+
270
+ // expression
271
+ if (isDbFieldExprssion(value)) {
272
+ setClauseParts.push(`${field} = ${value.exprssion}`);
273
+ if (value.params) params.push(...value.params);
274
+ } else {
275
+ // static value
276
+ setClauseParts.push(`${field} = ?`);
277
+ params.push(value);
278
+ }
279
+ }
280
+
281
+ let sql = `UPDATE ${table} SET ${setClauseParts.join(', ')}`;
282
+ if (whereFieldValues && Object.keys(whereFieldValues).length > 0) {
283
+ sql +=
284
+ ' WHERE ' +
285
+ Object.keys(whereFieldValues)
286
+ .map((item) => `${item}=?`)
287
+ .join(' AND ');
288
+ params.push(...Object.values(whereFieldValues));
289
+ }
290
+ return await this.execute(sql, params);
291
+ }
292
+
293
+ public async deleteObject(table: string, whereFieldValues: DbFieldValue) {
294
+ table = this.replacePrefix(table);
295
+ let sql =
296
+ 'DELETE FROM ' +
297
+ table +
298
+ ' WHERE ' +
299
+ Object.keys(whereFieldValues)
300
+ .map((item) => `${item}=?`)
301
+ .join(' AND ');
302
+ const params = Object.values(whereFieldValues);
303
+
304
+ return await this.execute(sql, params);
305
+ }
306
+
307
+ // public async hasTable(table: string): Promise<boolean> {
308
+ // table = this.replacePrefix(table);
309
+ // return await this.knex.schema.hasTable(table);
310
+ // }
311
+
312
+ // public async createTable(table: string, funCallback: (tableBuilder: Knex.CreateTableBuilder) => any) {
313
+ // table = this.replacePrefix(table);
314
+ // return await this.knex.schema.createTable(table, funCallback);
315
+ // }
316
+
317
+ // public async dropTable(table: string) {
318
+ // table = this.replacePrefix(table);
319
+ // return await this.knex.schema.dropTableIfExists(table);
320
+ // }
321
+
322
+ public async testConnection() {
323
+ return await this.select('select 1+1 as result');
324
+ }
325
+ }
@@ -1,5 +1,5 @@
1
- export * from './db';
2
- export * from '../../models/db-config';
3
- export * from './db-helper';
4
- // export * from './db-mysql';
5
- export * from './db-sqlite';
1
+ export * from './db';
2
+ export * from '../../models/db-config';
3
+ export * from './db-helper';
4
+ // export * from './db-mysql';
5
+ export * from './db-sqlite';
package/src/lib/index.ts CHANGED
@@ -1,3 +1,3 @@
1
- export * from './db';
2
- export * from './utils';
3
- export * from './logger';
1
+ export * from './db';
2
+ export * from './utils';
3
+ export * from './logger';