vona-module-a-ormdialect 5.0.19 → 5.0.21

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.
@@ -1,37 +1,54 @@
1
1
  /** databaseDialect: begin */
2
+ export * from '../bean/databaseDialect.betterSqlite3.ts';
2
3
  export * from '../bean/databaseDialect.mysql.ts';
3
4
  export * from '../bean/databaseDialect.mysql3.ts';
4
5
  export * from '../bean/databaseDialect.pg.ts';
5
- import 'vona';
6
- declare module 'vona' {
6
+ import type { IDatabaseDialectOptionsBetterSqlite3 } from '../bean/databaseDialect.betterSqlite3.ts';
7
+ import type { IDatabaseDialectOptionsMysql } from '../bean/databaseDialect.mysql.ts';
8
+ import type { IDatabaseDialectOptionsMysql3 } from '../bean/databaseDialect.mysql3.ts';
9
+ import type { IDatabaseDialectOptionsPg } from '../bean/databaseDialect.pg.ts';
10
+ import 'vona-module-a-orm';
11
+ declare module 'vona-module-a-orm' {
7
12
  interface IDatabaseDialectRecord {
8
- 'a-ormdialect:mysql': never;
9
- 'a-ormdialect:mysql3': never;
10
- 'a-ormdialect:pg': never;
13
+ 'a-ormdialect:betterSqlite3': IDatabaseDialectOptionsBetterSqlite3;
14
+ 'a-ormdialect:mysql': IDatabaseDialectOptionsMysql;
15
+ 'a-ormdialect:mysql3': IDatabaseDialectOptionsMysql3;
16
+ 'a-ormdialect:pg': IDatabaseDialectOptionsPg;
11
17
  }
12
18
  }
13
19
  declare module 'vona-module-a-ormdialect' {
20
+ interface DatabaseDialectBetterSqlite3 {
21
+ }
22
+ interface DatabaseDialectBetterSqlite3 {
23
+ get $beanFullName(): 'a-ormdialect.databaseDialect.betterSqlite3';
24
+ get $onionName(): 'a-ormdialect:betterSqlite3';
25
+ get $onionOptions(): IDatabaseDialectOptionsBetterSqlite3;
26
+ }
14
27
  interface DatabaseDialectMysql {
15
28
  }
16
29
  interface DatabaseDialectMysql {
17
30
  get $beanFullName(): 'a-ormdialect.databaseDialect.mysql';
18
31
  get $onionName(): 'a-ormdialect:mysql';
32
+ get $onionOptions(): IDatabaseDialectOptionsMysql;
19
33
  }
20
34
  interface DatabaseDialectPg {
21
35
  }
22
36
  interface DatabaseDialectPg {
23
37
  get $beanFullName(): 'a-ormdialect.databaseDialect.pg';
24
38
  get $onionName(): 'a-ormdialect:pg';
39
+ get $onionOptions(): IDatabaseDialectOptionsPg;
25
40
  }
26
41
  }
27
42
  /** databaseDialect: end */
28
43
  /** databaseDialect: begin */
44
+ import type { DatabaseDialectBetterSqlite3 } from '../bean/databaseDialect.betterSqlite3.ts';
29
45
  import type { DatabaseDialectMysql } from '../bean/databaseDialect.mysql.ts';
30
46
  import type { DatabaseDialectMysql3 } from '../bean/databaseDialect.mysql3.ts';
31
47
  import type { DatabaseDialectPg } from '../bean/databaseDialect.pg.ts';
32
48
  import 'vona';
33
49
  declare module 'vona' {
34
50
  interface IBeanRecordGeneral {
51
+ 'a-ormdialect.databaseDialect.betterSqlite3': DatabaseDialectBetterSqlite3;
35
52
  'a-ormdialect.databaseDialect.mysql': DatabaseDialectMysql;
36
53
  'a-ormdialect.databaseDialect.mysql3': DatabaseDialectMysql3;
37
54
  'a-ormdialect.databaseDialect.pg': DatabaseDialectPg;
@@ -0,0 +1,18 @@
1
+ import type { Knex } from 'knex';
2
+ import type { TableIdentity } from 'table-identity';
3
+ import type { ConfigDatabaseClient, IDatabaseDialectCapabilities, IDecoratorDatabaseDialectOptions, IFetchDatabasesResultItem, IFetchIndexesResultItem, TypeDatabaseDialectTableColumnsFn } from 'vona-module-a-orm';
4
+ import { BeanDatabaseDialectBase } from 'vona-module-a-orm';
5
+ export interface IDatabaseDialectOptionsBetterSqlite3 extends IDecoratorDatabaseDialectOptions {
6
+ }
7
+ export declare class DatabaseDialectBetterSqlite3 extends BeanDatabaseDialectBase {
8
+ protected _capabilities: IDatabaseDialectCapabilities;
9
+ protected _configBase?: Partial<ConfigDatabaseClient>;
10
+ fetchDatabases(_schemaBuilder: Knex.SchemaBuilder, databasePrefix: string): Promise<IFetchDatabasesResultItem[]>;
11
+ createDatabase(_schemaBuilder: Knex.SchemaBuilder, databaseName: string): Promise<string>;
12
+ dropDatabase(_schemaBuilder: Knex.SchemaBuilder, databaseName: string): Promise<void>;
13
+ fetchIndexes(schemaBuilder: Knex.SchemaBuilder, tableName: string): Promise<IFetchIndexesResultItem[]>;
14
+ insert(builder: Knex.QueryBuilder, datas: any[]): Promise<TableIdentity[]>;
15
+ select(builder: Knex.QueryBuilder, datas: any[], fn: TypeDatabaseDialectTableColumnsFn): Promise<any[]>;
16
+ query(result: any): any;
17
+ private _getDbDir;
18
+ }
@@ -1,11 +1,14 @@
1
1
  import type { Knex } from 'knex';
2
2
  import type { TableIdentity } from 'table-identity';
3
- import type { ConfigDatabaseClient, IFetchDatabasesResultItem, IFetchIndexesResultItem } from 'vona-module-a-orm';
3
+ import type { ConfigDatabaseClient, IDatabaseDialectCapabilities, IDecoratorDatabaseDialectOptions, IFetchDatabasesResultItem, IFetchIndexesResultItem } from 'vona-module-a-orm';
4
4
  import { BeanDatabaseDialectBase } from 'vona-module-a-orm';
5
+ export interface IDatabaseDialectOptionsMysql extends IDecoratorDatabaseDialectOptions {
6
+ }
5
7
  export declare class DatabaseDialectMysql extends BeanDatabaseDialectBase {
6
- getConfigBase(): ConfigDatabaseClient | undefined;
8
+ protected _capabilities: IDatabaseDialectCapabilities;
9
+ protected _configBase?: Partial<ConfigDatabaseClient>;
7
10
  fetchDatabases(schemaBuilder: Knex.SchemaBuilder, databasePrefix: string): Promise<IFetchDatabasesResultItem[]>;
8
- createDatabase(schemaBuilder: Knex.SchemaBuilder, databaseName: string): Promise<void>;
11
+ createDatabase(schemaBuilder: Knex.SchemaBuilder, databaseName: string): Promise<string>;
9
12
  dropDatabase(schemaBuilder: Knex.SchemaBuilder, databaseName: string): Promise<void>;
10
13
  fetchIndexes(schemaBuilder: Knex.SchemaBuilder, tableName: string): Promise<IFetchIndexesResultItem[]>;
11
14
  insert(builder: Knex.QueryBuilder, datas: any[]): Promise<TableIdentity[]>;
@@ -1,5 +1,6 @@
1
- import type { ConfigDatabaseClient } from 'vona-module-a-orm';
1
+ import type { IDecoratorDatabaseDialectOptions } from 'vona-module-a-orm';
2
2
  import { DatabaseDialectMysql } from './databaseDialect.mysql.ts';
3
+ export interface IDatabaseDialectOptionsMysql3 extends IDecoratorDatabaseDialectOptions {
4
+ }
3
5
  export declare class DatabaseDialectMysql3 extends DatabaseDialectMysql {
4
- getConfigBase(): ConfigDatabaseClient | undefined;
5
6
  }
@@ -1,11 +1,14 @@
1
1
  import type { Knex } from 'knex';
2
2
  import type { TableIdentity } from 'table-identity';
3
- import type { ConfigDatabaseClient, IFetchDatabasesResultItem, IFetchIndexesResultItem } from 'vona-module-a-orm';
3
+ import type { ConfigDatabaseClient, IDatabaseDialectCapabilities, IDecoratorDatabaseDialectOptions, IFetchDatabasesResultItem, IFetchIndexesResultItem } from 'vona-module-a-orm';
4
4
  import { BeanDatabaseDialectBase } from 'vona-module-a-orm';
5
+ export interface IDatabaseDialectOptionsPg extends IDecoratorDatabaseDialectOptions {
6
+ }
5
7
  export declare class DatabaseDialectPg extends BeanDatabaseDialectBase {
6
- getConfigBase(): ConfigDatabaseClient | undefined;
8
+ protected _capabilities: IDatabaseDialectCapabilities;
9
+ protected _configBase?: Partial<ConfigDatabaseClient>;
7
10
  fetchDatabases(schemaBuilder: Knex.SchemaBuilder, databasePrefix: string): Promise<IFetchDatabasesResultItem[]>;
8
- createDatabase(schemaBuilder: Knex.SchemaBuilder, databaseName: string): Promise<void>;
11
+ createDatabase(schemaBuilder: Knex.SchemaBuilder, databaseName: string): Promise<string>;
9
12
  dropDatabase(schemaBuilder: Knex.SchemaBuilder, databaseName: string): Promise<void>;
10
13
  fetchIndexes(schemaBuilder: Knex.SchemaBuilder, tableName: string): Promise<IFetchIndexesResultItem[]>;
11
14
  insert(builder: Knex.QueryBuilder, datas: any[]): Promise<TableIdentity[]>;
package/dist/index.js CHANGED
@@ -1,15 +1,93 @@
1
1
  import { BeanInfo, Virtual, BeanScopeBase } from 'vona';
2
- import { promisify } from 'node:util';
3
- import { isNil } from '@cabloy/utils';
2
+ import path from 'node:path';
3
+ import { ensureDir, remove } from 'fs-extra';
4
+ import { globby } from 'globby';
4
5
  import { DatabaseDialect, BeanDatabaseDialectBase } from 'vona-module-a-orm';
6
+ import { promisify } from 'node:util';
5
7
  import { Scope } from 'vona-module-a-bean';
6
8
 
9
+ var _dec$4, _dec2$4, _class$4;
10
+ let DatabaseDialectBetterSqlite3 = (_dec$4 = DatabaseDialect(), _dec2$4 = BeanInfo({
11
+ module: "a-ormdialect"
12
+ }), _dec$4(_class$4 = _dec2$4(_class$4 = class DatabaseDialectBetterSqlite3 extends BeanDatabaseDialectBase {
13
+ constructor(...args) {
14
+ super(...args);
15
+ this._capabilities = {
16
+ ilike: false,
17
+ level: false
18
+ };
19
+ this._configBase = {
20
+ useNullAsDefault: true,
21
+ pool: {
22
+ afterCreate(conn, done) {
23
+ sqlite3_afterCreate(conn).then(done).catch(done);
24
+ }
25
+ }
26
+ };
27
+ }
28
+ async fetchDatabases(_schemaBuilder, databasePrefix) {
29
+ const dbDir = this._getDbDir();
30
+ const files = await globby(`${databasePrefix}*.db`, {
31
+ cwd: dbDir,
32
+ onlyFiles: true
33
+ });
34
+ return files.map(item => {
35
+ return {
36
+ name: path.join(dbDir, item)
37
+ };
38
+ });
39
+ }
40
+ async createDatabase(_schemaBuilder, databaseName) {
41
+ const dbDir = this._getDbDir();
42
+ await ensureDir(dbDir);
43
+ return path.join(dbDir, `${databaseName}.db`);
44
+ }
45
+ async dropDatabase(_schemaBuilder, databaseName) {
46
+ await remove(databaseName);
47
+ for (const part of ['shm', 'wal', 'journal']) {
48
+ await remove(`${databaseName}-${part}`);
49
+ }
50
+ }
51
+ async fetchIndexes(schemaBuilder, tableName) {
52
+ let items = await schemaBuilder.raw(`PRAGMA index_list(${tableName})`);
53
+ items = items.map(item => {
54
+ return {
55
+ indexName: item.name
56
+ };
57
+ });
58
+ return items;
59
+ }
60
+ async insert(builder, datas) {
61
+ return await this.insertAsMysql(builder, datas);
62
+ }
63
+ async select(builder, datas, fn) {
64
+ return await this.selectAsSqlite3(builder, datas, fn);
65
+ }
66
+ query(result) {
67
+ return result;
68
+ }
69
+ _getDbDir() {
70
+ return path.join(this.app.projectPath, '.app/sqlite3');
71
+ }
72
+ }) || _class$4) || _class$4);
73
+ async function sqlite3_afterCreate(conn) {
74
+ const pragma = conn.pragma('journal_mode');
75
+ if (pragma[0]?.journal_mode?.toLocaleLowerCase() !== 'wal') {
76
+ conn.pragma('journal_mode = wal');
77
+ }
78
+ }
79
+
7
80
  var _dec$3, _dec2$3, _class$3;
8
81
  let DatabaseDialectMysql = (_dec$3 = DatabaseDialect(), _dec2$3 = BeanInfo({
9
82
  module: "a-ormdialect"
10
83
  }), _dec$3(_class$3 = _dec2$3(_class$3 = class DatabaseDialectMysql extends BeanDatabaseDialectBase {
11
- getConfigBase() {
12
- return {
84
+ constructor(...args) {
85
+ super(...args);
86
+ this._capabilities = {
87
+ ilike: false,
88
+ level: true
89
+ };
90
+ this._configBase = {
13
91
  pool: {
14
92
  afterCreate(conn, done) {
15
93
  mysql_afterCreate(conn).then(done).catch(done);
@@ -30,6 +108,7 @@ let DatabaseDialectMysql = (_dec$3 = DatabaseDialect(), _dec2$3 = BeanInfo({
30
108
  }
31
109
  async createDatabase(schemaBuilder, databaseName) {
32
110
  await schemaBuilder.raw(`CREATE DATABASE \`${databaseName}\` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci`);
111
+ return databaseName;
33
112
  }
34
113
  async dropDatabase(schemaBuilder, databaseName) {
35
114
  await schemaBuilder.raw(`drop database \`${databaseName}\``);
@@ -45,21 +124,7 @@ let DatabaseDialectMysql = (_dec$3 = DatabaseDialect(), _dec2$3 = BeanInfo({
45
124
  return items;
46
125
  }
47
126
  async insert(builder, datas) {
48
- if (datas.length === 0) return [];
49
- if (isNil(datas[0].id)) {
50
- const ids = [];
51
- for (const data of datas) {
52
- const builder2 = builder.clone();
53
- builder2.insert(data);
54
- const items = await builder2;
55
- ids.push(items[0]);
56
- }
57
- return ids;
58
- } else {
59
- builder.insert(datas);
60
- await builder;
61
- return datas.map(item => item.id);
62
- }
127
+ return await this.insertAsMysql(builder, datas);
63
128
  }
64
129
  query(result) {
65
130
  return result[0];
@@ -94,38 +159,19 @@ async function _executeQuery(conn, sql) {
94
159
  var _dec$2, _dec2$2, _dec3, _class$2;
95
160
  let DatabaseDialectMysql3 = (_dec$2 = DatabaseDialect(), _dec2$2 = Virtual(), _dec3 = BeanInfo({
96
161
  module: "a-ormdialect"
97
- }), _dec$2(_class$2 = _dec2$2(_class$2 = _dec3(_class$2 = class DatabaseDialectMysql3 extends DatabaseDialectMysql {
98
- getConfigBase() {
99
- return super.getConfigBase();
100
- // const configBase = super.getConfigBase();
101
- // return Object.assign({}, configBase, {
102
- // connection: {
103
- // // typeCast(field, next) {
104
- // // if (field.type === 'JSON') {
105
- // // return field.string('utf-8'); // utf8 https://github.com/sidorares/node-mysql2/pull/1662
106
- // // }
107
- // // return next();
108
- // // },
109
- // },
110
- // });
111
- }
112
- }) || _class$2) || _class$2) || _class$2);
162
+ }), _dec$2(_class$2 = _dec2$2(_class$2 = _dec3(_class$2 = class DatabaseDialectMysql3 extends DatabaseDialectMysql {}) || _class$2) || _class$2) || _class$2);
113
163
 
114
164
  var _dec$1, _dec2$1, _class$1;
115
165
  let DatabaseDialectPg = (_dec$1 = DatabaseDialect(), _dec2$1 = BeanInfo({
116
166
  module: "a-ormdialect"
117
167
  }), _dec$1(_class$1 = _dec2$1(_class$1 = class DatabaseDialectPg extends BeanDatabaseDialectBase {
118
- getConfigBase() {
119
- return {
120
- connection: {
121
- // types: {
122
- // getTypeParser: (oid: number, format: string): any => {
123
- // if (oid === 114) return pgTypes.getTypeParser(25, 'text');
124
- // return pgTypes.getTypeParser(oid, cast(format));
125
- // },
126
- // },
127
- }
168
+ constructor(...args) {
169
+ super(...args);
170
+ this._capabilities = {
171
+ ilike: true,
172
+ level: true
128
173
  };
174
+ this._configBase = undefined;
129
175
  }
130
176
  async fetchDatabases(schemaBuilder, databasePrefix) {
131
177
  const res = await schemaBuilder.raw(`select datname from pg_database where datname like '${databasePrefix}%'`);
@@ -139,6 +185,7 @@ let DatabaseDialectPg = (_dec$1 = DatabaseDialect(), _dec2$1 = BeanInfo({
139
185
  }
140
186
  async createDatabase(schemaBuilder, databaseName) {
141
187
  await schemaBuilder.raw(`CREATE DATABASE "${databaseName}" encoding=UTF8`);
188
+ return databaseName;
142
189
  }
143
190
  async dropDatabase(schemaBuilder, databaseName) {
144
191
  await schemaBuilder.raw(`DROP DATABASE "${databaseName}"`);
@@ -154,16 +201,7 @@ let DatabaseDialectPg = (_dec$1 = DatabaseDialect(), _dec2$1 = BeanInfo({
154
201
  return items;
155
202
  }
156
203
  async insert(builder, datas) {
157
- if (datas.length === 0) return [];
158
- if (isNil(datas[0].id)) {
159
- builder.insert(datas).returning('id');
160
- const items = await builder;
161
- return items.map(item => item.id);
162
- } else {
163
- builder.insert(datas);
164
- await builder;
165
- return datas.map(item => item.id);
166
- }
204
+ return await this.insertAsPg(builder, datas);
167
205
  }
168
206
  query(result) {
169
207
  return result.rows;
@@ -201,4 +239,4 @@ let ScopeModuleAOrmdialect = (_dec = Scope(), _dec2 = BeanInfo({
201
239
 
202
240
  /** scope: end */
203
241
 
204
- export { DatabaseDialectMysql, DatabaseDialectMysql3, DatabaseDialectPg, ScopeModuleAOrmdialect };
242
+ export { DatabaseDialectBetterSqlite3, DatabaseDialectMysql, DatabaseDialectMysql3, DatabaseDialectPg, ScopeModuleAOrmdialect };
package/package.json CHANGED
@@ -1,10 +1,13 @@
1
1
  {
2
2
  "name": "vona-module-a-ormdialect",
3
3
  "type": "module",
4
- "version": "5.0.19",
4
+ "version": "5.0.21",
5
5
  "title": "a-ormdialect",
6
6
  "vonaModule": {
7
- "dependencies": {}
7
+ "dependencies": {},
8
+ "globalDependencies": {
9
+ "better-sqlite3": true
10
+ }
8
11
  },
9
12
  "description": "",
10
13
  "author": "",
@@ -26,6 +29,8 @@
26
29
  "dist"
27
30
  ],
28
31
  "dependencies": {
32
+ "better-sqlite3": "^12.5.0",
33
+ "globby": "^16.0.0",
29
34
  "mysql2": "^3.15.0",
30
35
  "pg": "^8.16.3",
31
36
  "pg-types": "^4.1.0"