adminforth 1.3.54-next.3 → 1.3.54-next.30

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 (135) hide show
  1. package/dist/auth.js +42 -56
  2. package/dist/auth.js.map +1 -0
  3. package/dist/basePlugin.js +1 -0
  4. package/dist/basePlugin.js.map +1 -0
  5. package/dist/dataConnectors/baseConnector.js +108 -122
  6. package/dist/dataConnectors/baseConnector.js.map +1 -0
  7. package/dist/dataConnectors/clickhouse.js +132 -150
  8. package/dist/dataConnectors/clickhouse.js.map +1 -0
  9. package/dist/dataConnectors/mongo.js +75 -101
  10. package/dist/dataConnectors/mongo.js.map +1 -0
  11. package/dist/dataConnectors/postgres.js +124 -143
  12. package/dist/dataConnectors/postgres.js.map +1 -0
  13. package/dist/dataConnectors/sqlite.js +113 -130
  14. package/dist/dataConnectors/sqlite.js.map +1 -0
  15. package/dist/index.js +197 -217
  16. package/dist/index.js.map +1 -0
  17. package/dist/modules/codeInjector.js +480 -486
  18. package/dist/modules/codeInjector.js.map +1 -0
  19. package/dist/modules/configValidator.js +31 -22
  20. package/dist/modules/configValidator.js.map +1 -0
  21. package/dist/modules/operationalResource.js +50 -70
  22. package/dist/modules/operationalResource.js.map +1 -0
  23. package/dist/modules/restApi.js +104 -116
  24. package/dist/modules/restApi.js.map +1 -0
  25. package/dist/modules/styleGenerator.js +1 -0
  26. package/dist/modules/styleGenerator.js.map +1 -0
  27. package/dist/modules/styles.js +1 -0
  28. package/dist/modules/styles.js.map +1 -0
  29. package/dist/modules/utils.js +1 -0
  30. package/dist/modules/utils.js.map +1 -0
  31. package/dist/plugins/audit-log/types.js +2 -0
  32. package/dist/plugins/audit-log/types.js.map +1 -0
  33. package/dist/plugins/chat-gpt/types.js +2 -0
  34. package/dist/plugins/chat-gpt/types.js.map +1 -0
  35. package/dist/plugins/email-password-reset/types.js +2 -0
  36. package/dist/plugins/email-password-reset/types.js.map +1 -0
  37. package/dist/plugins/foreign-inline-list/types.js +2 -0
  38. package/dist/plugins/foreign-inline-list/types.js.map +1 -0
  39. package/dist/plugins/import-export/types.js +2 -0
  40. package/dist/plugins/import-export/types.js.map +1 -0
  41. package/dist/plugins/rich-editor/custom/async-queue.js +29 -0
  42. package/dist/plugins/rich-editor/custom/async-queue.js.map +1 -0
  43. package/dist/plugins/rich-editor/dist/async-queue.js +41 -0
  44. package/dist/plugins/rich-editor/dist/custom/async-queue.js +29 -0
  45. package/dist/plugins/rich-editor/dist/custom/async-queue.js.map +1 -0
  46. package/dist/plugins/rich-editor/types.js +16 -0
  47. package/dist/plugins/rich-editor/types.js.map +1 -0
  48. package/dist/plugins/two-factors-auth/types.js +2 -0
  49. package/dist/plugins/two-factors-auth/types.js.map +1 -0
  50. package/dist/plugins/upload/types.js +2 -0
  51. package/dist/plugins/upload/types.js.map +1 -0
  52. package/dist/servers/express.js +30 -42
  53. package/dist/servers/express.js.map +1 -0
  54. package/dist/types/AdminForthConfig.js +1 -0
  55. package/dist/types/AdminForthConfig.js.map +1 -0
  56. package/dist/types/FrontendAPI.js +1 -0
  57. package/dist/types/FrontendAPI.js.map +1 -0
  58. package/package.json +7 -4
  59. package/auth.ts +0 -140
  60. package/basePlugin.ts +0 -70
  61. package/dataConnectors/baseConnector.ts +0 -216
  62. package/dataConnectors/clickhouse.ts +0 -341
  63. package/dataConnectors/mongo.ts +0 -202
  64. package/dataConnectors/postgres.ts +0 -306
  65. package/dataConnectors/sqlite.ts +0 -254
  66. package/index.ts +0 -428
  67. package/modules/codeInjector.ts +0 -736
  68. package/modules/configValidator.ts +0 -571
  69. package/modules/operationalResource.ts +0 -98
  70. package/modules/restApi.ts +0 -718
  71. package/modules/styleGenerator.ts +0 -55
  72. package/modules/styles.ts +0 -126
  73. package/modules/utils.ts +0 -472
  74. package/servers/express.ts +0 -259
  75. package/spa/.eslintrc.cjs +0 -14
  76. package/spa/README.md +0 -39
  77. package/spa/env.d.ts +0 -1
  78. package/spa/index.html +0 -23
  79. package/spa/package-lock.json +0 -4573
  80. package/spa/package.json +0 -49
  81. package/spa/postcss.config.js +0 -6
  82. package/spa/public/assets/favicon.png +0 -0
  83. package/spa/src/App.vue +0 -418
  84. package/spa/src/assets/base.css +0 -2
  85. package/spa/src/assets/logo.svg +0 -19
  86. package/spa/src/components/AcceptModal.vue +0 -45
  87. package/spa/src/components/Breadcrumbs.vue +0 -41
  88. package/spa/src/components/BreadcrumbsWithButtons.vue +0 -26
  89. package/spa/src/components/CustomDatePicker.vue +0 -176
  90. package/spa/src/components/CustomDateRangePicker.vue +0 -218
  91. package/spa/src/components/CustomRangePicker.vue +0 -156
  92. package/spa/src/components/Dropdown.vue +0 -168
  93. package/spa/src/components/Filters.vue +0 -222
  94. package/spa/src/components/HelloWorld.vue +0 -17
  95. package/spa/src/components/MenuLink.vue +0 -27
  96. package/spa/src/components/ResourceForm.vue +0 -290
  97. package/spa/src/components/ResourceListTable.vue +0 -460
  98. package/spa/src/components/SingleSkeletLoader.vue +0 -13
  99. package/spa/src/components/SkeleteLoader.vue +0 -23
  100. package/spa/src/components/ThreeDotsMenu.vue +0 -43
  101. package/spa/src/components/Toast.vue +0 -78
  102. package/spa/src/components/ValueRenderer.vue +0 -114
  103. package/spa/src/components/icons/IconCalendar.vue +0 -5
  104. package/spa/src/components/icons/IconCommunity.vue +0 -7
  105. package/spa/src/components/icons/IconDocumentation.vue +0 -7
  106. package/spa/src/components/icons/IconEcosystem.vue +0 -7
  107. package/spa/src/components/icons/IconSupport.vue +0 -7
  108. package/spa/src/components/icons/IconTime.vue +0 -5
  109. package/spa/src/components/icons/IconTooling.vue +0 -19
  110. package/spa/src/composables/useFrontendApi.ts +0 -26
  111. package/spa/src/composables/useStores.ts +0 -131
  112. package/spa/src/index.scss +0 -31
  113. package/spa/src/main.ts +0 -18
  114. package/spa/src/router/index.ts +0 -59
  115. package/spa/src/spa_types/core.ts +0 -53
  116. package/spa/src/stores/core.ts +0 -148
  117. package/spa/src/stores/filters.ts +0 -27
  118. package/spa/src/stores/modal.ts +0 -48
  119. package/spa/src/stores/toast.ts +0 -31
  120. package/spa/src/stores/user.ts +0 -72
  121. package/spa/src/utils.ts +0 -149
  122. package/spa/src/views/CreateView.vue +0 -167
  123. package/spa/src/views/EditView.vue +0 -170
  124. package/spa/src/views/ListView.vue +0 -279
  125. package/spa/src/views/LoginView.vue +0 -192
  126. package/spa/src/views/ResourceParent.vue +0 -17
  127. package/spa/src/views/ShowView.vue +0 -186
  128. package/spa/tailwind.config.js +0 -17
  129. package/spa/tsconfig.app.json +0 -14
  130. package/spa/tsconfig.json +0 -11
  131. package/spa/tsconfig.node.json +0 -19
  132. package/spa/vite.config.ts +0 -56
  133. package/tsconfig.json +0 -112
  134. package/types/AdminForthConfig.ts +0 -1762
  135. package/types/FrontendAPI.ts +0 -143
@@ -1,12 +1,3 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
1
  import dayjs from 'dayjs';
11
2
  import pkg from 'pg';
12
3
  import { AdminForthDataTypes, AdminForthFilterOperators, AdminForthSortDirections } from '../types/AdminForthConfig.js';
@@ -34,19 +25,18 @@ class PostgresConnector extends AdminForthBaseConnector {
34
25
  this.db = new Client({
35
26
  connectionString: url
36
27
  });
37
- (() => __awaiter(this, void 0, void 0, function* () {
38
- yield this.db.connect();
28
+ (async () => {
29
+ await this.db.connect();
39
30
  this.db.on('error', (err) => {
40
31
  console.log('Postgres error: ', err.message, err.stack);
41
32
  this.db.end();
42
33
  this.db = new PostgresConnector({ url }).db;
43
34
  });
44
- }))();
35
+ })();
45
36
  }
46
- discoverFields(resource) {
47
- return __awaiter(this, void 0, void 0, function* () {
48
- const tableName = resource.table;
49
- const stmt = yield this.db.query(`
37
+ async discoverFields(resource) {
38
+ const tableName = resource.table;
39
+ const stmt = await this.db.query(`
50
40
  SELECT
51
41
  a.attname AS name,
52
42
  pg_catalog.format_type(a.atttypid, a.atttypmod) AS type,
@@ -69,67 +59,66 @@ class PostgresConnector extends AdminForthBaseConnector {
69
59
  ORDER BY
70
60
  a.attnum;
71
61
  `, [tableName]);
72
- const rows = stmt.rows;
73
- const fieldTypes = {};
74
- rows.forEach((row) => {
75
- const field = {};
76
- const baseType = row.type.toLowerCase();
77
- if (baseType == 'int') {
78
- field.type = AdminForthDataTypes.INTEGER;
79
- field._underlineType = 'int';
80
- }
81
- else if (baseType.includes('float') || baseType.includes('double')) {
82
- field.type = AdminForthDataTypes.FLOAT;
83
- field._underlineType = 'float';
84
- }
85
- else if (baseType.includes('bool')) {
86
- field.type = AdminForthDataTypes.BOOLEAN;
87
- field._underlineType = 'bool';
88
- }
89
- else if (baseType == 'uuid') {
90
- field.type = AdminForthDataTypes.STRING;
91
- field._underlineType = 'uuid';
92
- }
93
- else if (baseType.includes('character varying')) {
94
- field.type = AdminForthDataTypes.STRING;
95
- field._underlineType = 'varchar';
96
- const length = baseType.match(/\d+/);
97
- field.maxLength = length ? parseInt(length[0]) : null;
98
- }
99
- else if (baseType == 'text') {
100
- field.type = AdminForthDataTypes.TEXT;
101
- field._underlineType = 'text';
102
- }
103
- else if (baseType.includes('decimal(')) {
104
- field.type = AdminForthDataTypes.DECIMAL;
105
- field._underlineType = 'decimal';
106
- const [precision, scale] = baseType.match(/\d+/g);
107
- field.precision = parseInt(precision);
108
- field.scale = parseInt(scale);
109
- }
110
- else if (baseType == 'real') {
111
- field.type = AdminForthDataTypes.FLOAT;
112
- field._underlineType = 'real';
113
- }
114
- else if (baseType == 'date') {
115
- field.type = AdminForthDataTypes.DATE;
116
- field._underlineType = 'timestamp';
117
- }
118
- else if (baseType.includes('date') || baseType.includes('time')) {
119
- field.type = AdminForthDataTypes.DATETIME;
120
- field._underlineType = 'timestamp';
121
- }
122
- else {
123
- field.type = 'unknown';
124
- }
125
- field._baseTypeDebug = baseType;
126
- field.primaryKey = row.pk == 1;
127
- field.default = row.dflt_value;
128
- field.required = row.notnull && !row.dflt_value;
129
- fieldTypes[row.name] = field;
130
- });
131
- return fieldTypes;
62
+ const rows = stmt.rows;
63
+ const fieldTypes = {};
64
+ rows.forEach((row) => {
65
+ const field = {};
66
+ const baseType = row.type.toLowerCase();
67
+ if (baseType == 'int') {
68
+ field.type = AdminForthDataTypes.INTEGER;
69
+ field._underlineType = 'int';
70
+ }
71
+ else if (baseType.includes('float') || baseType.includes('double')) {
72
+ field.type = AdminForthDataTypes.FLOAT;
73
+ field._underlineType = 'float';
74
+ }
75
+ else if (baseType.includes('bool')) {
76
+ field.type = AdminForthDataTypes.BOOLEAN;
77
+ field._underlineType = 'bool';
78
+ }
79
+ else if (baseType == 'uuid') {
80
+ field.type = AdminForthDataTypes.STRING;
81
+ field._underlineType = 'uuid';
82
+ }
83
+ else if (baseType.includes('character varying')) {
84
+ field.type = AdminForthDataTypes.STRING;
85
+ field._underlineType = 'varchar';
86
+ const length = baseType.match(/\d+/);
87
+ field.maxLength = length ? parseInt(length[0]) : null;
88
+ }
89
+ else if (baseType == 'text') {
90
+ field.type = AdminForthDataTypes.TEXT;
91
+ field._underlineType = 'text';
92
+ }
93
+ else if (baseType.includes('decimal(')) {
94
+ field.type = AdminForthDataTypes.DECIMAL;
95
+ field._underlineType = 'decimal';
96
+ const [precision, scale] = baseType.match(/\d+/g);
97
+ field.precision = parseInt(precision);
98
+ field.scale = parseInt(scale);
99
+ }
100
+ else if (baseType == 'real') {
101
+ field.type = AdminForthDataTypes.FLOAT;
102
+ field._underlineType = 'real';
103
+ }
104
+ else if (baseType == 'date') {
105
+ field.type = AdminForthDataTypes.DATE;
106
+ field._underlineType = 'timestamp';
107
+ }
108
+ else if (baseType.includes('date') || baseType.includes('time')) {
109
+ field.type = AdminForthDataTypes.DATETIME;
110
+ field._underlineType = 'timestamp';
111
+ }
112
+ else {
113
+ field.type = 'unknown';
114
+ }
115
+ field._baseTypeDebug = baseType;
116
+ field.primaryKey = row.pk == 1;
117
+ field.default = row.dflt_value;
118
+ field.required = row.notnull && !row.dflt_value;
119
+ fieldTypes[row.name] = field;
132
120
  });
121
+ return fieldTypes;
133
122
  }
134
123
  getFieldValue(field, value) {
135
124
  if (field.type == AdminForthDataTypes.DATETIME) {
@@ -154,7 +143,12 @@ class PostgresConnector extends AdminForthBaseConnector {
154
143
  }
155
144
  if (field.type == AdminForthDataTypes.JSON) {
156
145
  if (typeof value == 'string') {
157
- return JSON.parse(value);
146
+ try {
147
+ return JSON.parse(value);
148
+ }
149
+ catch (e) {
150
+ return { 'error': `Failed to parse JSON: ${e.message}` };
151
+ }
158
152
  }
159
153
  else if (typeof value == 'object') {
160
154
  return value;
@@ -226,80 +220,67 @@ class PostgresConnector extends AdminForthBaseConnector {
226
220
  values: filterValues,
227
221
  };
228
222
  }
229
- getDataWithOriginalTypes(_a) {
230
- return __awaiter(this, arguments, void 0, function* ({ resource, limit, offset, sort, filters }) {
231
- const columns = resource.dataSourceColumns.map((col) => `"${col.name}"`).join(', ');
232
- const tableName = resource.table;
233
- const { sql: where, paramsCount, values: filterValues } = this.whereClauseAndValues(resource, filters);
234
- const limitOffset = `LIMIT $${paramsCount} OFFSET $${paramsCount + 1}`;
235
- const d = [...filterValues, limit, offset];
236
- const orderBy = sort.length ? `ORDER BY ${sort.map((s) => `"${s.field}" ${this.SortDirectionsMap[s.direction]}`).join(', ')}` : '';
237
- const selectQuery = `SELECT ${columns} FROM ${tableName} ${where} ${orderBy} ${limitOffset}`;
238
- if (process.env.HEAVY_DEBUG) {
239
- console.log('🪲 PG selectQuery:', selectQuery, 'params:', d);
223
+ async getDataWithOriginalTypes({ resource, limit, offset, sort, filters }) {
224
+ const columns = resource.dataSourceColumns.map((col) => `"${col.name}"`).join(', ');
225
+ const tableName = resource.table;
226
+ const { sql: where, paramsCount, values: filterValues } = this.whereClauseAndValues(resource, filters);
227
+ const limitOffset = `LIMIT $${paramsCount} OFFSET $${paramsCount + 1}`;
228
+ const d = [...filterValues, limit, offset];
229
+ const orderBy = sort.length ? `ORDER BY ${sort.map((s) => `"${s.field}" ${this.SortDirectionsMap[s.direction]}`).join(', ')}` : '';
230
+ const selectQuery = `SELECT ${columns} FROM ${tableName} ${where} ${orderBy} ${limitOffset}`;
231
+ if (process.env.HEAVY_DEBUG) {
232
+ console.log('🪲 PG selectQuery:', selectQuery, 'params:', d);
233
+ }
234
+ const stmt = await this.db.query(selectQuery, d);
235
+ const rows = stmt.rows;
236
+ return rows.map((row) => {
237
+ const newRow = {};
238
+ for (const [key, value] of Object.entries(row)) {
239
+ newRow[key] = value;
240
240
  }
241
- const stmt = yield this.db.query(selectQuery, d);
242
- const rows = stmt.rows;
243
- return rows.map((row) => {
244
- const newRow = {};
245
- for (const [key, value] of Object.entries(row)) {
246
- newRow[key] = value;
247
- }
248
- return newRow;
249
- });
241
+ return newRow;
250
242
  });
251
243
  }
252
- getCount(_a) {
253
- return __awaiter(this, arguments, void 0, function* ({ resource, filters }) {
254
- const tableName = resource.table;
255
- const { sql: where, values: filterValues } = this.whereClauseAndValues(resource, filters);
256
- const stmt = yield this.db.query(`SELECT COUNT(*) FROM ${tableName} ${where}`, filterValues);
257
- return stmt.rows[0].count;
258
- });
244
+ async getCount({ resource, filters }) {
245
+ const tableName = resource.table;
246
+ const { sql: where, values: filterValues } = this.whereClauseAndValues(resource, filters);
247
+ const stmt = await this.db.query(`SELECT COUNT(*) FROM ${tableName} ${where}`, filterValues);
248
+ return stmt.rows[0].count;
259
249
  }
260
- getMinMaxForColumnsWithOriginalTypes(_a) {
261
- return __awaiter(this, arguments, void 0, function* ({ resource, columns }) {
262
- const tableName = resource.table;
263
- const result = {};
264
- yield Promise.all(columns.map((col) => __awaiter(this, void 0, void 0, function* () {
265
- const stmt = yield this.db.query(`SELECT MIN(${col.name}) as min, MAX(${col.name}) as max FROM ${tableName}`);
266
- const { min, max } = stmt.rows[0];
267
- result[col.name] = {
268
- min, max,
269
- };
270
- })));
271
- return result;
272
- });
250
+ async getMinMaxForColumnsWithOriginalTypes({ resource, columns }) {
251
+ const tableName = resource.table;
252
+ const result = {};
253
+ await Promise.all(columns.map(async (col) => {
254
+ const stmt = await this.db.query(`SELECT MIN(${col.name}) as min, MAX(${col.name}) as max FROM ${tableName}`);
255
+ const { min, max } = stmt.rows[0];
256
+ result[col.name] = {
257
+ min, max,
258
+ };
259
+ }));
260
+ return result;
273
261
  }
274
- createRecordOriginalValues(_a) {
275
- return __awaiter(this, arguments, void 0, function* ({ resource, record }) {
276
- const tableName = resource.table;
277
- const columns = Object.keys(record);
278
- const placeholders = columns.map((_, i) => `$${i + 1}`).join(', ');
279
- const values = columns.map((colName) => record[colName]);
280
- for (let i = 0; i < columns.length; i++) {
281
- columns[i] = `"${columns[i]}"`;
282
- }
283
- yield this.db.query(`INSERT INTO ${tableName} (${columns.join(', ')}) VALUES (${placeholders})`, values);
284
- });
262
+ async createRecordOriginalValues({ resource, record }) {
263
+ const tableName = resource.table;
264
+ const columns = Object.keys(record);
265
+ const placeholders = columns.map((_, i) => `$${i + 1}`).join(', ');
266
+ const values = columns.map((colName) => record[colName]);
267
+ for (let i = 0; i < columns.length; i++) {
268
+ columns[i] = `"${columns[i]}"`;
269
+ }
270
+ await this.db.query(`INSERT INTO ${tableName} (${columns.join(', ')}) VALUES (${placeholders})`, values);
285
271
  }
286
- updateRecordOriginalValues(_a) {
287
- return __awaiter(this, arguments, void 0, function* ({ resource, recordId, newValues }) {
288
- const values = [...Object.values(newValues), recordId];
289
- const columnsWithPlaceholders = Object.keys(newValues).map((col, i) => `"${col}" = $${i + 1}`).join(', ');
290
- yield this.db.query(`UPDATE ${resource.table} SET ${columnsWithPlaceholders} WHERE "${this.getPrimaryKey(resource)}" = $${values.length}`, values);
291
- });
272
+ async updateRecordOriginalValues({ resource, recordId, newValues }) {
273
+ const values = [...Object.values(newValues), recordId];
274
+ const columnsWithPlaceholders = Object.keys(newValues).map((col, i) => `"${col}" = $${i + 1}`).join(', ');
275
+ await this.db.query(`UPDATE ${resource.table} SET ${columnsWithPlaceholders} WHERE "${this.getPrimaryKey(resource)}" = $${values.length}`, values);
292
276
  }
293
- deleteRecord(_a) {
294
- return __awaiter(this, arguments, void 0, function* ({ resource, recordId }) {
295
- const res = yield this.db.query(`DELETE FROM ${resource.table} WHERE "${this.getPrimaryKey(resource)}" = $1`, [recordId]);
296
- return res.rowCount > 0;
297
- });
277
+ async deleteRecord({ resource, recordId }) {
278
+ const res = await this.db.query(`DELETE FROM ${resource.table} WHERE "${this.getPrimaryKey(resource)}" = $1`, [recordId]);
279
+ return res.rowCount > 0;
298
280
  }
299
- close() {
300
- return __awaiter(this, void 0, void 0, function* () {
301
- yield this.db.end();
302
- });
281
+ async close() {
282
+ await this.db.end();
303
283
  }
304
284
  }
305
285
  export default PostgresConnector;
286
+ //# sourceMappingURL=postgres.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../dataConnectors/postgres.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,3 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
1
  import betterSqlite3 from 'better-sqlite3';
11
2
  import { AdminForthDataTypes, AdminForthFilterOperators, AdminForthSortDirections } from '../types/AdminForthConfig.js';
12
3
  import AdminForthBaseConnector from './baseConnector.js';
@@ -33,63 +24,61 @@ class SQLiteConnector extends AdminForthBaseConnector {
33
24
  // create connection here
34
25
  this.db = betterSqlite3(url.replace('sqlite://', ''));
35
26
  }
36
- discoverFields(resource) {
37
- return __awaiter(this, void 0, void 0, function* () {
38
- const tableName = resource.table;
39
- const stmt = this.db.prepare(`PRAGMA table_info(${tableName})`);
40
- const rows = yield stmt.all();
41
- const fieldTypes = {};
42
- rows.forEach((row) => {
43
- const field = {};
44
- const baseType = row.type.toLowerCase();
45
- if (baseType == 'int') {
46
- field.type = AdminForthDataTypes.INTEGER;
47
- field._underlineType = 'int';
48
- }
49
- else if (baseType.includes('varchar(')) {
50
- field.type = AdminForthDataTypes.STRING;
51
- field._underlineType = 'varchar';
52
- const length = baseType.match(/\d+/);
53
- field.maxLength = length ? parseInt(length[0]) : null;
54
- }
55
- else if (baseType == 'text') {
56
- field.type = AdminForthDataTypes.TEXT;
57
- field._underlineType = 'text';
58
- }
59
- else if (baseType.includes('decimal(')) {
60
- field.type = AdminForthDataTypes.DECIMAL;
61
- field._underlineType = 'decimal';
62
- const [precision, scale] = baseType.match(/\d+/g);
63
- field.precision = parseInt(precision);
64
- field.scale = parseInt(scale);
65
- }
66
- else if (baseType == 'real') {
67
- field.type = AdminForthDataTypes.FLOAT; //8-byte IEEE floating point number. It
68
- field._underlineType = 'real';
69
- }
70
- else if (baseType == 'timestamp') {
71
- field.type = AdminForthDataTypes.DATETIME;
72
- field._underlineType = 'timestamp';
73
- }
74
- else if (baseType == 'boolean') {
75
- field.type = AdminForthDataTypes.BOOLEAN;
76
- field._underlineType = 'boolean';
77
- }
78
- else if (baseType == 'datetime') {
79
- field.type = AdminForthDataTypes.DATETIME;
80
- field._underlineType = 'datetime';
81
- }
82
- else {
83
- field.type = 'unknown';
84
- }
85
- field._baseTypeDebug = baseType;
86
- field.required = row.notnull == 1;
87
- field.primaryKey = row.pk == 1;
88
- field.default = row.dflt_value;
89
- fieldTypes[row.name] = field;
90
- });
91
- return fieldTypes;
27
+ async discoverFields(resource) {
28
+ const tableName = resource.table;
29
+ const stmt = this.db.prepare(`PRAGMA table_info(${tableName})`);
30
+ const rows = await stmt.all();
31
+ const fieldTypes = {};
32
+ rows.forEach((row) => {
33
+ const field = {};
34
+ const baseType = row.type.toLowerCase();
35
+ if (baseType == 'int') {
36
+ field.type = AdminForthDataTypes.INTEGER;
37
+ field._underlineType = 'int';
38
+ }
39
+ else if (baseType.includes('varchar(')) {
40
+ field.type = AdminForthDataTypes.STRING;
41
+ field._underlineType = 'varchar';
42
+ const length = baseType.match(/\d+/);
43
+ field.maxLength = length ? parseInt(length[0]) : null;
44
+ }
45
+ else if (baseType == 'text') {
46
+ field.type = AdminForthDataTypes.TEXT;
47
+ field._underlineType = 'text';
48
+ }
49
+ else if (baseType.includes('decimal(')) {
50
+ field.type = AdminForthDataTypes.DECIMAL;
51
+ field._underlineType = 'decimal';
52
+ const [precision, scale] = baseType.match(/\d+/g);
53
+ field.precision = parseInt(precision);
54
+ field.scale = parseInt(scale);
55
+ }
56
+ else if (baseType == 'real') {
57
+ field.type = AdminForthDataTypes.FLOAT; //8-byte IEEE floating point number. It
58
+ field._underlineType = 'real';
59
+ }
60
+ else if (baseType == 'timestamp') {
61
+ field.type = AdminForthDataTypes.DATETIME;
62
+ field._underlineType = 'timestamp';
63
+ }
64
+ else if (baseType == 'boolean') {
65
+ field.type = AdminForthDataTypes.BOOLEAN;
66
+ field._underlineType = 'boolean';
67
+ }
68
+ else if (baseType == 'datetime') {
69
+ field.type = AdminForthDataTypes.DATETIME;
70
+ field._underlineType = 'datetime';
71
+ }
72
+ else {
73
+ field.type = 'unknown';
74
+ }
75
+ field._baseTypeDebug = baseType;
76
+ field.required = row.notnull == 1;
77
+ field.primaryKey = row.pk == 1;
78
+ field.default = row.dflt_value;
79
+ fieldTypes[row.name] = field;
92
80
  });
81
+ return fieldTypes;
93
82
  }
94
83
  getFieldValue(field, value) {
95
84
  if (field.type == AdminForthDataTypes.DATETIME) {
@@ -120,7 +109,12 @@ class SQLiteConnector extends AdminForthBaseConnector {
120
109
  }
121
110
  else if (field.type == AdminForthDataTypes.JSON) {
122
111
  if (field._underlineType == 'text' || field._underlineType == 'varchar') {
123
- return JSON.parse(value);
112
+ try {
113
+ return JSON.parse(value);
114
+ }
115
+ catch (e) {
116
+ return { 'error': `Failed to parse JSON: ${e.message}` };
117
+ }
124
118
  }
125
119
  else {
126
120
  console.error(`AdminForth: JSON field is not a string/text but ${field._underlineType}, this is not supported yet`);
@@ -189,80 +183,69 @@ class SQLiteConnector extends AdminForthBaseConnector {
189
183
  return acc;
190
184
  }, []);
191
185
  }
192
- getDataWithOriginalTypes(_a) {
193
- return __awaiter(this, arguments, void 0, function* ({ resource, limit, offset, sort, filters }) {
194
- const columns = resource.dataSourceColumns.map((col) => col.name).join(', ');
195
- const tableName = resource.table;
196
- const where = this.whereClause(filters);
197
- const filterValues = this.whereParams(filters);
198
- const orderBy = sort.length ? `ORDER BY ${sort.map((s) => `${s.field} ${this.SortDirectionsMap[s.direction]}`).join(', ')}` : '';
199
- const q = `SELECT ${columns} FROM ${tableName} ${where} ${orderBy} LIMIT ? OFFSET ?`;
200
- const stmt = this.db.prepare(q);
201
- const d = [...filterValues, limit, offset];
202
- if (process.env.HEAVY_DEBUG) {
203
- console.log('🪲📜 SQLITE Q', q, 'params:', d);
186
+ async getDataWithOriginalTypes({ resource, limit, offset, sort, filters }) {
187
+ const columns = resource.dataSourceColumns.map((col) => col.name).join(', ');
188
+ const tableName = resource.table;
189
+ const where = this.whereClause(filters);
190
+ const filterValues = this.whereParams(filters);
191
+ const orderBy = sort.length ? `ORDER BY ${sort.map((s) => `${s.field} ${this.SortDirectionsMap[s.direction]}`).join(', ')}` : '';
192
+ const q = `SELECT ${columns} FROM ${tableName} ${where} ${orderBy} LIMIT ? OFFSET ?`;
193
+ const stmt = this.db.prepare(q);
194
+ const d = [...filterValues, limit, offset];
195
+ if (process.env.HEAVY_DEBUG) {
196
+ console.log('🪲📜 SQLITE Q', q, 'params:', d);
197
+ }
198
+ const rows = await stmt.all(d);
199
+ return rows.map((row) => {
200
+ const newRow = {};
201
+ for (const [key, value] of Object.entries(row)) {
202
+ newRow[key] = value;
204
203
  }
205
- const rows = yield stmt.all(d);
206
- return rows.map((row) => {
207
- const newRow = {};
208
- for (const [key, value] of Object.entries(row)) {
209
- newRow[key] = value;
210
- }
211
- return newRow;
212
- });
204
+ return newRow;
213
205
  });
214
206
  }
215
- getCount(_a) {
216
- return __awaiter(this, arguments, void 0, function* ({ resource, filters }) {
217
- const tableName = resource.table;
218
- const where = this.whereClause(filters);
219
- const filterValues = this.whereParams(filters);
220
- const totalStmt = this.db.prepare(`SELECT COUNT(*) FROM ${tableName} ${where}`);
221
- return totalStmt.get([...filterValues])['COUNT(*)'];
222
- });
207
+ async getCount({ resource, filters }) {
208
+ const tableName = resource.table;
209
+ const where = this.whereClause(filters);
210
+ const filterValues = this.whereParams(filters);
211
+ const totalStmt = this.db.prepare(`SELECT COUNT(*) FROM ${tableName} ${where}`);
212
+ return totalStmt.get([...filterValues])['COUNT(*)'];
223
213
  }
224
- getMinMaxForColumnsWithOriginalTypes(_a) {
225
- return __awaiter(this, arguments, void 0, function* ({ resource, columns }) {
226
- const tableName = resource.table;
227
- const result = {};
228
- yield Promise.all(columns.map((col) => __awaiter(this, void 0, void 0, function* () {
229
- const stmt = yield this.db.prepare(`SELECT MIN(${col.name}) as min, MAX(${col.name}) as max FROM ${tableName}`);
230
- const { min, max } = stmt.get();
231
- result[col.name] = {
232
- min, max,
233
- };
234
- })));
235
- return result;
236
- });
214
+ async getMinMaxForColumnsWithOriginalTypes({ resource, columns }) {
215
+ const tableName = resource.table;
216
+ const result = {};
217
+ await Promise.all(columns.map(async (col) => {
218
+ const stmt = await this.db.prepare(`SELECT MIN(${col.name}) as min, MAX(${col.name}) as max FROM ${tableName}`);
219
+ const { min, max } = stmt.get();
220
+ result[col.name] = {
221
+ min, max,
222
+ };
223
+ }));
224
+ return result;
237
225
  }
238
- createRecordOriginalValues(_a) {
239
- return __awaiter(this, arguments, void 0, function* ({ resource, record }) {
240
- const tableName = resource.table;
241
- const columns = Object.keys(record);
242
- const placeholders = columns.map(() => '?').join(', ');
243
- const values = columns.map((colName) => record[colName]);
244
- const q = this.db.prepare(`INSERT INTO ${tableName} (${columns.join(', ')}) VALUES (${placeholders})`);
245
- yield q.run(values);
246
- });
226
+ async createRecordOriginalValues({ resource, record }) {
227
+ const tableName = resource.table;
228
+ const columns = Object.keys(record);
229
+ const placeholders = columns.map(() => '?').join(', ');
230
+ const values = columns.map((colName) => record[colName]);
231
+ const q = this.db.prepare(`INSERT INTO ${tableName} (${columns.join(', ')}) VALUES (${placeholders})`);
232
+ await q.run(values);
247
233
  }
248
- updateRecordOriginalValues(_a) {
249
- return __awaiter(this, arguments, void 0, function* ({ resource, recordId, newValues }) {
250
- const columnsWithPlaceholders = Object.keys(newValues).map((col) => `${col} = ?`);
251
- const values = [...Object.values(newValues), recordId];
252
- const q = this.db.prepare(`UPDATE ${resource.table} SET ${columnsWithPlaceholders} WHERE ${this.getPrimaryKey(resource)} = ?`);
253
- process.env.HEAVY_DEBUG && console.log('🪲 SQLITE Query', `UPDATE ${resource.table} SET ${columnsWithPlaceholders} WHERE ${this.getPrimaryKey(resource)} = ?`, 'params:', values);
254
- yield q.run(values);
255
- });
234
+ async updateRecordOriginalValues({ resource, recordId, newValues }) {
235
+ const columnsWithPlaceholders = Object.keys(newValues).map((col) => `${col} = ?`);
236
+ const values = [...Object.values(newValues), recordId];
237
+ const q = this.db.prepare(`UPDATE ${resource.table} SET ${columnsWithPlaceholders} WHERE ${this.getPrimaryKey(resource)} = ?`);
238
+ process.env.HEAVY_DEBUG && console.log('🪲 SQLITE Query', `UPDATE ${resource.table} SET ${columnsWithPlaceholders} WHERE ${this.getPrimaryKey(resource)} = ?`, 'params:', values);
239
+ await q.run(values);
256
240
  }
257
- deleteRecord(_a) {
258
- return __awaiter(this, arguments, void 0, function* ({ resource, recordId }) {
259
- const q = this.db.prepare(`DELETE FROM ${resource.table} WHERE ${this.getPrimaryKey(resource)} = ?`);
260
- const res = yield q.run(recordId);
261
- return res.changes > 0;
262
- });
241
+ async deleteRecord({ resource, recordId }) {
242
+ const q = this.db.prepare(`DELETE FROM ${resource.table} WHERE ${this.getPrimaryKey(resource)} = ?`);
243
+ const res = await q.run(recordId);
244
+ return res.changes > 0;
263
245
  }
264
246
  close() {
265
247
  this.db.close();
266
248
  }
267
249
  }
268
250
  export default SQLiteConnector;
251
+ //# sourceMappingURL=sqlite.js.map