remult 0.25.8 → 0.26.0
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/README.md +194 -129
- package/esm/graphql.js +131 -59
- package/esm/index.js +1 -1
- package/esm/migrations/compare-migration-snapshots.js +61 -0
- package/esm/migrations/generate-migrations.js +68 -0
- package/esm/migrations/index.js +2 -0
- package/esm/migrations/migrate.js +90 -0
- package/esm/migrations/migration-types.js +36 -0
- package/esm/migrations/update-migrations-ts-file.js +115 -0
- package/esm/postgres/postgres-data-provider.js +24 -3
- package/esm/postgres/schema-builder.js +35 -26
- package/esm/remult-better-sqlite3.js +47 -0
- package/esm/remult-bun-sqlite.js +41 -0
- package/esm/remult-knex/index.js +180 -51
- package/esm/remult-mongo.js +2 -2
- package/esm/remult-sql-js.js +3 -78
- package/esm/remult-sqlite-core.js +104 -0
- package/esm/server/expressBridge.js +130 -29
- package/esm/server/initAsyncHooks.js +75 -1
- package/esm/src/CompoundIdField.js +8 -2
- package/esm/src/context.js +20 -24
- package/esm/src/data-api.js +71 -30
- package/esm/src/data-providers/rest-data-provider.js +17 -15
- package/esm/src/data-providers/sql-database.js +32 -7
- package/esm/src/data-providers/web-sql-data-provider.js +1 -9
- package/esm/src/filter/filter-consumer-bridge-to-sql-request.js +37 -11
- package/esm/src/filter/filter-interfaces.js +229 -17
- package/esm/src/isOfType.js +9 -0
- package/esm/src/remult3/Fields.js +70 -18
- package/esm/src/remult3/RepositoryImplementation.js +47 -21
- package/esm/src/remult3/addValidator.js +15 -0
- package/esm/src/remult3/remult3.js +28 -57
- package/esm/src/server-action.js +4 -4
- package/esm/src/validators.js +6 -3
- package/esm/src/valueConverters.js +1 -1
- package/graphql.js +156 -71
- package/index.d.ts +4 -4
- package/index.js +2 -1
- package/migrations/compare-migration-snapshots.d.ts +27 -0
- package/migrations/compare-migration-snapshots.js +165 -0
- package/migrations/generate-migrations.d.ts +21 -0
- package/migrations/generate-migrations.js +104 -0
- package/migrations/index.d.ts +3 -0
- package/migrations/index.js +7 -0
- package/migrations/migrate.d.ts +27 -0
- package/migrations/migrate.js +175 -0
- package/migrations/migration-types.d.ts +48 -0
- package/migrations/migration-types.js +88 -0
- package/migrations/update-migrations-ts-file.d.ts +1 -0
- package/migrations/update-migrations-ts-file.js +141 -0
- package/package.json +21 -1
- package/postgres/postgres-data-provider.d.ts +8 -3
- package/postgres/postgres-data-provider.js +46 -3
- package/postgres/schema-builder.js +81 -48
- package/remult-better-sqlite3.d.ts +12 -0
- package/remult-better-sqlite3.js +64 -0
- package/remult-bun-sqlite.d.ts +11 -0
- package/remult-bun-sqlite.js +56 -0
- package/remult-knex/index.d.ts +12 -5
- package/remult-knex/index.js +257 -90
- package/remult-mongo.d.ts +2 -2
- package/remult-mongo.js +2 -2
- package/remult-sql-js.d.ts +2 -15
- package/remult-sql-js.js +11 -152
- package/remult-sqlite-core.d.ts +21 -0
- package/remult-sqlite-core.js +217 -0
- package/server/expressBridge.d.ts +30 -1
- package/server/expressBridge.js +140 -32
- package/server/initAsyncHooks.d.ts +16 -0
- package/server/initAsyncHooks.js +128 -2
- package/src/CompoundIdField.js +8 -2
- package/src/column-interfaces.d.ts +9 -3
- package/src/context.d.ts +8 -6
- package/src/context.js +27 -36
- package/src/data-api.d.ts +13 -9
- package/src/data-api.js +184 -135
- package/src/data-providers/rest-data-provider.js +26 -15
- package/src/data-providers/sql-database.d.ts +17 -5
- package/src/data-providers/sql-database.js +31 -7
- package/src/data-providers/web-sql-data-provider.d.ts +1 -2
- package/src/data-providers/web-sql-data-provider.js +4 -8
- package/src/entity.d.ts +64 -6
- package/src/filter/filter-consumer-bridge-to-sql-request.d.ts +31 -7
- package/src/filter/filter-consumer-bridge-to-sql-request.js +46 -21
- package/src/filter/filter-interfaces.d.ts +106 -39
- package/src/filter/filter-interfaces.js +312 -32
- package/src/isOfType.d.ts +2 -0
- package/src/isOfType.js +14 -0
- package/src/remult3/Fields.d.ts +36 -0
- package/src/remult3/Fields.js +81 -19
- package/src/remult3/RepositoryImplementation.d.ts +7 -3
- package/src/remult3/RepositoryImplementation.js +106 -71
- package/src/remult3/addValidator.d.ts +2 -0
- package/src/remult3/addValidator.js +20 -0
- package/src/remult3/remult3.d.ts +6 -2
- package/src/remult3/remult3.js +28 -57
- package/src/server-action.d.ts +1 -1
- package/src/server-action.js +5 -4
- package/src/sql-command.d.ts +6 -1
- package/src/validators.d.ts +1 -0
- package/src/validators.js +10 -4
- package/src/valueConverters.js +1 -1
package/remult-sql-js.d.ts
CHANGED
|
@@ -1,18 +1,5 @@
|
|
|
1
|
-
import type { EntityMetadata } from './src/remult3/remult3.js';
|
|
2
|
-
import type { SqlCommand, SqlImplementation } from './src/sql-command.js';
|
|
3
1
|
import type { Database } from 'sql.js';
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
import { SqliteCoreDataProvider } from './remult-sqlite-core.js';
|
|
3
|
+
export declare class SqlJsDataProvider extends SqliteCoreDataProvider {
|
|
6
4
|
constructor(db: Promise<Database>);
|
|
7
|
-
getLimitSqlSyntax(limit: number, offset: number): string;
|
|
8
|
-
afterMutation?: VoidFunction;
|
|
9
|
-
createCommand(): SqlCommand;
|
|
10
|
-
transaction(action: (sql: SqlImplementation) => Promise<void>): Promise<void>;
|
|
11
|
-
entityIsUsedForTheFirstTime(entity: EntityMetadata): Promise<void>;
|
|
12
|
-
ensureSchema(entities: EntityMetadata<any>[]): Promise<void>;
|
|
13
|
-
dropTable(entity: EntityMetadata): Promise<void>;
|
|
14
|
-
private addColumnSqlSyntax;
|
|
15
|
-
createTable(entity: EntityMetadata<any>): Promise<void>;
|
|
16
|
-
supportsJsonColumnType?: boolean;
|
|
17
|
-
wrapIdentifier?(name: string): string;
|
|
18
5
|
}
|
package/remult-sql-js.js
CHANGED
|
@@ -2,161 +2,20 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SqlJsDataProvider = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
|
-
var
|
|
6
|
-
var
|
|
7
|
-
|
|
8
|
-
var SqlJsDataProvider = /** @class */ (function () {
|
|
5
|
+
var remult_sqlite_core_js_1 = require("./remult-sqlite-core.js");
|
|
6
|
+
var SqlJsDataProvider = /** @class */ (function (_super) {
|
|
7
|
+
tslib_1.__extends(SqlJsDataProvider, _super);
|
|
9
8
|
function SqlJsDataProvider(db) {
|
|
10
|
-
|
|
9
|
+
var _this = _super.call(this, function () { return new SqlJsCommand(db); }, function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) {
|
|
10
|
+
switch (_a.label) {
|
|
11
|
+
case 0: return [4 /*yield*/, db];
|
|
12
|
+
case 1: return [2 /*return*/, (_a.sent()).close()];
|
|
13
|
+
}
|
|
14
|
+
}); }); }) || this;
|
|
15
|
+
return _this;
|
|
11
16
|
}
|
|
12
|
-
SqlJsDataProvider.prototype.getLimitSqlSyntax = function (limit, offset) {
|
|
13
|
-
return ' limit ' + limit + ' offset ' + offset;
|
|
14
|
-
};
|
|
15
|
-
SqlJsDataProvider.prototype.createCommand = function () {
|
|
16
|
-
return new SqlJsCommand(this.db);
|
|
17
|
-
};
|
|
18
|
-
SqlJsDataProvider.prototype.transaction = function (action) {
|
|
19
|
-
throw new Error('Method not implemented.');
|
|
20
|
-
};
|
|
21
|
-
SqlJsDataProvider.prototype.entityIsUsedForTheFirstTime = function (entity) {
|
|
22
|
-
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
23
|
-
return tslib_1.__generator(this, function (_a) {
|
|
24
|
-
switch (_a.label) {
|
|
25
|
-
case 0: return [4 /*yield*/, this.createTable(entity)];
|
|
26
|
-
case 1:
|
|
27
|
-
_a.sent();
|
|
28
|
-
return [2 /*return*/];
|
|
29
|
-
}
|
|
30
|
-
});
|
|
31
|
-
});
|
|
32
|
-
};
|
|
33
|
-
SqlJsDataProvider.prototype.ensureSchema = function (entities) {
|
|
34
|
-
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
35
|
-
var entities_1, entities_1_1, entity, e_1_1;
|
|
36
|
-
var e_1, _a;
|
|
37
|
-
return tslib_1.__generator(this, function (_b) {
|
|
38
|
-
switch (_b.label) {
|
|
39
|
-
case 0:
|
|
40
|
-
_b.trys.push([0, 5, 6, 7]);
|
|
41
|
-
entities_1 = tslib_1.__values(entities), entities_1_1 = entities_1.next();
|
|
42
|
-
_b.label = 1;
|
|
43
|
-
case 1:
|
|
44
|
-
if (!!entities_1_1.done) return [3 /*break*/, 4];
|
|
45
|
-
entity = entities_1_1.value;
|
|
46
|
-
return [4 /*yield*/, this.createTable(entity)];
|
|
47
|
-
case 2:
|
|
48
|
-
_b.sent();
|
|
49
|
-
_b.label = 3;
|
|
50
|
-
case 3:
|
|
51
|
-
entities_1_1 = entities_1.next();
|
|
52
|
-
return [3 /*break*/, 1];
|
|
53
|
-
case 4: return [3 /*break*/, 7];
|
|
54
|
-
case 5:
|
|
55
|
-
e_1_1 = _b.sent();
|
|
56
|
-
e_1 = { error: e_1_1 };
|
|
57
|
-
return [3 /*break*/, 7];
|
|
58
|
-
case 6:
|
|
59
|
-
try {
|
|
60
|
-
if (entities_1_1 && !entities_1_1.done && (_a = entities_1.return)) _a.call(entities_1);
|
|
61
|
-
}
|
|
62
|
-
finally { if (e_1) throw e_1.error; }
|
|
63
|
-
return [7 /*endfinally*/];
|
|
64
|
-
case 7: return [2 /*return*/];
|
|
65
|
-
}
|
|
66
|
-
});
|
|
67
|
-
});
|
|
68
|
-
};
|
|
69
|
-
SqlJsDataProvider.prototype.dropTable = function (entity) {
|
|
70
|
-
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
71
|
-
var e, sql;
|
|
72
|
-
return tslib_1.__generator(this, function (_a) {
|
|
73
|
-
switch (_a.label) {
|
|
74
|
-
case 0: return [4 /*yield*/, (0, filter_consumer_bridge_to_sql_request_js_1.dbNamesOf)(entity)];
|
|
75
|
-
case 1:
|
|
76
|
-
e = _a.sent();
|
|
77
|
-
sql = 'drop table if exists ' + e.$entityName;
|
|
78
|
-
if (sql_database_js_1.SqlDatabase.LogToConsole)
|
|
79
|
-
console.info(sql);
|
|
80
|
-
return [4 /*yield*/, this.createCommand().execute(sql)];
|
|
81
|
-
case 2:
|
|
82
|
-
_a.sent();
|
|
83
|
-
return [2 /*return*/];
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
});
|
|
87
|
-
};
|
|
88
|
-
SqlJsDataProvider.prototype.addColumnSqlSyntax = function (x, dbName) {
|
|
89
|
-
var result = dbName;
|
|
90
|
-
var nullNumber = x.allowNull ? '' : ' default 0 not null';
|
|
91
|
-
if (x.valueType == Date)
|
|
92
|
-
result += ' integer';
|
|
93
|
-
else if (x.valueType == Boolean)
|
|
94
|
-
result += ' integer ' + nullNumber;
|
|
95
|
-
else if (x.valueType == Number) {
|
|
96
|
-
if (!x.valueConverter.fieldTypeInDb)
|
|
97
|
-
result += ' real ' + nullNumber;
|
|
98
|
-
else
|
|
99
|
-
result += ' ' + x.valueConverter.fieldTypeInDb + ' ' + nullNumber;
|
|
100
|
-
}
|
|
101
|
-
else
|
|
102
|
-
result += ' text' + (x.allowNull ? ' ' : " default '' not null ");
|
|
103
|
-
return result;
|
|
104
|
-
};
|
|
105
|
-
SqlJsDataProvider.prototype.createTable = function (entity) {
|
|
106
|
-
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
107
|
-
var result, e, _a, _b, x, sql;
|
|
108
|
-
var e_2, _c;
|
|
109
|
-
return tslib_1.__generator(this, function (_d) {
|
|
110
|
-
switch (_d.label) {
|
|
111
|
-
case 0:
|
|
112
|
-
result = '';
|
|
113
|
-
return [4 /*yield*/, (0, filter_consumer_bridge_to_sql_request_js_1.dbNamesOf)(entity)];
|
|
114
|
-
case 1:
|
|
115
|
-
e = _d.sent();
|
|
116
|
-
try {
|
|
117
|
-
for (_a = tslib_1.__values(entity.fields), _b = _a.next(); !_b.done; _b = _a.next()) {
|
|
118
|
-
x = _b.value;
|
|
119
|
-
if (!(0, filter_consumer_bridge_to_sql_request_js_1.isDbReadonly)(x, e) || (0, RepositoryImplementation_js_1.isAutoIncrement)(x)) {
|
|
120
|
-
if (result.length != 0)
|
|
121
|
-
result += ',';
|
|
122
|
-
result += '\r\n ';
|
|
123
|
-
if ((0, RepositoryImplementation_js_1.isAutoIncrement)(x)) {
|
|
124
|
-
if (x.key != entity.idMetadata.field.key)
|
|
125
|
-
throw 'in web sql, autoincrement is only allowed for primary key';
|
|
126
|
-
result += e.$dbNameOf(x) + ' integer primary key autoincrement';
|
|
127
|
-
}
|
|
128
|
-
else {
|
|
129
|
-
result += this.addColumnSqlSyntax(x, e.$dbNameOf(x));
|
|
130
|
-
if (x.key == entity.idMetadata.field.key) {
|
|
131
|
-
result += ' primary key';
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
138
|
-
finally {
|
|
139
|
-
try {
|
|
140
|
-
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
|
|
141
|
-
}
|
|
142
|
-
finally { if (e_2) throw e_2.error; }
|
|
143
|
-
}
|
|
144
|
-
sql = 'create table if not exists ' + e.$entityName + ' (' + result + '\r\n)';
|
|
145
|
-
if (sql_database_js_1.SqlDatabase.LogToConsole)
|
|
146
|
-
console.log(sql);
|
|
147
|
-
return [4 /*yield*/, this.createCommand().execute(sql)];
|
|
148
|
-
case 2:
|
|
149
|
-
_d.sent();
|
|
150
|
-
return [2 /*return*/];
|
|
151
|
-
}
|
|
152
|
-
});
|
|
153
|
-
});
|
|
154
|
-
};
|
|
155
|
-
SqlJsDataProvider.prototype.wrapIdentifier = function (name) {
|
|
156
|
-
return name;
|
|
157
|
-
};
|
|
158
17
|
return SqlJsDataProvider;
|
|
159
|
-
}());
|
|
18
|
+
}(remult_sqlite_core_js_1.SqliteCoreDataProvider));
|
|
160
19
|
exports.SqlJsDataProvider = SqlJsDataProvider;
|
|
161
20
|
var SqlJsCommand = /** @class */ (function () {
|
|
162
21
|
function SqlJsCommand(db) {
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { EntityMetadata } from './src/remult3/remult3.js';
|
|
2
|
+
import type { SqlCommand, SqlImplementation } from './src/sql-command.js';
|
|
3
|
+
import type { CanBuildMigrations, MigrationBuilder, MigrationCode } from './migrations/migration-types.js';
|
|
4
|
+
export declare class SqliteCoreDataProvider implements SqlImplementation, CanBuildMigrations {
|
|
5
|
+
createCommand: () => SqlCommand;
|
|
6
|
+
end: () => Promise<void>;
|
|
7
|
+
constructor(createCommand: () => SqlCommand, end: () => Promise<void>);
|
|
8
|
+
orderByNullsFirst?: boolean;
|
|
9
|
+
getLimitSqlSyntax(limit: number, offset: number): string;
|
|
10
|
+
afterMutation?: VoidFunction;
|
|
11
|
+
provideMigrationBuilder(builder: MigrationCode): MigrationBuilder;
|
|
12
|
+
transaction(action: (sql: SqlImplementation) => Promise<void>): Promise<void>;
|
|
13
|
+
entityIsUsedForTheFirstTime(entity: EntityMetadata): Promise<void>;
|
|
14
|
+
ensureSchema(entities: EntityMetadata<any>[]): Promise<void>;
|
|
15
|
+
dropTable(entity: EntityMetadata): Promise<void>;
|
|
16
|
+
private addColumnSqlSyntax;
|
|
17
|
+
createTableIfNotExist(entity: EntityMetadata<any>): Promise<void>;
|
|
18
|
+
supportsJsonColumnType?: boolean;
|
|
19
|
+
private getCreateTableSql;
|
|
20
|
+
wrapIdentifier?(name: string): string;
|
|
21
|
+
}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SqliteCoreDataProvider = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
var sql_database_js_1 = require("./src/data-providers/sql-database.js");
|
|
6
|
+
var filter_consumer_bridge_to_sql_request_js_1 = require("./src/filter/filter-consumer-bridge-to-sql-request.js");
|
|
7
|
+
var RepositoryImplementation_js_1 = require("./src/remult3/RepositoryImplementation.js");
|
|
8
|
+
var SqliteCoreDataProvider = /** @class */ (function () {
|
|
9
|
+
function SqliteCoreDataProvider(createCommand, end) {
|
|
10
|
+
this.createCommand = createCommand;
|
|
11
|
+
this.end = end;
|
|
12
|
+
}
|
|
13
|
+
SqliteCoreDataProvider.prototype.getLimitSqlSyntax = function (limit, offset) {
|
|
14
|
+
return ' limit ' + limit + ' offset ' + offset;
|
|
15
|
+
};
|
|
16
|
+
SqliteCoreDataProvider.prototype.provideMigrationBuilder = function (builder) {
|
|
17
|
+
var _this = this;
|
|
18
|
+
var self = this;
|
|
19
|
+
return {
|
|
20
|
+
createTable: function (entity) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
21
|
+
var _a, _b;
|
|
22
|
+
return tslib_1.__generator(this, function (_c) {
|
|
23
|
+
switch (_c.label) {
|
|
24
|
+
case 0:
|
|
25
|
+
_b = (_a = builder).addSql;
|
|
26
|
+
return [4 /*yield*/, self.getCreateTableSql(entity)];
|
|
27
|
+
case 1:
|
|
28
|
+
_b.apply(_a, [_c.sent()]);
|
|
29
|
+
return [2 /*return*/];
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}); },
|
|
33
|
+
addColumn: function (entity, field) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
34
|
+
var e, sql;
|
|
35
|
+
return tslib_1.__generator(this, function (_a) {
|
|
36
|
+
switch (_a.label) {
|
|
37
|
+
case 0: return [4 /*yield*/, (0, filter_consumer_bridge_to_sql_request_js_1.dbNamesOf)(entity)];
|
|
38
|
+
case 1:
|
|
39
|
+
e = _a.sent();
|
|
40
|
+
sql = "alter table ".concat(e.$entityName, " add column ").concat(self.addColumnSqlSyntax(field, e.$dbNameOf(field)));
|
|
41
|
+
builder.addSql(sql);
|
|
42
|
+
return [2 /*return*/];
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
}); },
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
SqliteCoreDataProvider.prototype.transaction = function (action) {
|
|
49
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
50
|
+
var err_1;
|
|
51
|
+
return tslib_1.__generator(this, function (_a) {
|
|
52
|
+
switch (_a.label) {
|
|
53
|
+
case 0:
|
|
54
|
+
this.createCommand().execute('Begin Transaction');
|
|
55
|
+
_a.label = 1;
|
|
56
|
+
case 1:
|
|
57
|
+
_a.trys.push([1, 3, , 4]);
|
|
58
|
+
return [4 /*yield*/, action(this)];
|
|
59
|
+
case 2:
|
|
60
|
+
_a.sent();
|
|
61
|
+
this.createCommand().execute('Commit');
|
|
62
|
+
return [3 /*break*/, 4];
|
|
63
|
+
case 3:
|
|
64
|
+
err_1 = _a.sent();
|
|
65
|
+
this.createCommand().execute('Rollback');
|
|
66
|
+
throw err_1;
|
|
67
|
+
case 4: return [2 /*return*/];
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
};
|
|
72
|
+
SqliteCoreDataProvider.prototype.entityIsUsedForTheFirstTime = function (entity) {
|
|
73
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) {
|
|
74
|
+
return [2 /*return*/];
|
|
75
|
+
}); });
|
|
76
|
+
};
|
|
77
|
+
SqliteCoreDataProvider.prototype.ensureSchema = function (entities) {
|
|
78
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
79
|
+
var entities_1, entities_1_1, entity, e_1_1;
|
|
80
|
+
var e_1, _a;
|
|
81
|
+
return tslib_1.__generator(this, function (_b) {
|
|
82
|
+
switch (_b.label) {
|
|
83
|
+
case 0:
|
|
84
|
+
_b.trys.push([0, 5, 6, 7]);
|
|
85
|
+
entities_1 = tslib_1.__values(entities), entities_1_1 = entities_1.next();
|
|
86
|
+
_b.label = 1;
|
|
87
|
+
case 1:
|
|
88
|
+
if (!!entities_1_1.done) return [3 /*break*/, 4];
|
|
89
|
+
entity = entities_1_1.value;
|
|
90
|
+
return [4 /*yield*/, this.createTableIfNotExist(entity)];
|
|
91
|
+
case 2:
|
|
92
|
+
_b.sent();
|
|
93
|
+
_b.label = 3;
|
|
94
|
+
case 3:
|
|
95
|
+
entities_1_1 = entities_1.next();
|
|
96
|
+
return [3 /*break*/, 1];
|
|
97
|
+
case 4: return [3 /*break*/, 7];
|
|
98
|
+
case 5:
|
|
99
|
+
e_1_1 = _b.sent();
|
|
100
|
+
e_1 = { error: e_1_1 };
|
|
101
|
+
return [3 /*break*/, 7];
|
|
102
|
+
case 6:
|
|
103
|
+
try {
|
|
104
|
+
if (entities_1_1 && !entities_1_1.done && (_a = entities_1.return)) _a.call(entities_1);
|
|
105
|
+
}
|
|
106
|
+
finally { if (e_1) throw e_1.error; }
|
|
107
|
+
return [7 /*endfinally*/];
|
|
108
|
+
case 7: return [2 /*return*/];
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
};
|
|
113
|
+
SqliteCoreDataProvider.prototype.dropTable = function (entity) {
|
|
114
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
115
|
+
var e, sql;
|
|
116
|
+
return tslib_1.__generator(this, function (_a) {
|
|
117
|
+
switch (_a.label) {
|
|
118
|
+
case 0: return [4 /*yield*/, (0, filter_consumer_bridge_to_sql_request_js_1.dbNamesOf)(entity)];
|
|
119
|
+
case 1:
|
|
120
|
+
e = _a.sent();
|
|
121
|
+
sql = 'drop table if exists ' + e.$entityName;
|
|
122
|
+
if (sql_database_js_1.SqlDatabase.LogToConsole)
|
|
123
|
+
console.info(sql);
|
|
124
|
+
return [4 /*yield*/, this.createCommand().execute(sql)];
|
|
125
|
+
case 2:
|
|
126
|
+
_a.sent();
|
|
127
|
+
return [2 /*return*/];
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
};
|
|
132
|
+
SqliteCoreDataProvider.prototype.addColumnSqlSyntax = function (x, dbName) {
|
|
133
|
+
var result = dbName;
|
|
134
|
+
var nullNumber = x.allowNull ? '' : ' default 0 not null';
|
|
135
|
+
if (x.valueType == Date)
|
|
136
|
+
result += ' integer';
|
|
137
|
+
else if (x.valueType == Boolean)
|
|
138
|
+
result += ' integer ' + nullNumber;
|
|
139
|
+
else if (x.valueType == Number) {
|
|
140
|
+
if (!x.valueConverter.fieldTypeInDb)
|
|
141
|
+
result += ' numeric ' + nullNumber;
|
|
142
|
+
else
|
|
143
|
+
result += ' ' + x.valueConverter.fieldTypeInDb + ' ' + nullNumber;
|
|
144
|
+
}
|
|
145
|
+
else
|
|
146
|
+
result += ' text' + (x.allowNull ? ' ' : " default '' not null ");
|
|
147
|
+
return result;
|
|
148
|
+
};
|
|
149
|
+
SqliteCoreDataProvider.prototype.createTableIfNotExist = function (entity) {
|
|
150
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
151
|
+
var sql;
|
|
152
|
+
return tslib_1.__generator(this, function (_a) {
|
|
153
|
+
switch (_a.label) {
|
|
154
|
+
case 0: return [4 /*yield*/, this.getCreateTableSql(entity)];
|
|
155
|
+
case 1:
|
|
156
|
+
sql = _a.sent();
|
|
157
|
+
if (sql_database_js_1.SqlDatabase.LogToConsole)
|
|
158
|
+
console.log(sql);
|
|
159
|
+
return [4 /*yield*/, this.createCommand().execute(sql)];
|
|
160
|
+
case 2:
|
|
161
|
+
_a.sent();
|
|
162
|
+
return [2 /*return*/];
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
};
|
|
167
|
+
SqliteCoreDataProvider.prototype.getCreateTableSql = function (entity) {
|
|
168
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
169
|
+
var result, e, _a, _b, x, sql;
|
|
170
|
+
var e_2, _c;
|
|
171
|
+
return tslib_1.__generator(this, function (_d) {
|
|
172
|
+
switch (_d.label) {
|
|
173
|
+
case 0:
|
|
174
|
+
result = '';
|
|
175
|
+
return [4 /*yield*/, (0, filter_consumer_bridge_to_sql_request_js_1.dbNamesOf)(entity)];
|
|
176
|
+
case 1:
|
|
177
|
+
e = _d.sent();
|
|
178
|
+
try {
|
|
179
|
+
for (_a = tslib_1.__values(entity.fields), _b = _a.next(); !_b.done; _b = _a.next()) {
|
|
180
|
+
x = _b.value;
|
|
181
|
+
if (!(0, filter_consumer_bridge_to_sql_request_js_1.shouldNotCreateField)(x, e) || (0, RepositoryImplementation_js_1.isAutoIncrement)(x)) {
|
|
182
|
+
if (result.length != 0)
|
|
183
|
+
result += ',';
|
|
184
|
+
result += '\r\n ';
|
|
185
|
+
if ((0, RepositoryImplementation_js_1.isAutoIncrement)(x)) {
|
|
186
|
+
if (x.key != entity.idMetadata.field.key)
|
|
187
|
+
throw 'in web sql, autoincrement is only allowed for primary key';
|
|
188
|
+
result += e.$dbNameOf(x) + ' integer primary key autoincrement';
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
result += this.addColumnSqlSyntax(x, e.$dbNameOf(x));
|
|
192
|
+
if (x.key == entity.idMetadata.field.key) {
|
|
193
|
+
result += ' primary key';
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
200
|
+
finally {
|
|
201
|
+
try {
|
|
202
|
+
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
|
|
203
|
+
}
|
|
204
|
+
finally { if (e_2) throw e_2.error; }
|
|
205
|
+
}
|
|
206
|
+
sql = 'create table if not exists ' + e.$entityName + ' (' + result + '\r\n)';
|
|
207
|
+
return [2 /*return*/, sql];
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
};
|
|
212
|
+
SqliteCoreDataProvider.prototype.wrapIdentifier = function (name) {
|
|
213
|
+
return name;
|
|
214
|
+
};
|
|
215
|
+
return SqliteCoreDataProvider;
|
|
216
|
+
}());
|
|
217
|
+
exports.SqliteCoreDataProvider = SqliteCoreDataProvider;
|
|
@@ -4,7 +4,7 @@ import { Remult } from '../src/context.js';
|
|
|
4
4
|
import type { DataProvider } from '../src/data-interfaces.js';
|
|
5
5
|
import type { LiveQueryStorage, SubscriptionServer } from '../src/live-query/SubscriptionServer.js';
|
|
6
6
|
import { IdEntity } from '../src/remult3/IdEntity.js';
|
|
7
|
-
import type { Repository } from '../src/remult3/remult3.js';
|
|
7
|
+
import type { EntityMetadata, Repository } from '../src/remult3/remult3.js';
|
|
8
8
|
import type { queuedJobInfoResponse } from '../src/server-action.js';
|
|
9
9
|
export interface RemultServerOptions<RequestType> {
|
|
10
10
|
/**Entities to use for the api */
|
|
@@ -55,6 +55,35 @@ export interface RemultServerOptions<RequestType> {
|
|
|
55
55
|
admin?: Allowed;
|
|
56
56
|
/** Storage to use for backend methods that use queue */
|
|
57
57
|
queueStorage?: QueueStorage;
|
|
58
|
+
/**
|
|
59
|
+
* This method is called whenever there is an error in the API lifecycle.
|
|
60
|
+
*
|
|
61
|
+
* @param info - Information about the error.
|
|
62
|
+
* @param info.req - The request object.
|
|
63
|
+
* @param info.entity - (Optional) The entity metadata associated with the error, if applicable.
|
|
64
|
+
* @param info.exception - (Optional) The exception object or error that occurred.
|
|
65
|
+
* @param info.httpStatusCode - The HTTP status code.
|
|
66
|
+
* @param info.responseBody - The body of the response.
|
|
67
|
+
* @param info.sendError - A method to send a custom error response. Call this method with the desired HTTP status code and response body.
|
|
68
|
+
*
|
|
69
|
+
* @returns A promise that resolves when the error handling is complete.
|
|
70
|
+
* @example
|
|
71
|
+
* export const api = remultExpress({
|
|
72
|
+
* error: async (e) => {
|
|
73
|
+
* if (e.httpStatusCode == 500) {
|
|
74
|
+
* e.sendError(500, { message: "An error occurred" })
|
|
75
|
+
* }
|
|
76
|
+
* }
|
|
77
|
+
* })
|
|
78
|
+
*/
|
|
79
|
+
error?: (info: {
|
|
80
|
+
req: RequestType;
|
|
81
|
+
entity?: EntityMetadata;
|
|
82
|
+
exception?: any;
|
|
83
|
+
httpStatusCode: number;
|
|
84
|
+
responseBody: any;
|
|
85
|
+
sendError: (httpStatusCode: number, body: any) => void;
|
|
86
|
+
}) => Promise<void>;
|
|
58
87
|
}
|
|
59
88
|
export interface InitRequestOptions {
|
|
60
89
|
liveQueryStorage: LiveQueryStorage;
|