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.
@@ -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 remultAdminHtml, { buildEntityInfo } from './remult-admin.js';
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
- async getItem(entityDbName) {
12
- return new Promise(async (resolve, reject) => {
13
- const transaction = (await this.init()).transaction([this.storeName], 'readonly');
14
- const store = transaction.objectStore(this.storeName);
15
- const request = store.get(entityDbName);
16
- request.onerror = (event) => reject(request.error);
17
- request.onsuccess = (event) => {
18
- if (request.result) {
19
- resolve(request.result);
20
- }
21
- else {
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 init() {
29
- if (!this.db) {
30
- this.db = await new Promise((resolve, reject) => {
31
- let db;
32
- const request = indexedDB.open(this.dbName, 1);
33
- request.onerror = (event) => reject(request.error);
34
- request.onsuccess = (event) => {
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
- async clear() {
65
- return new Promise(async (resolve, reject) => {
66
- const transaction = (await this.init()).transaction([this.storeName], 'readwrite');
67
- const store = transaction.objectStore(this.storeName);
68
- const request = store.clear();
69
- request.onerror = (_event) => reject(request.error);
70
- request.onsuccess = (_event) => resolve();
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "remult",
3
- "version": "3.3.6",
3
+ "version": "3.3.8",
4
4
  "description": "A CRUD framework for full-stack TypeScript",
5
5
  "homepage": "https://remult.dev",
6
6
  "repository": {