remult 3.3.6 → 3.3.8
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/server/get-remult-admin-html.js +3 -139
- package/esm/server/remult-admin-html.js +13 -0
- package/esm/server/remult-admin.js +0 -13
- package/esm/server/remult-api-server.js +5 -1
- package/esm/src/data-providers/json-entity-indexed-db-data-provider.js +49 -55
- package/package.json +1 -1
- package/server/get-remult-admin-html.js +1 -1
- package/server/remult-admin-html.d.ts +2 -0
- package/server/remult-admin-html.js +14 -0
- package/server/remult-admin.d.ts +0 -1
- package/server/remult-admin.js +0 -12
- package/server/remult-api-server.js +21 -14
- package/src/data-providers/json-entity-indexed-db-data-provider.js +66 -99
- package/src/remult3/RepositoryImplementation.d.ts +2 -2
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { getHtml } from './get-remult-admin-html.js';
|
|
2
|
+
export default function remultAdminHtml(options) {
|
|
3
|
+
const { head, rootPath, requireAuthToken, disableLiveQuery } = options;
|
|
4
|
+
return getHtml()
|
|
5
|
+
.replace('<!--PLACE_HERE_HEAD-->', head)
|
|
6
|
+
.replace('<!--PLACE_HERE_BODY-->', `<script>
|
|
7
|
+
window.optionsFromServer = ${JSON.stringify({
|
|
8
|
+
rootPath,
|
|
9
|
+
requireAuthToken,
|
|
10
|
+
disableLiveQuery,
|
|
11
|
+
})}
|
|
12
|
+
</script>`);
|
|
13
|
+
}
|
|
@@ -1,20 +1,7 @@
|
|
|
1
1
|
import { getRelationFieldInfo, } from '../src/remult3/relationInfoMember.js';
|
|
2
2
|
import { Filter } from '../src/filter/filter-interfaces.js';
|
|
3
|
-
import { getHtml } from './get-remult-admin-html.js';
|
|
4
3
|
import { getValueList } from '../src/remult3/RepositoryImplementation.js';
|
|
5
4
|
import { InputTypes } from '../inputTypes.js';
|
|
6
|
-
export default function remultAdminHtml(options) {
|
|
7
|
-
const { head, rootPath, requireAuthToken, disableLiveQuery } = options;
|
|
8
|
-
return getHtml()
|
|
9
|
-
.replace('<!--PLACE_HERE_HEAD-->', head)
|
|
10
|
-
.replace('<!--PLACE_HERE_BODY-->', `<script>
|
|
11
|
-
window.optionsFromServer = ${JSON.stringify({
|
|
12
|
-
rootPath,
|
|
13
|
-
requireAuthToken,
|
|
14
|
-
disableLiveQuery,
|
|
15
|
-
})}
|
|
16
|
-
</script>`);
|
|
17
|
-
}
|
|
18
5
|
export function buildEntityInfo(options) {
|
|
19
6
|
const entities = [];
|
|
20
7
|
for (const metadata of options.entities.map((e) => options.remult.repo(e).metadata)) {
|
|
@@ -11,7 +11,7 @@ import { getEntityKey } from '../src/remult3/getEntityRef.js';
|
|
|
11
11
|
import { Action, classBackendMethodsArray } from '../src/server-action.js';
|
|
12
12
|
import { serverActionField } from '../src/server-action-info.js';
|
|
13
13
|
import { remultStatic } from '../src/remult-static.js';
|
|
14
|
-
import
|
|
14
|
+
import { buildEntityInfo } from './remult-admin.js';
|
|
15
15
|
import { isOfType } from '../src/isOfType.js';
|
|
16
16
|
import { initDataProviderOrJson } from './initDataProviderOrJson.js';
|
|
17
17
|
import { modulesFlatAndOrdered } from './module.js';
|
|
@@ -246,6 +246,10 @@ export class RemultServerImplementation {
|
|
|
246
246
|
disableLiveQuery =
|
|
247
247
|
this.options.admin.disableLiveQuery ?? disableLiveQuery;
|
|
248
248
|
}
|
|
249
|
+
// Lazy-load the ~1.4MB admin HTML module only when the admin
|
|
250
|
+
// page is actually requested, so it is never pulled into the
|
|
251
|
+
// bundle of apps that don't serve the admin UI.
|
|
252
|
+
const { default: remultAdminHtml } = await import('./remult-admin-html.js');
|
|
249
253
|
origResponse.send(remultAdminHtml({
|
|
250
254
|
rootPath: this.options.rootPath ?? '/api',
|
|
251
255
|
head,
|
|
@@ -8,66 +8,60 @@ export class JsonEntityIndexedDbStorage {
|
|
|
8
8
|
supportsRawJson = true;
|
|
9
9
|
//@internal
|
|
10
10
|
db;
|
|
11
|
-
|
|
12
|
-
return
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
resolve(null);
|
|
23
|
-
}
|
|
24
|
-
};
|
|
25
|
-
});
|
|
11
|
+
getItem(entityDbName) {
|
|
12
|
+
return this.run('readonly', (s) => s.get(entityDbName));
|
|
13
|
+
}
|
|
14
|
+
setItem(entityDbName, json) {
|
|
15
|
+
return this.run('readwrite', (s) => s.put(json, entityDbName));
|
|
16
|
+
}
|
|
17
|
+
removeItem(entityDbName) {
|
|
18
|
+
return this.run('readwrite', (s) => s.delete(entityDbName));
|
|
19
|
+
}
|
|
20
|
+
clear() {
|
|
21
|
+
return this.run('readwrite', (s) => s.clear());
|
|
26
22
|
}
|
|
27
23
|
//@internal
|
|
28
|
-
async
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
const request =
|
|
33
|
-
request.onerror = (
|
|
34
|
-
request.onsuccess = (
|
|
35
|
-
db = request.result;
|
|
36
|
-
resolve(db);
|
|
37
|
-
};
|
|
38
|
-
request.onupgradeneeded = (event) => {
|
|
39
|
-
db = request.result;
|
|
40
|
-
db.createObjectStore(this.storeName);
|
|
41
|
-
};
|
|
24
|
+
async run(mode, op) {
|
|
25
|
+
const attempt = async () => {
|
|
26
|
+
const db = await this.init();
|
|
27
|
+
return new Promise((resolve, reject) => {
|
|
28
|
+
const request = op(db.transaction([this.storeName], mode).objectStore(this.storeName));
|
|
29
|
+
request.onerror = () => reject(request.error);
|
|
30
|
+
request.onsuccess = () => resolve(request.result ?? null);
|
|
42
31
|
});
|
|
32
|
+
};
|
|
33
|
+
try {
|
|
34
|
+
return await attempt();
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
if (err?.name !== 'InvalidStateError')
|
|
38
|
+
throw err;
|
|
39
|
+
this.db = undefined;
|
|
40
|
+
return await attempt();
|
|
43
41
|
}
|
|
44
|
-
return this.db;
|
|
45
|
-
}
|
|
46
|
-
async setItem(entityDbName, json) {
|
|
47
|
-
return new Promise(async (resolve, reject) => {
|
|
48
|
-
const transaction = (await this.init()).transaction([this.storeName], 'readwrite');
|
|
49
|
-
const store = transaction.objectStore(this.storeName);
|
|
50
|
-
const request = store.put(json, entityDbName);
|
|
51
|
-
request.onerror = (event) => reject(request.error);
|
|
52
|
-
request.onsuccess = (event) => resolve();
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
async removeItem(entityDbName) {
|
|
56
|
-
return new Promise(async (resolve, reject) => {
|
|
57
|
-
const transaction = (await this.init()).transaction([this.storeName], 'readwrite');
|
|
58
|
-
const store = transaction.objectStore(this.storeName);
|
|
59
|
-
const request = store.delete(entityDbName);
|
|
60
|
-
request.onerror = (_event) => reject(request.error);
|
|
61
|
-
request.onsuccess = (_event) => resolve();
|
|
62
|
-
});
|
|
63
42
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
request
|
|
70
|
-
request.
|
|
43
|
+
//@internal
|
|
44
|
+
async init() {
|
|
45
|
+
if (this.db)
|
|
46
|
+
return this.db;
|
|
47
|
+
this.db = await new Promise((resolve, reject) => {
|
|
48
|
+
const request = indexedDB.open(this.dbName, 1);
|
|
49
|
+
request.onerror = () => reject(request.error);
|
|
50
|
+
request.onupgradeneeded = () => request.result.createObjectStore(this.storeName);
|
|
51
|
+
request.onsuccess = () => {
|
|
52
|
+
const db = request.result;
|
|
53
|
+
const forget = () => {
|
|
54
|
+
if (this.db === db)
|
|
55
|
+
this.db = undefined;
|
|
56
|
+
};
|
|
57
|
+
db.onclose = forget;
|
|
58
|
+
db.onversionchange = () => {
|
|
59
|
+
db.close();
|
|
60
|
+
forget();
|
|
61
|
+
};
|
|
62
|
+
resolve(db);
|
|
63
|
+
};
|
|
71
64
|
});
|
|
65
|
+
return this.db;
|
|
72
66
|
}
|
|
73
67
|
}
|