@warp-drive/core 5.8.0-alpha.5 → 5.8.0-alpha.7

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 (33) hide show
  1. package/declarations/build-config.d.ts +18 -1
  2. package/declarations/index.d.ts +80 -3
  3. package/declarations/reactive/-private/document.d.ts +58 -46
  4. package/declarations/reactive/-private/schema.d.ts +1 -1
  5. package/declarations/reactive.d.ts +3 -2
  6. package/declarations/request.d.ts +25 -0
  7. package/declarations/store/-private/caches/instance-cache.d.ts +1 -1
  8. package/declarations/store/-private/default-cache-policy.d.ts +74 -73
  9. package/declarations/store/-private/managers/cache-capabilities-manager.d.ts +1 -1
  10. package/declarations/store/-private/managers/cache-manager.d.ts +6 -4
  11. package/declarations/store/-private/new-core-tmp/promise-state.d.ts +1 -0
  12. package/declarations/store/-private/store-service.d.ts +1 -1
  13. package/declarations/store/-types/q/cache-capabilities-manager.d.ts +1 -1
  14. package/declarations/store/deprecated/store.d.ts +1 -1
  15. package/declarations/types/cache.d.ts +6 -4
  16. package/declarations/types/request.d.ts +4 -6
  17. package/declarations/types/schema/fields.d.ts +11 -0
  18. package/declarations/types/symbols.d.ts +2 -2
  19. package/dist/build-config.js +1 -1
  20. package/dist/default-cache-policy-D7_u4YRH.js +572 -0
  21. package/dist/graph/-private.js +1 -1
  22. package/dist/{index-MiSBsI57.js → index-BMCk_UD5.js} +10453 -10426
  23. package/dist/index.js +5 -4
  24. package/dist/reactive.js +7 -42
  25. package/dist/{context-C_7OLieY.js → request-CN-dNlEY.js} +193 -173
  26. package/dist/request.js +1 -1
  27. package/dist/store/-private.js +1 -1
  28. package/dist/store.js +1 -570
  29. package/dist/types/-private.js +1 -1
  30. package/dist/types/request.js +3 -5
  31. package/dist/types/schema/fields.js +14 -0
  32. package/dist/types/symbols.js +2 -2
  33. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -1,7 +1,8 @@
1
- import './types/runtime.js';
2
- export { C as CacheHandler, U as Fetch, V as RequestManager, S as Store, r as recordIdentifierFor, Y as setIdentifierForgetMethod, W as setIdentifierGenerationMethod, Z as setIdentifierResetMethod, X as setIdentifierUpdateMethod, $ as setKeyInfoForResource, s as storeFor } from "./index-MiSBsI57.js";
1
+ export { C as CacheHandler, V as Fetch, W as RequestManager, S as Store, r as recordIdentifierFor, $ as setIdentifierForgetMethod, Y as setIdentifierGenerationMethod, a0 as setIdentifierResetMethod, Z as setIdentifierUpdateMethod, a1 as setKeyInfoForResource, s as storeFor, X as useRecommendedStore } from "./index-BMCk_UD5.js";
2
+ import "./symbols-sql1_mdx.js";
3
3
  import '@ember/debug';
4
4
  import '@embroider/macros';
5
5
  import './utils/string.js';
6
- import "./symbols-sql1_mdx.js";
7
- import "./configure-C3x8YXzL.js";
6
+ import "./configure-C3x8YXzL.js";
7
+ import "./default-cache-policy-D7_u4YRH.js";
8
+ import './types/runtime.js';
package/dist/reactive.js CHANGED
@@ -1,45 +1,10 @@
1
- import { L as ReactiveResource } from "./index-MiSBsI57.js";
2
- export { N as SchemaService, M as checkout, T as commit, P as fromIdentity, Q as registerDerivations, O as withDefaults } from "./index-MiSBsI57.js";
3
- import { isResourceSchema } from './types/schema/fields.js';
4
- import { D as Destroy } from "./symbols-sql1_mdx.js";
1
+ export { O as SchemaService, L as checkout, U as commit, q as createRequestSubscription, Q as fromIdentity, p as getPromiseState, t as getRequestState, M as instantiateRecord, T as registerDerivations, N as teardownRecord, P as withDefaults } from "./index-BMCk_UD5.js";
5
2
  export { a as Checkout } from "./symbols-sql1_mdx.js";
6
- import { macroCondition, getGlobalConfig } from '@embroider/macros';
7
- function instantiateRecord(store, identifier, createArgs) {
8
- const schema = store.schema;
9
- const resourceSchema = schema.resource(identifier);
10
- macroCondition(getGlobalConfig().WarpDrive.env.DEBUG) ? (test => {
11
- if (!test) {
12
- throw new Error(`Expected a resource schema`);
13
- }
14
- })(isResourceSchema(resourceSchema)) : {};
15
- const legacy = resourceSchema?.legacy ?? false;
16
- const editable = legacy;
17
- const record = new ReactiveResource({
18
- store,
19
- resourceKey: identifier,
20
- modeName: legacy ? 'legacy' : 'polaris',
21
- legacy: legacy,
22
- editable: editable,
23
- path: null,
24
- field: null,
25
- value: null
26
- });
27
- if (createArgs && editable) {
28
- Object.assign(record, createArgs);
29
- }
30
- return record;
31
- }
32
- function assertReactiveResource(record) {
33
- macroCondition(getGlobalConfig().WarpDrive.env.DEBUG) ? (test => {
34
- if (!test) {
35
- throw new Error('Expected a ReactiveResource');
36
- }
37
- })(record && typeof record === 'object' && Destroy in record) : {};
38
- }
39
- function teardownRecord(record) {
40
- assertReactiveResource(record);
41
- record[Destroy]();
42
- }
3
+ import './types/request.js';
4
+ import '@embroider/macros';
5
+ import '@ember/debug';
6
+ import './utils/string.js';
7
+ import "./configure-C3x8YXzL.js";
43
8
  const Subscriptions = new WeakMap();
44
9
 
45
10
  /**
@@ -161,4 +126,4 @@ function getExpensiveRequestSubscription(store, requestKey, callback) {
161
126
  subscription.removeWatcher(callback);
162
127
  };
163
128
  }
164
- export { getExpensiveRequestSubscription, instantiateRecord, teardownRecord };
129
+ export { getExpensiveRequestSubscription };
@@ -1,4 +1,4 @@
1
- import { STRUCTURED, IS_FUTURE, SkipCache } from './types/request.js';
1
+ import { SkipCache, STRUCTURED, IS_FUTURE } from './types/request.js';
2
2
  import { getOrSetGlobal, getOrSetUniversal } from './types/-private.js';
3
3
  import { macroCondition, getGlobalConfig } from '@embroider/macros';
4
4
  const BODY_TYPES = {
@@ -233,6 +233,179 @@ function assertValidRequest(request, isTopLevel) {
233
233
  }
234
234
  }
235
235
  }
236
+ function upgradeHeaders(headers) {
237
+ headers.clone = () => {
238
+ return new Headers(headers);
239
+ };
240
+ headers.toJSON = () => {
241
+ return Array.from(headers);
242
+ };
243
+ return headers;
244
+ }
245
+ function cloneResponseProperties(response) {
246
+ const {
247
+ headers,
248
+ ok,
249
+ redirected,
250
+ status,
251
+ statusText,
252
+ type,
253
+ url
254
+ } = response;
255
+ upgradeHeaders(headers);
256
+ return {
257
+ headers: headers,
258
+ ok,
259
+ redirected,
260
+ status,
261
+ statusText,
262
+ type,
263
+ url
264
+ };
265
+ }
266
+ class ContextOwner {
267
+ hasSetStream = false;
268
+ hasSetResponse = false;
269
+ hasSubscribers = false;
270
+ stream = createDeferred();
271
+ response = null;
272
+ nextCalled = 0;
273
+ constructor(request, god, isRoot = false) {
274
+ this.isRoot = isRoot;
275
+ this.requestId = god.id;
276
+ this.controller = request.controller || god.controller;
277
+ this.stream.promise.sizeHint = 0;
278
+ if (request.controller) {
279
+ if (request.controller !== god.controller) {
280
+ god.controller.signal.addEventListener('abort', () => {
281
+ this.controller.abort(god.controller.signal.reason);
282
+ });
283
+ }
284
+ delete request.controller;
285
+ }
286
+ let enhancedRequest = Object.assign({
287
+ signal: this.controller.signal
288
+ }, request);
289
+ if (macroCondition(getGlobalConfig().WarpDrive.env.DEBUG)) {
290
+ if (!request?.cacheOptions?.[SkipCache]) {
291
+ request = deepFreeze(request);
292
+ enhancedRequest = deepFreeze(enhancedRequest);
293
+ }
294
+ } else {
295
+ if (request.headers) {
296
+ upgradeHeaders(request.headers);
297
+ }
298
+ }
299
+ this.enhancedRequest = enhancedRequest;
300
+ this.request = request;
301
+ this.god = god;
302
+ this.stream.promise = this.stream.promise.then(stream => {
303
+ if (this.god.stream === stream && this.hasSubscribers) {
304
+ this.god.stream = null;
305
+ }
306
+ return stream;
307
+ });
308
+ }
309
+ get hasRequestedStream() {
310
+ return this.god.hasRequestedStream;
311
+ }
312
+ getResponse() {
313
+ if (this.hasSetResponse) {
314
+ return this.response;
315
+ }
316
+ if (this.nextCalled === 1) {
317
+ return this.god.response;
318
+ }
319
+ return null;
320
+ }
321
+ getStream() {
322
+ if (this.isRoot) {
323
+ this.god.hasRequestedStream = true;
324
+ }
325
+ if (!this.hasSetResponse) {
326
+ const hint = this.god.response?.headers?.get('content-length');
327
+ this.stream.promise.sizeHint = hint ? parseInt(hint, 10) : 0;
328
+ }
329
+ this.hasSubscribers = true;
330
+ return this.stream.promise;
331
+ }
332
+ abort(reason) {
333
+ this.controller.abort(reason);
334
+ }
335
+ setStream(stream) {
336
+ if (!this.hasSetStream) {
337
+ this.hasSetStream = true;
338
+ if (!(stream instanceof Promise)) {
339
+ this.god.stream = stream;
340
+ }
341
+ // @ts-expect-error
342
+ this.stream.resolve(stream);
343
+ }
344
+ }
345
+ resolveStream() {
346
+ this.setStream(this.nextCalled === 1 ? this.god.stream : null);
347
+ }
348
+ setResponse(response) {
349
+ if (this.hasSetResponse) {
350
+ if (macroCondition(getGlobalConfig().WarpDrive.env.DEBUG)) {
351
+ throw new Error(`Cannot setResponse when a response has already been set`);
352
+ }
353
+ return;
354
+ }
355
+ this.hasSetResponse = true;
356
+ if (response instanceof Response) {
357
+ // TODO potentially avoid cloning in prod
358
+ let responseData = cloneResponseProperties(response);
359
+ if (macroCondition(getGlobalConfig().WarpDrive.env.DEBUG)) {
360
+ responseData = deepFreeze(responseData);
361
+ }
362
+ this.response = responseData;
363
+ this.god.response = responseData;
364
+ const sizeHint = response.headers?.get('content-length');
365
+ this.stream.promise.sizeHint = sizeHint ? parseInt(sizeHint, 10) : 0;
366
+ } else {
367
+ this.response = response;
368
+ this.god.response = response;
369
+ }
370
+ }
371
+ }
372
+ class Context {
373
+ /** @internal */
374
+
375
+ /** @internal */
376
+
377
+ /** @internal */
378
+
379
+ constructor(owner, isCacheHandler) {
380
+ this.id = owner.requestId;
381
+ this.___owner = owner;
382
+ this.request = owner.enhancedRequest;
383
+ this._isCacheHandler = isCacheHandler;
384
+ this._finalized = false;
385
+ }
386
+ setStream(stream) {
387
+ this.___owner.setStream(stream);
388
+ }
389
+ setResponse(response) {
390
+ this.___owner.setResponse(response);
391
+ }
392
+ setIdentifier(identifier) {
393
+ macroCondition(getGlobalConfig().WarpDrive.env.DEBUG) ? (test => {
394
+ if (!test) {
395
+ throw new Error(`setIdentifier may only be used synchronously from a CacheHandler`);
396
+ }
397
+ })(identifier && this._isCacheHandler && !this._finalized) : {};
398
+ this.___owner.god.identifier = identifier;
399
+ }
400
+ get hasRequestedStream() {
401
+ return this.___owner.hasRequestedStream;
402
+ }
403
+
404
+ /** @private */
405
+ _finalize() {
406
+ this._finalized = true;
407
+ }
408
+ }
236
409
  const PromiseCache = getOrSetUniversal('PromiseCache', new WeakMap());
237
410
  const RequestMap = getOrSetUniversal('RequestMap', new Map());
238
411
  function setRequestResult(requestId, result) {
@@ -502,177 +675,24 @@ function createFuture(owner) {
502
675
  deferred.promise = promise;
503
676
  return deferred;
504
677
  }
505
- function upgradeHeaders(headers) {
506
- headers.clone = () => {
507
- return new Headers(headers);
508
- };
509
- headers.toJSON = () => {
510
- return Array.from(headers);
511
- };
512
- return headers;
513
- }
514
- function cloneResponseProperties(response) {
515
- const {
516
- headers,
517
- ok,
518
- redirected,
519
- status,
520
- statusText,
521
- type,
522
- url
523
- } = response;
524
- upgradeHeaders(headers);
525
- return {
526
- headers: headers,
527
- ok,
528
- redirected,
529
- status,
530
- statusText,
531
- type,
532
- url
533
- };
534
- }
535
- class ContextOwner {
536
- hasSetStream = false;
537
- hasSetResponse = false;
538
- hasSubscribers = false;
539
- stream = createDeferred();
540
- response = null;
541
- nextCalled = 0;
542
- constructor(request, god, isRoot = false) {
543
- this.isRoot = isRoot;
544
- this.requestId = god.id;
545
- this.controller = request.controller || god.controller;
546
- this.stream.promise.sizeHint = 0;
547
- if (request.controller) {
548
- if (request.controller !== god.controller) {
549
- god.controller.signal.addEventListener('abort', () => {
550
- this.controller.abort(god.controller.signal.reason);
551
- });
552
- }
553
- delete request.controller;
554
- }
555
- let enhancedRequest = Object.assign({
556
- signal: this.controller.signal
557
- }, request);
558
- if (macroCondition(getGlobalConfig().WarpDrive.env.DEBUG)) {
559
- if (!request?.cacheOptions?.[SkipCache]) {
560
- request = deepFreeze(request);
561
- enhancedRequest = deepFreeze(enhancedRequest);
562
- }
563
- } else {
564
- if (request.headers) {
565
- upgradeHeaders(request.headers);
566
- }
567
- }
568
- this.enhancedRequest = enhancedRequest;
569
- this.request = request;
570
- this.god = god;
571
- this.stream.promise = this.stream.promise.then(stream => {
572
- if (this.god.stream === stream && this.hasSubscribers) {
573
- this.god.stream = null;
574
- }
575
- return stream;
576
- });
577
- }
578
- get hasRequestedStream() {
579
- return this.god.hasRequestedStream;
580
- }
581
- getResponse() {
582
- if (this.hasSetResponse) {
583
- return this.response;
584
- }
585
- if (this.nextCalled === 1) {
586
- return this.god.response;
587
- }
588
- return null;
589
- }
590
- getStream() {
591
- if (this.isRoot) {
592
- this.god.hasRequestedStream = true;
593
- }
594
- if (!this.hasSetResponse) {
595
- const hint = this.god.response?.headers?.get('content-length');
596
- this.stream.promise.sizeHint = hint ? parseInt(hint, 10) : 0;
597
- }
598
- this.hasSubscribers = true;
599
- return this.stream.promise;
600
- }
601
- abort(reason) {
602
- this.controller.abort(reason);
603
- }
604
- setStream(stream) {
605
- if (!this.hasSetStream) {
606
- this.hasSetStream = true;
607
- if (!(stream instanceof Promise)) {
608
- this.god.stream = stream;
609
- }
610
- // @ts-expect-error
611
- this.stream.resolve(stream);
612
- }
613
- }
614
- resolveStream() {
615
- this.setStream(this.nextCalled === 1 ? this.god.stream : null);
616
- }
617
- setResponse(response) {
618
- if (this.hasSetResponse) {
619
- if (macroCondition(getGlobalConfig().WarpDrive.env.DEBUG)) {
620
- throw new Error(`Cannot setResponse when a response has already been set`);
621
- }
622
- return;
623
- }
624
- this.hasSetResponse = true;
625
- if (response instanceof Response) {
626
- // TODO potentially avoid cloning in prod
627
- let responseData = cloneResponseProperties(response);
628
- if (macroCondition(getGlobalConfig().WarpDrive.env.DEBUG)) {
629
- responseData = deepFreeze(responseData);
630
- }
631
- this.response = responseData;
632
- this.god.response = responseData;
633
- const sizeHint = response.headers?.get('content-length');
634
- this.stream.promise.sizeHint = sizeHint ? parseInt(sizeHint, 10) : 0;
635
- } else {
636
- this.response = response;
637
- this.god.response = response;
638
- }
639
- }
640
- }
641
- class Context {
642
- /** @internal */
643
-
644
- /** @internal */
645
678
 
646
- /** @internal */
647
-
648
- constructor(owner, isCacheHandler) {
649
- this.id = owner.requestId;
650
- this.___owner = owner;
651
- this.request = owner.enhancedRequest;
652
- this._isCacheHandler = isCacheHandler;
653
- this._finalized = false;
654
- }
655
- setStream(stream) {
656
- this.___owner.setStream(stream);
657
- }
658
- setResponse(response) {
659
- this.___owner.setResponse(response);
660
- }
661
- setIdentifier(identifier) {
662
- macroCondition(getGlobalConfig().WarpDrive.env.DEBUG) ? (test => {
663
- if (!test) {
664
- throw new Error(`setIdentifier may only be used synchronously from a CacheHandler`);
665
- }
666
- })(identifier && this._isCacheHandler && !this._finalized) : {};
667
- this.___owner.god.identifier = identifier;
668
- }
669
- get hasRequestedStream() {
670
- return this.___owner.hasRequestedStream;
671
- }
672
-
673
- /** @private */
674
- _finalize() {
675
- this._finalized = true;
676
- }
679
+ /**
680
+ * Brands the supplied object with the supplied response type.
681
+ *
682
+ * ```ts
683
+ * import type { ReactiveDataDocument } from '@warp-drive/core/reactive';
684
+ * import { withResponseType } from '@warp-drive/core/request';
685
+ * import type { User } from '#/data/user.ts'
686
+ *
687
+ * const result = await store.request(
688
+ * withResponseType<ReactiveDataDocument<User>>({ url: '/users/1' })
689
+ * );
690
+ *
691
+ * result.content.data; // will have type User
692
+ * ```
693
+ *
694
+ */
695
+ function withResponseType(obj) {
696
+ return obj;
677
697
  }
678
- export { IS_CACHE_HANDLER as I, cloneResponseProperties as a, assertValidRequest as b, createDeferred as c, getRequestResult as d, executeNextHandler as e, clearRequestResult as f, getPromiseResult as g, setPromiseResult as s, upgradePromise as u };
698
+ export { IS_CACHE_HANDLER as I, assertValidRequest as a, getRequestResult as b, cloneResponseProperties as c, clearRequestResult as d, executeNextHandler as e, createDeferred as f, getPromiseResult as g, setPromiseResult as s, upgradePromise as u, withResponseType as w };
package/dist/request.js CHANGED
@@ -1 +1 @@
1
- export { c as createDeferred, g as getPromiseResult, s as setPromiseResult } from "./context-C_7OLieY.js";
1
+ export { f as createDeferred, g as getPromiseResult, s as setPromiseResult, w as withBrand, w as withResponseType } from "./request-CN-dNlEY.js";
@@ -1,2 +1,2 @@
1
- export { C as CacheHandler, D as DISPOSE, R as RecordArrayManager, E as Signals, S as Store, k as StoreMap, _ as _clearCaches, n as _deprecatingNormalize, h as assertPrivateCapabilities, d as assertPrivateStore, b as coerceId, c as constructResource, J as consumeInternalSignal, G as createInternalMemo, l as createLegacyManyArray, q as createRequestSubscription, A as defineGate, B as defineNonEnumerableSignal, z as defineSignal, e as ensureStringId, y as entangleInitiallyStaleSignal, x as entangleSignal, f as fastPush, w as gate, K as getOrCreateInternalSignal, p as getPromiseState, t as getRequestState, g as isPrivateStore, a as isRequestKey, i as isResourceKey, m as log, o as logGroup, v as memoized, I as notifyInternalSignal, F as peekInternalSignal, r as recordIdentifierFor, j as setRecordIdentifier, u as signal, s as storeFor, H as withSignalStore } from "../index-MiSBsI57.js";
1
+ export { C as CacheHandler, D as DISPOSE, R as RecordArrayManager, E as Signals, S as Store, k as StoreMap, _ as _clearCaches, n as _deprecatingNormalize, h as assertPrivateCapabilities, d as assertPrivateStore, b as coerceId, c as constructResource, J as consumeInternalSignal, G as createInternalMemo, l as createLegacyManyArray, q as createRequestSubscription, A as defineGate, B as defineNonEnumerableSignal, z as defineSignal, e as ensureStringId, y as entangleInitiallyStaleSignal, x as entangleSignal, f as fastPush, w as gate, K as getOrCreateInternalSignal, p as getPromiseState, t as getRequestState, g as isPrivateStore, a as isRequestKey, i as isResourceKey, m as log, o as logGroup, v as memoized, I as notifyInternalSignal, F as peekInternalSignal, r as recordIdentifierFor, j as setRecordIdentifier, u as signal, s as storeFor, H as withSignalStore } from "../index-BMCk_UD5.js";
2
2
  export { A as ARRAY_SIGNAL, O as OBJECT_SIGNAL, w as waitFor } from "../configure-C3x8YXzL.js";