remult 0.18.1-exp.34 → 0.18.1-exp.35
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/esm/live-query/data-provider-live-query-storage.d.ts +3 -4
- package/esm/live-query/data-provider-live-query-storage.js +2 -3
- package/esm/postgres/postgres-data-provider.d.ts +1 -1
- package/esm/postgres/postgres-data-provider.js +3 -3
- package/esm/postgres/schema-builder.d.ts +1 -1
- package/esm/postgres/schema-builder.js +1 -9
- package/esm/remult-knex/index.d.ts +2 -2
- package/esm/remult-knex/index.js +4 -11
- package/esm/server/expressBridge.js +15 -3
- package/esm/server/index.d.ts +1 -0
- package/esm/server/index.js +1 -0
- package/esm/src/data-interfaces.d.ts +3 -4
- package/esm/src/data-providers/sql-database.d.ts +1 -1
- package/esm/src/data-providers/sql-database.js +2 -2
- package/esm/src/shared-tests/db-tests-setup.d.ts +12 -5
- package/esm/src/shared-tests/db-tests-setup.js +13 -4
- package/esm/src/shared-tests/db-tests.db-tests.js +4 -2
- package/esm/src/sql-command.d.ts +1 -1
- package/esm/src/tests/frontend-database-tests-setup.spec.js +2 -2
- package/live-query/data-provider-live-query-storage.d.ts +3 -4
- package/live-query/data-provider-live-query-storage.js +2 -2
- package/package.json +1 -1
- package/postgres/postgres-data-provider.d.ts +1 -1
- package/postgres/postgres-data-provider.js +3 -3
- package/postgres/schema-builder.d.ts +1 -1
- package/postgres/schema-builder.js +24 -34
- package/remult-knex/index.d.ts +2 -2
- package/remult-knex/index.js +27 -37
- package/server/expressBridge.js +21 -8
- package/server/index.d.ts +1 -0
- package/server/index.js +3 -1
- package/src/data-interfaces.d.ts +3 -4
- package/src/data-providers/sql-database.d.ts +1 -1
- package/src/data-providers/sql-database.js +2 -2
- package/src/shared-tests/db-tests-setup.d.ts +12 -5
- package/src/shared-tests/db-tests-setup.js +15 -5
- package/src/shared-tests/db-tests.db-tests.js +3 -1
- package/src/sql-command.d.ts +1 -1
- package/src/tests/frontend-database-tests-setup.spec.js +1 -1
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { CanEnsureSchema, DataProvider } from "../src/data-interfaces";
|
|
1
|
+
import { Storage, DataProvider } from "../src/data-interfaces";
|
|
3
2
|
import { LiveQueryStorage, StoredQuery } from "../src/live-query/SubscriptionServer";
|
|
4
3
|
import { EntityBase, Repository } from "../src/remult3";
|
|
5
|
-
export declare class DataProviderLiveQueryStorage implements LiveQueryStorage,
|
|
4
|
+
export declare class DataProviderLiveQueryStorage implements LiveQueryStorage, Storage {
|
|
6
5
|
repo: Promise<Repository<LiveQueryStorageEntity>>;
|
|
7
6
|
dataProvider: Promise<DataProvider>;
|
|
8
7
|
constructor(dataProvider: DataProvider | Promise<DataProvider> | (() => Promise<DataProvider | undefined>));
|
|
9
|
-
ensureSchema(
|
|
8
|
+
ensureSchema(): Promise<void>;
|
|
10
9
|
add({ id, entityKey, data }: StoredQuery): Promise<void>;
|
|
11
10
|
remove(queryId: string): Promise<void>;
|
|
12
11
|
forEach(entityKey: string, callback: (args: {
|
|
@@ -7,12 +7,11 @@ export class DataProviderLiveQueryStorage {
|
|
|
7
7
|
this.dataProvider = initDataProvider(dataProvider);
|
|
8
8
|
this.repo = this.dataProvider.then(dp => new Remult(dp).repo(LiveQueryStorageEntity));
|
|
9
9
|
}
|
|
10
|
-
async ensureSchema(
|
|
11
|
-
await (await this.dataProvider).ensureSchema([(await this.repo).metadata]
|
|
10
|
+
async ensureSchema() {
|
|
11
|
+
await (await this.dataProvider).ensureSchema([(await this.repo).metadata]);
|
|
12
12
|
}
|
|
13
13
|
async add({ id, entityKey, data }) {
|
|
14
14
|
await this.repo.then(async (repo) => {
|
|
15
|
-
//TODO - talk to yoni about how this fails with non entity ref - since repo save here makes a wrong decision, since an item returns
|
|
16
15
|
const q = await repo.findId(id, { createIfNotFound: true });
|
|
17
16
|
await q.assign({ entityKey, data }).save();
|
|
18
17
|
});
|
|
@@ -16,7 +16,7 @@ export declare class PostgresDataProvider implements SqlImplementation {
|
|
|
16
16
|
getLimitSqlSyntax(limit: number, offset: number): string;
|
|
17
17
|
createCommand(): SqlCommand;
|
|
18
18
|
constructor(pool: PostgresPool);
|
|
19
|
-
ensureSchema(entities: EntityMetadata<any>[]
|
|
19
|
+
ensureSchema(entities: EntityMetadata<any>[]): Promise<void>;
|
|
20
20
|
transaction(action: (dataProvider: SqlImplementation) => Promise<void>): Promise<void>;
|
|
21
21
|
}
|
|
22
22
|
export interface PostgresCommandSource {
|
|
@@ -22,10 +22,10 @@ export class PostgresDataProvider {
|
|
|
22
22
|
createCommand() {
|
|
23
23
|
return new PostgresBridgeToSQLCommand(this.pool);
|
|
24
24
|
}
|
|
25
|
-
async ensureSchema(entities
|
|
25
|
+
async ensureSchema(entities) {
|
|
26
26
|
var db = new SqlDatabase(this);
|
|
27
27
|
var sb = new PostgresSchemaBuilder(db);
|
|
28
|
-
await sb.ensureSchema(entities
|
|
28
|
+
await sb.ensureSchema(entities);
|
|
29
29
|
}
|
|
30
30
|
async transaction(action) {
|
|
31
31
|
let client = await this.pool.connect();
|
|
@@ -104,6 +104,6 @@ export async function preparePostgresQueueStorage(sql) {
|
|
|
104
104
|
c.dataProvider = (sql);
|
|
105
105
|
let JobsInQueueEntity = (await import('../server/expressBridge')).JobsInQueueEntity;
|
|
106
106
|
let e = c.repo(JobsInQueueEntity);
|
|
107
|
-
await sql.ensureSchema([e.metadata]
|
|
107
|
+
await sql.ensureSchema([e.metadata]);
|
|
108
108
|
return new (await import('../server/expressBridge')).EntityQueueStorage(c.repo(JobsInQueueEntity));
|
|
109
109
|
}
|
|
@@ -7,7 +7,7 @@ export declare function verifyStructureOfAllEntities(db: SqlDatabase, remult: Re
|
|
|
7
7
|
export declare class PostgresSchemaBuilder {
|
|
8
8
|
private pool;
|
|
9
9
|
verifyStructureOfAllEntities(remult?: Remult): Promise<void>;
|
|
10
|
-
ensureSchema(entities: EntityMetadata<any>[]
|
|
10
|
+
ensureSchema(entities: EntityMetadata<any>[]): Promise<void>;
|
|
11
11
|
createIfNotExist(entity: EntityMetadata): Promise<void>;
|
|
12
12
|
addColumnIfNotExist<T extends EntityMetadata>(entity: T, c: ((e: T) => FieldMetadata)): Promise<void>;
|
|
13
13
|
verifyAllColumns<T extends EntityMetadata>(entity: T): Promise<void>;
|
|
@@ -59,13 +59,7 @@ export class PostgresSchemaBuilder {
|
|
|
59
59
|
}
|
|
60
60
|
await this.ensureSchema(entities);
|
|
61
61
|
}
|
|
62
|
-
async ensureSchema(entities
|
|
63
|
-
//TODO - discuss this console log
|
|
64
|
-
let desc = "Ensure postgres schema";
|
|
65
|
-
if (caption)
|
|
66
|
-
desc += " - " + caption;
|
|
67
|
-
if (PostgresSchemaBuilder.logToConsole)
|
|
68
|
-
console.time(desc);
|
|
62
|
+
async ensureSchema(entities) {
|
|
69
63
|
for (const entity of entities) {
|
|
70
64
|
let e = await dbNamesOf(entity);
|
|
71
65
|
try {
|
|
@@ -80,8 +74,6 @@ export class PostgresSchemaBuilder {
|
|
|
80
74
|
console.error("failed verify structure of " + e.$entityName + " ", err);
|
|
81
75
|
}
|
|
82
76
|
}
|
|
83
|
-
if (PostgresSchemaBuilder.logToConsole)
|
|
84
|
-
console.timeEnd(desc);
|
|
85
77
|
}
|
|
86
78
|
async createIfNotExist(entity) {
|
|
87
79
|
var c = this.pool.createCommand();
|
|
@@ -12,13 +12,13 @@ export declare class KnexDataProvider implements DataProvider {
|
|
|
12
12
|
static rawFilter(build: CustomKnexFilterBuilderFunction): EntityFilter<any>;
|
|
13
13
|
static filterToRaw<entityType>(entity: RepositoryOverloads<entityType>, condition: EntityFilter<entityType>): Promise<(knex: any) => void>;
|
|
14
14
|
supportsRawFilter?: boolean;
|
|
15
|
-
ensureSchema(entities: EntityMetadata<any>[]
|
|
15
|
+
ensureSchema(entities: EntityMetadata<any>[]): Promise<void>;
|
|
16
16
|
}
|
|
17
17
|
export declare type CustomKnexFilterBuilderFunction = () => Promise<(builder: Knex.QueryBuilder) => void>;
|
|
18
18
|
export declare class KnexSchemaBuilder {
|
|
19
19
|
private knex;
|
|
20
20
|
verifyStructureOfAllEntities(remult?: Remult): Promise<void>;
|
|
21
|
-
ensureSchema(entities: EntityMetadata<any>[]
|
|
21
|
+
ensureSchema(entities: EntityMetadata<any>[]): Promise<void>;
|
|
22
22
|
createIfNotExist(entity: EntityMetadata): Promise<void>;
|
|
23
23
|
addColumnIfNotExist<T extends EntityMetadata>(entity: T, c: ((e: T) => FieldMetadata)): Promise<void>;
|
|
24
24
|
verifyAllColumns<T extends EntityMetadata>(entity: T): Promise<void>;
|
package/esm/remult-knex/index.js
CHANGED
|
@@ -45,9 +45,9 @@ export class KnexDataProvider {
|
|
|
45
45
|
let r = await b.resolveWhere();
|
|
46
46
|
return knex => r.forEach(y => y(knex));
|
|
47
47
|
}
|
|
48
|
-
async ensureSchema(entities
|
|
48
|
+
async ensureSchema(entities) {
|
|
49
49
|
var sb = new KnexSchemaBuilder(this.knex);
|
|
50
|
-
await sb.ensureSchema(entities
|
|
50
|
+
await sb.ensureSchema(entities);
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
53
|
class KnexEntityDataProvider {
|
|
@@ -286,12 +286,7 @@ export class KnexSchemaBuilder {
|
|
|
286
286
|
const entities = allEntities.map(x => remult.repo(x).metadata);
|
|
287
287
|
this.ensureSchema(entities);
|
|
288
288
|
}
|
|
289
|
-
async ensureSchema(entities
|
|
290
|
-
let desc = "ensure knex schema";
|
|
291
|
-
if (caption)
|
|
292
|
-
desc += " - " + caption;
|
|
293
|
-
if (KnexSchemaBuilder.logToConsole)
|
|
294
|
-
console.time(desc);
|
|
289
|
+
async ensureSchema(entities) {
|
|
295
290
|
for (const entity of entities) {
|
|
296
291
|
let e = await dbNamesOf(entity);
|
|
297
292
|
try {
|
|
@@ -303,11 +298,9 @@ export class KnexSchemaBuilder {
|
|
|
303
298
|
}
|
|
304
299
|
}
|
|
305
300
|
catch (err) {
|
|
306
|
-
console.error("failed
|
|
301
|
+
console.error("failed ensure schema of " + e.$entityName + " ", err);
|
|
307
302
|
}
|
|
308
303
|
}
|
|
309
|
-
if (KnexSchemaBuilder.logToConsole)
|
|
310
|
-
console.timeEnd(desc);
|
|
311
304
|
}
|
|
312
305
|
async createIfNotExist(entity) {
|
|
313
306
|
const e = await dbNamesOf(entity);
|
|
@@ -35,14 +35,26 @@ export function createRemultServerCore(options) {
|
|
|
35
35
|
await new Promise((res) => {
|
|
36
36
|
RemultAsyncLocalStorage.instance.run(remult, async () => {
|
|
37
37
|
if (options.ensureSchema) {
|
|
38
|
+
let started = false;
|
|
39
|
+
const startConsoleLog = () => {
|
|
40
|
+
if (started)
|
|
41
|
+
return;
|
|
42
|
+
started = true;
|
|
43
|
+
console.time("Ensure Schema");
|
|
44
|
+
};
|
|
38
45
|
if (dp.ensureSchema) {
|
|
46
|
+
startConsoleLog();
|
|
39
47
|
const entitiesMetadata = options.entities.map(e => remult.repo(e).metadata);
|
|
40
48
|
await dp.ensureSchema(entitiesMetadata);
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
49
|
+
}
|
|
50
|
+
for (const item of [options.liveQueryStorage, options.queueStorage]) {
|
|
51
|
+
if (item?.ensureSchema) {
|
|
52
|
+
startConsoleLog();
|
|
53
|
+
await item.ensureSchema();
|
|
44
54
|
}
|
|
45
55
|
}
|
|
56
|
+
if (started)
|
|
57
|
+
console.timeEnd("Ensure Schema");
|
|
46
58
|
}
|
|
47
59
|
if (options.initApi)
|
|
48
60
|
await options.initApi(remult);
|
package/esm/server/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { GenericRequest, RemultServer, RemultServerOptions } from './expressBridge';
|
|
2
2
|
export { queuedJobInfo, QueueStorage, GenericRequest, GenericRequestHandler, GenericResponse, GenericRouter, RemultServerOptions, SpecificRoute, RemultServer, InitRequestOptions } from './expressBridge';
|
|
3
3
|
export { JsonEntityFileStorage, JsonFileDataProvider } from './JsonEntityFileStorage';
|
|
4
|
+
export { DataProviderLiveQueryStorage } from '../live-query/data-provider-live-query-storage';
|
|
4
5
|
export declare function createRemultServer<RequestType extends GenericRequest = GenericRequest>(options?: RemultServerOptions<RequestType>): RemultServer;
|
package/esm/server/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createRemultServerCore, } from './expressBridge';
|
|
2
2
|
import { initAsyncHooks } from './initAsyncHooks';
|
|
3
3
|
export { JsonEntityFileStorage, JsonFileDataProvider } from './JsonEntityFileStorage';
|
|
4
|
+
export { DataProviderLiveQueryStorage } from '../live-query/data-provider-live-query-storage';
|
|
4
5
|
export function createRemultServer(options) {
|
|
5
6
|
initAsyncHooks();
|
|
6
7
|
return createRemultServerCore(options);
|
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import { Sort } from './sort';
|
|
2
2
|
import { Filter } from './filter/filter-interfaces';
|
|
3
3
|
import { EntityMetadata, OmitEB } from './remult3';
|
|
4
|
-
import type { Remult } from './context';
|
|
5
4
|
export interface DataProvider {
|
|
6
5
|
getEntityDataProvider(entity: EntityMetadata): EntityDataProvider;
|
|
7
6
|
transaction(action: (dataProvider: DataProvider) => Promise<void>): Promise<void>;
|
|
8
7
|
supportsRawFilter?: boolean;
|
|
9
|
-
ensureSchema?(entities: EntityMetadata[]
|
|
8
|
+
ensureSchema?(entities: EntityMetadata[]): Promise<void>;
|
|
10
9
|
}
|
|
11
|
-
export interface
|
|
12
|
-
ensureSchema(
|
|
10
|
+
export interface Storage {
|
|
11
|
+
ensureSchema(): Promise<void>;
|
|
13
12
|
}
|
|
14
13
|
export interface EntityDataProvider {
|
|
15
14
|
count(where: Filter): Promise<number>;
|
|
@@ -8,7 +8,7 @@ export declare class SqlDatabase implements DataProvider {
|
|
|
8
8
|
static getDb(remult?: Remult): SqlDatabase;
|
|
9
9
|
createCommand(): SqlCommand;
|
|
10
10
|
execute(sql: string): Promise<SqlResult>;
|
|
11
|
-
ensureSchema(entities: EntityMetadata<any>[]
|
|
11
|
+
ensureSchema(entities: EntityMetadata<any>[]): Promise<void>;
|
|
12
12
|
getEntityDataProvider(entity: EntityMetadata): EntityDataProvider;
|
|
13
13
|
transaction(action: (dataProvider: DataProvider) => Promise<void>): Promise<void>;
|
|
14
14
|
static rawFilter(build: CustomSqlFilterBuilderFunction): EntityFilter<any>;
|
|
@@ -26,9 +26,9 @@ export class SqlDatabase {
|
|
|
26
26
|
_getSourceSql() {
|
|
27
27
|
return this.sql;
|
|
28
28
|
}
|
|
29
|
-
async ensureSchema(entities
|
|
29
|
+
async ensureSchema(entities) {
|
|
30
30
|
if (this.sql.ensureSchema)
|
|
31
|
-
await this.sql.ensureSchema(entities
|
|
31
|
+
await this.sql.ensureSchema(entities);
|
|
32
32
|
}
|
|
33
33
|
getEntityDataProvider(entity) {
|
|
34
34
|
return new ActualSQLServerDataProvider(entity, this, async (dbName) => {
|
|
@@ -5,15 +5,22 @@ import { Repository } from "../remult3";
|
|
|
5
5
|
import { CategoriesForTesting } from "../tests/remult-3-entities";
|
|
6
6
|
import { Status } from "../tests/testModel/models";
|
|
7
7
|
export declare function itWithFocus(key: string, what: () => Promise<void>, focus?: boolean): void;
|
|
8
|
-
export declare function testAll(key: string, what: dbTestWhatSignature, focus?: boolean
|
|
9
|
-
|
|
8
|
+
export declare function testAll(key: string, what: dbTestWhatSignature, focus?: boolean, options?: {
|
|
9
|
+
exclude?: string[];
|
|
10
|
+
}): void;
|
|
11
|
+
export declare function addDatabaseToTest(tester: dbTestMethodSignature, key?: string): dbTestMethodSignature;
|
|
10
12
|
export declare function testInMemory(key: string, what: dbTestWhatSignature, focus?: boolean): void;
|
|
11
|
-
export declare
|
|
13
|
+
export declare const TestDbs: {
|
|
14
|
+
restDataProvider: string;
|
|
15
|
+
};
|
|
16
|
+
export declare type dbTestWhatSignature = ((db: {
|
|
12
17
|
db: DataProvider;
|
|
13
18
|
remult: Remult;
|
|
14
19
|
createEntity<entityType>(entity: ClassType<entityType>): Promise<Repository<entityType>>;
|
|
15
|
-
}) => Promise<void
|
|
16
|
-
export declare type dbTestMethodSignature = (key: string, what: dbTestWhatSignature, focus: boolean) => void
|
|
20
|
+
}) => Promise<void>);
|
|
21
|
+
export declare type dbTestMethodSignature = ((key: string, what: dbTestWhatSignature, focus: boolean) => void) & {
|
|
22
|
+
key?: string;
|
|
23
|
+
};
|
|
17
24
|
export declare function testAllDbs<T extends CategoriesForTesting>(key: string, doTest: (helper: {
|
|
18
25
|
remult: Remult;
|
|
19
26
|
createData: (doInsert?: (insert: (id: number, name: string, description?: string, status?: Status) => Promise<void>) => Promise<void>, entity?: {
|
|
@@ -8,17 +8,23 @@ export function itWithFocus(key, what, focus = false) {
|
|
|
8
8
|
else
|
|
9
9
|
it(key, what);
|
|
10
10
|
}
|
|
11
|
-
export function testAll(key, what, focus = false) {
|
|
11
|
+
export function testAll(key, what, focus = false, options) {
|
|
12
|
+
function runTest(m) {
|
|
13
|
+
return !options?.exclude?.includes(m.key);
|
|
14
|
+
}
|
|
12
15
|
for (const test of databasesTesters) {
|
|
13
|
-
test
|
|
16
|
+
if (runTest(test))
|
|
17
|
+
test(key, what, focus);
|
|
14
18
|
}
|
|
15
19
|
loadedTests.push(x => {
|
|
16
|
-
x
|
|
20
|
+
if (runTest(x))
|
|
21
|
+
x(key, what, focus);
|
|
17
22
|
});
|
|
18
23
|
}
|
|
19
24
|
const databasesTesters = [];
|
|
20
25
|
const loadedTests = [];
|
|
21
|
-
export function addDatabaseToTest(tester) {
|
|
26
|
+
export function addDatabaseToTest(tester, key) {
|
|
27
|
+
tester.key = key;
|
|
22
28
|
for (const test of loadedTests) {
|
|
23
29
|
test(tester);
|
|
24
30
|
}
|
|
@@ -32,6 +38,9 @@ export function testInMemory(key, what, focus = false) {
|
|
|
32
38
|
await what({ db, remult, createEntity: async (x) => remult.repo(x) });
|
|
33
39
|
}, focus);
|
|
34
40
|
}
|
|
41
|
+
export const TestDbs = {
|
|
42
|
+
restDataProvider: "restDataProvider"
|
|
43
|
+
};
|
|
35
44
|
databasesTesters.push(testInMemory);
|
|
36
45
|
export async function testAllDbs(key, doTest, focus = false) {
|
|
37
46
|
testAll(key, async ({ remult, createEntity }) => {
|
|
@@ -7,7 +7,7 @@ import { h } from "../tests/h";
|
|
|
7
7
|
import { Categories as newCategories } from "../tests/remult-3-entities";
|
|
8
8
|
import { tasks } from "../tests/tasks";
|
|
9
9
|
import { TestDataApiResponse } from "../tests/TestDataApiResponse";
|
|
10
|
-
import { testAll, testAllDbs } from "./db-tests-setup";
|
|
10
|
+
import { testAll, testAllDbs, TestDbs } from "./db-tests-setup";
|
|
11
11
|
import { entityWithValidations, testConfiguration } from "./entityWithValidations";
|
|
12
12
|
import { Remult } from "../context";
|
|
13
13
|
import { dWithPrefilter } from "../tests/dWithPrefilter";
|
|
@@ -772,11 +772,13 @@ testAll("test date", async ({ createEntity }) => {
|
|
|
772
772
|
testAll("test live query storage", async ({ db, remult }) => {
|
|
773
773
|
var x = new DataProviderLiveQueryStorage(db);
|
|
774
774
|
if (db.ensureSchema)
|
|
775
|
-
await x.ensureSchema(
|
|
775
|
+
await x.ensureSchema();
|
|
776
776
|
const id = uuid();
|
|
777
777
|
await x.add({ id, entityKey: 'x', data: "noam" });
|
|
778
778
|
await x.forEach("x", async (args) => {
|
|
779
779
|
expect(args.query.data).toBe("noam");
|
|
780
780
|
});
|
|
781
781
|
expect((await x.keepAliveAndReturnUnknownQueryIds([id]))).toEqual([]);
|
|
782
|
+
}, false, {
|
|
783
|
+
exclude: [TestDbs.restDataProvider]
|
|
782
784
|
});
|
package/esm/src/sql-command.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ export interface SqlImplementation {
|
|
|
4
4
|
createCommand(): SqlCommand;
|
|
5
5
|
transaction(action: (sql: SqlImplementation) => Promise<void>): Promise<void>;
|
|
6
6
|
entityIsUsedForTheFirstTime(entity: EntityMetadata): Promise<void>;
|
|
7
|
-
ensureSchema?(entities: EntityMetadata[]
|
|
7
|
+
ensureSchema?(entities: EntityMetadata[]): Promise<void>;
|
|
8
8
|
}
|
|
9
9
|
export interface SqlCommand extends SqlCommandWithParameters {
|
|
10
10
|
execute(sql: string): Promise<SqlResult>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { addDatabaseToTest, itWithFocus } from "../shared-tests/db-tests-setup";
|
|
1
|
+
import { addDatabaseToTest, itWithFocus, TestDbs } from "../shared-tests/db-tests-setup";
|
|
2
2
|
import { InMemoryDataProvider, remult } from "../..";
|
|
3
3
|
import { Remult } from "../context";
|
|
4
4
|
import { SqlDatabase } from "../data-providers/sql-database";
|
|
@@ -33,5 +33,5 @@ export function testRest(key, what, focus = false) {
|
|
|
33
33
|
await what({ db, remult, createEntity: async (x) => remult.repo(x) });
|
|
34
34
|
}, focus);
|
|
35
35
|
}
|
|
36
|
-
addDatabaseToTest(testRest);
|
|
36
|
+
addDatabaseToTest(testRest, TestDbs.restDataProvider);
|
|
37
37
|
import '../shared-tests/';
|
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { CanEnsureSchema, DataProvider } from "../src/data-interfaces";
|
|
1
|
+
import { Storage, DataProvider } from "../src/data-interfaces";
|
|
3
2
|
import { LiveQueryStorage, StoredQuery } from "../src/live-query/SubscriptionServer";
|
|
4
3
|
import { EntityBase, Repository } from "../src/remult3";
|
|
5
|
-
export declare class DataProviderLiveQueryStorage implements LiveQueryStorage,
|
|
4
|
+
export declare class DataProviderLiveQueryStorage implements LiveQueryStorage, Storage {
|
|
6
5
|
repo: Promise<Repository<LiveQueryStorageEntity>>;
|
|
7
6
|
dataProvider: Promise<DataProvider>;
|
|
8
7
|
constructor(dataProvider: DataProvider | Promise<DataProvider> | (() => Promise<DataProvider | undefined>));
|
|
9
|
-
ensureSchema(
|
|
8
|
+
ensureSchema(): Promise<void>;
|
|
10
9
|
add({ id, entityKey, data }: StoredQuery): Promise<void>;
|
|
11
10
|
remove(queryId: string): Promise<void>;
|
|
12
11
|
forEach(entityKey: string, callback: (args: {
|
|
@@ -12,7 +12,7 @@ var DataProviderLiveQueryStorage = /** @class */ (function () {
|
|
|
12
12
|
return new context_1.Remult(dp).repo(LiveQueryStorageEntity);
|
|
13
13
|
});
|
|
14
14
|
}
|
|
15
|
-
DataProviderLiveQueryStorage.prototype.ensureSchema = function (
|
|
15
|
+
DataProviderLiveQueryStorage.prototype.ensureSchema = function () {
|
|
16
16
|
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
17
17
|
var _a, _b;
|
|
18
18
|
return tslib_1.__generator(this, function (_c) {
|
|
@@ -21,7 +21,7 @@ var DataProviderLiveQueryStorage = /** @class */ (function () {
|
|
|
21
21
|
case 1:
|
|
22
22
|
_b = (_a = (_c.sent())).ensureSchema;
|
|
23
23
|
return [4 /*yield*/, this.repo];
|
|
24
|
-
case 2: return [4 /*yield*/, _b.apply(_a, [[(_c.sent()).metadata]
|
|
24
|
+
case 2: return [4 /*yield*/, _b.apply(_a, [[(_c.sent()).metadata]])];
|
|
25
25
|
case 3:
|
|
26
26
|
_c.sent();
|
|
27
27
|
return [2 /*return*/];
|
package/package.json
CHANGED
|
@@ -16,7 +16,7 @@ export declare class PostgresDataProvider implements SqlImplementation {
|
|
|
16
16
|
getLimitSqlSyntax(limit: number, offset: number): string;
|
|
17
17
|
createCommand(): SqlCommand;
|
|
18
18
|
constructor(pool: PostgresPool);
|
|
19
|
-
ensureSchema(entities: EntityMetadata<any>[]
|
|
19
|
+
ensureSchema(entities: EntityMetadata<any>[]): Promise<void>;
|
|
20
20
|
transaction(action: (dataProvider: SqlImplementation) => Promise<void>): Promise<void>;
|
|
21
21
|
}
|
|
22
22
|
export interface PostgresCommandSource {
|
|
@@ -31,7 +31,7 @@ var PostgresDataProvider = /** @class */ (function () {
|
|
|
31
31
|
PostgresDataProvider.prototype.createCommand = function () {
|
|
32
32
|
return new PostgresBridgeToSQLCommand(this.pool);
|
|
33
33
|
};
|
|
34
|
-
PostgresDataProvider.prototype.ensureSchema = function (entities
|
|
34
|
+
PostgresDataProvider.prototype.ensureSchema = function (entities) {
|
|
35
35
|
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
36
36
|
var db, sb;
|
|
37
37
|
return tslib_1.__generator(this, function (_a) {
|
|
@@ -39,7 +39,7 @@ var PostgresDataProvider = /** @class */ (function () {
|
|
|
39
39
|
case 0:
|
|
40
40
|
db = new sql_database_1.SqlDatabase(this);
|
|
41
41
|
sb = new schema_builder_1.PostgresSchemaBuilder(db);
|
|
42
|
-
return [4 /*yield*/, sb.ensureSchema(entities
|
|
42
|
+
return [4 /*yield*/, sb.ensureSchema(entities)];
|
|
43
43
|
case 1:
|
|
44
44
|
_a.sent();
|
|
45
45
|
return [2 /*return*/];
|
|
@@ -162,7 +162,7 @@ function preparePostgresQueueStorage(sql) {
|
|
|
162
162
|
case 1:
|
|
163
163
|
JobsInQueueEntity = (_a.sent()).JobsInQueueEntity;
|
|
164
164
|
e = c.repo(JobsInQueueEntity);
|
|
165
|
-
return [4 /*yield*/, sql.ensureSchema([e.metadata]
|
|
165
|
+
return [4 /*yield*/, sql.ensureSchema([e.metadata])];
|
|
166
166
|
case 2:
|
|
167
167
|
_a.sent();
|
|
168
168
|
return [4 /*yield*/, Promise.resolve().then(function () { return tslib_1.__importStar(require('../server/expressBridge')); })];
|
|
@@ -7,7 +7,7 @@ export declare function verifyStructureOfAllEntities(db: SqlDatabase, remult: Re
|
|
|
7
7
|
export declare class PostgresSchemaBuilder {
|
|
8
8
|
private pool;
|
|
9
9
|
verifyStructureOfAllEntities(remult?: Remult): Promise<void>;
|
|
10
|
-
ensureSchema(entities: EntityMetadata<any>[]
|
|
10
|
+
ensureSchema(entities: EntityMetadata<any>[]): Promise<void>;
|
|
11
11
|
createIfNotExist(entity: EntityMetadata): Promise<void>;
|
|
12
12
|
addColumnIfNotExist<T extends EntityMetadata>(entity: T, c: ((e: T) => FieldMetadata)): Promise<void>;
|
|
13
13
|
verifyAllColumns<T extends EntityMetadata>(entity: T): Promise<void>;
|
|
@@ -107,64 +107,54 @@ var PostgresSchemaBuilder = /** @class */ (function () {
|
|
|
107
107
|
});
|
|
108
108
|
});
|
|
109
109
|
};
|
|
110
|
-
PostgresSchemaBuilder.prototype.ensureSchema = function (entities
|
|
110
|
+
PostgresSchemaBuilder.prototype.ensureSchema = function (entities) {
|
|
111
111
|
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
112
|
-
var
|
|
112
|
+
var entities_1, entities_1_1, entity, e, err_1, e_2_1;
|
|
113
113
|
var e_2, _a;
|
|
114
114
|
return tslib_1.__generator(this, function (_b) {
|
|
115
115
|
switch (_b.label) {
|
|
116
116
|
case 0:
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
desc += " - " + caption;
|
|
120
|
-
if (PostgresSchemaBuilder.logToConsole)
|
|
121
|
-
console.time(desc);
|
|
117
|
+
_b.trys.push([0, 10, 11, 12]);
|
|
118
|
+
entities_1 = tslib_1.__values(entities), entities_1_1 = entities_1.next();
|
|
122
119
|
_b.label = 1;
|
|
123
120
|
case 1:
|
|
124
|
-
|
|
125
|
-
entities_1 = tslib_1.__values(entities), entities_1_1 = entities_1.next();
|
|
126
|
-
_b.label = 2;
|
|
127
|
-
case 2:
|
|
128
|
-
if (!!entities_1_1.done) return [3 /*break*/, 10];
|
|
121
|
+
if (!!entities_1_1.done) return [3 /*break*/, 9];
|
|
129
122
|
entity = entities_1_1.value;
|
|
130
123
|
return [4 /*yield*/, filter_consumer_bridge_to_sql_request_1.dbNamesOf(entity)];
|
|
131
|
-
case
|
|
124
|
+
case 2:
|
|
132
125
|
e = _b.sent();
|
|
133
|
-
_b.label =
|
|
134
|
-
case
|
|
135
|
-
_b.trys.push([
|
|
136
|
-
if (!!entity.options.sqlExpression) return [3 /*break*/,
|
|
137
|
-
if (!(e.$entityName.toLowerCase().indexOf('from ') < 0)) return [3 /*break*/,
|
|
126
|
+
_b.label = 3;
|
|
127
|
+
case 3:
|
|
128
|
+
_b.trys.push([3, 7, , 8]);
|
|
129
|
+
if (!!entity.options.sqlExpression) return [3 /*break*/, 6];
|
|
130
|
+
if (!(e.$entityName.toLowerCase().indexOf('from ') < 0)) return [3 /*break*/, 6];
|
|
138
131
|
return [4 /*yield*/, this.createIfNotExist(entity)];
|
|
139
|
-
case
|
|
132
|
+
case 4:
|
|
140
133
|
_b.sent();
|
|
141
134
|
return [4 /*yield*/, this.verifyAllColumns(entity)];
|
|
142
|
-
case
|
|
135
|
+
case 5:
|
|
143
136
|
_b.sent();
|
|
144
|
-
_b.label =
|
|
145
|
-
case
|
|
146
|
-
case
|
|
137
|
+
_b.label = 6;
|
|
138
|
+
case 6: return [3 /*break*/, 8];
|
|
139
|
+
case 7:
|
|
147
140
|
err_1 = _b.sent();
|
|
148
141
|
console.error("failed verify structure of " + e.$entityName + " ", err_1);
|
|
149
|
-
return [3 /*break*/,
|
|
150
|
-
case
|
|
142
|
+
return [3 /*break*/, 8];
|
|
143
|
+
case 8:
|
|
151
144
|
entities_1_1 = entities_1.next();
|
|
152
|
-
return [3 /*break*/,
|
|
153
|
-
case
|
|
154
|
-
case
|
|
145
|
+
return [3 /*break*/, 1];
|
|
146
|
+
case 9: return [3 /*break*/, 12];
|
|
147
|
+
case 10:
|
|
155
148
|
e_2_1 = _b.sent();
|
|
156
149
|
e_2 = { error: e_2_1 };
|
|
157
|
-
return [3 /*break*/,
|
|
158
|
-
case
|
|
150
|
+
return [3 /*break*/, 12];
|
|
151
|
+
case 11:
|
|
159
152
|
try {
|
|
160
153
|
if (entities_1_1 && !entities_1_1.done && (_a = entities_1.return)) _a.call(entities_1);
|
|
161
154
|
}
|
|
162
155
|
finally { if (e_2) throw e_2.error; }
|
|
163
156
|
return [7 /*endfinally*/];
|
|
164
|
-
case
|
|
165
|
-
if (PostgresSchemaBuilder.logToConsole)
|
|
166
|
-
console.timeEnd(desc);
|
|
167
|
-
return [2 /*return*/];
|
|
157
|
+
case 12: return [2 /*return*/];
|
|
168
158
|
}
|
|
169
159
|
});
|
|
170
160
|
});
|
package/remult-knex/index.d.ts
CHANGED
|
@@ -12,13 +12,13 @@ export declare class KnexDataProvider implements DataProvider {
|
|
|
12
12
|
static rawFilter(build: CustomKnexFilterBuilderFunction): EntityFilter<any>;
|
|
13
13
|
static filterToRaw<entityType>(entity: RepositoryOverloads<entityType>, condition: EntityFilter<entityType>): Promise<(knex: any) => void>;
|
|
14
14
|
supportsRawFilter?: boolean;
|
|
15
|
-
ensureSchema(entities: EntityMetadata<any>[]
|
|
15
|
+
ensureSchema(entities: EntityMetadata<any>[]): Promise<void>;
|
|
16
16
|
}
|
|
17
17
|
export declare type CustomKnexFilterBuilderFunction = () => Promise<(builder: Knex.QueryBuilder) => void>;
|
|
18
18
|
export declare class KnexSchemaBuilder {
|
|
19
19
|
private knex;
|
|
20
20
|
verifyStructureOfAllEntities(remult?: Remult): Promise<void>;
|
|
21
|
-
ensureSchema(entities: EntityMetadata<any>[]
|
|
21
|
+
ensureSchema(entities: EntityMetadata<any>[]): Promise<void>;
|
|
22
22
|
createIfNotExist(entity: EntityMetadata): Promise<void>;
|
|
23
23
|
addColumnIfNotExist<T extends EntityMetadata>(entity: T, c: ((e: T) => FieldMetadata)): Promise<void>;
|
|
24
24
|
verifyAllColumns<T extends EntityMetadata>(entity: T): Promise<void>;
|
package/remult-knex/index.js
CHANGED
|
@@ -84,14 +84,14 @@ var KnexDataProvider = /** @class */ (function () {
|
|
|
84
84
|
});
|
|
85
85
|
});
|
|
86
86
|
};
|
|
87
|
-
KnexDataProvider.prototype.ensureSchema = function (entities
|
|
87
|
+
KnexDataProvider.prototype.ensureSchema = function (entities) {
|
|
88
88
|
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
89
89
|
var sb;
|
|
90
90
|
return tslib_1.__generator(this, function (_a) {
|
|
91
91
|
switch (_a.label) {
|
|
92
92
|
case 0:
|
|
93
93
|
sb = new KnexSchemaBuilder(this.knex);
|
|
94
|
-
return [4 /*yield*/, sb.ensureSchema(entities
|
|
94
|
+
return [4 /*yield*/, sb.ensureSchema(entities)];
|
|
95
95
|
case 1:
|
|
96
96
|
_a.sent();
|
|
97
97
|
return [2 /*return*/];
|
|
@@ -582,64 +582,54 @@ var KnexSchemaBuilder = /** @class */ (function () {
|
|
|
582
582
|
});
|
|
583
583
|
});
|
|
584
584
|
};
|
|
585
|
-
KnexSchemaBuilder.prototype.ensureSchema = function (entities
|
|
585
|
+
KnexSchemaBuilder.prototype.ensureSchema = function (entities) {
|
|
586
586
|
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
587
|
-
var
|
|
587
|
+
var entities_1, entities_1_1, entity, e, err_2, e_6_1;
|
|
588
588
|
var e_6, _a;
|
|
589
589
|
return tslib_1.__generator(this, function (_b) {
|
|
590
590
|
switch (_b.label) {
|
|
591
591
|
case 0:
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
desc += " - " + caption;
|
|
595
|
-
if (KnexSchemaBuilder.logToConsole)
|
|
596
|
-
console.time(desc);
|
|
592
|
+
_b.trys.push([0, 10, 11, 12]);
|
|
593
|
+
entities_1 = tslib_1.__values(entities), entities_1_1 = entities_1.next();
|
|
597
594
|
_b.label = 1;
|
|
598
595
|
case 1:
|
|
599
|
-
|
|
600
|
-
entities_1 = tslib_1.__values(entities), entities_1_1 = entities_1.next();
|
|
601
|
-
_b.label = 2;
|
|
602
|
-
case 2:
|
|
603
|
-
if (!!entities_1_1.done) return [3 /*break*/, 10];
|
|
596
|
+
if (!!entities_1_1.done) return [3 /*break*/, 9];
|
|
604
597
|
entity = entities_1_1.value;
|
|
605
598
|
return [4 /*yield*/, filter_consumer_bridge_to_sql_request_1.dbNamesOf(entity)];
|
|
606
|
-
case
|
|
599
|
+
case 2:
|
|
607
600
|
e = _b.sent();
|
|
608
|
-
_b.label =
|
|
609
|
-
case
|
|
610
|
-
_b.trys.push([
|
|
611
|
-
if (!!entity.options.sqlExpression) return [3 /*break*/,
|
|
612
|
-
if (!(e.$entityName.toLowerCase().indexOf('from ') < 0)) return [3 /*break*/,
|
|
601
|
+
_b.label = 3;
|
|
602
|
+
case 3:
|
|
603
|
+
_b.trys.push([3, 7, , 8]);
|
|
604
|
+
if (!!entity.options.sqlExpression) return [3 /*break*/, 6];
|
|
605
|
+
if (!(e.$entityName.toLowerCase().indexOf('from ') < 0)) return [3 /*break*/, 6];
|
|
613
606
|
return [4 /*yield*/, this.createIfNotExist(entity)];
|
|
614
|
-
case
|
|
607
|
+
case 4:
|
|
615
608
|
_b.sent();
|
|
616
609
|
return [4 /*yield*/, this.verifyAllColumns(entity)];
|
|
617
|
-
case
|
|
610
|
+
case 5:
|
|
618
611
|
_b.sent();
|
|
619
|
-
_b.label =
|
|
620
|
-
case
|
|
621
|
-
case
|
|
612
|
+
_b.label = 6;
|
|
613
|
+
case 6: return [3 /*break*/, 8];
|
|
614
|
+
case 7:
|
|
622
615
|
err_2 = _b.sent();
|
|
623
|
-
console.error("failed
|
|
624
|
-
return [3 /*break*/,
|
|
625
|
-
case
|
|
616
|
+
console.error("failed ensure schema of " + e.$entityName + " ", err_2);
|
|
617
|
+
return [3 /*break*/, 8];
|
|
618
|
+
case 8:
|
|
626
619
|
entities_1_1 = entities_1.next();
|
|
627
|
-
return [3 /*break*/,
|
|
628
|
-
case
|
|
629
|
-
case
|
|
620
|
+
return [3 /*break*/, 1];
|
|
621
|
+
case 9: return [3 /*break*/, 12];
|
|
622
|
+
case 10:
|
|
630
623
|
e_6_1 = _b.sent();
|
|
631
624
|
e_6 = { error: e_6_1 };
|
|
632
|
-
return [3 /*break*/,
|
|
633
|
-
case
|
|
625
|
+
return [3 /*break*/, 12];
|
|
626
|
+
case 11:
|
|
634
627
|
try {
|
|
635
628
|
if (entities_1_1 && !entities_1_1.done && (_a = entities_1.return)) _a.call(entities_1);
|
|
636
629
|
}
|
|
637
630
|
finally { if (e_6) throw e_6.error; }
|
|
638
631
|
return [7 /*endfinally*/];
|
|
639
|
-
case
|
|
640
|
-
if (KnexSchemaBuilder.logToConsole)
|
|
641
|
-
console.timeEnd(desc);
|
|
642
|
-
return [2 /*return*/];
|
|
632
|
+
case 12: return [2 /*return*/];
|
|
643
633
|
}
|
|
644
634
|
});
|
|
645
635
|
});
|
package/server/expressBridge.js
CHANGED
|
@@ -43,13 +43,21 @@ function createRemultServerCore(options) {
|
|
|
43
43
|
remult = new context_1.Remult(dp);
|
|
44
44
|
return [4 /*yield*/, new Promise(function (res) {
|
|
45
45
|
RemultAsyncLocalStorage.instance.run(remult, function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
46
|
-
var entitiesMetadata, _a, _b, item, e_1_1;
|
|
46
|
+
var started_1, startConsoleLog, entitiesMetadata, _a, _b, item, e_1_1;
|
|
47
47
|
var e_1, _c;
|
|
48
48
|
return tslib_1.__generator(this, function (_d) {
|
|
49
49
|
switch (_d.label) {
|
|
50
50
|
case 0:
|
|
51
|
-
if (!options.ensureSchema) return [3 /*break*/,
|
|
52
|
-
|
|
51
|
+
if (!options.ensureSchema) return [3 /*break*/, 10];
|
|
52
|
+
started_1 = false;
|
|
53
|
+
startConsoleLog = function () {
|
|
54
|
+
if (started_1)
|
|
55
|
+
return;
|
|
56
|
+
started_1 = true;
|
|
57
|
+
console.time("Ensure Schema");
|
|
58
|
+
};
|
|
59
|
+
if (!dp.ensureSchema) return [3 /*break*/, 2];
|
|
60
|
+
startConsoleLog();
|
|
53
61
|
entitiesMetadata = options.entities.map(function (e) { return remult.repo(e).metadata; });
|
|
54
62
|
return [4 /*yield*/, dp.ensureSchema(entitiesMetadata)];
|
|
55
63
|
case 1:
|
|
@@ -63,7 +71,8 @@ function createRemultServerCore(options) {
|
|
|
63
71
|
if (!!_b.done) return [3 /*break*/, 6];
|
|
64
72
|
item = _b.value;
|
|
65
73
|
if (!(item === null || item === void 0 ? void 0 : item.ensureSchema)) return [3 /*break*/, 5];
|
|
66
|
-
|
|
74
|
+
startConsoleLog();
|
|
75
|
+
return [4 /*yield*/, item.ensureSchema()];
|
|
67
76
|
case 4:
|
|
68
77
|
_d.sent();
|
|
69
78
|
_d.label = 5;
|
|
@@ -82,12 +91,16 @@ function createRemultServerCore(options) {
|
|
|
82
91
|
finally { if (e_1) throw e_1.error; }
|
|
83
92
|
return [7 /*endfinally*/];
|
|
84
93
|
case 9:
|
|
85
|
-
if (
|
|
86
|
-
|
|
94
|
+
if (started_1)
|
|
95
|
+
console.timeEnd("Ensure Schema");
|
|
96
|
+
_d.label = 10;
|
|
87
97
|
case 10:
|
|
88
|
-
|
|
89
|
-
|
|
98
|
+
if (!options.initApi) return [3 /*break*/, 12];
|
|
99
|
+
return [4 /*yield*/, options.initApi(remult)];
|
|
90
100
|
case 11:
|
|
101
|
+
_d.sent();
|
|
102
|
+
_d.label = 12;
|
|
103
|
+
case 12:
|
|
91
104
|
res({});
|
|
92
105
|
return [2 /*return*/];
|
|
93
106
|
}
|
package/server/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { GenericRequest, RemultServer, RemultServerOptions } from './expressBridge';
|
|
2
2
|
export { queuedJobInfo, QueueStorage, GenericRequest, GenericRequestHandler, GenericResponse, GenericRouter, RemultServerOptions, SpecificRoute, RemultServer, InitRequestOptions } from './expressBridge';
|
|
3
3
|
export { JsonEntityFileStorage, JsonFileDataProvider } from './JsonEntityFileStorage';
|
|
4
|
+
export { DataProviderLiveQueryStorage } from '../live-query/data-provider-live-query-storage';
|
|
4
5
|
export declare function createRemultServer<RequestType extends GenericRequest = GenericRequest>(options?: RemultServerOptions<RequestType>): RemultServer;
|
package/server/index.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createRemultServer = exports.JsonFileDataProvider = exports.JsonEntityFileStorage = void 0;
|
|
3
|
+
exports.createRemultServer = exports.DataProviderLiveQueryStorage = exports.JsonFileDataProvider = exports.JsonEntityFileStorage = void 0;
|
|
4
4
|
var expressBridge_1 = require("./expressBridge");
|
|
5
5
|
var initAsyncHooks_1 = require("./initAsyncHooks");
|
|
6
6
|
var JsonEntityFileStorage_1 = require("./JsonEntityFileStorage");
|
|
7
7
|
Object.defineProperty(exports, "JsonEntityFileStorage", { enumerable: true, get: function () { return JsonEntityFileStorage_1.JsonEntityFileStorage; } });
|
|
8
8
|
Object.defineProperty(exports, "JsonFileDataProvider", { enumerable: true, get: function () { return JsonEntityFileStorage_1.JsonFileDataProvider; } });
|
|
9
|
+
var data_provider_live_query_storage_1 = require("../live-query/data-provider-live-query-storage");
|
|
10
|
+
Object.defineProperty(exports, "DataProviderLiveQueryStorage", { enumerable: true, get: function () { return data_provider_live_query_storage_1.DataProviderLiveQueryStorage; } });
|
|
9
11
|
function createRemultServer(options) {
|
|
10
12
|
initAsyncHooks_1.initAsyncHooks();
|
|
11
13
|
return expressBridge_1.createRemultServerCore(options);
|
package/src/data-interfaces.d.ts
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import { Sort } from './sort';
|
|
2
2
|
import { Filter } from './filter/filter-interfaces';
|
|
3
3
|
import { EntityMetadata, OmitEB } from './remult3';
|
|
4
|
-
import type { Remult } from './context';
|
|
5
4
|
export interface DataProvider {
|
|
6
5
|
getEntityDataProvider(entity: EntityMetadata): EntityDataProvider;
|
|
7
6
|
transaction(action: (dataProvider: DataProvider) => Promise<void>): Promise<void>;
|
|
8
7
|
supportsRawFilter?: boolean;
|
|
9
|
-
ensureSchema?(entities: EntityMetadata[]
|
|
8
|
+
ensureSchema?(entities: EntityMetadata[]): Promise<void>;
|
|
10
9
|
}
|
|
11
|
-
export interface
|
|
12
|
-
ensureSchema(
|
|
10
|
+
export interface Storage {
|
|
11
|
+
ensureSchema(): Promise<void>;
|
|
13
12
|
}
|
|
14
13
|
export interface EntityDataProvider {
|
|
15
14
|
count(where: Filter): Promise<number>;
|
|
@@ -8,7 +8,7 @@ export declare class SqlDatabase implements DataProvider {
|
|
|
8
8
|
static getDb(remult?: Remult): SqlDatabase;
|
|
9
9
|
createCommand(): SqlCommand;
|
|
10
10
|
execute(sql: string): Promise<SqlResult>;
|
|
11
|
-
ensureSchema(entities: EntityMetadata<any>[]
|
|
11
|
+
ensureSchema(entities: EntityMetadata<any>[]): Promise<void>;
|
|
12
12
|
getEntityDataProvider(entity: EntityMetadata): EntityDataProvider;
|
|
13
13
|
transaction(action: (dataProvider: DataProvider) => Promise<void>): Promise<void>;
|
|
14
14
|
static rawFilter(build: CustomSqlFilterBuilderFunction): EntityFilter<any>;
|
|
@@ -37,13 +37,13 @@ var SqlDatabase = /** @class */ (function () {
|
|
|
37
37
|
SqlDatabase.prototype._getSourceSql = function () {
|
|
38
38
|
return this.sql;
|
|
39
39
|
};
|
|
40
|
-
SqlDatabase.prototype.ensureSchema = function (entities
|
|
40
|
+
SqlDatabase.prototype.ensureSchema = function (entities) {
|
|
41
41
|
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
42
42
|
return tslib_1.__generator(this, function (_a) {
|
|
43
43
|
switch (_a.label) {
|
|
44
44
|
case 0:
|
|
45
45
|
if (!this.sql.ensureSchema) return [3 /*break*/, 2];
|
|
46
|
-
return [4 /*yield*/, this.sql.ensureSchema(entities
|
|
46
|
+
return [4 /*yield*/, this.sql.ensureSchema(entities)];
|
|
47
47
|
case 1:
|
|
48
48
|
_a.sent();
|
|
49
49
|
_a.label = 2;
|
|
@@ -5,15 +5,22 @@ import { Repository } from "../remult3";
|
|
|
5
5
|
import { CategoriesForTesting } from "../tests/remult-3-entities";
|
|
6
6
|
import { Status } from "../tests/testModel/models";
|
|
7
7
|
export declare function itWithFocus(key: string, what: () => Promise<void>, focus?: boolean): void;
|
|
8
|
-
export declare function testAll(key: string, what: dbTestWhatSignature, focus?: boolean
|
|
9
|
-
|
|
8
|
+
export declare function testAll(key: string, what: dbTestWhatSignature, focus?: boolean, options?: {
|
|
9
|
+
exclude?: string[];
|
|
10
|
+
}): void;
|
|
11
|
+
export declare function addDatabaseToTest(tester: dbTestMethodSignature, key?: string): dbTestMethodSignature;
|
|
10
12
|
export declare function testInMemory(key: string, what: dbTestWhatSignature, focus?: boolean): void;
|
|
11
|
-
export declare
|
|
13
|
+
export declare const TestDbs: {
|
|
14
|
+
restDataProvider: string;
|
|
15
|
+
};
|
|
16
|
+
export declare type dbTestWhatSignature = ((db: {
|
|
12
17
|
db: DataProvider;
|
|
13
18
|
remult: Remult;
|
|
14
19
|
createEntity<entityType>(entity: ClassType<entityType>): Promise<Repository<entityType>>;
|
|
15
|
-
}) => Promise<void
|
|
16
|
-
export declare type dbTestMethodSignature = (key: string, what: dbTestWhatSignature, focus: boolean) => void
|
|
20
|
+
}) => Promise<void>);
|
|
21
|
+
export declare type dbTestMethodSignature = ((key: string, what: dbTestWhatSignature, focus: boolean) => void) & {
|
|
22
|
+
key?: string;
|
|
23
|
+
};
|
|
17
24
|
export declare function testAllDbs<T extends CategoriesForTesting>(key: string, doTest: (helper: {
|
|
18
25
|
remult: Remult;
|
|
19
26
|
createData: (doInsert?: (insert: (id: number, name: string, description?: string, status?: Status) => Promise<void>) => Promise<void>, entity?: {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.testAllDbs = exports.testInMemory = exports.addDatabaseToTest = exports.testAll = exports.itWithFocus = void 0;
|
|
3
|
+
exports.testAllDbs = exports.TestDbs = exports.testInMemory = exports.addDatabaseToTest = exports.testAll = exports.itWithFocus = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
var context_1 = require("../context");
|
|
6
6
|
var in_memory_database_1 = require("../data-providers/in-memory-database");
|
|
@@ -14,13 +14,18 @@ function itWithFocus(key, what, focus) {
|
|
|
14
14
|
it(key, what);
|
|
15
15
|
}
|
|
16
16
|
exports.itWithFocus = itWithFocus;
|
|
17
|
-
function testAll(key, what, focus) {
|
|
17
|
+
function testAll(key, what, focus, options) {
|
|
18
18
|
var e_1, _a;
|
|
19
19
|
if (focus === void 0) { focus = false; }
|
|
20
|
+
function runTest(m) {
|
|
21
|
+
var _a;
|
|
22
|
+
return !((_a = options === null || options === void 0 ? void 0 : options.exclude) === null || _a === void 0 ? void 0 : _a.includes(m.key));
|
|
23
|
+
}
|
|
20
24
|
try {
|
|
21
25
|
for (var databasesTesters_1 = tslib_1.__values(databasesTesters), databasesTesters_1_1 = databasesTesters_1.next(); !databasesTesters_1_1.done; databasesTesters_1_1 = databasesTesters_1.next()) {
|
|
22
26
|
var test_1 = databasesTesters_1_1.value;
|
|
23
|
-
test_1
|
|
27
|
+
if (runTest(test_1))
|
|
28
|
+
test_1(key, what, focus);
|
|
24
29
|
}
|
|
25
30
|
}
|
|
26
31
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
@@ -31,14 +36,16 @@ function testAll(key, what, focus) {
|
|
|
31
36
|
finally { if (e_1) throw e_1.error; }
|
|
32
37
|
}
|
|
33
38
|
loadedTests.push(function (x) {
|
|
34
|
-
x
|
|
39
|
+
if (runTest(x))
|
|
40
|
+
x(key, what, focus);
|
|
35
41
|
});
|
|
36
42
|
}
|
|
37
43
|
exports.testAll = testAll;
|
|
38
44
|
var databasesTesters = [];
|
|
39
45
|
var loadedTests = [];
|
|
40
|
-
function addDatabaseToTest(tester) {
|
|
46
|
+
function addDatabaseToTest(tester, key) {
|
|
41
47
|
var e_2, _a;
|
|
48
|
+
tester.key = key;
|
|
42
49
|
try {
|
|
43
50
|
for (var loadedTests_1 = tslib_1.__values(loadedTests), loadedTests_1_1 = loadedTests_1.next(); !loadedTests_1_1.done; loadedTests_1_1 = loadedTests_1.next()) {
|
|
44
51
|
var test_2 = loadedTests_1_1.value;
|
|
@@ -78,6 +85,9 @@ function testInMemory(key, what, focus) {
|
|
|
78
85
|
}); }, focus);
|
|
79
86
|
}
|
|
80
87
|
exports.testInMemory = testInMemory;
|
|
88
|
+
exports.TestDbs = {
|
|
89
|
+
restDataProvider: "restDataProvider"
|
|
90
|
+
};
|
|
81
91
|
databasesTesters.push(testInMemory);
|
|
82
92
|
function testAllDbs(key, doTest, focus) {
|
|
83
93
|
if (focus === void 0) { focus = false; }
|
|
@@ -1731,7 +1731,7 @@ db_tests_setup_1.testAll("test live query storage", function (_a) {
|
|
|
1731
1731
|
case 0:
|
|
1732
1732
|
x = new data_provider_live_query_storage_1.DataProviderLiveQueryStorage(db);
|
|
1733
1733
|
if (!db.ensureSchema) return [3 /*break*/, 2];
|
|
1734
|
-
return [4 /*yield*/, x.ensureSchema(
|
|
1734
|
+
return [4 /*yield*/, x.ensureSchema()];
|
|
1735
1735
|
case 1:
|
|
1736
1736
|
_c.sent();
|
|
1737
1737
|
_c.label = 2;
|
|
@@ -1756,4 +1756,6 @@ db_tests_setup_1.testAll("test live query storage", function (_a) {
|
|
|
1756
1756
|
}
|
|
1757
1757
|
});
|
|
1758
1758
|
});
|
|
1759
|
+
}, false, {
|
|
1760
|
+
exclude: [db_tests_setup_1.TestDbs.restDataProvider]
|
|
1759
1761
|
});
|
package/src/sql-command.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ export interface SqlImplementation {
|
|
|
4
4
|
createCommand(): SqlCommand;
|
|
5
5
|
transaction(action: (sql: SqlImplementation) => Promise<void>): Promise<void>;
|
|
6
6
|
entityIsUsedForTheFirstTime(entity: EntityMetadata): Promise<void>;
|
|
7
|
-
ensureSchema?(entities: EntityMetadata[]
|
|
7
|
+
ensureSchema?(entities: EntityMetadata[]): Promise<void>;
|
|
8
8
|
}
|
|
9
9
|
export interface SqlCommand extends SqlCommandWithParameters {
|
|
10
10
|
execute(sql: string): Promise<SqlResult>;
|
|
@@ -96,5 +96,5 @@ function testRest(key, what, focus) {
|
|
|
96
96
|
}); }, focus);
|
|
97
97
|
}
|
|
98
98
|
exports.testRest = testRest;
|
|
99
|
-
db_tests_setup_1.addDatabaseToTest(testRest);
|
|
99
|
+
db_tests_setup_1.addDatabaseToTest(testRest, db_tests_setup_1.TestDbs.restDataProvider);
|
|
100
100
|
require("../shared-tests/");
|