@iamjulianacosta/mobx-data 1.0.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 (215) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +366 -0
  3. package/dist/CacheHandler-BTU_rYkv.js +208 -0
  4. package/dist/CacheHandler-BTU_rYkv.js.map +1 -0
  5. package/dist/CacheHandler-CXgY9IJo.cjs +2 -0
  6. package/dist/CacheHandler-CXgY9IJo.cjs.map +1 -0
  7. package/dist/EmbeddedRecordsMixin-CBvqNdgC.cjs +2 -0
  8. package/dist/EmbeddedRecordsMixin-CBvqNdgC.cjs.map +1 -0
  9. package/dist/EmbeddedRecordsMixin-VoHluHCT.js +261 -0
  10. package/dist/EmbeddedRecordsMixin-VoHluHCT.js.map +1 -0
  11. package/dist/JsonApiSerializer-CC5HXp4b.js +194 -0
  12. package/dist/JsonApiSerializer-CC5HXp4b.js.map +1 -0
  13. package/dist/JsonApiSerializer-CKB02AgP.cjs +2 -0
  14. package/dist/JsonApiSerializer-CKB02AgP.cjs.map +1 -0
  15. package/dist/MemoryAdapter-Bx1e7ndV.js +123 -0
  16. package/dist/MemoryAdapter-Bx1e7ndV.js.map +1 -0
  17. package/dist/MemoryAdapter-D1cTyydm.cjs +2 -0
  18. package/dist/MemoryAdapter-D1cTyydm.cjs.map +1 -0
  19. package/dist/ODataAdapter-C4IHK4BK.js +157 -0
  20. package/dist/ODataAdapter-C4IHK4BK.js.map +1 -0
  21. package/dist/ODataAdapter-DyyF1sdA.cjs +2 -0
  22. package/dist/ODataAdapter-DyyF1sdA.cjs.map +1 -0
  23. package/dist/RestAdapter-B4aRvs4m.js +355 -0
  24. package/dist/RestAdapter-B4aRvs4m.js.map +1 -0
  25. package/dist/RestAdapter-CJOwTsKK.cjs +2 -0
  26. package/dist/RestAdapter-CJOwTsKK.cjs.map +1 -0
  27. package/dist/SchemaService-DZwkFgZu.js +102 -0
  28. package/dist/SchemaService-DZwkFgZu.js.map +1 -0
  29. package/dist/SchemaService-Di_yjVzU.cjs +2 -0
  30. package/dist/SchemaService-Di_yjVzU.cjs.map +1 -0
  31. package/dist/Serializer-95gi5edy.cjs +2 -0
  32. package/dist/Serializer-95gi5edy.cjs.map +1 -0
  33. package/dist/Serializer-FxJbsZ50.js +139 -0
  34. package/dist/Serializer-FxJbsZ50.js.map +1 -0
  35. package/dist/Store-BdwMrbDi.cjs +2 -0
  36. package/dist/Store-BdwMrbDi.cjs.map +1 -0
  37. package/dist/Store-CZ7Z-Nme.js +912 -0
  38. package/dist/Store-CZ7Z-Nme.js.map +1 -0
  39. package/dist/adapter/Adapter.d.ts +146 -0
  40. package/dist/adapter/Adapter.d.ts.map +1 -0
  41. package/dist/adapter/MemoryAdapter.d.ts +44 -0
  42. package/dist/adapter/MemoryAdapter.d.ts.map +1 -0
  43. package/dist/adapter/RestAdapter.d.ts +57 -0
  44. package/dist/adapter/RestAdapter.d.ts.map +1 -0
  45. package/dist/adapter/index.cjs +2 -0
  46. package/dist/adapter/index.cjs.map +1 -0
  47. package/dist/adapter/index.d.ts +4 -0
  48. package/dist/adapter/index.d.ts.map +1 -0
  49. package/dist/adapter/index.js +8 -0
  50. package/dist/adapter/index.js.map +1 -0
  51. package/dist/date-Bj4O2W1F.js +107 -0
  52. package/dist/date-Bj4O2W1F.js.map +1 -0
  53. package/dist/date-CRCe-9gf.cjs +2 -0
  54. package/dist/date-CRCe-9gf.cjs.map +1 -0
  55. package/dist/decorators-HQ1KnRdh.cjs +2 -0
  56. package/dist/decorators-HQ1KnRdh.cjs.map +1 -0
  57. package/dist/decorators-Zr35qr6A.js +50 -0
  58. package/dist/decorators-Zr35qr6A.js.map +1 -0
  59. package/dist/index.cjs +2 -0
  60. package/dist/index.cjs.map +1 -0
  61. package/dist/index.d.ts +10 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +52 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/json-api/JsonApiAdapter.d.ts +38 -0
  66. package/dist/json-api/JsonApiAdapter.d.ts.map +1 -0
  67. package/dist/json-api/JsonApiSerializer.d.ts +73 -0
  68. package/dist/json-api/JsonApiSerializer.d.ts.map +1 -0
  69. package/dist/json-api/index.cjs +2 -0
  70. package/dist/json-api/index.cjs.map +1 -0
  71. package/dist/json-api/index.d.ts +3 -0
  72. package/dist/json-api/index.d.ts.map +1 -0
  73. package/dist/json-api/index.js +6 -0
  74. package/dist/json-api/index.js.map +1 -0
  75. package/dist/model/Errors.d.ts +46 -0
  76. package/dist/model/Errors.d.ts.map +1 -0
  77. package/dist/model/Model.d.ts +226 -0
  78. package/dist/model/Model.d.ts.map +1 -0
  79. package/dist/model/Snapshot.d.ts +72 -0
  80. package/dist/model/Snapshot.d.ts.map +1 -0
  81. package/dist/model/StateMachine.d.ts +45 -0
  82. package/dist/model/StateMachine.d.ts.map +1 -0
  83. package/dist/model/index.cjs +2 -0
  84. package/dist/model/index.cjs.map +1 -0
  85. package/dist/model/index.d.ts +6 -0
  86. package/dist/model/index.d.ts.map +1 -0
  87. package/dist/model/index.js +11 -0
  88. package/dist/model/index.js.map +1 -0
  89. package/dist/model/relationships.d.ts +182 -0
  90. package/dist/model/relationships.d.ts.map +1 -0
  91. package/dist/odata/ODataAdapter.d.ts +67 -0
  92. package/dist/odata/ODataAdapter.d.ts.map +1 -0
  93. package/dist/odata/index.cjs +2 -0
  94. package/dist/odata/index.cjs.map +1 -0
  95. package/dist/odata/index.d.ts +2 -0
  96. package/dist/odata/index.d.ts.map +1 -0
  97. package/dist/odata/index.js +5 -0
  98. package/dist/odata/index.js.map +1 -0
  99. package/dist/relationships-B55LBaCW.cjs +2 -0
  100. package/dist/relationships-B55LBaCW.cjs.map +1 -0
  101. package/dist/relationships-BEXANmWg.js +821 -0
  102. package/dist/relationships-BEXANmWg.js.map +1 -0
  103. package/dist/request/CacheHandler.d.ts +50 -0
  104. package/dist/request/CacheHandler.d.ts.map +1 -0
  105. package/dist/request/FetchHandler.d.ts +41 -0
  106. package/dist/request/FetchHandler.d.ts.map +1 -0
  107. package/dist/request/RequestManager.d.ts +52 -0
  108. package/dist/request/RequestManager.d.ts.map +1 -0
  109. package/dist/request/index.cjs +2 -0
  110. package/dist/request/index.cjs.map +1 -0
  111. package/dist/request/index.d.ts +5 -0
  112. package/dist/request/index.d.ts.map +1 -0
  113. package/dist/request/index.js +7 -0
  114. package/dist/request/index.js.map +1 -0
  115. package/dist/request/types.d.ts +111 -0
  116. package/dist/request/types.d.ts.map +1 -0
  117. package/dist/schema/SchemaService.d.ts +58 -0
  118. package/dist/schema/SchemaService.d.ts.map +1 -0
  119. package/dist/schema/decorators.d.ts +50 -0
  120. package/dist/schema/decorators.d.ts.map +1 -0
  121. package/dist/schema/index.cjs +2 -0
  122. package/dist/schema/index.cjs.map +1 -0
  123. package/dist/schema/index.d.ts +4 -0
  124. package/dist/schema/index.d.ts.map +1 -0
  125. package/dist/schema/index.js +13 -0
  126. package/dist/schema/index.js.map +1 -0
  127. package/dist/schema/types.d.ts +61 -0
  128. package/dist/schema/types.d.ts.map +1 -0
  129. package/dist/serializer/EmbeddedRecordsMixin.d.ts +80 -0
  130. package/dist/serializer/EmbeddedRecordsMixin.d.ts.map +1 -0
  131. package/dist/serializer/JsonSerializer.d.ts +52 -0
  132. package/dist/serializer/JsonSerializer.d.ts.map +1 -0
  133. package/dist/serializer/RestSerializer.d.ts +43 -0
  134. package/dist/serializer/RestSerializer.d.ts.map +1 -0
  135. package/dist/serializer/Serializer.d.ts +202 -0
  136. package/dist/serializer/Serializer.d.ts.map +1 -0
  137. package/dist/serializer/index.cjs +2 -0
  138. package/dist/serializer/index.cjs.map +1 -0
  139. package/dist/serializer/index.d.ts +5 -0
  140. package/dist/serializer/index.d.ts.map +1 -0
  141. package/dist/serializer/index.js +9 -0
  142. package/dist/serializer/index.js.map +1 -0
  143. package/dist/store/IdentityMap.d.ts +53 -0
  144. package/dist/store/IdentityMap.d.ts.map +1 -0
  145. package/dist/store/RecordArray.d.ts +114 -0
  146. package/dist/store/RecordArray.d.ts.map +1 -0
  147. package/dist/store/Store.d.ts +395 -0
  148. package/dist/store/Store.d.ts.map +1 -0
  149. package/dist/store/index.cjs +2 -0
  150. package/dist/store/index.cjs.map +1 -0
  151. package/dist/store/index.d.ts +5 -0
  152. package/dist/store/index.d.ts.map +1 -0
  153. package/dist/store/index.js +8 -0
  154. package/dist/store/index.js.map +1 -0
  155. package/dist/transforms/Transform.d.ts +49 -0
  156. package/dist/transforms/Transform.d.ts.map +1 -0
  157. package/dist/transforms/boolean.d.ts +26 -0
  158. package/dist/transforms/boolean.d.ts.map +1 -0
  159. package/dist/transforms/date.d.ts +22 -0
  160. package/dist/transforms/date.d.ts.map +1 -0
  161. package/dist/transforms/index.cjs +2 -0
  162. package/dist/transforms/index.cjs.map +1 -0
  163. package/dist/transforms/index.d.ts +6 -0
  164. package/dist/transforms/index.d.ts.map +1 -0
  165. package/dist/transforms/index.js +9 -0
  166. package/dist/transforms/index.js.map +1 -0
  167. package/dist/transforms/number.d.ts +17 -0
  168. package/dist/transforms/number.d.ts.map +1 -0
  169. package/dist/transforms/string.d.ts +18 -0
  170. package/dist/transforms/string.d.ts.map +1 -0
  171. package/dist/types-C9NB2gRj.js +7 -0
  172. package/dist/types-C9NB2gRj.js.map +1 -0
  173. package/dist/types-uWOXMPWW.cjs +2 -0
  174. package/dist/types-uWOXMPWW.cjs.map +1 -0
  175. package/package.json +140 -0
  176. package/src/adapter/Adapter.ts +320 -0
  177. package/src/adapter/MemoryAdapter.ts +216 -0
  178. package/src/adapter/RestAdapter.ts +248 -0
  179. package/src/adapter/index.ts +7 -0
  180. package/src/index.ts +17 -0
  181. package/src/json-api/JsonApiAdapter.ts +93 -0
  182. package/src/json-api/JsonApiSerializer.ts +245 -0
  183. package/src/json-api/index.ts +2 -0
  184. package/src/model/Errors.ts +100 -0
  185. package/src/model/Model.ts +683 -0
  186. package/src/model/Snapshot.ts +162 -0
  187. package/src/model/StateMachine.ts +149 -0
  188. package/src/model/index.ts +20 -0
  189. package/src/model/relationships.ts +484 -0
  190. package/src/odata/ODataAdapter.ts +245 -0
  191. package/src/odata/index.ts +1 -0
  192. package/src/request/CacheHandler.ts +125 -0
  193. package/src/request/FetchHandler.ts +119 -0
  194. package/src/request/RequestManager.ts +112 -0
  195. package/src/request/index.ts +4 -0
  196. package/src/request/types.ts +139 -0
  197. package/src/schema/SchemaService.ts +161 -0
  198. package/src/schema/decorators.ts +162 -0
  199. package/src/schema/index.ts +3 -0
  200. package/src/schema/types.ts +66 -0
  201. package/src/serializer/EmbeddedRecordsMixin.ts +257 -0
  202. package/src/serializer/JsonSerializer.ts +173 -0
  203. package/src/serializer/RestSerializer.ts +138 -0
  204. package/src/serializer/Serializer.ts +397 -0
  205. package/src/serializer/index.ts +15 -0
  206. package/src/store/IdentityMap.ts +110 -0
  207. package/src/store/RecordArray.ts +210 -0
  208. package/src/store/Store.ts +1391 -0
  209. package/src/store/index.ts +11 -0
  210. package/src/transforms/Transform.ts +52 -0
  211. package/src/transforms/boolean.ts +57 -0
  212. package/src/transforms/date.ts +48 -0
  213. package/src/transforms/index.ts +5 -0
  214. package/src/transforms/number.ts +42 -0
  215. package/src/transforms/string.ts +35 -0
@@ -0,0 +1,11 @@
1
+ export { Store } from './Store.js';
2
+ export type {
3
+ AdapterLike,
4
+ AdapterFetchOptions,
5
+ SerializerLike,
6
+ FindOptions,
7
+ NormalizedDocument,
8
+ NormalizedResource,
9
+ } from './Store.js';
10
+ export { IdentityMap } from './IdentityMap.js';
11
+ export { RecordArray, AdapterPopulatedRecordArray } from './RecordArray.js';
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Interface and abstract base class for data transforms.
3
+ *
4
+ * A transform converts attribute values between the wire format used by the
5
+ * server (External) and the in-memory format used by the application
6
+ * (Internal).
7
+ *
8
+ * - `deserialize` — called when the store receives data from the server
9
+ * (normalize direction, server → app).
10
+ * - `serialize` — called when the store sends data to the server
11
+ * (serialize direction, app → server).
12
+ *
13
+ * Built-in transforms: `StringTransform`, `NumberTransform`,
14
+ * `BooleanTransform`, `DateTransform`.
15
+ *
16
+ * Custom transforms can be implemented by extending `BaseTransform`:
17
+ *
18
+ * ```ts
19
+ * @injectable()
20
+ * class UpperCaseTransform extends BaseTransform<string, string> {
21
+ * deserialize(value: string) { return value.toUpperCase(); }
22
+ * serialize(value: string) { return value.toLowerCase(); }
23
+ * }
24
+ * ```
25
+ */
26
+
27
+ /** Bidirectional value converter for a single attribute type. */
28
+ export interface Transform<External = unknown, Internal = unknown> {
29
+ /**
30
+ * Converts a raw server value to the application-side type.
31
+ * @param serialized - Raw value as it arrived from the server.
32
+ * @param options - Extra options forwarded from the `@attr` decorator.
33
+ */
34
+ deserialize(serialized: External, options?: Record<string, unknown>): Internal;
35
+
36
+ /**
37
+ * Converts an application-side value back to the wire format.
38
+ * @param deserialized - Current in-memory value.
39
+ * @param options - Extra options forwarded from the `@attr` decorator.
40
+ */
41
+ serialize(deserialized: Internal, options?: Record<string, unknown>): External;
42
+ }
43
+
44
+ /**
45
+ * Convenience abstract class that implements `Transform` and can be extended
46
+ * to create custom transforms without repeating the interface declaration.
47
+ */
48
+ export abstract class BaseTransform<External = unknown, Internal = unknown>
49
+ implements Transform<External, Internal> {
50
+ abstract deserialize(serialized: External, options?: Record<string, unknown>): Internal;
51
+ abstract serialize(deserialized: Internal, options?: Record<string, unknown>): External;
52
+ }
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Transform that converts between arbitrary wire values and booleans.
3
+ *
4
+ * Deserialization coercions:
5
+ * - `null` / `undefined` → `false` (or `null` when `allowNull: true`)
6
+ * - `boolean` → passed through
7
+ * - `number` → `true` only when the value is exactly `1`
8
+ * - `string` → `true` for `'true'`, `'t'`, or `'1'` (case-insensitive)
9
+ * - anything else → `Boolean(value)`
10
+ *
11
+ * Serialization: `Boolean(value)` (preserves `null` when `allowNull: true`).
12
+ */
13
+
14
+ import { injectable } from 'tsyringe';
15
+ import { BaseTransform } from './Transform.js';
16
+
17
+ /** Options accepted by `BooleanTransform`. */
18
+ export interface BooleanTransformOptions {
19
+ /**
20
+ * When `true`, `null` / `undefined` input is preserved as `null` rather
21
+ * than coerced to `false`.
22
+ */
23
+ allowNull?: boolean;
24
+ }
25
+
26
+ @injectable()
27
+ export class BooleanTransform extends BaseTransform<unknown, boolean | null> {
28
+ deserialize(
29
+ serialized: unknown,
30
+ options: BooleanTransformOptions = {},
31
+ ): boolean | null {
32
+ if (serialized === null || serialized === undefined) {
33
+ return options.allowNull ? null : false;
34
+ }
35
+ if (typeof serialized === 'boolean') {
36
+ return serialized;
37
+ }
38
+ if (typeof serialized === 'number') {
39
+ return serialized === 1;
40
+ }
41
+ if (typeof serialized === 'string') {
42
+ const normalized = serialized.toLowerCase();
43
+ return normalized === 'true' || normalized === 't' || normalized === '1';
44
+ }
45
+ return Boolean(serialized);
46
+ }
47
+
48
+ serialize(
49
+ deserialized: boolean | null,
50
+ options: BooleanTransformOptions = {},
51
+ ): unknown {
52
+ if (deserialized === null || deserialized === undefined) {
53
+ return options.allowNull ? null : false;
54
+ }
55
+ return Boolean(deserialized);
56
+ }
57
+ }
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Transform that converts between ISO 8601 strings (or numeric timestamps)
3
+ * and JavaScript `Date` objects.
4
+ *
5
+ * Deserialization:
6
+ * - `null` / `undefined` / `''` → `null`
7
+ * - `Date` instance → returned as-is (or `null` when invalid)
8
+ * - `number` (Unix ms) or `string` (ISO 8601) → parsed via `new Date(value)`,
9
+ * returns `null` when parsing yields `NaN`
10
+ * - anything else → `null`
11
+ *
12
+ * Serialization:
13
+ * - `null` / `undefined` → `null`
14
+ * - `Date` instance → ISO 8601 string via `.toISOString()` (or `null` when invalid)
15
+ * - anything else → `null`
16
+ */
17
+
18
+ import { injectable } from 'tsyringe';
19
+ import { BaseTransform } from './Transform.js';
20
+
21
+ @injectable()
22
+ export class DateTransform extends BaseTransform<unknown, Date | null> {
23
+ deserialize(serialized: unknown): Date | null {
24
+ if (serialized === null || serialized === undefined || serialized === '') {
25
+ return null;
26
+ }
27
+ if (serialized instanceof Date) {
28
+ return Number.isNaN(serialized.getTime()) ? null : serialized;
29
+ }
30
+ if (typeof serialized === 'number' || typeof serialized === 'string') {
31
+ const parsed = new Date(serialized);
32
+ return Number.isNaN(parsed.getTime()) ? null : parsed;
33
+ }
34
+ return null;
35
+ }
36
+
37
+ serialize(deserialized: Date | null): unknown {
38
+ if (deserialized === null || deserialized === undefined) {
39
+ return null;
40
+ }
41
+ if (deserialized instanceof Date) {
42
+ return Number.isNaN(deserialized.getTime())
43
+ ? null
44
+ : deserialized.toISOString();
45
+ }
46
+ return null;
47
+ }
48
+ }
@@ -0,0 +1,5 @@
1
+ export { BaseTransform, type Transform } from './Transform.js';
2
+ export { StringTransform } from './string.js';
3
+ export { NumberTransform } from './number.js';
4
+ export { BooleanTransform } from './boolean.js';
5
+ export { DateTransform } from './date.js';
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Transform that converts between arbitrary wire values and numbers.
3
+ *
4
+ * Deserialization / serialization coercions (identical in both directions):
5
+ * - `null` / `undefined` / `''` → `null`
6
+ * - finite `number` → passed through
7
+ * - non-finite `number` (NaN, Infinity) → `null`
8
+ * - `string` → trimmed and parsed; `null` when the result is not finite
9
+ * - anything else → `null`
10
+ */
11
+
12
+ import { injectable } from 'tsyringe';
13
+ import { BaseTransform } from './Transform.js';
14
+
15
+ @injectable()
16
+ export class NumberTransform extends BaseTransform<unknown, number | null> {
17
+ static coerce(value: unknown): number | null {
18
+ if (value === null || value === undefined || value === '') {
19
+ return null;
20
+ }
21
+ if (typeof value === 'number') {
22
+ return Number.isFinite(value) ? value : null;
23
+ }
24
+ if (typeof value === 'string') {
25
+ const trimmed = value.trim();
26
+ if (trimmed === '') {
27
+ return null;
28
+ }
29
+ const parsed = Number(trimmed);
30
+ return Number.isFinite(parsed) ? parsed : null;
31
+ }
32
+ return null;
33
+ }
34
+
35
+ deserialize(serialized: unknown): number | null {
36
+ return NumberTransform.coerce(serialized);
37
+ }
38
+
39
+ serialize(deserialized: number | null): unknown {
40
+ return NumberTransform.coerce(deserialized);
41
+ }
42
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Transform that converts between arbitrary wire values and strings.
3
+ *
4
+ * Deserialization:
5
+ * - `null` / `undefined` → `null`
6
+ * - `string` → passed through
7
+ * - anything else → `String(value)`
8
+ *
9
+ * Serialization:
10
+ * - `null` / `undefined` → `null`
11
+ * - anything else → `String(value)`
12
+ */
13
+
14
+ import { injectable } from 'tsyringe';
15
+ import { BaseTransform } from './Transform.js';
16
+
17
+ @injectable()
18
+ export class StringTransform extends BaseTransform<unknown, string | null> {
19
+ deserialize(serialized: unknown): string | null {
20
+ if (serialized === null || serialized === undefined) {
21
+ return null;
22
+ }
23
+ if (typeof serialized === 'string') {
24
+ return serialized;
25
+ }
26
+ return String(serialized);
27
+ }
28
+
29
+ serialize(deserialized: string | null): unknown {
30
+ if (deserialized === null || deserialized === undefined) {
31
+ return null;
32
+ }
33
+ return String(deserialized);
34
+ }
35
+ }