remult 0.26.11-next.0 → 0.26.11
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/internals.js +1 -0
- package/esm/postgres/postgres-data-provider.js +2 -2
- package/esm/remult-fresh.js +1 -1
- package/esm/remult-sqlite-core.js +3 -3
- package/esm/remult-turso.js +59 -0
- package/esm/server/core.js +1 -1
- package/esm/server/index.js +1 -1
- package/esm/src/buildRestDataProvider.js +3 -2
- package/esm/src/data-providers/array-entity-data-provider.js +2 -2
- package/esm/src/data-providers/sql-database.js +1 -1
- package/esm/src/live-query/SseSubscriptionClient.js +7 -3
- package/esm/src/remult3/RepositoryImplementation.js +1 -1
- package/esm/src/remult3/remult3.js +8 -12
- package/internals.d.ts +1 -0
- package/internals.js +3 -1
- package/package.json +6 -1
- package/postgres/postgres-data-provider.d.ts +1 -1
- package/postgres/postgres-data-provider.js +2 -2
- package/remult-express.d.ts +1 -1
- package/remult-fastify.d.ts +1 -1
- package/remult-fresh.d.ts +1 -1
- package/remult-fresh.js +2 -2
- package/remult-sqlite-core.js +15 -10
- package/remult-sqlite3.d.ts +1 -1
- package/remult-turso.d.ts +8 -0
- package/remult-turso.js +100 -0
- package/server/core.d.ts +1 -1
- package/server/core.js +2 -2
- package/server/index.d.ts +2 -2
- package/server/index.js +2 -2
- package/src/buildRestDataProvider.js +3 -2
- package/src/data-providers/array-entity-data-provider.js +2 -2
- package/src/data-providers/sql-database.js +0 -1
- package/src/live-query/SseSubscriptionClient.js +7 -3
- package/src/remult3/RepositoryImplementation.js +1 -1
- package/src/remult3/remult3.d.ts +3 -0
- package/src/remult3/remult3.js +9 -11
- /package/esm/server/{expressBridge.js → remult-api-server.js} +0 -0
- /package/server/{expressBridge.d.ts → remult-api-server.d.ts} +0 -0
- /package/server/{expressBridge.js → remult-api-server.js} +0 -0
package/esm/internals.js
CHANGED
|
@@ -4,3 +4,4 @@ export { decorateColumnSettings, controllerRefImpl, getControllerRef, } from './
|
|
|
4
4
|
export { getEntitySettings } from './src/remult3/getEntityRef.js';
|
|
5
5
|
export { __updateEntityBasedOnWhere } from './src/filter/filter-interfaces.js';
|
|
6
6
|
export const actionInfo = remultStatic.actionInfo;
|
|
7
|
+
export { flags } from './src/remult3/remult3.js';
|
|
@@ -163,11 +163,11 @@ export async function createPostgresDataProvider(options) {
|
|
|
163
163
|
export async function preparePostgresQueueStorage(sql) {
|
|
164
164
|
let c = new Remult();
|
|
165
165
|
c.dataProvider = sql;
|
|
166
|
-
let JobsInQueueEntity = (await import('../server/
|
|
166
|
+
let JobsInQueueEntity = (await import('../server/remult-api-server.js'))
|
|
167
167
|
.JobsInQueueEntity;
|
|
168
168
|
let e = c.repo(JobsInQueueEntity);
|
|
169
169
|
await sql.ensureSchema([e.metadata]);
|
|
170
|
-
return new (await import('../server/
|
|
170
|
+
return new (await import('../server/remult-api-server.js')).EntityQueueStorage(c.repo(JobsInQueueEntity));
|
|
171
171
|
}
|
|
172
172
|
export class PostgresSchemaWrapper {
|
|
173
173
|
pool;
|
package/esm/remult-fresh.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createRemultServerCore } from './server/
|
|
1
|
+
import { createRemultServerCore } from './server/remult-api-server.js';
|
|
2
2
|
export function remultFresh(options, response) {
|
|
3
3
|
const server = createRemultServerCore(options, {
|
|
4
4
|
buildGenericRequestInfo: (r) => r,
|
|
@@ -29,13 +29,13 @@ export class SqliteCoreDataProvider {
|
|
|
29
29
|
};
|
|
30
30
|
}
|
|
31
31
|
async transaction(action) {
|
|
32
|
-
this.createCommand().execute('Begin Transaction');
|
|
32
|
+
await this.createCommand().execute('Begin Transaction');
|
|
33
33
|
try {
|
|
34
34
|
await action(this);
|
|
35
|
-
this.createCommand().execute('Commit');
|
|
35
|
+
await this.createCommand().execute('Commit');
|
|
36
36
|
}
|
|
37
37
|
catch (err) {
|
|
38
|
-
this.createCommand().execute('Rollback');
|
|
38
|
+
await this.createCommand().execute('Rollback');
|
|
39
39
|
throw err;
|
|
40
40
|
}
|
|
41
41
|
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { SqliteCoreDataProvider } from './remult-sqlite-core.js';
|
|
2
|
+
import { cast } from './src/isOfType.js';
|
|
3
|
+
export class TursoDataProvider extends SqliteCoreDataProvider {
|
|
4
|
+
client;
|
|
5
|
+
constructor(client) {
|
|
6
|
+
super(() => new TursoCommand(client), async () => {
|
|
7
|
+
await cast(this.client, 'close').close();
|
|
8
|
+
}, false);
|
|
9
|
+
this.client = client;
|
|
10
|
+
}
|
|
11
|
+
async transaction(action) {
|
|
12
|
+
const trans = await cast(this.client, 'transaction').transaction();
|
|
13
|
+
try {
|
|
14
|
+
await action(new TursoDataProvider(trans));
|
|
15
|
+
await trans.commit();
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
await trans.rollback();
|
|
19
|
+
throw err;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
class TursoCommand {
|
|
24
|
+
db;
|
|
25
|
+
values = {};
|
|
26
|
+
i = 1;
|
|
27
|
+
constructor(db) {
|
|
28
|
+
this.db = db;
|
|
29
|
+
}
|
|
30
|
+
async execute(sql) {
|
|
31
|
+
return new TursoSqlResult(await this.db.execute({
|
|
32
|
+
sql,
|
|
33
|
+
args: this.values,
|
|
34
|
+
}));
|
|
35
|
+
}
|
|
36
|
+
addParameterAndReturnSqlToken(val) {
|
|
37
|
+
return this.param(val);
|
|
38
|
+
}
|
|
39
|
+
param(val) {
|
|
40
|
+
if (val instanceof Date)
|
|
41
|
+
val = val.valueOf();
|
|
42
|
+
if (typeof val === 'boolean')
|
|
43
|
+
val = val ? 1 : 0;
|
|
44
|
+
const key = ':' + this.i++;
|
|
45
|
+
this.values[key.substring(1)] = val;
|
|
46
|
+
return key;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
class TursoSqlResult {
|
|
50
|
+
result;
|
|
51
|
+
constructor(result) {
|
|
52
|
+
this.result = result;
|
|
53
|
+
this.rows = result.rows;
|
|
54
|
+
}
|
|
55
|
+
rows;
|
|
56
|
+
getColumnKeyInResultForIndexInSelect(index) {
|
|
57
|
+
return this.result.columns[index];
|
|
58
|
+
}
|
|
59
|
+
}
|
package/esm/server/core.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { createRemultServerCore, } from './
|
|
1
|
+
export { createRemultServerCore, } from './remult-api-server.js';
|
|
2
2
|
export { JsonEntityFileStorage, JsonFileDataProvider, } from './JsonEntityFileStorage.js';
|
|
3
3
|
export { SseSubscriptionServer } from '../SseSubscriptionServer.js';
|
|
4
4
|
export { DataProviderLiveQueryStorage } from '../live-query/data-provider-live-query-storage.js';
|
package/esm/server/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createRemultServerCore } from './
|
|
1
|
+
import { createRemultServerCore } from './remult-api-server.js';
|
|
2
2
|
import { initAsyncHooks } from './initAsyncHooks.js';
|
|
3
3
|
export { SseSubscriptionServer } from '../SseSubscriptionServer.js';
|
|
4
4
|
export { DataProviderLiveQueryStorage } from '../live-query/data-provider-live-query-storage.js';
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { RestDataProviderHttpProviderUsingFetch } from './data-providers/rest-data-provider.js';
|
|
2
|
+
import { flags } from './remult3/remult3.js';
|
|
2
3
|
export function buildRestDataProvider(provider) {
|
|
3
4
|
if (!provider)
|
|
4
5
|
return new RestDataProviderHttpProviderUsingFetch();
|
|
@@ -51,11 +52,11 @@ export async function retry(what) {
|
|
|
51
52
|
err.message?.includes('http proxy error') ||
|
|
52
53
|
err.message?.startsWith('Gateway Timeout') ||
|
|
53
54
|
err.status == 500) &&
|
|
54
|
-
i++ <
|
|
55
|
+
i++ < flags.error500RetryCount) {
|
|
55
56
|
await new Promise((res, req) => {
|
|
56
57
|
setTimeout(() => {
|
|
57
58
|
res({});
|
|
58
|
-
},
|
|
59
|
+
}, 500);
|
|
59
60
|
});
|
|
60
61
|
continue;
|
|
61
62
|
}
|
|
@@ -134,7 +134,7 @@ export class ArrayEntityDataProvider {
|
|
|
134
134
|
return Promise.resolve(this.translateFromJson(this.rows()[i], names));
|
|
135
135
|
}
|
|
136
136
|
}
|
|
137
|
-
throw new Error(
|
|
137
|
+
throw new Error(`ArrayEntityDataProvider: Couldn't find row with id "${id}" in entity "${this.entity.key}" to update`);
|
|
138
138
|
}
|
|
139
139
|
async delete(id) {
|
|
140
140
|
const names = await this.init();
|
|
@@ -145,7 +145,7 @@ export class ArrayEntityDataProvider {
|
|
|
145
145
|
return Promise.resolve();
|
|
146
146
|
}
|
|
147
147
|
}
|
|
148
|
-
throw new Error(
|
|
148
|
+
throw new Error(`ArrayEntityDataProvider: Couldn't find row with id "${id}" in entity "${this.entity.key}" to delete`);
|
|
149
149
|
}
|
|
150
150
|
async insert(data) {
|
|
151
151
|
const names = await this.init();
|
|
@@ -100,7 +100,7 @@ export class SqlDatabase {
|
|
|
100
100
|
},
|
|
101
101
|
};
|
|
102
102
|
}
|
|
103
|
-
static async filterToRaw(repo, condition, sqlCommand, dbNames, wrapIdentifier
|
|
103
|
+
static async filterToRaw(repo, condition, sqlCommand, dbNames, wrapIdentifier) {
|
|
104
104
|
if (!sqlCommand) {
|
|
105
105
|
sqlCommand = new myDummySQLCommand();
|
|
106
106
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { buildRestDataProvider } from '../buildRestDataProvider.js';
|
|
2
2
|
import { remult } from '../remult-proxy.js';
|
|
3
3
|
import { remultStatic } from '../remult-static.js';
|
|
4
|
+
import { flags } from '../remult3/remult3.js';
|
|
4
5
|
import { streamUrl } from './SubscriptionChannel.js';
|
|
5
6
|
export class SseSubscriptionClient {
|
|
6
7
|
openConnection(onReconnect) {
|
|
@@ -34,6 +35,7 @@ export class SseSubscriptionClient {
|
|
|
34
35
|
};
|
|
35
36
|
const createConnectionPromise = () => new Promise((res) => {
|
|
36
37
|
createConnection();
|
|
38
|
+
let retryCount = 0;
|
|
37
39
|
function createConnection() {
|
|
38
40
|
if (source)
|
|
39
41
|
source.close();
|
|
@@ -47,9 +49,11 @@ export class SseSubscriptionClient {
|
|
|
47
49
|
source.onerror = (e) => {
|
|
48
50
|
console.error('Live Query Event Source Error', e);
|
|
49
51
|
source.close();
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
52
|
+
if (retryCount++ < flags.error500RetryCount) {
|
|
53
|
+
setTimeout(() => {
|
|
54
|
+
createConnection();
|
|
55
|
+
}, 500);
|
|
56
|
+
}
|
|
53
57
|
};
|
|
54
58
|
source.addEventListener('connectionId', async (e) => {
|
|
55
59
|
//@ts-ignore
|
|
@@ -1144,7 +1144,7 @@ class rowHelperBase {
|
|
|
1144
1144
|
}
|
|
1145
1145
|
}
|
|
1146
1146
|
}
|
|
1147
|
-
await promiseAll([...this.fields], (x) => x.load());
|
|
1147
|
+
await promiseAll([...this.fields].filter((f) => !getRelationFieldInfo(f.metadata)), (x) => x.load());
|
|
1148
1148
|
}
|
|
1149
1149
|
}
|
|
1150
1150
|
export class rowHelperImplementation extends rowHelperBase {
|
|
@@ -1,16 +1,11 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export const flags = {
|
|
2
|
+
error500RetryCount: 4,
|
|
3
|
+
};
|
|
2
4
|
//y2 - soft-delete-discussion https://discord.com/channels/975754286384418847/1230386433093533698/1230386433093533698
|
|
3
|
-
//y1 -
|
|
4
|
-
/*y1 - The retry on server error is too wide (error 500, basically any server error) 50 retries is annoying
|
|
5
|
-
- vite doesn't say proxy error, so we can't listen to that to know that we are in dev
|
|
6
|
-
- Our SSE has it's own separate retry every 500 ms that is also problematic
|
|
7
|
-
- when using concurrently - on any server error - the terminal is flooded by the error messages
|
|
8
|
-
//y1 - consider id to also support keyof (id:['company','index']) - had problem with | (keyof Partial<entityType>)[] & `entity`
|
|
9
|
-
//y2 - readonly key: keyof MembersOnly<entityType> & string
|
|
5
|
+
//y1 - live query with count #436
|
|
10
6
|
//y1 TODO - In the esm version of our tutorial - the imports are automatically .ts and not .js in react and not in vue
|
|
11
7
|
//y1 TODO - consider id to also support keyof (id:['company','index']) - had problem with | (keyof Partial<entityType>)[] & `entity`
|
|
12
8
|
//y1 TODO - readonly key: keyof MembersOnly<entityType> & string
|
|
13
|
-
|
|
14
9
|
//y1 - talk about insert / update / delete with relations
|
|
15
10
|
/*
|
|
16
11
|
repo(Order).insert({},{
|
|
@@ -27,16 +22,16 @@ export {};
|
|
|
27
22
|
}))
|
|
28
23
|
*/
|
|
29
24
|
//p1 - consider upsert (where,set)
|
|
30
|
-
//
|
|
25
|
+
//y1 - wait a second to close stream -see pr
|
|
26
|
+
//p1 - Consider enforcing serial operations on JSON database to prevent data loss
|
|
31
27
|
//p1 - prepare the createEntity discussion
|
|
32
28
|
//p1 - return error on connection error
|
|
33
|
-
//p1 - reconsider key typing to be keyof & string
|
|
34
29
|
//p1 - article on displayValue including it's definition for entities that is used in relations
|
|
30
|
+
//p1 - article auth.js with express - played with it, requires type="module" and a few more configurations - https://github.com/noam-honig/express-auth
|
|
35
31
|
//p2 -fix remult admin not to load the html into memory until used
|
|
36
32
|
//y2 - currently for string fields we default for 255 in knex (which is their default) why not just use text (varchar max) - and only use exact length when one is provided?
|
|
37
33
|
//p2 - create foreign key constraints in user code - https://codesandbox.io/p/devbox/fk-validator-tdshcs
|
|
38
34
|
//p2 - admin url1 - pocketbase use /_ for the admin //{allowed?:Allowed,url?:string} also checkout the admin* as it should probably be something else and didn't work in hono
|
|
39
|
-
//p1 - article auth.js with express - played with it, requires type="module" and a few more configurations - https://github.com/noam-honig/express-auth
|
|
40
35
|
//y2 - fix validators cache
|
|
41
36
|
//y2 - should we validate relations
|
|
42
37
|
//y1 - dependency of live query tables live query refresh of view on table update
|
|
@@ -86,6 +81,7 @@ export {};
|
|
|
86
81
|
//p1 - when a tasks table exists in a different schema - we get many errors
|
|
87
82
|
//p1 - live query with include
|
|
88
83
|
//p1 - adjust angular tutorial starter kit for latest angular (as is in tutorial)
|
|
84
|
+
//y2 - Fix problem with promise all in sql expression recurssion - when using PromiseAll in row relation loading, some sql expressions appear is recursion call even if they are not
|
|
89
85
|
//p2 - when subscribe is forbidden - the query still runs after the renew process
|
|
90
86
|
//p2 - 'update tasks set where id = $1
|
|
91
87
|
//p2 - type metadata.key - to keyof entity - based on cwis input
|
package/internals.d.ts
CHANGED
package/internals.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.actionInfo = exports.__updateEntityBasedOnWhere = exports.getEntitySettings = exports.getControllerRef = exports.controllerRefImpl = exports.decorateColumnSettings = exports.getRelationFieldInfo = exports.getRelationInfo = void 0;
|
|
3
|
+
exports.flags = exports.actionInfo = exports.__updateEntityBasedOnWhere = exports.getEntitySettings = exports.getControllerRef = exports.controllerRefImpl = exports.decorateColumnSettings = exports.getRelationFieldInfo = exports.getRelationInfo = void 0;
|
|
4
4
|
var remult_static_js_1 = require("./src/remult-static.js");
|
|
5
5
|
var relationInfoMember_js_1 = require("./src/remult3/relationInfoMember.js");
|
|
6
6
|
Object.defineProperty(exports, "getRelationInfo", { enumerable: true, get: function () { return relationInfoMember_js_1.getRelationInfo; } });
|
|
@@ -14,3 +14,5 @@ Object.defineProperty(exports, "getEntitySettings", { enumerable: true, get: fun
|
|
|
14
14
|
var filter_interfaces_js_1 = require("./src/filter/filter-interfaces.js");
|
|
15
15
|
Object.defineProperty(exports, "__updateEntityBasedOnWhere", { enumerable: true, get: function () { return filter_interfaces_js_1.__updateEntityBasedOnWhere; } });
|
|
16
16
|
exports.actionInfo = remult_static_js_1.remultStatic.actionInfo;
|
|
17
|
+
var remult3_js_1 = require("./src/remult3/remult3.js");
|
|
18
|
+
Object.defineProperty(exports, "flags", { enumerable: true, get: function () { return remult3_js_1.flags; } });
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "remult",
|
|
3
|
-
"version": "0.26.11
|
|
3
|
+
"version": "0.26.11",
|
|
4
4
|
"description": "A CRUD framework for full-stack TypeScript",
|
|
5
5
|
"homepage": "https://remult.dev",
|
|
6
6
|
"repository": {
|
|
@@ -116,6 +116,11 @@
|
|
|
116
116
|
"import": "./esm/remult-sqlite3.js",
|
|
117
117
|
"types": "./remult-sqlite3.d.ts"
|
|
118
118
|
},
|
|
119
|
+
"./remult-turso": {
|
|
120
|
+
"require": "./remult-turso.js",
|
|
121
|
+
"import": "./esm/remult-turso.js",
|
|
122
|
+
"types": "./remult-turso.d.ts"
|
|
123
|
+
},
|
|
119
124
|
"./remult-bun-sqlite": {
|
|
120
125
|
"require": "./remult-bun-sqlite.js",
|
|
121
126
|
"import": "./esm/remult-bun-sqlite.js",
|
|
@@ -45,7 +45,7 @@ export declare function createPostgresDataProvider(options?: {
|
|
|
45
45
|
schema?: string;
|
|
46
46
|
orderByNullsFirst?: boolean;
|
|
47
47
|
}): Promise<SqlDatabase>;
|
|
48
|
-
export declare function preparePostgresQueueStorage(sql: SqlDatabase): Promise<import("../server/
|
|
48
|
+
export declare function preparePostgresQueueStorage(sql: SqlDatabase): Promise<import("../server/remult-api-server.js").EntityQueueStorage>;
|
|
49
49
|
export declare class PostgresSchemaWrapper implements PostgresPool {
|
|
50
50
|
private pool;
|
|
51
51
|
private schema;
|
|
@@ -248,7 +248,7 @@ function preparePostgresQueueStorage(sql) {
|
|
|
248
248
|
case 0:
|
|
249
249
|
c = new context_js_1.Remult();
|
|
250
250
|
c.dataProvider = sql;
|
|
251
|
-
return [4 /*yield*/, Promise.resolve().then(function () { return tslib_1.__importStar(require('../server/
|
|
251
|
+
return [4 /*yield*/, Promise.resolve().then(function () { return tslib_1.__importStar(require('../server/remult-api-server.js')); })];
|
|
252
252
|
case 1:
|
|
253
253
|
JobsInQueueEntity = (_a.sent())
|
|
254
254
|
.JobsInQueueEntity;
|
|
@@ -256,7 +256,7 @@ function preparePostgresQueueStorage(sql) {
|
|
|
256
256
|
return [4 /*yield*/, sql.ensureSchema([e.metadata])];
|
|
257
257
|
case 2:
|
|
258
258
|
_a.sent();
|
|
259
|
-
return [4 /*yield*/, Promise.resolve().then(function () { return tslib_1.__importStar(require('../server/
|
|
259
|
+
return [4 /*yield*/, Promise.resolve().then(function () { return tslib_1.__importStar(require('../server/remult-api-server.js')); })];
|
|
260
260
|
case 3: return [2 /*return*/, new (_a.sent()).EntityQueueStorage(c.repo(JobsInQueueEntity))];
|
|
261
261
|
}
|
|
262
262
|
});
|
package/remult-express.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as express from 'express';
|
|
2
|
-
import type { RemultServer, RemultServerCore, RemultServerOptions } from './server/
|
|
2
|
+
import type { RemultServer, RemultServerCore, RemultServerOptions } from './server/remult-api-server.js';
|
|
3
3
|
export declare function remultExpress(options?: RemultServerOptions<express.Request> & {
|
|
4
4
|
bodyParser?: boolean;
|
|
5
5
|
bodySizeLimit?: string;
|
package/remult-fastify.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { FastifyPluginCallback, FastifyRequest } from 'fastify';
|
|
2
|
-
import type { RemultServerCore, RemultServerOptions, RemultServer } from './server/
|
|
2
|
+
import type { RemultServerCore, RemultServerOptions, RemultServer } from './server/remult-api-server.js';
|
|
3
3
|
export declare function remultFastify(options: RemultServerOptions<FastifyRequest>): RemultFastifyServer;
|
|
4
4
|
export type RemultFastifyServer = FastifyPluginCallback & RemultServerCore<FastifyRequest> & {
|
|
5
5
|
withRemult: RemultServer<FastifyRequest>['withRemultAsync'];
|
package/remult-fresh.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { RemultServerCore, RemultServerOptions } from './server/
|
|
1
|
+
import type { RemultServerCore, RemultServerOptions } from './server/remult-api-server.js';
|
|
2
2
|
export declare function remultFresh(options: RemultServerOptions<FreshRequest>, response: FreshResponse): RemultFresh;
|
|
3
3
|
export interface RemultFresh extends RemultServerCore<FreshRequest> {
|
|
4
4
|
handle(req: FreshRequest, ctx: FreshContext): Promise<any>;
|
package/remult-fresh.js
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.remultFresh = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
|
-
var
|
|
5
|
+
var remult_api_server_js_1 = require("./server/remult-api-server.js");
|
|
6
6
|
function remultFresh(options, response) {
|
|
7
7
|
var _this = this;
|
|
8
|
-
var server = (0,
|
|
8
|
+
var server = (0, remult_api_server_js_1.createRemultServerCore)(options, {
|
|
9
9
|
buildGenericRequestInfo: function (r) { return r; },
|
|
10
10
|
getRequestBody: function (req) { return req.json(); },
|
|
11
11
|
});
|
package/remult-sqlite-core.js
CHANGED
|
@@ -52,21 +52,26 @@ var SqliteCoreDataProvider = /** @class */ (function () {
|
|
|
52
52
|
var err_1;
|
|
53
53
|
return tslib_1.__generator(this, function (_a) {
|
|
54
54
|
switch (_a.label) {
|
|
55
|
-
case 0:
|
|
56
|
-
this.createCommand().execute('Begin Transaction');
|
|
57
|
-
_a.label = 1;
|
|
55
|
+
case 0: return [4 /*yield*/, this.createCommand().execute('Begin Transaction')];
|
|
58
56
|
case 1:
|
|
59
|
-
_a.trys.push([1, 3, , 4]);
|
|
60
|
-
return [4 /*yield*/, action(this)];
|
|
61
|
-
case 2:
|
|
62
57
|
_a.sent();
|
|
63
|
-
|
|
64
|
-
|
|
58
|
+
_a.label = 2;
|
|
59
|
+
case 2:
|
|
60
|
+
_a.trys.push([2, 5, , 7]);
|
|
61
|
+
return [4 /*yield*/, action(this)];
|
|
65
62
|
case 3:
|
|
63
|
+
_a.sent();
|
|
64
|
+
return [4 /*yield*/, this.createCommand().execute('Commit')];
|
|
65
|
+
case 4:
|
|
66
|
+
_a.sent();
|
|
67
|
+
return [3 /*break*/, 7];
|
|
68
|
+
case 5:
|
|
66
69
|
err_1 = _a.sent();
|
|
67
|
-
this.createCommand().execute('Rollback');
|
|
70
|
+
return [4 /*yield*/, this.createCommand().execute('Rollback')];
|
|
71
|
+
case 6:
|
|
72
|
+
_a.sent();
|
|
68
73
|
throw err_1;
|
|
69
|
-
case
|
|
74
|
+
case 7: return [2 /*return*/];
|
|
70
75
|
}
|
|
71
76
|
});
|
|
72
77
|
});
|
package/remult-sqlite3.d.ts
CHANGED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { SqlImplementation } from './index.js';
|
|
2
|
+
import { SqliteCoreDataProvider } from './remult-sqlite-core.js';
|
|
3
|
+
import type { Client } from '@libsql/client';
|
|
4
|
+
export declare class TursoDataProvider extends SqliteCoreDataProvider {
|
|
5
|
+
private client;
|
|
6
|
+
constructor(client: Pick<Client, 'execute'>);
|
|
7
|
+
transaction(action: (sql: SqlImplementation) => Promise<void>): Promise<void>;
|
|
8
|
+
}
|
package/remult-turso.js
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TursoDataProvider = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
var remult_sqlite_core_js_1 = require("./remult-sqlite-core.js");
|
|
6
|
+
var isOfType_js_1 = require("./src/isOfType.js");
|
|
7
|
+
var TursoDataProvider = /** @class */ (function (_super) {
|
|
8
|
+
tslib_1.__extends(TursoDataProvider, _super);
|
|
9
|
+
function TursoDataProvider(client) {
|
|
10
|
+
var _this = _super.call(this, function () { return new TursoCommand(client); }, function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
11
|
+
return tslib_1.__generator(this, function (_a) {
|
|
12
|
+
switch (_a.label) {
|
|
13
|
+
case 0: return [4 /*yield*/, (0, isOfType_js_1.cast)(this.client, 'close').close()];
|
|
14
|
+
case 1:
|
|
15
|
+
_a.sent();
|
|
16
|
+
return [2 /*return*/];
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
}); }, false) || this;
|
|
20
|
+
_this.client = client;
|
|
21
|
+
return _this;
|
|
22
|
+
}
|
|
23
|
+
TursoDataProvider.prototype.transaction = function (action) {
|
|
24
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
25
|
+
var trans, err_1;
|
|
26
|
+
return tslib_1.__generator(this, function (_a) {
|
|
27
|
+
switch (_a.label) {
|
|
28
|
+
case 0: return [4 /*yield*/, (0, isOfType_js_1.cast)(this.client, 'transaction').transaction()];
|
|
29
|
+
case 1:
|
|
30
|
+
trans = _a.sent();
|
|
31
|
+
_a.label = 2;
|
|
32
|
+
case 2:
|
|
33
|
+
_a.trys.push([2, 5, , 7]);
|
|
34
|
+
return [4 /*yield*/, action(new TursoDataProvider(trans))];
|
|
35
|
+
case 3:
|
|
36
|
+
_a.sent();
|
|
37
|
+
return [4 /*yield*/, trans.commit()];
|
|
38
|
+
case 4:
|
|
39
|
+
_a.sent();
|
|
40
|
+
return [3 /*break*/, 7];
|
|
41
|
+
case 5:
|
|
42
|
+
err_1 = _a.sent();
|
|
43
|
+
return [4 /*yield*/, trans.rollback()];
|
|
44
|
+
case 6:
|
|
45
|
+
_a.sent();
|
|
46
|
+
throw err_1;
|
|
47
|
+
case 7: return [2 /*return*/];
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
return TursoDataProvider;
|
|
53
|
+
}(remult_sqlite_core_js_1.SqliteCoreDataProvider));
|
|
54
|
+
exports.TursoDataProvider = TursoDataProvider;
|
|
55
|
+
var TursoCommand = /** @class */ (function () {
|
|
56
|
+
function TursoCommand(db) {
|
|
57
|
+
this.db = db;
|
|
58
|
+
this.values = {};
|
|
59
|
+
this.i = 1;
|
|
60
|
+
}
|
|
61
|
+
TursoCommand.prototype.execute = function (sql) {
|
|
62
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
63
|
+
var _a;
|
|
64
|
+
return tslib_1.__generator(this, function (_b) {
|
|
65
|
+
switch (_b.label) {
|
|
66
|
+
case 0:
|
|
67
|
+
_a = TursoSqlResult.bind;
|
|
68
|
+
return [4 /*yield*/, this.db.execute({
|
|
69
|
+
sql: sql,
|
|
70
|
+
args: this.values,
|
|
71
|
+
})];
|
|
72
|
+
case 1: return [2 /*return*/, new (_a.apply(TursoSqlResult, [void 0, _b.sent()]))()];
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
};
|
|
77
|
+
TursoCommand.prototype.addParameterAndReturnSqlToken = function (val) {
|
|
78
|
+
return this.param(val);
|
|
79
|
+
};
|
|
80
|
+
TursoCommand.prototype.param = function (val) {
|
|
81
|
+
if (val instanceof Date)
|
|
82
|
+
val = val.valueOf();
|
|
83
|
+
if (typeof val === 'boolean')
|
|
84
|
+
val = val ? 1 : 0;
|
|
85
|
+
var key = ':' + this.i++;
|
|
86
|
+
this.values[key.substring(1)] = val;
|
|
87
|
+
return key;
|
|
88
|
+
};
|
|
89
|
+
return TursoCommand;
|
|
90
|
+
}());
|
|
91
|
+
var TursoSqlResult = /** @class */ (function () {
|
|
92
|
+
function TursoSqlResult(result) {
|
|
93
|
+
this.result = result;
|
|
94
|
+
this.rows = result.rows;
|
|
95
|
+
}
|
|
96
|
+
TursoSqlResult.prototype.getColumnKeyInResultForIndexInSelect = function (index) {
|
|
97
|
+
return this.result.columns[index];
|
|
98
|
+
};
|
|
99
|
+
return TursoSqlResult;
|
|
100
|
+
}());
|
package/server/core.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { queuedJobInfo, QueueStorage, GenericRequestInfo, GenericRequestHandler, GenericResponse, GenericRouter, createRemultServerCore, RemultServerOptions, SpecificRoute, RemultServer, } from './
|
|
1
|
+
export { queuedJobInfo, QueueStorage, GenericRequestInfo, GenericRequestHandler, GenericResponse, GenericRouter, createRemultServerCore, RemultServerOptions, SpecificRoute, RemultServer, } from './remult-api-server.js';
|
|
2
2
|
export { JsonEntityFileStorage, JsonFileDataProvider, } from './JsonEntityFileStorage.js';
|
|
3
3
|
export { SseSubscriptionServer } from '../SseSubscriptionServer.js';
|
|
4
4
|
export { DataProviderLiveQueryStorage } from '../live-query/data-provider-live-query-storage.js';
|
package/server/core.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.DataProviderLiveQueryStorage = exports.SseSubscriptionServer = exports.JsonFileDataProvider = exports.JsonEntityFileStorage = exports.createRemultServerCore = void 0;
|
|
4
|
-
var
|
|
5
|
-
Object.defineProperty(exports, "createRemultServerCore", { enumerable: true, get: function () { return
|
|
4
|
+
var remult_api_server_js_1 = require("./remult-api-server.js");
|
|
5
|
+
Object.defineProperty(exports, "createRemultServerCore", { enumerable: true, get: function () { return remult_api_server_js_1.createRemultServerCore; } });
|
|
6
6
|
var JsonEntityFileStorage_js_1 = require("./JsonEntityFileStorage.js");
|
|
7
7
|
Object.defineProperty(exports, "JsonEntityFileStorage", { enumerable: true, get: function () { return JsonEntityFileStorage_js_1.JsonEntityFileStorage; } });
|
|
8
8
|
Object.defineProperty(exports, "JsonFileDataProvider", { enumerable: true, get: function () { return JsonEntityFileStorage_js_1.JsonFileDataProvider; } });
|
package/server/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { RemultServer, RemultServerOptions, ServerCoreOptions } from './
|
|
1
|
+
import type { RemultServer, RemultServerOptions, ServerCoreOptions } from './remult-api-server.js';
|
|
2
2
|
export { SseSubscriptionServer } from '../SseSubscriptionServer.js';
|
|
3
3
|
export { DataProviderLiveQueryStorage } from '../live-query/data-provider-live-query-storage.js';
|
|
4
4
|
export { JsonEntityFileStorage, JsonFileDataProvider, } from './JsonEntityFileStorage.js';
|
|
5
|
-
export { GenericRequestHandler, GenericRequestInfo, GenericResponse, GenericRouter, InitRequestOptions, QueueStorage, RemultServer, RemultServerCore, RemultServerOptions, SpecificRoute, queuedJobInfo, } from './
|
|
5
|
+
export { GenericRequestHandler, GenericRequestInfo, GenericResponse, GenericRouter, InitRequestOptions, QueueStorage, RemultServer, RemultServerCore, RemultServerOptions, SpecificRoute, queuedJobInfo, } from './remult-api-server.js';
|
|
6
6
|
export declare function createRemultServer<RequestType>(options: RemultServerOptions<RequestType>, serverCoreOptions?: ServerCoreOptions<RequestType>): RemultServer<RequestType>;
|
package/server/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createRemultServer = exports.JsonFileDataProvider = exports.JsonEntityFileStorage = exports.DataProviderLiveQueryStorage = exports.SseSubscriptionServer = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
|
-
var
|
|
5
|
+
var remult_api_server_js_1 = require("./remult-api-server.js");
|
|
6
6
|
var initAsyncHooks_js_1 = require("./initAsyncHooks.js");
|
|
7
7
|
var SseSubscriptionServer_js_1 = require("../SseSubscriptionServer.js");
|
|
8
8
|
Object.defineProperty(exports, "SseSubscriptionServer", { enumerable: true, get: function () { return SseSubscriptionServer_js_1.SseSubscriptionServer; } });
|
|
@@ -14,7 +14,7 @@ Object.defineProperty(exports, "JsonFileDataProvider", { enumerable: true, get:
|
|
|
14
14
|
function createRemultServer(options, serverCoreOptions) {
|
|
15
15
|
var _this = this;
|
|
16
16
|
(0, initAsyncHooks_js_1.initAsyncHooks)();
|
|
17
|
-
return (0,
|
|
17
|
+
return (0, remult_api_server_js_1.createRemultServerCore)(options, serverCoreOptions || {
|
|
18
18
|
buildGenericRequestInfo: function (req) { return req; },
|
|
19
19
|
getRequestBody: function (req) { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) {
|
|
20
20
|
return [2 /*return*/, req.body];
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.processHttpException = exports.toPromise = exports.retry = exports.HttpProviderBridgeToRestDataProviderHttpProvider = exports.isExternalHttpProvider = exports.buildRestDataProvider = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
var rest_data_provider_js_1 = require("./data-providers/rest-data-provider.js");
|
|
6
|
+
var remult3_js_1 = require("./remult3/remult3.js");
|
|
6
7
|
function buildRestDataProvider(provider) {
|
|
7
8
|
if (!provider)
|
|
8
9
|
return new rest_data_provider_js_1.RestDataProviderHttpProviderUsingFetch();
|
|
@@ -85,11 +86,11 @@ function retry(what) {
|
|
|
85
86
|
((_c = err_1.message) === null || _c === void 0 ? void 0 : _c.includes('http proxy error')) ||
|
|
86
87
|
((_d = err_1.message) === null || _d === void 0 ? void 0 : _d.startsWith('Gateway Timeout')) ||
|
|
87
88
|
err_1.status == 500) &&
|
|
88
|
-
i++ <
|
|
89
|
+
i++ < remult3_js_1.flags.error500RetryCount)) return [3 /*break*/, 6];
|
|
89
90
|
return [4 /*yield*/, new Promise(function (res, req) {
|
|
90
91
|
setTimeout(function () {
|
|
91
92
|
res({});
|
|
92
|
-
},
|
|
93
|
+
}, 500);
|
|
93
94
|
})];
|
|
94
95
|
case 5:
|
|
95
96
|
_e.sent();
|
|
@@ -229,7 +229,7 @@ var ArrayEntityDataProvider = /** @class */ (function () {
|
|
|
229
229
|
return [2 /*return*/, Promise.resolve(this.translateFromJson(this.rows()[i], names))];
|
|
230
230
|
}
|
|
231
231
|
}
|
|
232
|
-
throw new Error("
|
|
232
|
+
throw new Error("ArrayEntityDataProvider: Couldn't find row with id \"".concat(id, "\" in entity \"").concat(this.entity.key, "\" to update"));
|
|
233
233
|
}
|
|
234
234
|
});
|
|
235
235
|
});
|
|
@@ -249,7 +249,7 @@ var ArrayEntityDataProvider = /** @class */ (function () {
|
|
|
249
249
|
return [2 /*return*/, Promise.resolve()];
|
|
250
250
|
}
|
|
251
251
|
}
|
|
252
|
-
throw new Error("
|
|
252
|
+
throw new Error("ArrayEntityDataProvider: Couldn't find row with id \"".concat(id, "\" in entity \"").concat(this.entity.key, "\" to delete"));
|
|
253
253
|
}
|
|
254
254
|
});
|
|
255
255
|
});
|
|
@@ -167,7 +167,6 @@ var SqlDatabase = /** @class */ (function () {
|
|
|
167
167
|
_a;
|
|
168
168
|
};
|
|
169
169
|
SqlDatabase.filterToRaw = function (repo, condition, sqlCommand, dbNames, wrapIdentifier) {
|
|
170
|
-
if (wrapIdentifier === void 0) { wrapIdentifier = function (x) { return x; }; }
|
|
171
170
|
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
172
171
|
var r, b, _a, _b, _c;
|
|
173
172
|
return tslib_1.__generator(this, function (_d) {
|
|
@@ -5,6 +5,7 @@ var tslib_1 = require("tslib");
|
|
|
5
5
|
var buildRestDataProvider_js_1 = require("../buildRestDataProvider.js");
|
|
6
6
|
var remult_proxy_js_1 = require("../remult-proxy.js");
|
|
7
7
|
var remult_static_js_1 = require("../remult-static.js");
|
|
8
|
+
var remult3_js_1 = require("../remult3/remult3.js");
|
|
8
9
|
var SubscriptionChannel_js_1 = require("./SubscriptionChannel.js");
|
|
9
10
|
var SseSubscriptionClient = /** @class */ (function () {
|
|
10
11
|
function SseSubscriptionClient() {
|
|
@@ -54,6 +55,7 @@ var SseSubscriptionClient = /** @class */ (function () {
|
|
|
54
55
|
var createConnectionPromise = function () {
|
|
55
56
|
return new Promise(function (res) {
|
|
56
57
|
createConnection();
|
|
58
|
+
var retryCount = 0;
|
|
57
59
|
function createConnection() {
|
|
58
60
|
var _this = this;
|
|
59
61
|
if (source)
|
|
@@ -68,9 +70,11 @@ var SseSubscriptionClient = /** @class */ (function () {
|
|
|
68
70
|
source.onerror = function (e) {
|
|
69
71
|
console.error('Live Query Event Source Error', e);
|
|
70
72
|
source.close();
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
73
|
+
if (retryCount++ < remult3_js_1.flags.error500RetryCount) {
|
|
74
|
+
setTimeout(function () {
|
|
75
|
+
createConnection();
|
|
76
|
+
}, 500);
|
|
77
|
+
}
|
|
74
78
|
};
|
|
75
79
|
source.addEventListener('connectionId', function (e) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
76
80
|
var _a, _b, channel, e_1_1;
|
|
@@ -1886,7 +1886,7 @@ var rowHelperBase = /** @class */ (function () {
|
|
|
1886
1886
|
}
|
|
1887
1887
|
finally { if (e_29) throw e_29.error; }
|
|
1888
1888
|
}
|
|
1889
|
-
return [4 /*yield*/, promiseAll(tslib_1.__spreadArray([], tslib_1.__read(this.fields), false), function (x) { return x.load(); })];
|
|
1889
|
+
return [4 /*yield*/, promiseAll(tslib_1.__spreadArray([], tslib_1.__read(this.fields), false).filter(function (f) { return !(0, relationInfoMember_js_1.getRelationFieldInfo)(f.metadata); }), function (x) { return x.load(); })];
|
|
1890
1890
|
case 1:
|
|
1891
1891
|
_d.sent();
|
|
1892
1892
|
return [2 /*return*/];
|
package/src/remult3/remult3.d.ts
CHANGED
|
@@ -676,3 +676,6 @@ export interface ClassDecoratorContextStub<Class extends new (...args: any) => a
|
|
|
676
676
|
addInitializer(initializer: (this: Class) => void): void;
|
|
677
677
|
}
|
|
678
678
|
export type ClassFieldDecorator<entityType, valueType> = (target: any, context: string | ClassFieldDecoratorContextStub<entityType, valueType | undefined>, c?: any) => void;
|
|
679
|
+
export declare const flags: {
|
|
680
|
+
error500RetryCount: number;
|
|
681
|
+
};
|
package/src/remult3/remult3.js
CHANGED
|
@@ -1,17 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.flags = void 0;
|
|
4
|
+
exports.flags = {
|
|
5
|
+
error500RetryCount: 4,
|
|
6
|
+
};
|
|
3
7
|
//y2 - soft-delete-discussion https://discord.com/channels/975754286384418847/1230386433093533698/1230386433093533698
|
|
4
|
-
//y1 -
|
|
5
|
-
/*y1 - The retry on server error is too wide (error 500, basically any server error) 50 retries is annoying
|
|
6
|
-
- vite doesn't say proxy error, so we can't listen to that to know that we are in dev
|
|
7
|
-
- Our SSE has it's own separate retry every 500 ms that is also problematic
|
|
8
|
-
- when using concurrently - on any server error - the terminal is flooded by the error messages
|
|
9
|
-
//y1 - consider id to also support keyof (id:['company','index']) - had problem with | (keyof Partial<entityType>)[] & `entity`
|
|
10
|
-
//y2 - readonly key: keyof MembersOnly<entityType> & string
|
|
8
|
+
//y1 - live query with count #436
|
|
11
9
|
//y1 TODO - In the esm version of our tutorial - the imports are automatically .ts and not .js in react and not in vue
|
|
12
10
|
//y1 TODO - consider id to also support keyof (id:['company','index']) - had problem with | (keyof Partial<entityType>)[] & `entity`
|
|
13
11
|
//y1 TODO - readonly key: keyof MembersOnly<entityType> & string
|
|
14
|
-
|
|
15
12
|
//y1 - talk about insert / update / delete with relations
|
|
16
13
|
/*
|
|
17
14
|
repo(Order).insert({},{
|
|
@@ -28,16 +25,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
28
25
|
}))
|
|
29
26
|
*/
|
|
30
27
|
//p1 - consider upsert (where,set)
|
|
31
|
-
//
|
|
28
|
+
//y1 - wait a second to close stream -see pr
|
|
29
|
+
//p1 - Consider enforcing serial operations on JSON database to prevent data loss
|
|
32
30
|
//p1 - prepare the createEntity discussion
|
|
33
31
|
//p1 - return error on connection error
|
|
34
|
-
//p1 - reconsider key typing to be keyof & string
|
|
35
32
|
//p1 - article on displayValue including it's definition for entities that is used in relations
|
|
33
|
+
//p1 - article auth.js with express - played with it, requires type="module" and a few more configurations - https://github.com/noam-honig/express-auth
|
|
36
34
|
//p2 -fix remult admin not to load the html into memory until used
|
|
37
35
|
//y2 - currently for string fields we default for 255 in knex (which is their default) why not just use text (varchar max) - and only use exact length when one is provided?
|
|
38
36
|
//p2 - create foreign key constraints in user code - https://codesandbox.io/p/devbox/fk-validator-tdshcs
|
|
39
37
|
//p2 - admin url1 - pocketbase use /_ for the admin //{allowed?:Allowed,url?:string} also checkout the admin* as it should probably be something else and didn't work in hono
|
|
40
|
-
//p1 - article auth.js with express - played with it, requires type="module" and a few more configurations - https://github.com/noam-honig/express-auth
|
|
41
38
|
//y2 - fix validators cache
|
|
42
39
|
//y2 - should we validate relations
|
|
43
40
|
//y1 - dependency of live query tables live query refresh of view on table update
|
|
@@ -87,6 +84,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
87
84
|
//p1 - when a tasks table exists in a different schema - we get many errors
|
|
88
85
|
//p1 - live query with include
|
|
89
86
|
//p1 - adjust angular tutorial starter kit for latest angular (as is in tutorial)
|
|
87
|
+
//y2 - Fix problem with promise all in sql expression recurssion - when using PromiseAll in row relation loading, some sql expressions appear is recursion call even if they are not
|
|
90
88
|
//p2 - when subscribe is forbidden - the query still runs after the renew process
|
|
91
89
|
//p2 - 'update tasks set where id = $1
|
|
92
90
|
//p2 - type metadata.key - to keyof entity - based on cwis input
|
|
File without changes
|
|
File without changes
|
|
File without changes
|