vona-module-a-orm 5.1.30 → 5.1.32

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.
@@ -4,6 +4,16 @@ import { BeanBase } from 'vona';
4
4
  import type { ITableColumn } from '../types/columns.ts';
5
5
  import type { ConfigDatabaseClient } from '../types/config.ts';
6
6
  import type { IDatabaseDialectCapabilities, IFetchDatabasesResultItem, IFetchIndexesResultItem, TypeDatabaseDialectTableColumnsFn } from '../types/dialect.ts';
7
+ type ColumnDefaultLiteral = {
8
+ kind: 'string';
9
+ value: string;
10
+ } | {
11
+ kind: 'boolean';
12
+ value: boolean;
13
+ } | {
14
+ kind: 'number';
15
+ value: string;
16
+ };
7
17
  export declare class ServiceDatabaseDialectBase extends BeanBase {
8
18
  protected _capabilities?: IDatabaseDialectCapabilities;
9
19
  protected _configBase?: Partial<ConfigDatabaseClient>;
@@ -19,13 +29,21 @@ export declare class ServiceDatabaseDialectBase extends BeanBase {
19
29
  query(_result: any): void;
20
30
  viewDependents(_builder: Knex.QueryBuilder, _viewName: string): Promise<string[]>;
21
31
  coerceColumn(column: Knex.ColumnInfo): ITableColumn;
22
- protected _isMysqlBooleanColumn(column: ITableColumn): boolean;
32
+ protected _isMysqlBooleanColumn(column: Pick<ITableColumn, 'columnType'>): boolean;
23
33
  protected selectAsMysql(_builder: Knex.QueryBuilder, datas: any[], fn: TypeDatabaseDialectTableColumnsFn): Promise<any[]>;
24
34
  protected selectAsSqlite3(_builder: Knex.QueryBuilder, datas: any[], fn: TypeDatabaseDialectTableColumnsFn): Promise<any[]>;
25
35
  protected insertAsMysql(builder: Knex.QueryBuilder, datas: any[]): Promise<[TableIdentity[], Knex.QueryBuilder]>;
26
36
  protected insertAsPg(builder: Knex.QueryBuilder, datas: any[]): Promise<[TableIdentity[], Knex.QueryBuilder]>;
27
- protected _coerceColumnValue(type: string, value: any): any;
28
- protected _safeNumber(value: any): number | undefined;
29
- protected _columnTypePrefixes(type: string, prefixes: string[]): boolean;
37
+ protected _coerceColumnValue(column: Pick<ITableColumn, 'type' | 'columnType'>, value: unknown): {} | undefined;
38
+ protected _isBooleanColumn(column: Pick<ITableColumn, 'type' | 'columnType'>): boolean;
39
+ protected _columnTypeName(type: string): string;
40
+ protected _coerceColumnLiteral(value: string): ColumnDefaultLiteral | undefined;
41
+ protected _unwrapColumnDefault(value: string): string;
42
+ protected _isScalarColumnDefault(value: string): boolean;
43
+ protected _isColumnDefaultBalanced(value: string): boolean;
44
+ protected _isExpressionColumnDefault(value: string): boolean;
45
+ protected _safeInteger(value: string): string | number;
46
+ protected _safeNumber(value: string): number | undefined;
30
47
  }
48
+ export {};
31
49
  //# sourceMappingURL=databaseDialectBase_.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"databaseDialectBase_.d.ts","sourceRoot":"","sources":["../../src/service/databaseDialectBase_.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"databaseDialectBase_.d.ts","sourceRoot":"","sources":["../../src/service/databaseDialectBase_.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"transactionFiber_.d.ts","sourceRoot":"","sources":["../../src/service/transactionFiber_.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAExC,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAKhC,qBACa,uBAAwB,SAAQ,QAAQ;IACnD,OAAO,CAAC,WAAW,CAAwB;IAC3C,OAAO,CAAC,uBAAuB,CAAiC;IAEhE,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW;IAKpD,IAAW,UAAU,sCAEpB;IAED,MAAM,CAAC,EAAE,EAAE,WAAW;IAItB,UAAU,CAAC,EAAE,EAAE,WAAW;IAIpB,QAAQ;IAKR,UAAU;IAKV,WAAW;IAIX,eAAe;CAGtB"}
1
+ {"version":3,"file":"transactionFiber_.d.ts","sourceRoot":"","sources":["../../src/service/transactionFiber_.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAExC,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAKhC,qBACa,uBAAwB,SAAQ,QAAQ;IACnD,OAAO,CAAC,WAAW,CAAwB;IAC3C,OAAO,CAAC,uBAAuB,CAAiC;IAEhE,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW;IAKpD,IAAW,UAAU,sCAEpB;IAED,MAAM,CAAC,EAAE,EAAE,WAAW;IAItB,UAAU,CAAC,EAAE,EAAE,WAAW;IAIpB,QAAQ;IASR,UAAU;IAKV,WAAW;IAIX,eAAe;CAGtB"}
@@ -1 +1 @@
1
- {"version":3,"file":"transaction_.d.ts","sourceRoot":"","sources":["../../src/service/transaction_.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAEvD,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAGhC,OAAO,KAAK,EACV,oCAAoC,EACpC,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAKtE,qBACa,kBAAmB,SAAQ,QAAQ;IAC9C,OAAO,CAAC,GAAG,CAAY;IAEvB,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS;IAIhC,IAAI,gBAAgB,wDAEnB;IAED,IAAI,gBAAgB,IAAI,uBAAuB,GAAG,SAAS,CAE1D;IAED,IAAI,aAAa,YAEhB;IAED,IAAI,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,SAAS,CAElD;IAEK,MAAM,CAAC,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,oCAAoC;IAW5E,UAAU,CAAC,EAAE,EAAE,WAAW;IAOpB,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC;YAiDhF,uBAAuB;CAmCtC"}
1
+ {"version":3,"file":"transaction_.d.ts","sourceRoot":"","sources":["../../src/service/transaction_.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAEvD,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAGhC,OAAO,KAAK,EACV,oCAAoC,EACpC,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAKtE,qBACa,kBAAmB,SAAQ,QAAQ;IAC9C,OAAO,CAAC,GAAG,CAAY;IAEvB,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS;IAIhC,IAAI,gBAAgB,wDAEnB;IAED,IAAI,gBAAgB,IAAI,uBAAuB,GAAG,SAAS,CAE1D;IAED,IAAI,aAAa,YAEhB;IAED,IAAI,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,SAAS,CAElD;IAEK,MAAM,CAAC,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,oCAAoC;IAW5E,UAAU,CAAC,EAAE,EAAE,WAAW;IAOpB,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC;YAiDhF,uBAAuB;CAsCtC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "vona-module-a-orm",
3
- "version": "5.1.30",
4
- "gitHead": "eb85d771ef75776a439e56df3af8be6a3a36c1c2",
3
+ "version": "5.1.32",
4
+ "gitHead": "8d575dd958be6aa16daa249bdbdb024d20d0789d",
5
5
  "description": "db",
6
6
  "keywords": [
7
7
  "Cabloy Module"
@@ -15,17 +15,17 @@ import type {
15
15
  } from '../types/dialect.ts';
16
16
 
17
17
  const BOOLEAN_COLUMN_TYPES = ['bit', 'bool', 'boolean'];
18
- const NUMBER_COLUMN_TYPES = ['int'];
19
- const TIMESTAMP_COLUMN_TYPE_PREFIXES = ['timestamp'];
20
- const FLOAT_COLUMN_TYPE_PREFIXES = ['float', 'double'];
21
- const INTEGER_COLUMN_TYPE_PREFIXES = [
22
- 'tinyint',
23
- 'smallint',
24
- 'mediumint',
25
- 'bigint',
26
- 'numeric',
27
- 'integer',
28
- ];
18
+ const INTEGER_COLUMN_TYPES = ['tinyint', 'smallint', 'mediumint', 'int', 'integer'];
19
+ const FLOAT_COLUMN_TYPES = ['float', 'double'];
20
+ const GENERATED_DEFAULT_PATTERN =
21
+ /^(?:current_timestamp\b(?:\s*\(\s*\d*\s*\))?|current_date\b|current_time\b(?:\s*\(\s*\d*\s*\))?|now\s*\(\s*\)|nextval\s*\()/i;
22
+ const NUMBER_LITERAL_PATTERN = /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i;
23
+ const QUOTED_LITERAL_PATTERN = /^'((?:''|[^'])*)'$/;
24
+
25
+ type ColumnDefaultLiteral =
26
+ | { kind: 'string'; value: string }
27
+ | { kind: 'boolean'; value: boolean }
28
+ | { kind: 'number'; value: string };
29
29
 
30
30
  @Service()
31
31
  @Virtual()
@@ -96,13 +96,13 @@ export class ServiceDatabaseDialectBase extends BeanBase {
96
96
 
97
97
  coerceColumn(column: Knex.ColumnInfo): ITableColumn {
98
98
  const result = { type: column.type } as ITableColumn;
99
- result.default = this._coerceColumnValue(column.type, column.defaultValue);
100
99
  const columnType = (column as Knex.ColumnInfo & { columnType?: string }).columnType;
101
100
  if (columnType) result.columnType = columnType;
101
+ result.default = this._coerceColumnValue(result, column.defaultValue);
102
102
  return result;
103
103
  }
104
104
 
105
- protected _isMysqlBooleanColumn(column: ITableColumn) {
105
+ protected _isMysqlBooleanColumn(column: Pick<ITableColumn, 'columnType'>) {
106
106
  return column.columnType?.trim().toLowerCase() === 'tinyint(1)';
107
107
  }
108
108
 
@@ -191,34 +191,105 @@ export class ServiceDatabaseDialectBase extends BeanBase {
191
191
  return [items.map(item => item.id), builder];
192
192
  }
193
193
 
194
- protected _coerceColumnValue(type: string, value) {
194
+ protected _coerceColumnValue(column: Pick<ITableColumn, 'type' | 'columnType'>, value: unknown) {
195
195
  if (isNil(value)) return undefined;
196
- if (BOOLEAN_COLUMN_TYPES.includes(type)) return safeBoolean(value);
197
- if (NUMBER_COLUMN_TYPES.includes(type)) return this._safeNumber(value);
198
- if (
199
- this._columnTypePrefixes(type, TIMESTAMP_COLUMN_TYPE_PREFIXES) &&
200
- value === 'CURRENT_TIMESTAMP'
201
- ) {
202
- return undefined; // new Date();
196
+ if (typeof value !== 'string') {
197
+ return this._isBooleanColumn(column) ? safeBoolean(value as any) : value;
203
198
  }
204
- if (this._columnTypePrefixes(type, FLOAT_COLUMN_TYPE_PREFIXES)) {
205
- return this._safeNumber(value);
199
+
200
+ const literal = this._coerceColumnLiteral(value);
201
+ if (literal === undefined) return undefined;
202
+ if (this._isBooleanColumn(column)) return safeBoolean(literal.value);
203
+ if (literal.kind === 'boolean') return literal.value;
204
+
205
+ const type = this._columnTypeName(column.type);
206
+ if (literal.kind === 'string') return literal.value;
207
+ if (INTEGER_COLUMN_TYPES.includes(type)) return this._safeInteger(literal.value);
208
+ if (FLOAT_COLUMN_TYPES.includes(type)) return this._safeNumber(literal.value);
209
+ return literal.value;
210
+ }
211
+
212
+ protected _isBooleanColumn(column: Pick<ITableColumn, 'type' | 'columnType'>) {
213
+ return (
214
+ this._isMysqlBooleanColumn(column) ||
215
+ BOOLEAN_COLUMN_TYPES.includes(this._columnTypeName(column.type))
216
+ );
217
+ }
218
+
219
+ protected _columnTypeName(type: string) {
220
+ return type.trim().toLowerCase().match(/^\w+/)?.[0] ?? '';
221
+ }
222
+
223
+ protected _coerceColumnLiteral(value: string): ColumnDefaultLiteral | undefined {
224
+ const literal = this._unwrapColumnDefault(value);
225
+ if (literal === '') return undefined;
226
+ const literalLower = literal.toLowerCase();
227
+ if (literalLower === 'null' || GENERATED_DEFAULT_PATTERN.test(literal)) return undefined;
228
+ const quoted = literal.match(QUOTED_LITERAL_PATTERN);
229
+ if (quoted) return { kind: 'string', value: quoted[1].replaceAll("''", "'") };
230
+ if (literalLower === 'true' || literalLower === 't') return { kind: 'boolean', value: true };
231
+ if (literalLower === 'false' || literalLower === 'f') return { kind: 'boolean', value: false };
232
+ if (NUMBER_LITERAL_PATTERN.test(literal)) return { kind: 'number', value: literal };
233
+ if (this._isExpressionColumnDefault(literal)) return undefined;
234
+ return { kind: 'string', value: literal };
235
+ }
236
+
237
+ protected _unwrapColumnDefault(value: string) {
238
+ let literal = value.trim();
239
+ while (literal.startsWith('(') && literal.endsWith(')')) {
240
+ const inner = literal.slice(1, -1).trim();
241
+ if (!inner || !this._isColumnDefaultBalanced(inner)) break;
242
+ literal = inner;
206
243
  }
207
- if (this._columnTypePrefixes(type, INTEGER_COLUMN_TYPE_PREFIXES)) {
208
- return this._safeNumber(value);
244
+ const castIndex = literal.indexOf('::');
245
+ if (castIndex > 0 && this._isScalarColumnDefault(literal.slice(0, castIndex).trim())) {
246
+ literal = literal.slice(0, castIndex).trim();
209
247
  }
210
- // pg: NULL::character varying
211
- if (value.indexOf('NULL::') === 0) return undefined;
212
- return value;
248
+ return literal;
213
249
  }
214
250
 
215
- // pg: nextval
216
- protected _safeNumber(value) {
251
+ protected _isScalarColumnDefault(value: string) {
252
+ return (
253
+ value.toLowerCase() === 'null' ||
254
+ QUOTED_LITERAL_PATTERN.test(value) ||
255
+ value.toLowerCase() === 'true' ||
256
+ value.toLowerCase() === 'false' ||
257
+ NUMBER_LITERAL_PATTERN.test(value)
258
+ );
259
+ }
260
+
261
+ protected _isColumnDefaultBalanced(value: string) {
262
+ let depth = 0;
263
+ let quoted = false;
264
+ for (let index = 0; index < value.length; index++) {
265
+ const char = value[index];
266
+ if (char === "'") {
267
+ if (quoted && value[index + 1] === "'") {
268
+ index++;
269
+ } else {
270
+ quoted = !quoted;
271
+ }
272
+ } else if (!quoted && char === '(') {
273
+ depth++;
274
+ } else if (!quoted && char === ')') {
275
+ if (depth === 0) return false;
276
+ depth--;
277
+ }
278
+ }
279
+ return !quoted && depth === 0;
280
+ }
281
+
282
+ protected _isExpressionColumnDefault(value: string) {
283
+ return /[()*/+\-\s]/.test(value);
284
+ }
285
+
286
+ protected _safeInteger(value: string) {
217
287
  const num = Number(value);
218
- return Number.isNaN(num) ? undefined : num;
288
+ return Number.isSafeInteger(num) ? num : value;
219
289
  }
220
290
 
221
- protected _columnTypePrefixes(type: string, prefixes: string[]) {
222
- return prefixes.some(prefix => type.includes(prefix));
291
+ protected _safeNumber(value: string) {
292
+ const num = Number(value);
293
+ return Number.isFinite(num) ? num : undefined;
223
294
  }
224
295
  }
@@ -29,8 +29,12 @@ export class ServiceTransactionFiber extends BeanBase {
29
29
  }
30
30
 
31
31
  async doCommit() {
32
- await this._connection.commit();
33
- this._connection = undefined as any;
32
+ const connection = this._connection;
33
+ try {
34
+ await Promise.all([connection.executionPromise, connection.commit()]);
35
+ } finally {
36
+ this._connection = undefined as any;
37
+ }
34
38
  }
35
39
 
36
40
  async doRollback() {
@@ -134,9 +134,12 @@ export class ServiceTransaction extends BeanBase {
134
134
  if (fiber) {
135
135
  try {
136
136
  await fiber.doCommit();
137
- } finally {
137
+ } catch (err) {
138
138
  this.transactionState.remove(this._db);
139
+ await fiber.compensatesDone();
140
+ throw err;
139
141
  }
142
+ this.transactionState.remove(this._db);
140
143
  await fiber.commitsDone();
141
144
  }
142
145
  return res;