@warp-drive/core 5.8.0-alpha.3 → 5.8.0-alpha.30

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 (65) hide show
  1. package/README.md +22 -38
  2. package/declarations/build-config.d.ts +18 -1
  3. package/declarations/graph/-private/-edge-definition.d.ts +12 -2
  4. package/declarations/index.d.ts +82 -3
  5. package/declarations/reactive/-private/document.d.ts +58 -46
  6. package/declarations/reactive/-private/record.d.ts +10 -1
  7. package/declarations/reactive/-private/schema.d.ts +77 -4
  8. package/declarations/reactive/-private.d.ts +1 -0
  9. package/declarations/reactive.d.ts +13 -7
  10. package/declarations/request/-private/types.d.ts +1 -1
  11. package/declarations/request.d.ts +47 -0
  12. package/declarations/store/-private/caches/instance-cache.d.ts +4 -5
  13. package/declarations/store/-private/default-cache-policy.d.ts +147 -129
  14. package/declarations/store/-private/managers/cache-capabilities-manager.d.ts +1 -1
  15. package/declarations/store/-private/managers/cache-key-manager.d.ts +26 -8
  16. package/declarations/store/-private/managers/cache-manager.d.ts +6 -4
  17. package/declarations/store/-private/managers/notification-manager.d.ts +1 -1
  18. package/declarations/store/-private/new-core-tmp/promise-state.d.ts +1 -0
  19. package/declarations/store/-private/new-core-tmp/request-state.d.ts +1 -1
  20. package/declarations/store/-private/store-service.d.ts +43 -64
  21. package/declarations/store/-private.d.ts +0 -1
  22. package/declarations/store/-types/q/cache-capabilities-manager.d.ts +1 -1
  23. package/declarations/store/deprecated/store.d.ts +33 -32
  24. package/declarations/store.d.ts +1 -0
  25. package/declarations/types/cache.d.ts +8 -6
  26. package/declarations/types/record.d.ts +132 -0
  27. package/declarations/types/request.d.ts +26 -14
  28. package/declarations/types/schema/fields.d.ts +30 -6
  29. package/declarations/{store/-types/q → types/schema}/schema-service.d.ts +11 -9
  30. package/declarations/types/spec/document.d.ts +34 -0
  31. package/declarations/types/symbols.d.ts +2 -2
  32. package/declarations/types.d.ts +1 -1
  33. package/dist/build-config.js +1 -1
  34. package/dist/default-cache-policy-D7_u4YRH.js +572 -0
  35. package/dist/graph/-private.js +13 -4
  36. package/dist/{request-state-CUuZzgvE.js → index-CHrZ1B2X.js} +10081 -8924
  37. package/dist/index.js +6 -382
  38. package/dist/reactive.js +4 -778
  39. package/dist/{context-C_7OLieY.js → request-oqoLC9rz.js} +219 -172
  40. package/dist/request.js +1 -1
  41. package/dist/store/-private.js +1 -1
  42. package/dist/store.js +1 -533
  43. package/dist/types/-private.js +1 -1
  44. package/dist/types/record.js +127 -0
  45. package/dist/types/request.js +14 -12
  46. package/dist/types/schema/fields.js +14 -0
  47. package/dist/types/schema/schema-service.js +0 -0
  48. package/dist/types/symbols.js +2 -2
  49. package/logos/README.md +2 -2
  50. package/logos/logo-yellow-slab.svg +1 -0
  51. package/logos/word-mark-black.svg +1 -0
  52. package/logos/word-mark-white.svg +1 -0
  53. package/package.json +3 -3
  54. package/logos/NCC-1701-a-blue.svg +0 -4
  55. package/logos/NCC-1701-a-gold.svg +0 -4
  56. package/logos/NCC-1701-a-gold_100.svg +0 -1
  57. package/logos/NCC-1701-a-gold_base-64.txt +0 -1
  58. package/logos/NCC-1701-a.svg +0 -4
  59. package/logos/docs-badge.svg +0 -2
  60. package/logos/ember-data-logo-dark.svg +0 -12
  61. package/logos/ember-data-logo-light.svg +0 -12
  62. package/logos/social1.png +0 -0
  63. package/logos/social2.png +0 -0
  64. package/logos/warp-drive-logo-dark.svg +0 -4
  65. package/logos/warp-drive-logo-gold.svg +0 -4
@@ -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,51 @@ 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
-
646
- /** @internal */
647
678
 
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
- }
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;
697
+ }
672
698
 
673
- /** @private */
674
- _finalize() {
675
- this._finalized = true;
676
- }
699
+ /**
700
+ * Brands the supplied object with the supplied response type
701
+ * wrapped in {@link ReactiveDataDocument}. This is a convenience for
702
+ * the common case of using {@link withResponseType} with `ReactiveDataDocument`.
703
+ *
704
+ * ```ts
705
+ * import { withReactiveResponse } from '@warp-drive/core/request';
706
+ * import type { User } from '#/data/user.ts'
707
+ *
708
+ * const result = await store.request(
709
+ * withReactiveResponse<User>({ url: '/users/1' })
710
+ * );
711
+ *
712
+ * result.content.data; // will have type User
713
+ * ```
714
+ *
715
+ * @public
716
+ */
717
+ function withReactiveResponse(obj) {
718
+ return obj;
677
719
  }
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 };
720
+
721
+ /**
722
+ * @deprecated use {@link withResponseType} instead
723
+ */
724
+ const withBrand = withResponseType;
725
+ export { IS_CACHE_HANDLER as I, assertValidRequest as a, getRequestResult as b, cloneResponseProperties as c, clearRequestResult as d, executeNextHandler as e, withResponseType as f, getPromiseResult as g, withReactiveResponse as h, createDeferred as i, setPromiseResult as s, upgradePromise as u, withBrand 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 { i as createDeferred, g as getPromiseResult, s as setPromiseResult, w as withBrand, h as withReactiveResponse, f as withResponseType } from "./request-oqoLC9rz.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 "../request-state-CUuZzgvE.js";
1
+ export { C as CacheHandler, D as DISPOSE, R as RecordArrayManager, B 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, I as consumeInternalSignal, F as createInternalMemo, l as createLegacyManyArray, p as createRequestSubscription, z as defineGate, A as defineNonEnumerableSignal, y as defineSignal, e as ensureStringId, x as entangleInitiallyStaleSignal, w as entangleSignal, f as fastPush, v as gate, J as getOrCreateInternalSignal, q as getRequestState, g as isPrivateStore, a as isRequestKey, i as isResourceKey, m as log, o as logGroup, u as memoized, H as notifyInternalSignal, E as peekInternalSignal, r as recordIdentifierFor, j as setRecordIdentifier, t as signal, s as storeFor, G as withSignalStore } from "../index-CHrZ1B2X.js";
2
2
  export { A as ARRAY_SIGNAL, O as OBJECT_SIGNAL, w as waitFor } from "../configure-C3x8YXzL.js";