@opra/client 0.22.0 → 0.23.0

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.
package/browser.js CHANGED
@@ -9,7 +9,7 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
9
9
  // ../../build/client/esm/client.js
10
10
  import { lastValueFrom as lastValueFrom2, Observable as Observable2 } from "rxjs";
11
11
  import { isReadableStreamLike } from "rxjs/internal/util/isReadableStreamLike";
12
- import { DocumentFactory, HttpHeaderCodes, HttpParams, isBlob, joinPath } from "@opra/common";
12
+ import { DocumentFactory, isBlob, OpraURL as OpraURL2 } from "@opra/common";
13
13
 
14
14
  // ../../build/client/esm/client-error.js
15
15
  var ClientError = class extends Error {
@@ -29,11 +29,15 @@ var ClientError = class extends Error {
29
29
  }
30
30
  };
31
31
 
32
+ // ../../build/client/esm/collection-node.js
33
+ import { toArrayDef } from "putil-varhelpers";
34
+
32
35
  // ../../build/client/esm/constants.js
33
36
  var JSON_CONTENT_TYPE_PATTERN = /^application\/([\w-]+\+)?\bjson\b/i;
34
37
  var TEXT_CONTENT_TYPE_PATTERN = /^text\/.*$/i;
35
38
  var FORMDATA_CONTENT_TYPE_PATTERN = /^multipart\/\bform-data\b/i;
36
- var kHttpClientContext = Symbol("kContext");
39
+ var kRequest = Symbol.for("kRequest");
40
+ var kContext = Symbol.for("kContext");
37
41
 
38
42
  // ../../build/client/esm/http-request-observable.js
39
43
  import { lastValueFrom, Observable } from "rxjs";
@@ -72,24 +76,22 @@ var HttpRequest = class _HttpRequest {
72
76
  this.referrerPolicy = init?.referrerPolicy || "";
73
77
  this.signal = init?.signal || new AbortController().signal;
74
78
  this.body = init?.body;
75
- this.urlInstance = new OpraURL(init?.url);
76
- if (init?.params)
77
- this.params.appendAll(init.params);
79
+ this.parsedUrl = new OpraURL(init?.url);
80
+ if (init?.params) {
81
+ const params = new URLSearchParams(init.params);
82
+ params.forEach((v, k) => this.params.set(k, v));
83
+ }
78
84
  }
79
85
  /** Returns the URL of request as a string. */
80
86
  get url() {
81
- return this.urlInstance.href;
87
+ return this.parsedUrl;
82
88
  }
83
89
  set url(value) {
84
- this.urlInstance.parse(value);
90
+ this.parsedUrl = value;
85
91
  }
86
92
  /** Returns the searchParams of the URL as OpraURLSearchParams */
87
93
  get params() {
88
- return this.urlInstance.searchParams;
89
- }
90
- /** Returns the path part of URL as OpraURLPath */
91
- get path() {
92
- return this.urlInstance.path;
94
+ return this.parsedUrl.searchParams;
93
95
  }
94
96
  clone(...update) {
95
97
  const out = new _HttpRequest();
@@ -149,7 +151,6 @@ var HttpEventType;
149
151
  })(HttpEventType || (HttpEventType = {}));
150
152
 
151
153
  // ../../build/client/esm/http-request-observable.js
152
- var kRequest = Symbol("kRequest");
153
154
  var HttpRequestObservable = class extends Observable {
154
155
  static {
155
156
  __name(this, "HttpRequestObservable");
@@ -158,7 +159,7 @@ var HttpRequestObservable = class extends Observable {
158
159
  super((subscriber) => {
159
160
  context.send(options?.observe || HttpObserveType.Body, this[kRequest]).subscribe(subscriber);
160
161
  });
161
- this[kHttpClientContext] = context;
162
+ this[kContext] = context;
162
163
  this[kRequest] = new HttpRequest(options?.http);
163
164
  this.contentId = uid(6);
164
165
  }
@@ -175,15 +176,13 @@ var HttpRequestObservable = class extends Observable {
175
176
  return this;
176
177
  }
177
178
  async fetch(observe) {
178
- return lastValueFrom(this[kHttpClientContext].send(observe || HttpObserveType.Body, this[kRequest]));
179
+ return lastValueFrom(this[kContext].send(observe || HttpObserveType.Body, this[kRequest]));
179
180
  }
180
181
  with(cb) {
181
182
  cb(this);
182
183
  return this;
183
184
  }
184
185
  };
185
- HttpRequestObservable.kContext = kHttpClientContext;
186
- HttpRequestObservable.kRequest = kRequest;
187
186
 
188
187
  // ../../build/client/esm/collection-node.js
189
188
  var HttpCollectionNode = class {
@@ -191,105 +190,118 @@ var HttpCollectionNode = class {
191
190
  __name(this, "HttpCollectionNode");
192
191
  }
193
192
  constructor(context) {
194
- this[kHttpClientContext] = context;
193
+ this[kContext] = context;
195
194
  }
196
195
  create(data, options) {
197
- const context = this[kHttpClientContext];
196
+ const context = this[kContext];
197
+ context.operation = "create";
198
198
  const requestHost = new HttpRequestObservable(context, options);
199
- const request = requestHost[HttpRequestObservable.kRequest];
199
+ const request = requestHost[kRequest];
200
200
  request.method = "POST";
201
- request.url = context.resourceName;
201
+ request.url.resolve(context.resourceName);
202
202
  request.body = data;
203
203
  if (options?.include)
204
- request.params.set("$include", options.include);
204
+ request.params.set("$include", toArrayDef(options.include, []).join(","));
205
205
  if (options?.pick)
206
- request.params.set("$pick", options.pick);
206
+ request.params.set("$pick", toArrayDef(options.pick, []).join(","));
207
207
  if (options?.omit)
208
- request.params.set("$omit", options.omit);
208
+ request.params.set("$omit", toArrayDef(options.omit, []).join(","));
209
209
  return requestHost;
210
210
  }
211
211
  delete(id, options) {
212
- const context = this[kHttpClientContext];
212
+ if (id == null)
213
+ throw new TypeError(`'id' argument must have a value`);
214
+ const context = this[kContext];
215
+ context.operation = "delete";
213
216
  const requestHost = new HttpRequestObservable(context, options);
214
- const request = requestHost[HttpRequestObservable.kRequest];
217
+ const request = requestHost[kRequest];
215
218
  request.method = "DELETE";
216
- request.path.join({ resource: context.resourceName, key: id });
219
+ request.url.join({ resource: context.resourceName, key: id });
217
220
  return requestHost;
218
221
  }
219
222
  deleteMany(options) {
220
- const context = this[kHttpClientContext];
223
+ const context = this[kContext];
224
+ context.operation = "deleteMany";
221
225
  const requestHost = new HttpRequestObservable(context, options);
222
- const request = requestHost[HttpRequestObservable.kRequest];
226
+ const request = requestHost[kRequest];
223
227
  request.method = "DELETE";
224
- request.url = context.resourceName;
228
+ request.url.join(context.resourceName);
225
229
  if (options?.filter)
226
- request.params.set("$filter", options.filter);
230
+ request.params.set("$filter", String(options.filter));
227
231
  return requestHost;
228
232
  }
229
233
  get(id, options) {
230
- const context = this[kHttpClientContext];
234
+ if (id == null)
235
+ throw new TypeError(`'id' argument must have a value`);
236
+ const context = this[kContext];
237
+ context.operation = "get";
231
238
  const requestHost = new HttpRequestObservable(context, options);
232
- const request = requestHost[HttpRequestObservable.kRequest];
239
+ const request = requestHost[kRequest];
233
240
  request.method = "GET";
234
- request.path.join({ resource: context.resourceName, key: id });
241
+ request.url.join({ resource: context.resourceName, key: id });
235
242
  if (options?.include)
236
- request.params.set("$include", options.include);
243
+ request.params.set("$include", toArrayDef(options.include, []).join(","));
237
244
  if (options?.pick)
238
- request.params.set("$pick", options.pick);
245
+ request.params.set("$pick", toArrayDef(options.pick, []).join(","));
239
246
  if (options?.omit)
240
- request.params.set("$omit", options.omit);
247
+ request.params.set("$omit", toArrayDef(options.omit, []).join(","));
241
248
  return requestHost;
242
249
  }
243
250
  findMany(options) {
244
- const context = this[kHttpClientContext];
251
+ const context = this[kContext];
252
+ context.operation = "findMany";
245
253
  const requestHost = new HttpRequestObservable(context, options);
246
- const request = requestHost[HttpRequestObservable.kRequest];
254
+ const request = requestHost[kRequest];
247
255
  request.method = "GET";
248
- request.url = context.resourceName;
256
+ request.url.join(context.resourceName);
249
257
  if (options?.include)
250
- request.params.set("$include", options.include);
258
+ request.params.set("$include", toArrayDef(options.include, []).join(","));
251
259
  if (options?.pick)
252
- request.params.set("$pick", options.pick);
260
+ request.params.set("$pick", toArrayDef(options.pick, []).join(","));
253
261
  if (options?.omit)
254
- request.params.set("$omit", options.omit);
262
+ request.params.set("$omit", toArrayDef(options.omit, []).join(","));
255
263
  if (options?.sort)
256
- request.params.set("$sort", options.sort);
264
+ request.params.set("$sort", toArrayDef(options.sort, []).join(","));
257
265
  if (options?.filter)
258
- request.params.set("$filter", options.filter);
266
+ request.params.set("$filter", String(options.filter));
259
267
  if (options?.limit != null)
260
- request.params.set("$limit", options.limit);
268
+ request.params.set("$limit", String(options.limit));
261
269
  if (options?.skip != null)
262
- request.params.set("$skip", options.skip);
270
+ request.params.set("$skip", String(options.skip));
263
271
  if (options?.count != null)
264
- request.params.set("$count", options.count);
272
+ request.params.set("$count", String(options.count));
265
273
  if (options?.distinct != null)
266
- request.params.set("$distinct", options.distinct);
274
+ request.params.set("$distinct", String(options.distinct));
267
275
  return requestHost;
268
276
  }
269
277
  update(id, data, options) {
270
- const context = this[kHttpClientContext];
278
+ if (id == null)
279
+ throw new TypeError(`'id' argument must have a value`);
280
+ const context = this[kContext];
281
+ context.operation = "update";
271
282
  const requestHost = new HttpRequestObservable(context, options);
272
- const request = requestHost[HttpRequestObservable.kRequest];
283
+ const request = requestHost[kRequest];
273
284
  request.method = "PATCH";
274
- request.path.join({ resource: context.resourceName, key: id });
285
+ request.url.join({ resource: context.resourceName, key: id });
275
286
  request.body = data;
276
287
  if (options?.include)
277
- request.params.set("$include", options.include);
288
+ request.params.set("$include", String(options.include));
278
289
  if (options?.pick)
279
- request.params.set("$pick", options.pick);
290
+ request.params.set("$pick", String(options.pick));
280
291
  if (options?.omit)
281
- request.params.set("$omit", options.omit);
292
+ request.params.set("$omit", String(options.omit));
282
293
  return requestHost;
283
294
  }
284
295
  updateMany(data, options) {
285
- const context = this[kHttpClientContext];
296
+ const context = this[kContext];
297
+ context.operation = "updateMany";
286
298
  const requestHost = new HttpRequestObservable(context, options);
287
- const request = requestHost[HttpRequestObservable.kRequest];
299
+ const request = requestHost[kRequest];
288
300
  request.method = "PATCH";
289
- request.url = context.resourceName;
301
+ request.url.join(context.resourceName);
290
302
  request.body = data;
291
303
  if (options?.filter)
292
- request.params.set("$filter", options.filter);
304
+ request.params.set("$filter", String(options.filter));
293
305
  return requestHost;
294
306
  }
295
307
  };
@@ -316,63 +328,68 @@ var HttpResponse = class _HttpResponse {
316
328
  };
317
329
 
318
330
  // ../../build/client/esm/singleton-node.js
331
+ import { toArrayDef as toArrayDef2 } from "putil-varhelpers";
319
332
  var HttpSingletonNode = class {
320
333
  static {
321
334
  __name(this, "HttpSingletonNode");
322
335
  }
323
336
  constructor(context) {
324
- this[kHttpClientContext] = context;
337
+ this[kContext] = context;
325
338
  }
326
339
  create(data, options) {
327
- const context = this[kHttpClientContext];
340
+ const context = this[kContext];
341
+ context.operation = "create";
328
342
  const requestHost = new HttpRequestObservable(context, options);
329
- const request = requestHost[HttpRequestObservable.kRequest];
343
+ const request = requestHost[kRequest];
330
344
  request.method = "POST";
331
- request.url = context.resourceName;
345
+ request.url.join(context.resourceName);
332
346
  request.body = data;
333
347
  if (options?.include)
334
- request.params.set("$include", options.include);
348
+ request.params.set("$include", toArrayDef2(options.include, []).join(","));
335
349
  if (options?.pick)
336
- request.params.set("$pick", options.pick);
350
+ request.params.set("$pick", toArrayDef2(options.pick, []).join(","));
337
351
  if (options?.omit)
338
- request.params.set("$omit", options.omit);
352
+ request.params.set("$omit", toArrayDef2(options.omit, []).join(","));
339
353
  return requestHost;
340
354
  }
341
355
  delete(options) {
342
- const context = this[kHttpClientContext];
356
+ const context = this[kContext];
357
+ context.operation = "delete";
343
358
  const requestHost = new HttpRequestObservable(context, options);
344
- const request = requestHost[HttpRequestObservable.kRequest];
359
+ const request = requestHost[kRequest];
345
360
  request.method = "DELETE";
346
- request.path.join({ resource: context.resourceName });
361
+ request.url.join({ resource: context.resourceName });
347
362
  return requestHost;
348
363
  }
349
364
  get(options) {
350
- const context = this[kHttpClientContext];
365
+ const context = this[kContext];
366
+ context.operation = "get";
351
367
  const requestHost = new HttpRequestObservable(context, options);
352
- const request = requestHost[HttpRequestObservable.kRequest];
368
+ const request = requestHost[kRequest];
353
369
  request.method = "GET";
354
- request.path.join({ resource: context.resourceName });
370
+ request.url.join({ resource: context.resourceName });
355
371
  if (options?.include)
356
- request.params.set("$include", options.include);
372
+ request.params.set("$include", toArrayDef2(options.include, []).join(","));
357
373
  if (options?.pick)
358
- request.params.set("$pick", options.pick);
374
+ request.params.set("$pick", toArrayDef2(options.pick, []).join(","));
359
375
  if (options?.omit)
360
- request.params.set("$omit", options.omit);
376
+ request.params.set("$omit", toArrayDef2(options.omit, []).join(","));
361
377
  return requestHost;
362
378
  }
363
379
  update(data, options) {
364
- const context = this[kHttpClientContext];
380
+ const context = this[kContext];
381
+ context.operation = "update";
365
382
  const requestHost = new HttpRequestObservable(context, options);
366
- const request = requestHost[HttpRequestObservable.kRequest];
383
+ const request = requestHost[kRequest];
367
384
  request.method = "PATCH";
368
- request.path.join({ resource: context.resourceName });
385
+ request.url.join({ resource: context.resourceName });
369
386
  request.body = data;
370
387
  if (options?.include)
371
- request.params.set("$include", options.include);
388
+ request.params.set("$include", toArrayDef2(options.include, []).join(","));
372
389
  if (options?.pick)
373
- request.params.set("$pick", options.pick);
390
+ request.params.set("$pick", toArrayDef2(options.pick, []).join(","));
374
391
  if (options?.omit)
375
- request.params.set("$omit", options.omit);
392
+ request.params.set("$omit", toArrayDef2(options.omit, []).join(","));
376
393
  return requestHost;
377
394
  }
378
395
  };
@@ -396,7 +413,7 @@ var OpraHttpClient = class {
396
413
  this.defaults = {
397
414
  ...options?.defaults,
398
415
  headers: options?.defaults?.headers instanceof Headers ? options?.defaults?.headers : new Headers(options?.defaults?.headers),
399
- params: options?.defaults?.params instanceof HttpParams ? options?.defaults?.params : new HttpParams(options?.defaults?.params)
416
+ params: options?.defaults?.params instanceof URLSearchParams ? options?.defaults?.params : new URLSearchParams(options?.defaults?.params)
400
417
  };
401
418
  }
402
419
  get serviceUrl() {
@@ -409,7 +426,7 @@ var OpraHttpClient = class {
409
426
  if (promise) {
410
427
  return promise;
411
428
  }
412
- this[kAssets].metadataPromise = promise = lastValueFrom2(this._sendRequest(HttpObserveType.Body, new HttpRequest({
429
+ this[kAssets].metadataPromise = promise = lastValueFrom2(this._sendRequest("Singleton", "get", HttpObserveType.Body, new HttpRequest({
413
430
  method: "GET",
414
431
  url: "$metadata",
415
432
  headers: new Headers({ "accept": "application/json" })
@@ -419,7 +436,7 @@ var OpraHttpClient = class {
419
436
  this[kAssets].api = api;
420
437
  return api;
421
438
  }).catch((e) => {
422
- e.message = "Unable to fetch metadata from " + this.serviceUrl + ". " + e.message;
439
+ e.message = "Unable to fetch metadata from service url (" + this.serviceUrl + "). " + e.message;
423
440
  throw e;
424
441
  }).finally(() => delete this[kAssets].metadataPromise);
425
442
  }
@@ -432,8 +449,10 @@ var OpraHttpClient = class {
432
449
  resourceName = resourceName.name;
433
450
  const ctx = {
434
451
  client: this,
452
+ resourceKind: "Collection",
453
+ operation: "",
435
454
  resourceName,
436
- send: (observe, request) => this._sendRequest(observe, request, ctx),
455
+ send: (observe, request) => this._sendRequest("Collection", ctx.operation, observe, request, ctx),
437
456
  // requestInterceptors: [
438
457
  // // Validate resource exists and is a collection resource
439
458
  // async () => {
@@ -450,8 +469,10 @@ var OpraHttpClient = class {
450
469
  resourceName = resourceName.name;
451
470
  const ctx = {
452
471
  client: this,
472
+ resourceKind: "Singleton",
473
+ operation: "",
453
474
  resourceName,
454
- send: (observe, request) => this._sendRequest(observe, request, ctx),
475
+ send: (observe, request) => this._sendRequest("Singleton", ctx.operation, observe, request, ctx),
455
476
  // requestInterceptors: [
456
477
  // // Validate resource exists and is a singleton resource
457
478
  // async () => {
@@ -463,11 +484,11 @@ var OpraHttpClient = class {
463
484
  };
464
485
  return new HttpSingletonNode(ctx);
465
486
  }
466
- _sendRequest(observe, request, ctx) {
487
+ _sendRequest(resourceKind, operation, observe, request, ctx) {
467
488
  return new Observable2((subscriber) => {
468
489
  (async () => {
469
490
  request.inset(this.defaults);
470
- const url = request.url.includes("://") ? request.url : joinPath(this.serviceUrl, request.url);
491
+ const url = new OpraURL2(request.url, this.serviceUrl);
471
492
  let body;
472
493
  if (request.body) {
473
494
  let contentType;
@@ -515,8 +536,8 @@ var OpraHttpClient = class {
515
536
  request,
516
537
  event: HttpEventType.Sent
517
538
  });
518
- const response = await this._fetch(url, request);
519
- await this._handleResponse(observe, subscriber, request, response);
539
+ const response = await this._fetch(url.toString(), request);
540
+ await this._handleResponse(resourceKind, operation, observe, subscriber, request, response, ctx);
520
541
  })().catch((error) => subscriber.error(error));
521
542
  });
522
543
  }
@@ -526,7 +547,7 @@ var OpraHttpClient = class {
526
547
  _createResponse(init) {
527
548
  return new HttpResponse(init);
528
549
  }
529
- async _handleResponse(observe, subscriber, request, fetchResponse, ctx) {
550
+ async _handleResponse(resourceKind, operation, observe, subscriber, request, fetchResponse, ctx) {
530
551
  const headers = fetchResponse.headers;
531
552
  if (observe === HttpObserveType.Events) {
532
553
  const response2 = this._createResponse({
@@ -544,11 +565,13 @@ var OpraHttpClient = class {
544
565
  });
545
566
  }
546
567
  let body;
568
+ let totalCount;
547
569
  if (fetchResponse.body) {
548
570
  if (JSON_CONTENT_TYPE_PATTERN.test(headers.get("Content-Type") || "")) {
549
571
  body = await fetchResponse.json();
550
572
  if (typeof body === "string")
551
573
  body = JSON.parse(body);
574
+ totalCount = body.totalCount;
552
575
  } else if (TEXT_CONTENT_TYPE_PATTERN.test(headers.get("Content-Type") || ""))
553
576
  body = await fetchResponse.text();
554
577
  else if (FORMDATA_CONTENT_TYPE_PATTERN.test(headers.get("Content-Type") || ""))
@@ -575,8 +598,8 @@ var OpraHttpClient = class {
575
598
  statusText: fetchResponse.statusText,
576
599
  body
577
600
  };
578
- if (fetchResponse.headers.has(HttpHeaderCodes.X_Total_Count))
579
- responseInit.totalCount = parseInt(fetchResponse.headers.get(HttpHeaderCodes.X_Total_Count), 10);
601
+ if (totalCount != null)
602
+ responseInit.totalCount = totalCount;
580
603
  const response = this._createResponse(responseInit);
581
604
  if (ctx) {
582
605
  const responseInterceptors = [
@@ -588,7 +611,10 @@ var OpraHttpClient = class {
588
611
  }
589
612
  }
590
613
  if (observe === HttpObserveType.Body) {
591
- subscriber.next(body);
614
+ if ((resourceKind === "Collection" || resourceKind === "Singleton") && (operation === "create" || operation === "get" || operation === "findMany" || operation === "update"))
615
+ subscriber.next(body.data);
616
+ else
617
+ subscriber.next(body);
592
618
  } else {
593
619
  if (observe === HttpObserveType.Events)
594
620
  subscriber.next({
package/cjs/client.js CHANGED
@@ -27,8 +27,8 @@ class OpraHttpClient {
27
27
  ...options?.defaults,
28
28
  headers: options?.defaults?.headers instanceof Headers
29
29
  ? options?.defaults?.headers : new Headers(options?.defaults?.headers),
30
- params: options?.defaults?.params instanceof common_1.HttpParams
31
- ? options?.defaults?.params : new common_1.HttpParams(options?.defaults?.params)
30
+ params: options?.defaults?.params instanceof URLSearchParams
31
+ ? options?.defaults?.params : new URLSearchParams(options?.defaults?.params)
32
32
  };
33
33
  }
34
34
  get serviceUrl() {
@@ -41,7 +41,7 @@ class OpraHttpClient {
41
41
  if (promise) {
42
42
  return promise;
43
43
  }
44
- this[kAssets].metadataPromise = promise = (0, rxjs_1.lastValueFrom)(this._sendRequest(types_js_1.HttpObserveType.Body, new http_request_js_1.HttpRequest({
44
+ this[kAssets].metadataPromise = promise = (0, rxjs_1.lastValueFrom)(this._sendRequest('Singleton', 'get', types_js_1.HttpObserveType.Body, new http_request_js_1.HttpRequest({
45
45
  method: 'GET',
46
46
  url: '$metadata',
47
47
  headers: new Headers({ 'accept': 'application/json' })
@@ -53,7 +53,7 @@ class OpraHttpClient {
53
53
  return api;
54
54
  })
55
55
  .catch((e) => {
56
- e.message = 'Unable to fetch metadata from ' + this.serviceUrl + '. ' + e.message;
56
+ e.message = 'Unable to fetch metadata from service url (' + this.serviceUrl + '). ' + e.message;
57
57
  throw e;
58
58
  })
59
59
  .finally(() => delete this[kAssets].metadataPromise);
@@ -68,8 +68,10 @@ class OpraHttpClient {
68
68
  resourceName = resourceName.name;
69
69
  const ctx = {
70
70
  client: this,
71
+ resourceKind: 'Collection',
72
+ operation: '',
71
73
  resourceName,
72
- send: (observe, request) => this._sendRequest(observe, request, ctx),
74
+ send: (observe, request) => this._sendRequest('Collection', ctx.operation, observe, request, ctx),
73
75
  // requestInterceptors: [
74
76
  // // Validate resource exists and is a collection resource
75
77
  // async () => {
@@ -87,8 +89,10 @@ class OpraHttpClient {
87
89
  resourceName = resourceName.name;
88
90
  const ctx = {
89
91
  client: this,
92
+ resourceKind: 'Singleton',
93
+ operation: '',
90
94
  resourceName,
91
- send: (observe, request) => this._sendRequest(observe, request, ctx),
95
+ send: (observe, request) => this._sendRequest('Singleton', ctx.operation, observe, request, ctx),
92
96
  // requestInterceptors: [
93
97
  // // Validate resource exists and is a singleton resource
94
98
  // async () => {
@@ -100,11 +104,11 @@ class OpraHttpClient {
100
104
  };
101
105
  return new singleton_node_js_1.HttpSingletonNode(ctx);
102
106
  }
103
- _sendRequest(observe, request, ctx) {
107
+ _sendRequest(resourceKind, operation, observe, request, ctx) {
104
108
  return new rxjs_1.Observable(subscriber => {
105
109
  (async () => {
106
110
  request.inset(this.defaults);
107
- const url = request.url.includes('://') ? request.url : (0, common_1.joinPath)(this.serviceUrl, request.url);
111
+ const url = new common_1.OpraURL(request.url, this.serviceUrl);
108
112
  let body;
109
113
  if (request.body) {
110
114
  let contentType;
@@ -156,8 +160,8 @@ class OpraHttpClient {
156
160
  request,
157
161
  event: types_js_1.HttpEventType.Sent,
158
162
  });
159
- const response = await this._fetch(url, request);
160
- await this._handleResponse(observe, subscriber, request, response);
163
+ const response = await this._fetch(url.toString(), request);
164
+ await this._handleResponse(resourceKind, operation, observe, subscriber, request, response, ctx);
161
165
  })().catch(error => subscriber.error(error));
162
166
  });
163
167
  }
@@ -167,7 +171,7 @@ class OpraHttpClient {
167
171
  _createResponse(init) {
168
172
  return new http_response_js_1.HttpResponse(init);
169
173
  }
170
- async _handleResponse(observe, subscriber, request, fetchResponse, ctx) {
174
+ async _handleResponse(resourceKind, operation, observe, subscriber, request, fetchResponse, ctx) {
171
175
  const headers = fetchResponse.headers;
172
176
  if (observe === types_js_1.HttpObserveType.Events) {
173
177
  const response = this._createResponse({
@@ -185,11 +189,13 @@ class OpraHttpClient {
185
189
  });
186
190
  }
187
191
  let body;
192
+ let totalCount;
188
193
  if (fetchResponse.body) {
189
194
  if (constants_js_1.JSON_CONTENT_TYPE_PATTERN.test(headers.get('Content-Type') || '')) {
190
195
  body = await fetchResponse.json();
191
196
  if (typeof body === 'string')
192
197
  body = JSON.parse(body);
198
+ totalCount = body.totalCount;
193
199
  }
194
200
  else if (constants_js_1.TEXT_CONTENT_TYPE_PATTERN.test(headers.get('Content-Type') || ''))
195
201
  body = await fetchResponse.text();
@@ -217,8 +223,8 @@ class OpraHttpClient {
217
223
  statusText: fetchResponse.statusText,
218
224
  body
219
225
  };
220
- if (fetchResponse.headers.has(common_1.HttpHeaderCodes.X_Total_Count))
221
- responseInit.totalCount = parseInt(fetchResponse.headers.get(common_1.HttpHeaderCodes.X_Total_Count), 10);
226
+ if (totalCount != null)
227
+ responseInit.totalCount = totalCount;
222
228
  const response = this._createResponse(responseInit);
223
229
  if (ctx) {
224
230
  const responseInterceptors = [
@@ -230,7 +236,11 @@ class OpraHttpClient {
230
236
  }
231
237
  }
232
238
  if (observe === types_js_1.HttpObserveType.Body) {
233
- subscriber.next(body);
239
+ if ((resourceKind === 'Collection' || resourceKind === 'Singleton') &&
240
+ (operation === 'create' || operation === 'get' || operation === 'findMany' || operation === 'update'))
241
+ subscriber.next(body.data);
242
+ else
243
+ subscriber.next(body);
234
244
  }
235
245
  else {
236
246
  if (observe === types_js_1.HttpObserveType.Events)