@iamjulianacosta/mobx-data 1.0.1 → 1.1.1

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.
Files changed (61) hide show
  1. package/dist/{JsonApiSerializer-CKB02AgP.cjs → JsonApiSerializer-Bc4iQB0d.cjs} +2 -2
  2. package/dist/{JsonApiSerializer-CKB02AgP.cjs.map → JsonApiSerializer-Bc4iQB0d.cjs.map} +1 -1
  3. package/dist/{JsonApiSerializer-CC5HXp4b.js → JsonApiSerializer-wndq5a1n.js} +2 -2
  4. package/dist/{JsonApiSerializer-CC5HXp4b.js.map → JsonApiSerializer-wndq5a1n.js.map} +1 -1
  5. package/dist/{MemoryAdapter-D1cTyydm.cjs → MemoryAdapter-BTK2D64s.cjs} +2 -2
  6. package/dist/{MemoryAdapter-D1cTyydm.cjs.map → MemoryAdapter-BTK2D64s.cjs.map} +1 -1
  7. package/dist/{MemoryAdapter-Bx1e7ndV.js → MemoryAdapter-ni25N4H0.js} +2 -2
  8. package/dist/{MemoryAdapter-Bx1e7ndV.js.map → MemoryAdapter-ni25N4H0.js.map} +1 -1
  9. package/dist/{ODataAdapter-C4IHK4BK.js → ODataAdapter-DAja_jKM.js} +2 -2
  10. package/dist/{ODataAdapter-C4IHK4BK.js.map → ODataAdapter-DAja_jKM.js.map} +1 -1
  11. package/dist/{ODataAdapter-DyyF1sdA.cjs → ODataAdapter-lMifLyLD.cjs} +2 -2
  12. package/dist/{ODataAdapter-DyyF1sdA.cjs.map → ODataAdapter-lMifLyLD.cjs.map} +1 -1
  13. package/dist/RestAdapter-1V94stW-.cjs +2 -0
  14. package/dist/{RestAdapter-CJOwTsKK.cjs.map → RestAdapter-1V94stW-.cjs.map} +1 -1
  15. package/dist/{RestAdapter-B4aRvs4m.js → RestAdapter-CGWqOR_G.js} +32 -23
  16. package/dist/{RestAdapter-B4aRvs4m.js.map → RestAdapter-CGWqOR_G.js.map} +1 -1
  17. package/dist/Store-KvjmBTQ9.cjs +2 -0
  18. package/dist/Store-KvjmBTQ9.cjs.map +1 -0
  19. package/dist/{Store-CZ7Z-Nme.js → Store-mvrDLQEZ.js} +195 -150
  20. package/dist/Store-mvrDLQEZ.js.map +1 -0
  21. package/dist/adapter/RestAdapter.d.ts.map +1 -1
  22. package/dist/adapter/index.cjs +1 -1
  23. package/dist/adapter/index.js +2 -2
  24. package/dist/cache/IndexedDBCache.d.ts +22 -0
  25. package/dist/cache/IndexedDBCache.d.ts.map +1 -0
  26. package/dist/cache/cache-utils.d.ts +4 -0
  27. package/dist/cache/cache-utils.d.ts.map +1 -0
  28. package/dist/cache/index.d.ts +4 -0
  29. package/dist/cache/index.d.ts.map +1 -0
  30. package/dist/cache/types.d.ts +25 -0
  31. package/dist/cache/types.d.ts.map +1 -0
  32. package/dist/cache-utils-2lswvJ87.cjs +2 -0
  33. package/dist/cache-utils-2lswvJ87.cjs.map +1 -0
  34. package/dist/cache-utils-38Dqu4Qf.js +39 -0
  35. package/dist/cache-utils-38Dqu4Qf.js.map +1 -0
  36. package/dist/index.cjs +1 -1
  37. package/dist/index.cjs.map +1 -1
  38. package/dist/index.d.ts +1 -0
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +144 -49
  41. package/dist/index.js.map +1 -1
  42. package/dist/json-api/index.cjs +1 -1
  43. package/dist/json-api/index.js +1 -1
  44. package/dist/odata/index.cjs +1 -1
  45. package/dist/odata/index.js +1 -1
  46. package/dist/store/Store.d.ts +6 -0
  47. package/dist/store/Store.d.ts.map +1 -1
  48. package/dist/store/index.cjs +1 -1
  49. package/dist/store/index.js +1 -1
  50. package/package.json +2 -1
  51. package/src/adapter/RestAdapter.ts +12 -2
  52. package/src/cache/IndexedDBCache.ts +171 -0
  53. package/src/cache/cache-utils.ts +57 -0
  54. package/src/cache/index.ts +12 -0
  55. package/src/cache/types.ts +33 -0
  56. package/src/index.ts +1 -0
  57. package/src/store/Store.ts +100 -0
  58. package/dist/RestAdapter-CJOwTsKK.cjs +0 -2
  59. package/dist/Store-BdwMrbDi.cjs +0 -2
  60. package/dist/Store-BdwMrbDi.cjs.map +0 -1
  61. package/dist/Store-CZ7Z-Nme.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,52 +1,147 @@
1
- import { A as e, M as s, R as o } from "./types-C9NB2gRj.js";
2
- import { a as n, b as p, h as A } from "./decorators-Zr35qr6A.js";
3
- import { S as f } from "./SchemaService-DZwkFgZu.js";
4
- import { A as d, a as M, E as i, M as x, b as E, S as T, c as R } from "./relationships-BEXANmWg.js";
5
- import { A as l, I as y, R as h, S as _ } from "./Store-CZ7Z-Nme.js";
6
- import { A as B, R as I } from "./RestAdapter-B4aRvs4m.js";
7
- import { M as g } from "./MemoryAdapter-Bx1e7ndV.js";
8
- import { S as D } from "./Serializer-FxJbsZ50.js";
9
- import { E as N, J as O, R as u } from "./EmbeddedRecordsMixin-VoHluHCT.js";
10
- import { B as Y, a as C, D as F, N as L, S as P } from "./date-Bj4O2W1F.js";
11
- import { C as v, F as U, R as j } from "./CacheHandler-BTU_rYkv.js";
12
- import { J as w, a as G } from "./JsonApiSerializer-CC5HXp4b.js";
13
- import { O as V } from "./ODataAdapter-C4IHK4BK.js";
1
+ import { A as T, M as b, R as _ } from "./types-C9NB2gRj.js";
2
+ import { a as E, b as R, h as w } from "./decorators-Zr35qr6A.js";
3
+ import { S as P } from "./SchemaService-DZwkFgZu.js";
4
+ import { A as g, a as L, E as q, M as D, b as H, S as K, c as O } from "./relationships-BEXANmWg.js";
5
+ import { A as I, I as B, R as J, S as z } from "./Store-mvrDLQEZ.js";
6
+ import { A as k, R as Y } from "./RestAdapter-CGWqOR_G.js";
7
+ import { M as C } from "./MemoryAdapter-ni25N4H0.js";
8
+ import { S as $ } from "./Serializer-FxJbsZ50.js";
9
+ import { E as G, J as Q, R as W } from "./EmbeddedRecordsMixin-VoHluHCT.js";
10
+ import { B as Z, a as ee, D as te, N as se, S as ae } from "./date-Bj4O2W1F.js";
11
+ import { C as oe, F as ne, R as ce } from "./CacheHandler-BTU_rYkv.js";
12
+ import { J as de, a as ue } from "./JsonApiSerializer-wndq5a1n.js";
13
+ import { O as pe } from "./ODataAdapter-DAja_jKM.js";
14
+ import { R as me, a as Ae, e as fe, p as ye } from "./cache-utils-38Dqu4Qf.js";
15
+ const o = "cache-entries", h = 1, m = 36e5;
16
+ class u {
17
+ constructor(e = {}) {
18
+ this._database = null, this._openPromise = null, this._databaseName = e.databaseName ?? "mobx-data-cache", this._defaultTTL = e.defaultTTL ?? m;
19
+ }
20
+ get defaultTTL() {
21
+ return this._defaultTTL;
22
+ }
23
+ async open() {
24
+ return this._database ? this._database : this._openPromise ? this._openPromise : (this._openPromise = new Promise((e, s) => {
25
+ const t = indexedDB.open(this._databaseName, h);
26
+ t.onupgradeneeded = () => {
27
+ const a = t.result;
28
+ if (!a.objectStoreNames.contains(o)) {
29
+ const n = a.createObjectStore(o, {
30
+ keyPath: "key"
31
+ });
32
+ n.createIndex("modelName", "modelName", { unique: !1 }), n.createIndex("expiresAt", "expiresAt", { unique: !1 });
33
+ }
34
+ }, t.onsuccess = () => {
35
+ this._database = t.result, e(this._database);
36
+ }, t.onerror = () => {
37
+ this._openPromise = null, s(t.error);
38
+ };
39
+ }), this._openPromise);
40
+ }
41
+ static cacheKey(e, s) {
42
+ return `${e}:${s}`;
43
+ }
44
+ async get(e, s) {
45
+ const t = await this.open();
46
+ return new Promise((a, n) => {
47
+ const r = t.transaction(o, "readonly").objectStore(o).get(u.cacheKey(e, s));
48
+ r.onsuccess = () => {
49
+ const c = r.result;
50
+ if (!c) {
51
+ a(null);
52
+ return;
53
+ }
54
+ if (Date.now() > c.expiresAt) {
55
+ this.invalidate(e, s), a(null);
56
+ return;
57
+ }
58
+ a(c);
59
+ }, r.onerror = () => n(r.error);
60
+ });
61
+ }
62
+ async set(e, s, t, a = {}) {
63
+ const n = await this.open(), d = Date.now(), i = a.ttl ?? this._defaultTTL, r = {
64
+ key: u.cacheKey(e, s),
65
+ modelName: e,
66
+ id: s,
67
+ attributes: t,
68
+ relationships: a.relationships,
69
+ cachedAt: d,
70
+ expiresAt: d + i
71
+ };
72
+ return new Promise((c, p) => {
73
+ const l = n.transaction(o, "readwrite").objectStore(o).put(r);
74
+ l.onsuccess = () => c(), l.onerror = () => p(l.error);
75
+ });
76
+ }
77
+ async has(e, s) {
78
+ return await this.get(e, s) !== null;
79
+ }
80
+ async invalidate(e, s) {
81
+ const t = await this.open();
82
+ return new Promise((a, n) => {
83
+ const r = t.transaction(o, "readwrite").objectStore(o).delete(u.cacheKey(e, s));
84
+ r.onsuccess = () => a(), r.onerror = () => n(r.error);
85
+ });
86
+ }
87
+ async invalidateAll(e) {
88
+ const s = await this.open();
89
+ return e ? new Promise((t, a) => {
90
+ const r = s.transaction(o, "readwrite").objectStore(o).index("modelName").openCursor(IDBKeyRange.only(e));
91
+ r.onsuccess = () => {
92
+ const c = r.result;
93
+ c ? (c.delete(), c.continue()) : t();
94
+ }, r.onerror = () => a(r.error);
95
+ }) : new Promise((t, a) => {
96
+ const i = s.transaction(o, "readwrite").objectStore(o).clear();
97
+ i.onsuccess = () => t(), i.onerror = () => a(i.error);
98
+ });
99
+ }
100
+ async close() {
101
+ this._database && (this._database.close(), this._database = null, this._openPromise = null);
102
+ }
103
+ }
14
104
  export {
15
- e as ATTRIBUTES_META_KEY,
16
- B as Adapter,
17
- l as AdapterPopulatedRecordArray,
18
- d as AsyncBelongsTo,
19
- M as AsyncHasMany,
20
- Y as BaseTransform,
21
- C as BooleanTransform,
22
- v as CacheHandler,
23
- F as DateTransform,
24
- N as EmbeddedRecordsMixin,
25
- i as Errors,
26
- U as FetchHandler,
27
- y as IdentityMap,
28
- w as JsonApiAdapter,
29
- G as JsonApiSerializer,
30
- O as JsonSerializer,
31
- s as MODEL_NAME_META_KEY,
32
- x as ManyArray,
33
- g as MemoryAdapter,
34
- E as Model,
35
- L as NumberTransform,
36
- V as ODataAdapter,
37
- o as RELATIONSHIPS_META_KEY,
38
- h as RecordArray,
39
- j as RequestManager,
40
- I as RestAdapter,
41
- u as RestSerializer,
42
- f as SchemaService,
43
- D as Serializer,
44
- T as Snapshot,
45
- R as StateMachine,
46
- _ as Store,
47
- P as StringTransform,
48
- n as attr,
49
- p as belongsTo,
50
- A as hasMany
105
+ T as ATTRIBUTES_META_KEY,
106
+ k as Adapter,
107
+ I as AdapterPopulatedRecordArray,
108
+ g as AsyncBelongsTo,
109
+ L as AsyncHasMany,
110
+ Z as BaseTransform,
111
+ ee as BooleanTransform,
112
+ oe as CacheHandler,
113
+ te as DateTransform,
114
+ G as EmbeddedRecordsMixin,
115
+ q as Errors,
116
+ ne as FetchHandler,
117
+ B as IdentityMap,
118
+ u as IndexedDBCache,
119
+ de as JsonApiAdapter,
120
+ ue as JsonApiSerializer,
121
+ Q as JsonSerializer,
122
+ b as MODEL_NAME_META_KEY,
123
+ D as ManyArray,
124
+ C as MemoryAdapter,
125
+ H as Model,
126
+ se as NumberTransform,
127
+ pe as ODataAdapter,
128
+ _ as RELATIONSHIPS_META_KEY,
129
+ me as RESPONSE_HEADERS,
130
+ J as RecordArray,
131
+ ce as RequestManager,
132
+ Y as RestAdapter,
133
+ W as RestSerializer,
134
+ P as SchemaService,
135
+ $ as Serializer,
136
+ K as Snapshot,
137
+ O as StateMachine,
138
+ z as Store,
139
+ ae as StringTransform,
140
+ Ae as attachResponseHeaders,
141
+ E as attr,
142
+ R as belongsTo,
143
+ fe as extractResponseHeaders,
144
+ w as hasMany,
145
+ ye as parseCacheTTLFromHeaders
51
146
  };
52
147
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../src/cache/IndexedDBCache.ts"],"sourcesContent":["import type { RelationshipRef } from '@mobx-data/model';\nimport type { CacheEntryData, IndexedDBCacheOptions, CacheLike } from './types.js';\n\nconst STORE_NAME = 'cache-entries';\nconst DATABASE_VERSION = 1;\nconst DEFAULT_TTL = 3_600_000;\n\ninterface StoredEntry extends CacheEntryData {\n key: string;\n}\n\nexport class IndexedDBCache implements CacheLike {\n private _databaseName: string;\n\n private _defaultTTL: number;\n\n private _database: IDBDatabase | null = null;\n\n private _openPromise: Promise<IDBDatabase> | null = null;\n\n constructor(options: IndexedDBCacheOptions = {}) {\n this._databaseName = options.databaseName ?? 'mobx-data-cache';\n this._defaultTTL = options.defaultTTL ?? DEFAULT_TTL;\n }\n\n get defaultTTL(): number {\n return this._defaultTTL;\n }\n\n private async open(): Promise<IDBDatabase> {\n if (this._database) {\n return this._database;\n }\n if (this._openPromise) {\n return this._openPromise;\n }\n\n this._openPromise = new Promise<IDBDatabase>((resolve, reject) => {\n const request = indexedDB.open(this._databaseName, DATABASE_VERSION);\n request.onupgradeneeded = () => {\n const database = request.result;\n if (!database.objectStoreNames.contains(STORE_NAME)) {\n const store = database.createObjectStore(STORE_NAME, {\n keyPath: 'key',\n });\n store.createIndex('modelName', 'modelName', { unique: false });\n store.createIndex('expiresAt', 'expiresAt', { unique: false });\n }\n };\n request.onsuccess = () => {\n this._database = request.result;\n resolve(this._database);\n };\n request.onerror = () => {\n this._openPromise = null;\n reject(request.error);\n };\n });\n return this._openPromise;\n }\n\n static cacheKey(modelName: string, id: string): string {\n return `${modelName}:${id}`;\n }\n\n async get(modelName: string, id: string): Promise<CacheEntryData | null> {\n const database = await this.open();\n return new Promise((resolve, reject) => {\n const transaction = database.transaction(STORE_NAME, 'readonly');\n const store = transaction.objectStore(STORE_NAME);\n const request = store.get(IndexedDBCache.cacheKey(modelName, id));\n request.onsuccess = () => {\n const entry = request.result as StoredEntry | undefined;\n if (!entry) {\n resolve(null);\n return;\n }\n if (Date.now() > entry.expiresAt) {\n this.invalidate(modelName, id);\n resolve(null);\n return;\n }\n resolve(entry);\n };\n request.onerror = () => reject(request.error);\n });\n }\n\n async set(\n modelName: string,\n id: string,\n attributes: Record<string, unknown>,\n options: {\n relationships?: Record<string, RelationshipRef>;\n ttl?: number;\n } = {},\n ): Promise<void> {\n const database = await this.open();\n const now = Date.now();\n const ttl = options.ttl ?? this._defaultTTL;\n const entry: StoredEntry = {\n key: IndexedDBCache.cacheKey(modelName, id),\n modelName,\n id,\n attributes,\n relationships: options.relationships,\n cachedAt: now,\n expiresAt: now + ttl,\n };\n return new Promise((resolve, reject) => {\n const transaction = database.transaction(STORE_NAME, 'readwrite');\n const store = transaction.objectStore(STORE_NAME);\n const request = store.put(entry);\n request.onsuccess = () => resolve();\n request.onerror = () => reject(request.error);\n });\n }\n\n async has(modelName: string, id: string): Promise<boolean> {\n const entry = await this.get(modelName, id);\n return entry !== null;\n }\n\n async invalidate(modelName: string, id: string): Promise<void> {\n const database = await this.open();\n return new Promise((resolve, reject) => {\n const transaction = database.transaction(STORE_NAME, 'readwrite');\n const store = transaction.objectStore(STORE_NAME);\n const request = store.delete(IndexedDBCache.cacheKey(modelName, id));\n request.onsuccess = () => resolve();\n request.onerror = () => reject(request.error);\n });\n }\n\n async invalidateAll(modelName?: string): Promise<void> {\n const database = await this.open();\n if (!modelName) {\n return new Promise((resolve, reject) => {\n const transaction = database.transaction(STORE_NAME, 'readwrite');\n const store = transaction.objectStore(STORE_NAME);\n const request = store.clear();\n request.onsuccess = () => resolve();\n request.onerror = () => reject(request.error);\n });\n }\n return new Promise((resolve, reject) => {\n const transaction = database.transaction(STORE_NAME, 'readwrite');\n const store = transaction.objectStore(STORE_NAME);\n const index = store.index('modelName');\n const cursorRequest = index.openCursor(IDBKeyRange.only(modelName));\n cursorRequest.onsuccess = () => {\n const cursor = cursorRequest.result;\n if (cursor) {\n cursor.delete();\n cursor.continue();\n } else {\n resolve();\n }\n };\n cursorRequest.onerror = () => reject(cursorRequest.error);\n });\n }\n\n async close(): Promise<void> {\n if (this._database) {\n this._database.close();\n this._database = null;\n this._openPromise = null;\n }\n }\n}\n"],"names":["STORE_NAME","DATABASE_VERSION","DEFAULT_TTL","IndexedDBCache","options","resolve","reject","request","database","store","modelName","id","entry","attributes","now","ttl","cursorRequest","cursor"],"mappings":";;;;;;;;;;;;;;AAGA,MAAMA,IAAa,iBACbC,IAAmB,GACnBC,IAAc;AAMb,MAAMC,EAAoC;AAAA,EAS/C,YAAYC,IAAiC,IAAI;AAJjD,SAAQ,YAAgC,MAExC,KAAQ,eAA4C,MAGlD,KAAK,gBAAgBA,EAAQ,gBAAgB,mBAC7C,KAAK,cAAcA,EAAQ,cAAcF;AAAA,EAC3C;AAAA,EAEA,IAAI,aAAqB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,OAA6B;AACzC,WAAI,KAAK,YACA,KAAK,YAEV,KAAK,eACA,KAAK,gBAGd,KAAK,eAAe,IAAI,QAAqB,CAACG,GAASC,MAAW;AAChE,YAAMC,IAAU,UAAU,KAAK,KAAK,eAAeN,CAAgB;AACnE,MAAAM,EAAQ,kBAAkB,MAAM;AAC9B,cAAMC,IAAWD,EAAQ;AACzB,YAAI,CAACC,EAAS,iBAAiB,SAASR,CAAU,GAAG;AACnD,gBAAMS,IAAQD,EAAS,kBAAkBR,GAAY;AAAA,YACnD,SAAS;AAAA,UAAA,CACV;AACD,UAAAS,EAAM,YAAY,aAAa,aAAa,EAAE,QAAQ,IAAO,GAC7DA,EAAM,YAAY,aAAa,aAAa,EAAE,QAAQ,IAAO;AAAA,QAC/D;AAAA,MACF,GACAF,EAAQ,YAAY,MAAM;AACxB,aAAK,YAAYA,EAAQ,QACzBF,EAAQ,KAAK,SAAS;AAAA,MACxB,GACAE,EAAQ,UAAU,MAAM;AACtB,aAAK,eAAe,MACpBD,EAAOC,EAAQ,KAAK;AAAA,MACtB;AAAA,IACF,CAAC,GACM,KAAK;AAAA,EACd;AAAA,EAEA,OAAO,SAASG,GAAmBC,GAAoB;AACrD,WAAO,GAAGD,CAAS,IAAIC,CAAE;AAAA,EAC3B;AAAA,EAEA,MAAM,IAAID,GAAmBC,GAA4C;AACvE,UAAMH,IAAW,MAAM,KAAK,KAAA;AAC5B,WAAO,IAAI,QAAQ,CAACH,GAASC,MAAW;AAGtC,YAAMC,IAFcC,EAAS,YAAYR,GAAY,UAAU,EACrC,YAAYA,CAAU,EAC1B,IAAIG,EAAe,SAASO,GAAWC,CAAE,CAAC;AAChE,MAAAJ,EAAQ,YAAY,MAAM;AACxB,cAAMK,IAAQL,EAAQ;AACtB,YAAI,CAACK,GAAO;AACV,UAAAP,EAAQ,IAAI;AACZ;AAAA,QACF;AACA,YAAI,KAAK,QAAQO,EAAM,WAAW;AAChC,eAAK,WAAWF,GAAWC,CAAE,GAC7BN,EAAQ,IAAI;AACZ;AAAA,QACF;AACA,QAAAA,EAAQO,CAAK;AAAA,MACf,GACAL,EAAQ,UAAU,MAAMD,EAAOC,EAAQ,KAAK;AAAA,IAC9C,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,IACJG,GACAC,GACAE,GACAT,IAGI,CAAA,GACW;AACf,UAAMI,IAAW,MAAM,KAAK,KAAA,GACtBM,IAAM,KAAK,IAAA,GACXC,IAAMX,EAAQ,OAAO,KAAK,aAC1BQ,IAAqB;AAAA,MACzB,KAAKT,EAAe,SAASO,GAAWC,CAAE;AAAA,MAC1C,WAAAD;AAAA,MACA,IAAAC;AAAA,MACA,YAAAE;AAAA,MACA,eAAeT,EAAQ;AAAA,MACvB,UAAUU;AAAA,MACV,WAAWA,IAAMC;AAAA,IAAA;AAEnB,WAAO,IAAI,QAAQ,CAACV,GAASC,MAAW;AAGtC,YAAMC,IAFcC,EAAS,YAAYR,GAAY,WAAW,EACtC,YAAYA,CAAU,EAC1B,IAAIY,CAAK;AAC/B,MAAAL,EAAQ,YAAY,MAAMF,EAAA,GAC1BE,EAAQ,UAAU,MAAMD,EAAOC,EAAQ,KAAK;AAAA,IAC9C,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,IAAIG,GAAmBC,GAA8B;AAEzD,WADc,MAAM,KAAK,IAAID,GAAWC,CAAE,MACzB;AAAA,EACnB;AAAA,EAEA,MAAM,WAAWD,GAAmBC,GAA2B;AAC7D,UAAMH,IAAW,MAAM,KAAK,KAAA;AAC5B,WAAO,IAAI,QAAQ,CAACH,GAASC,MAAW;AAGtC,YAAMC,IAFcC,EAAS,YAAYR,GAAY,WAAW,EACtC,YAAYA,CAAU,EAC1B,OAAOG,EAAe,SAASO,GAAWC,CAAE,CAAC;AACnE,MAAAJ,EAAQ,YAAY,MAAMF,EAAA,GAC1BE,EAAQ,UAAU,MAAMD,EAAOC,EAAQ,KAAK;AAAA,IAC9C,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,cAAcG,GAAmC;AACrD,UAAMF,IAAW,MAAM,KAAK,KAAA;AAC5B,WAAKE,IASE,IAAI,QAAQ,CAACL,GAASC,MAAW;AAItC,YAAMU,IAHcR,EAAS,YAAYR,GAAY,WAAW,EACtC,YAAYA,CAAU,EAC5B,MAAM,WAAW,EACT,WAAW,YAAY,KAAKU,CAAS,CAAC;AAClE,MAAAM,EAAc,YAAY,MAAM;AAC9B,cAAMC,IAASD,EAAc;AAC7B,QAAIC,KACFA,EAAO,OAAA,GACPA,EAAO,SAAA,KAEPZ,EAAA;AAAA,MAEJ,GACAW,EAAc,UAAU,MAAMV,EAAOU,EAAc,KAAK;AAAA,IAC1D,CAAC,IAvBQ,IAAI,QAAQ,CAACX,GAASC,MAAW;AAGtC,YAAMC,IAFcC,EAAS,YAAYR,GAAY,WAAW,EACtC,YAAYA,CAAU,EAC1B,MAAA;AACtB,MAAAO,EAAQ,YAAY,MAAMF,EAAA,GAC1BE,EAAQ,UAAU,MAAMD,EAAOC,EAAQ,KAAK;AAAA,IAC9C,CAAC;AAAA,EAkBL;AAAA,EAEA,MAAM,QAAuB;AAC3B,IAAI,KAAK,cACP,KAAK,UAAU,MAAA,GACf,KAAK,YAAY,MACjB,KAAK,eAAe;AAAA,EAExB;AACF;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../JsonApiSerializer-CKB02AgP.cjs");Object.defineProperty(exports,"JsonApiAdapter",{enumerable:!0,get:()=>e.JsonApiAdapter});Object.defineProperty(exports,"JsonApiSerializer",{enumerable:!0,get:()=>e.JsonApiSerializer});
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../JsonApiSerializer-Bc4iQB0d.cjs");Object.defineProperty(exports,"JsonApiAdapter",{enumerable:!0,get:()=>e.JsonApiAdapter});Object.defineProperty(exports,"JsonApiSerializer",{enumerable:!0,get:()=>e.JsonApiSerializer});
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { J as e, a as i } from "../JsonApiSerializer-CC5HXp4b.js";
1
+ import { J as e, a as i } from "../JsonApiSerializer-wndq5a1n.js";
2
2
  export {
3
3
  e as JsonApiAdapter,
4
4
  i as JsonApiSerializer
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../ODataAdapter-DyyF1sdA.cjs");Object.defineProperty(exports,"ODataAdapter",{enumerable:!0,get:()=>e.ODataAdapter});
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../ODataAdapter-lMifLyLD.cjs");Object.defineProperty(exports,"ODataAdapter",{enumerable:!0,get:()=>e.ODataAdapter});
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { O as t } from "../ODataAdapter-C4IHK4BK.js";
1
+ import { O as t } from "../ODataAdapter-DAja_jKM.js";
2
2
  export {
3
3
  t as ODataAdapter
4
4
  };
@@ -36,6 +36,7 @@
36
36
  */
37
37
  import { SchemaService, type RelationshipDef, type AttributeDef } from '@mobx-data/schema';
38
38
  import { Model, type RelationshipRef, type ModelStoreLike, type SaveOptions } from '@mobx-data/model';
39
+ import type { CacheLike } from '../cache/types.js';
39
40
  import { IdentityMap } from './IdentityMap.js';
40
41
  import { RecordArray, AdapterPopulatedRecordArray } from './RecordArray.js';
41
42
  /** Options forwarded from the Store to adapter fetch methods. */
@@ -127,11 +128,15 @@ export declare class Store implements ModelStoreLike {
127
128
  private relationshipCache;
128
129
  /** Tracks new records that have been appended to a hasMany but not yet saved. */
129
130
  private pendingMembers;
131
+ /** Optional persistent cache layer (e.g. IndexedDB). */
132
+ private _cache;
130
133
  constructor(schema: SchemaService);
131
134
  /** Registers an adapter for a given model name (or `'application'` as a fallback). */
132
135
  registerAdapter(modelName: string, adapter: AdapterLike): void;
133
136
  /** Registers a serializer for a given model name (or `'application'` as a fallback). */
134
137
  registerSerializer(modelName: string, serializer: SerializerLike): void;
138
+ /** Registers a persistent cache layer (e.g. IndexedDB) for offline-first reads. */
139
+ registerCache(cache: CacheLike): void;
135
140
  /**
136
141
  * Returns the adapter for `modelName`, falling back to `'application'`.
137
142
  * @throws when no adapter is registered.
@@ -305,6 +310,7 @@ export declare class Store implements ModelStoreLike {
305
310
  * the inverse. Pending members are removed from the pending set.
306
311
  */
307
312
  _hasManyRemove(record: Model, name: string, meta: RelationshipDef, value: Model): void;
313
+ private cacheNormalizedDocument;
308
314
  private coalescePending;
309
315
  private coalesceScheduled;
310
316
  private scheduleCoalescedFind;
@@ -1 +1 @@
1
- {"version":3,"file":"Store.d.ts","sourceRoot":"","sources":["../../src/store/Store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Store.d.ts","sourceRoot":"","sources":["../../src/store/Store.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../Store-BdwMrbDi.cjs");exports.AdapterPopulatedRecordArray=e.AdapterPopulatedRecordArray;exports.IdentityMap=e.IdentityMap;exports.RecordArray=e.RecordArray;Object.defineProperty(exports,"Store",{enumerable:!0,get:()=>e.Store});
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../Store-KvjmBTQ9.cjs");exports.AdapterPopulatedRecordArray=e.AdapterPopulatedRecordArray;exports.IdentityMap=e.IdentityMap;exports.RecordArray=e.RecordArray;Object.defineProperty(exports,"Store",{enumerable:!0,get:()=>e.Store});
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { A as e, I as o, R as t, S as d } from "../Store-CZ7Z-Nme.js";
1
+ import { A as e, I as o, R as t, S as d } from "../Store-mvrDLQEZ.js";
2
2
  export {
3
3
  e as AdapterPopulatedRecordArray,
4
4
  o as IdentityMap,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iamjulianacosta/mobx-data",
3
- "version": "1.0.1",
3
+ "version": "1.1.1",
4
4
  "description": "Ember Data feature-complete clone for MobX",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -123,6 +123,7 @@
123
123
  "eslint-config-airbnb-typescript": "^18.0.0",
124
124
  "eslint-import-resolver-typescript": "^3.7.0",
125
125
  "eslint-plugin-import": "^2.31.0",
126
+ "fake-indexeddb": "^6.2.5",
126
127
  "mobx": "^6.13.5",
127
128
  "nyc": "^18.0.0",
128
129
  "reflect-metadata": "^0.2.2",
@@ -22,6 +22,7 @@
22
22
 
23
23
  import { injectable } from 'tsyringe';
24
24
  import { Adapter, type AdapterSnapshot } from './Adapter.js';
25
+ import { attachResponseHeaders } from '../cache/cache-utils.js';
25
26
 
26
27
  @injectable()
27
28
  export class RestAdapter extends Adapter {
@@ -104,11 +105,20 @@ export class RestAdapter extends Adapter {
104
105
  if (!text) {
105
106
  return null;
106
107
  }
108
+ let result: unknown;
107
109
  try {
108
- return JSON.parse(text);
110
+ result = JSON.parse(text);
109
111
  } catch {
110
- return text;
112
+ result = text;
111
113
  }
114
+ if (result !== null && typeof result === 'object') {
115
+ const headers: Record<string, string> = {};
116
+ response.headers.forEach((value, key) => {
117
+ headers[key.toLowerCase()] = value;
118
+ });
119
+ attachResponseHeaders(result, headers);
120
+ }
121
+ return result;
112
122
  }
113
123
 
114
124
  override async findRecord(
@@ -0,0 +1,171 @@
1
+ import type { RelationshipRef } from '@mobx-data/model';
2
+ import type { CacheEntryData, IndexedDBCacheOptions, CacheLike } from './types.js';
3
+
4
+ const STORE_NAME = 'cache-entries';
5
+ const DATABASE_VERSION = 1;
6
+ const DEFAULT_TTL = 3_600_000;
7
+
8
+ interface StoredEntry extends CacheEntryData {
9
+ key: string;
10
+ }
11
+
12
+ export class IndexedDBCache implements CacheLike {
13
+ private _databaseName: string;
14
+
15
+ private _defaultTTL: number;
16
+
17
+ private _database: IDBDatabase | null = null;
18
+
19
+ private _openPromise: Promise<IDBDatabase> | null = null;
20
+
21
+ constructor(options: IndexedDBCacheOptions = {}) {
22
+ this._databaseName = options.databaseName ?? 'mobx-data-cache';
23
+ this._defaultTTL = options.defaultTTL ?? DEFAULT_TTL;
24
+ }
25
+
26
+ get defaultTTL(): number {
27
+ return this._defaultTTL;
28
+ }
29
+
30
+ private async open(): Promise<IDBDatabase> {
31
+ if (this._database) {
32
+ return this._database;
33
+ }
34
+ if (this._openPromise) {
35
+ return this._openPromise;
36
+ }
37
+
38
+ this._openPromise = new Promise<IDBDatabase>((resolve, reject) => {
39
+ const request = indexedDB.open(this._databaseName, DATABASE_VERSION);
40
+ request.onupgradeneeded = () => {
41
+ const database = request.result;
42
+ if (!database.objectStoreNames.contains(STORE_NAME)) {
43
+ const store = database.createObjectStore(STORE_NAME, {
44
+ keyPath: 'key',
45
+ });
46
+ store.createIndex('modelName', 'modelName', { unique: false });
47
+ store.createIndex('expiresAt', 'expiresAt', { unique: false });
48
+ }
49
+ };
50
+ request.onsuccess = () => {
51
+ this._database = request.result;
52
+ resolve(this._database);
53
+ };
54
+ request.onerror = () => {
55
+ this._openPromise = null;
56
+ reject(request.error);
57
+ };
58
+ });
59
+ return this._openPromise;
60
+ }
61
+
62
+ static cacheKey(modelName: string, id: string): string {
63
+ return `${modelName}:${id}`;
64
+ }
65
+
66
+ async get(modelName: string, id: string): Promise<CacheEntryData | null> {
67
+ const database = await this.open();
68
+ return new Promise((resolve, reject) => {
69
+ const transaction = database.transaction(STORE_NAME, 'readonly');
70
+ const store = transaction.objectStore(STORE_NAME);
71
+ const request = store.get(IndexedDBCache.cacheKey(modelName, id));
72
+ request.onsuccess = () => {
73
+ const entry = request.result as StoredEntry | undefined;
74
+ if (!entry) {
75
+ resolve(null);
76
+ return;
77
+ }
78
+ if (Date.now() > entry.expiresAt) {
79
+ this.invalidate(modelName, id);
80
+ resolve(null);
81
+ return;
82
+ }
83
+ resolve(entry);
84
+ };
85
+ request.onerror = () => reject(request.error);
86
+ });
87
+ }
88
+
89
+ async set(
90
+ modelName: string,
91
+ id: string,
92
+ attributes: Record<string, unknown>,
93
+ options: {
94
+ relationships?: Record<string, RelationshipRef>;
95
+ ttl?: number;
96
+ } = {},
97
+ ): Promise<void> {
98
+ const database = await this.open();
99
+ const now = Date.now();
100
+ const ttl = options.ttl ?? this._defaultTTL;
101
+ const entry: StoredEntry = {
102
+ key: IndexedDBCache.cacheKey(modelName, id),
103
+ modelName,
104
+ id,
105
+ attributes,
106
+ relationships: options.relationships,
107
+ cachedAt: now,
108
+ expiresAt: now + ttl,
109
+ };
110
+ return new Promise((resolve, reject) => {
111
+ const transaction = database.transaction(STORE_NAME, 'readwrite');
112
+ const store = transaction.objectStore(STORE_NAME);
113
+ const request = store.put(entry);
114
+ request.onsuccess = () => resolve();
115
+ request.onerror = () => reject(request.error);
116
+ });
117
+ }
118
+
119
+ async has(modelName: string, id: string): Promise<boolean> {
120
+ const entry = await this.get(modelName, id);
121
+ return entry !== null;
122
+ }
123
+
124
+ async invalidate(modelName: string, id: string): Promise<void> {
125
+ const database = await this.open();
126
+ return new Promise((resolve, reject) => {
127
+ const transaction = database.transaction(STORE_NAME, 'readwrite');
128
+ const store = transaction.objectStore(STORE_NAME);
129
+ const request = store.delete(IndexedDBCache.cacheKey(modelName, id));
130
+ request.onsuccess = () => resolve();
131
+ request.onerror = () => reject(request.error);
132
+ });
133
+ }
134
+
135
+ async invalidateAll(modelName?: string): Promise<void> {
136
+ const database = await this.open();
137
+ if (!modelName) {
138
+ return new Promise((resolve, reject) => {
139
+ const transaction = database.transaction(STORE_NAME, 'readwrite');
140
+ const store = transaction.objectStore(STORE_NAME);
141
+ const request = store.clear();
142
+ request.onsuccess = () => resolve();
143
+ request.onerror = () => reject(request.error);
144
+ });
145
+ }
146
+ return new Promise((resolve, reject) => {
147
+ const transaction = database.transaction(STORE_NAME, 'readwrite');
148
+ const store = transaction.objectStore(STORE_NAME);
149
+ const index = store.index('modelName');
150
+ const cursorRequest = index.openCursor(IDBKeyRange.only(modelName));
151
+ cursorRequest.onsuccess = () => {
152
+ const cursor = cursorRequest.result;
153
+ if (cursor) {
154
+ cursor.delete();
155
+ cursor.continue();
156
+ } else {
157
+ resolve();
158
+ }
159
+ };
160
+ cursorRequest.onerror = () => reject(cursorRequest.error);
161
+ });
162
+ }
163
+
164
+ async close(): Promise<void> {
165
+ if (this._database) {
166
+ this._database.close();
167
+ this._database = null;
168
+ this._openPromise = null;
169
+ }
170
+ }
171
+ }
@@ -0,0 +1,57 @@
1
+ import { RESPONSE_HEADERS } from './types.js';
2
+
3
+ const DEFAULT_TTL = 3_600_000;
4
+
5
+ export function parseCacheTTLFromHeaders(headers: Record<string, string>): number {
6
+ const cacheControl = headers['cache-control'];
7
+ if (cacheControl) {
8
+ if (/no-store/i.test(cacheControl) || /no-cache/i.test(cacheControl)) {
9
+ return 0;
10
+ }
11
+ const sMaxAge = /s-maxage=(\d+)/i.exec(cacheControl);
12
+ if (sMaxAge) {
13
+ return parseInt(sMaxAge[1]!, 10) * 1000;
14
+ }
15
+ const maxAge = /max-age=(\d+)/i.exec(cacheControl);
16
+ if (maxAge) {
17
+ return parseInt(maxAge[1]!, 10) * 1000;
18
+ }
19
+ }
20
+
21
+ const expires = headers['expires'];
22
+ if (expires) {
23
+ const expiresMilliseconds = new Date(expires).getTime();
24
+ if (!Number.isNaN(expiresMilliseconds)) {
25
+ return Math.max(0, expiresMilliseconds - Date.now());
26
+ }
27
+ }
28
+
29
+ return DEFAULT_TTL;
30
+ }
31
+
32
+ export function extractResponseHeaders(
33
+ payload: unknown,
34
+ ): Record<string, string> | null {
35
+ if (payload !== null && typeof payload === 'object') {
36
+ return (
37
+ (payload as Record<symbol, unknown>)[RESPONSE_HEADERS] as
38
+ | Record<string, string>
39
+ | undefined
40
+ ) ?? null;
41
+ }
42
+ return null;
43
+ }
44
+
45
+ export function attachResponseHeaders(
46
+ payload: unknown,
47
+ headers: Record<string, string>,
48
+ ): void {
49
+ if (payload !== null && typeof payload === 'object') {
50
+ Object.defineProperty(payload, RESPONSE_HEADERS, {
51
+ value: headers,
52
+ enumerable: false,
53
+ writable: false,
54
+ configurable: false,
55
+ });
56
+ }
57
+ }
@@ -0,0 +1,12 @@
1
+ export { IndexedDBCache } from './IndexedDBCache.js';
2
+ export {
3
+ type CacheEntryData,
4
+ type IndexedDBCacheOptions,
5
+ type CacheLike,
6
+ RESPONSE_HEADERS,
7
+ } from './types.js';
8
+ export {
9
+ parseCacheTTLFromHeaders,
10
+ extractResponseHeaders,
11
+ attachResponseHeaders,
12
+ } from './cache-utils.js';
@@ -0,0 +1,33 @@
1
+ import type { RelationshipRef } from '@mobx-data/model';
2
+
3
+ export const RESPONSE_HEADERS: unique symbol = Symbol('response-headers');
4
+
5
+ export interface CacheEntryData {
6
+ modelName: string;
7
+ id: string;
8
+ attributes: Record<string, unknown>;
9
+ relationships?: Record<string, RelationshipRef>;
10
+ cachedAt: number;
11
+ expiresAt: number;
12
+ }
13
+
14
+ export interface IndexedDBCacheOptions {
15
+ databaseName?: string;
16
+ defaultTTL?: number;
17
+ }
18
+
19
+ export interface CacheLike {
20
+ get(modelName: string, id: string): Promise<CacheEntryData | null>;
21
+ set(
22
+ modelName: string,
23
+ id: string,
24
+ attributes: Record<string, unknown>,
25
+ options?: {
26
+ relationships?: Record<string, RelationshipRef>;
27
+ ttl?: number;
28
+ },
29
+ ): Promise<void>;
30
+ has(modelName: string, id: string): Promise<boolean>;
31
+ invalidate(modelName: string, id: string): Promise<void>;
32
+ invalidateAll(modelName?: string): Promise<void>;
33
+ }