@opra/client 0.23.2 → 0.24.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
@@ -33,6 +33,7 @@ var ClientError = class extends Error {
33
33
  import { toArrayDef } from "putil-varhelpers";
34
34
 
35
35
  // ../../build/client/esm/constants.js
36
+ var OPRA_JSON_CONTENT_TYPE_PATTERN = /^application\/\bopra\+json\b/i;
36
37
  var JSON_CONTENT_TYPE_PATTERN = /^application\/([\w-]+\+)?\bjson\b/i;
37
38
  var TEXT_CONTENT_TYPE_PATTERN = /^text\/.*$/i;
38
39
  var FORMDATA_CONTENT_TYPE_PATTERN = /^multipart\/\bform-data\b/i;
@@ -194,11 +195,11 @@ var HttpCollectionNode = class {
194
195
  }
195
196
  create(data, options) {
196
197
  const context = this[kContext];
197
- context.operation = "create";
198
+ context.endpoint = "create";
198
199
  const requestHost = new HttpRequestObservable(context, options);
199
200
  const request = requestHost[kRequest];
200
201
  request.method = "POST";
201
- request.url.resolve(context.resourceName);
202
+ request.url.resolve(context.resource);
202
203
  request.body = data;
203
204
  if (options?.include)
204
205
  request.params.set("$include", toArrayDef(options.include, []).join(","));
@@ -212,20 +213,20 @@ var HttpCollectionNode = class {
212
213
  if (id == null)
213
214
  throw new TypeError(`'id' argument must have a value`);
214
215
  const context = this[kContext];
215
- context.operation = "delete";
216
+ context.endpoint = "delete";
216
217
  const requestHost = new HttpRequestObservable(context, options);
217
218
  const request = requestHost[kRequest];
218
219
  request.method = "DELETE";
219
- request.url.join({ resource: context.resourceName, key: id });
220
+ request.url.join({ resource: context.resource, key: id });
220
221
  return requestHost;
221
222
  }
222
223
  deleteMany(options) {
223
224
  const context = this[kContext];
224
- context.operation = "deleteMany";
225
+ context.endpoint = "deleteMany";
225
226
  const requestHost = new HttpRequestObservable(context, options);
226
227
  const request = requestHost[kRequest];
227
228
  request.method = "DELETE";
228
- request.url.join(context.resourceName);
229
+ request.url.join(context.resource);
229
230
  if (options?.filter)
230
231
  request.params.set("$filter", String(options.filter));
231
232
  return requestHost;
@@ -234,11 +235,11 @@ var HttpCollectionNode = class {
234
235
  if (id == null)
235
236
  throw new TypeError(`'id' argument must have a value`);
236
237
  const context = this[kContext];
237
- context.operation = "get";
238
+ context.endpoint = "get";
238
239
  const requestHost = new HttpRequestObservable(context, options);
239
240
  const request = requestHost[kRequest];
240
241
  request.method = "GET";
241
- request.url.join({ resource: context.resourceName, key: id });
242
+ request.url.join({ resource: context.resource, key: id });
242
243
  if (options?.include)
243
244
  request.params.set("$include", toArrayDef(options.include, []).join(","));
244
245
  if (options?.pick)
@@ -249,11 +250,11 @@ var HttpCollectionNode = class {
249
250
  }
250
251
  findMany(options) {
251
252
  const context = this[kContext];
252
- context.operation = "findMany";
253
+ context.endpoint = "findMany";
253
254
  const requestHost = new HttpRequestObservable(context, options);
254
255
  const request = requestHost[kRequest];
255
256
  request.method = "GET";
256
- request.url.join(context.resourceName);
257
+ request.url.join(context.resource);
257
258
  if (options?.include)
258
259
  request.params.set("$include", toArrayDef(options.include, []).join(","));
259
260
  if (options?.pick)
@@ -278,11 +279,11 @@ var HttpCollectionNode = class {
278
279
  if (id == null)
279
280
  throw new TypeError(`'id' argument must have a value`);
280
281
  const context = this[kContext];
281
- context.operation = "update";
282
+ context.endpoint = "update";
282
283
  const requestHost = new HttpRequestObservable(context, options);
283
284
  const request = requestHost[kRequest];
284
285
  request.method = "PATCH";
285
- request.url.join({ resource: context.resourceName, key: id });
286
+ request.url.join({ resource: context.resource, key: id });
286
287
  request.body = data;
287
288
  if (options?.include)
288
289
  request.params.set("$include", String(options.include));
@@ -294,11 +295,11 @@ var HttpCollectionNode = class {
294
295
  }
295
296
  updateMany(data, options) {
296
297
  const context = this[kContext];
297
- context.operation = "updateMany";
298
+ context.endpoint = "updateMany";
298
299
  const requestHost = new HttpRequestObservable(context, options);
299
300
  const request = requestHost[kRequest];
300
301
  request.method = "PATCH";
301
- request.url.join(context.resourceName);
302
+ request.url.join(context.resource);
302
303
  request.body = data;
303
304
  if (options?.filter)
304
305
  request.params.set("$filter", String(options.filter));
@@ -338,11 +339,11 @@ var HttpSingletonNode = class {
338
339
  }
339
340
  create(data, options) {
340
341
  const context = this[kContext];
341
- context.operation = "create";
342
+ context.endpoint = "create";
342
343
  const requestHost = new HttpRequestObservable(context, options);
343
344
  const request = requestHost[kRequest];
344
345
  request.method = "POST";
345
- request.url.join(context.resourceName);
346
+ request.url.join(context.resource);
346
347
  request.body = data;
347
348
  if (options?.include)
348
349
  request.params.set("$include", toArrayDef2(options.include, []).join(","));
@@ -354,20 +355,20 @@ var HttpSingletonNode = class {
354
355
  }
355
356
  delete(options) {
356
357
  const context = this[kContext];
357
- context.operation = "delete";
358
+ context.endpoint = "delete";
358
359
  const requestHost = new HttpRequestObservable(context, options);
359
360
  const request = requestHost[kRequest];
360
361
  request.method = "DELETE";
361
- request.url.join({ resource: context.resourceName });
362
+ request.url.join({ resource: context.resource });
362
363
  return requestHost;
363
364
  }
364
365
  get(options) {
365
366
  const context = this[kContext];
366
- context.operation = "get";
367
+ context.endpoint = "get";
367
368
  const requestHost = new HttpRequestObservable(context, options);
368
369
  const request = requestHost[kRequest];
369
370
  request.method = "GET";
370
- request.url.join({ resource: context.resourceName });
371
+ request.url.join({ resource: context.resource });
371
372
  if (options?.include)
372
373
  request.params.set("$include", toArrayDef2(options.include, []).join(","));
373
374
  if (options?.pick)
@@ -378,11 +379,11 @@ var HttpSingletonNode = class {
378
379
  }
379
380
  update(data, options) {
380
381
  const context = this[kContext];
381
- context.operation = "update";
382
+ context.endpoint = "update";
382
383
  const requestHost = new HttpRequestObservable(context, options);
383
384
  const request = requestHost[kRequest];
384
385
  request.method = "PATCH";
385
- request.url.join({ resource: context.resourceName });
386
+ request.url.join({ resource: context.resource });
386
387
  request.body = data;
387
388
  if (options?.include)
388
389
  request.params.set("$include", toArrayDef2(options.include, []).join(","));
@@ -426,12 +427,14 @@ var OpraHttpClient = class {
426
427
  if (promise) {
427
428
  return promise;
428
429
  }
429
- this[kAssets].metadataPromise = promise = lastValueFrom2(this._sendRequest("Singleton", "get", HttpObserveType.Body, new HttpRequest({
430
+ this[kAssets].metadataPromise = promise = lastValueFrom2(this._sendRequest(HttpObserveType.Body, new HttpRequest({
430
431
  method: "GET",
431
- url: "$metadata",
432
+ url: "",
432
433
  headers: new Headers({ "accept": "application/json" })
433
434
  })));
434
435
  return await promise.then(async (body) => {
436
+ if (!body)
437
+ throw new Error(`No response returned.`);
435
438
  const api = await DocumentFactory.createDocument(body);
436
439
  this[kAssets].api = api;
437
440
  return api;
@@ -449,42 +452,42 @@ var OpraHttpClient = class {
449
452
  resourceName = resourceName.name;
450
453
  const ctx = {
451
454
  client: this,
452
- resourceKind: "Collection",
453
- operation: "",
454
- resourceName,
455
- send: (observe, request) => this._sendRequest("Collection", ctx.operation, observe, request, ctx),
455
+ sourceKind: "Collection",
456
+ endpoint: "",
457
+ resource: resourceName,
458
+ send: (observe, request) => this._sendRequest(observe, request, "Collection", ctx.endpoint, ctx),
456
459
  // requestInterceptors: [
457
460
  // // Validate resource exists and is a collection resource
458
461
  // async () => {
459
462
  // const metadata = await this.getMetadata();
460
- // metadata.getCollection(ctx.resourceName);
463
+ // metadata.getCollection(ctx.sourceName);
461
464
  // }
462
465
  // ],
463
466
  responseInterceptors: []
464
467
  };
465
468
  return new HttpCollectionNode(ctx);
466
469
  }
467
- singleton(resourceName) {
468
- if (typeof resourceName === "function")
469
- resourceName = resourceName.name;
470
+ singleton(sourceName) {
471
+ if (typeof sourceName === "function")
472
+ sourceName = sourceName.name;
470
473
  const ctx = {
471
474
  client: this,
472
- resourceKind: "Singleton",
473
- operation: "",
474
- resourceName,
475
- send: (observe, request) => this._sendRequest("Singleton", ctx.operation, observe, request, ctx),
475
+ sourceKind: "Singleton",
476
+ endpoint: "",
477
+ resource: sourceName,
478
+ send: (observe, request) => this._sendRequest(observe, request, "Singleton", ctx.endpoint, ctx),
476
479
  // requestInterceptors: [
477
480
  // // Validate resource exists and is a singleton resource
478
481
  // async () => {
479
482
  // const metadata = await this.getMetadata();
480
- // metadata.getSingleton(ctx.resourceName);
483
+ // metadata.getSingleton(ctx.sourceName);
481
484
  // }
482
485
  // ],
483
486
  responseInterceptors: []
484
487
  };
485
488
  return new HttpSingletonNode(ctx);
486
489
  }
487
- _sendRequest(resourceKind, operation, observe, request, ctx) {
490
+ _sendRequest(observe, request, sourceKind, endpoint, ctx) {
488
491
  return new Observable2((subscriber) => {
489
492
  (async () => {
490
493
  request.inset(this.defaults);
@@ -537,7 +540,7 @@ var OpraHttpClient = class {
537
540
  event: HttpEventType.Sent
538
541
  });
539
542
  const response = await this._fetch(url.toString(), request);
540
- await this._handleResponse(resourceKind, operation, observe, subscriber, request, response, ctx);
543
+ await this._handleResponse(observe, subscriber, request, response, sourceKind, endpoint, ctx);
541
544
  })().catch((error) => subscriber.error(error));
542
545
  });
543
546
  }
@@ -547,7 +550,7 @@ var OpraHttpClient = class {
547
550
  _createResponse(init) {
548
551
  return new HttpResponse(init);
549
552
  }
550
- async _handleResponse(resourceKind, operation, observe, subscriber, request, fetchResponse, ctx) {
553
+ async _handleResponse(observe, subscriber, request, fetchResponse, sourceKind, endpoint, ctx) {
551
554
  const headers = fetchResponse.headers;
552
555
  if (observe === HttpObserveType.Events) {
553
556
  const response2 = this._createResponse({
@@ -566,12 +569,17 @@ var OpraHttpClient = class {
566
569
  }
567
570
  let body;
568
571
  let totalCount;
572
+ let affected;
573
+ const contentType = headers.get("Content-Type") || "";
569
574
  if (fetchResponse.body) {
570
- if (JSON_CONTENT_TYPE_PATTERN.test(headers.get("Content-Type") || "")) {
575
+ if (JSON_CONTENT_TYPE_PATTERN.test(contentType)) {
571
576
  body = await fetchResponse.json();
572
577
  if (typeof body === "string")
573
578
  body = JSON.parse(body);
574
- totalCount = body.totalCount;
579
+ if (OPRA_JSON_CONTENT_TYPE_PATTERN.test(contentType)) {
580
+ totalCount = body.totalCount;
581
+ affected = body.affected;
582
+ }
575
583
  } else if (TEXT_CONTENT_TYPE_PATTERN.test(headers.get("Content-Type") || ""))
576
584
  body = await fetchResponse.text();
577
585
  else if (FORMDATA_CONTENT_TYPE_PATTERN.test(headers.get("Content-Type") || ""))
@@ -600,6 +608,8 @@ var OpraHttpClient = class {
600
608
  };
601
609
  if (totalCount != null)
602
610
  responseInit.totalCount = totalCount;
611
+ if (affected != null)
612
+ responseInit.affected = affected;
603
613
  const response = this._createResponse(responseInit);
604
614
  if (ctx) {
605
615
  const responseInterceptors = [
@@ -611,7 +621,7 @@ var OpraHttpClient = class {
611
621
  }
612
622
  }
613
623
  if (observe === HttpObserveType.Body) {
614
- if ((resourceKind === "Collection" || resourceKind === "Singleton") && (operation === "create" || operation === "get" || operation === "findMany" || operation === "update"))
624
+ if (OPRA_JSON_CONTENT_TYPE_PATTERN.test(contentType))
615
625
  subscriber.next(body.data);
616
626
  else
617
627
  subscriber.next(body);
package/cjs/client.js CHANGED
@@ -41,13 +41,15 @@ class OpraHttpClient {
41
41
  if (promise) {
42
42
  return promise;
43
43
  }
44
- this[kAssets].metadataPromise = promise = (0, rxjs_1.lastValueFrom)(this._sendRequest('Singleton', 'get', types_js_1.HttpObserveType.Body, new http_request_js_1.HttpRequest({
44
+ this[kAssets].metadataPromise = promise = (0, rxjs_1.lastValueFrom)(this._sendRequest(types_js_1.HttpObserveType.Body, new http_request_js_1.HttpRequest({
45
45
  method: 'GET',
46
- url: '$metadata',
46
+ url: '',
47
47
  headers: new Headers({ 'accept': 'application/json' })
48
48
  })));
49
49
  return await promise
50
50
  .then(async (body) => {
51
+ if (!body)
52
+ throw new Error(`No response returned.`);
51
53
  const api = await common_1.DocumentFactory.createDocument(body);
52
54
  this[kAssets].api = api;
53
55
  return api;
@@ -68,43 +70,43 @@ class OpraHttpClient {
68
70
  resourceName = resourceName.name;
69
71
  const ctx = {
70
72
  client: this,
71
- resourceKind: 'Collection',
72
- operation: '',
73
- resourceName,
74
- send: (observe, request) => this._sendRequest('Collection', ctx.operation, observe, request, ctx),
73
+ sourceKind: 'Collection',
74
+ endpoint: '',
75
+ resource: resourceName,
76
+ send: (observe, request) => this._sendRequest(observe, request, 'Collection', ctx.endpoint, ctx),
75
77
  // requestInterceptors: [
76
78
  // // Validate resource exists and is a collection resource
77
79
  // async () => {
78
80
  // const metadata = await this.getMetadata();
79
- // metadata.getCollection(ctx.resourceName);
81
+ // metadata.getCollection(ctx.sourceName);
80
82
  // }
81
83
  // ],
82
84
  responseInterceptors: []
83
85
  };
84
86
  return new collection_node_js_1.HttpCollectionNode(ctx);
85
87
  }
86
- singleton(resourceName) {
88
+ singleton(sourceName) {
87
89
  // If name argument is a class, we extract name from the class
88
- if (typeof resourceName === 'function')
89
- resourceName = resourceName.name;
90
+ if (typeof sourceName === 'function')
91
+ sourceName = sourceName.name;
90
92
  const ctx = {
91
93
  client: this,
92
- resourceKind: 'Singleton',
93
- operation: '',
94
- resourceName,
95
- send: (observe, request) => this._sendRequest('Singleton', ctx.operation, observe, request, ctx),
94
+ sourceKind: 'Singleton',
95
+ endpoint: '',
96
+ resource: sourceName,
97
+ send: (observe, request) => this._sendRequest(observe, request, 'Singleton', ctx.endpoint, ctx),
96
98
  // requestInterceptors: [
97
99
  // // Validate resource exists and is a singleton resource
98
100
  // async () => {
99
101
  // const metadata = await this.getMetadata();
100
- // metadata.getSingleton(ctx.resourceName);
102
+ // metadata.getSingleton(ctx.sourceName);
101
103
  // }
102
104
  // ],
103
105
  responseInterceptors: []
104
106
  };
105
107
  return new singleton_node_js_1.HttpSingletonNode(ctx);
106
108
  }
107
- _sendRequest(resourceKind, operation, observe, request, ctx) {
109
+ _sendRequest(observe, request, sourceKind, endpoint, ctx) {
108
110
  return new rxjs_1.Observable(subscriber => {
109
111
  (async () => {
110
112
  request.inset(this.defaults);
@@ -161,7 +163,7 @@ class OpraHttpClient {
161
163
  event: types_js_1.HttpEventType.Sent,
162
164
  });
163
165
  const response = await this._fetch(url.toString(), request);
164
- await this._handleResponse(resourceKind, operation, observe, subscriber, request, response, ctx);
166
+ await this._handleResponse(observe, subscriber, request, response, sourceKind, endpoint, ctx);
165
167
  })().catch(error => subscriber.error(error));
166
168
  });
167
169
  }
@@ -171,7 +173,7 @@ class OpraHttpClient {
171
173
  _createResponse(init) {
172
174
  return new http_response_js_1.HttpResponse(init);
173
175
  }
174
- async _handleResponse(resourceKind, operation, observe, subscriber, request, fetchResponse, ctx) {
176
+ async _handleResponse(observe, subscriber, request, fetchResponse, sourceKind, endpoint, ctx) {
175
177
  const headers = fetchResponse.headers;
176
178
  if (observe === types_js_1.HttpObserveType.Events) {
177
179
  const response = this._createResponse({
@@ -190,12 +192,17 @@ class OpraHttpClient {
190
192
  }
191
193
  let body;
192
194
  let totalCount;
195
+ let affected;
196
+ const contentType = headers.get('Content-Type') || '';
193
197
  if (fetchResponse.body) {
194
- if (constants_js_1.JSON_CONTENT_TYPE_PATTERN.test(headers.get('Content-Type') || '')) {
198
+ if (constants_js_1.JSON_CONTENT_TYPE_PATTERN.test(contentType)) {
195
199
  body = await fetchResponse.json();
196
200
  if (typeof body === 'string')
197
201
  body = JSON.parse(body);
198
- totalCount = body.totalCount;
202
+ if (constants_js_1.OPRA_JSON_CONTENT_TYPE_PATTERN.test(contentType)) {
203
+ totalCount = body.totalCount;
204
+ affected = body.affected;
205
+ }
199
206
  }
200
207
  else if (constants_js_1.TEXT_CONTENT_TYPE_PATTERN.test(headers.get('Content-Type') || ''))
201
208
  body = await fetchResponse.text();
@@ -225,6 +232,8 @@ class OpraHttpClient {
225
232
  };
226
233
  if (totalCount != null)
227
234
  responseInit.totalCount = totalCount;
235
+ if (affected != null)
236
+ responseInit.affected = affected;
228
237
  const response = this._createResponse(responseInit);
229
238
  if (ctx) {
230
239
  const responseInterceptors = [
@@ -236,8 +245,7 @@ class OpraHttpClient {
236
245
  }
237
246
  }
238
247
  if (observe === types_js_1.HttpObserveType.Body) {
239
- if ((resourceKind === 'Collection' || resourceKind === 'Singleton') &&
240
- (operation === 'create' || operation === 'get' || operation === 'findMany' || operation === 'update'))
248
+ if (constants_js_1.OPRA_JSON_CONTENT_TYPE_PATTERN.test(contentType))
241
249
  subscriber.next(body.data);
242
250
  else
243
251
  subscriber.next(body);
@@ -10,11 +10,11 @@ class HttpCollectionNode {
10
10
  }
11
11
  create(data, options) {
12
12
  const context = this[constants_js_1.kContext];
13
- context.operation = 'create';
13
+ context.endpoint = 'create';
14
14
  const requestHost = new http_request_observable_js_1.HttpRequestObservable(context, options);
15
15
  const request = requestHost[constants_js_1.kRequest];
16
16
  request.method = 'POST';
17
- request.url.resolve(context.resourceName);
17
+ request.url.resolve(context.resource);
18
18
  request.body = data;
19
19
  if (options?.include)
20
20
  request.params.set('$include', (0, putil_varhelpers_1.toArrayDef)(options.include, []).join(','));
@@ -28,20 +28,20 @@ class HttpCollectionNode {
28
28
  if (id == null)
29
29
  throw new TypeError(`'id' argument must have a value`);
30
30
  const context = this[constants_js_1.kContext];
31
- context.operation = 'delete';
31
+ context.endpoint = 'delete';
32
32
  const requestHost = new http_request_observable_js_1.HttpRequestObservable(context, options);
33
33
  const request = requestHost[constants_js_1.kRequest];
34
34
  request.method = 'DELETE';
35
- request.url.join({ resource: context.resourceName, key: id });
35
+ request.url.join({ resource: context.resource, key: id });
36
36
  return requestHost;
37
37
  }
38
38
  deleteMany(options) {
39
39
  const context = this[constants_js_1.kContext];
40
- context.operation = 'deleteMany';
40
+ context.endpoint = 'deleteMany';
41
41
  const requestHost = new http_request_observable_js_1.HttpRequestObservable(context, options);
42
42
  const request = requestHost[constants_js_1.kRequest];
43
43
  request.method = 'DELETE';
44
- request.url.join(context.resourceName);
44
+ request.url.join(context.resource);
45
45
  if (options?.filter)
46
46
  request.params.set('$filter', String(options.filter));
47
47
  return requestHost;
@@ -50,11 +50,11 @@ class HttpCollectionNode {
50
50
  if (id == null)
51
51
  throw new TypeError(`'id' argument must have a value`);
52
52
  const context = this[constants_js_1.kContext];
53
- context.operation = 'get';
53
+ context.endpoint = 'get';
54
54
  const requestHost = new http_request_observable_js_1.HttpRequestObservable(context, options);
55
55
  const request = requestHost[constants_js_1.kRequest];
56
56
  request.method = 'GET';
57
- request.url.join({ resource: context.resourceName, key: id });
57
+ request.url.join({ resource: context.resource, key: id });
58
58
  if (options?.include)
59
59
  request.params.set('$include', (0, putil_varhelpers_1.toArrayDef)(options.include, []).join(','));
60
60
  if (options?.pick)
@@ -65,11 +65,11 @@ class HttpCollectionNode {
65
65
  }
66
66
  findMany(options) {
67
67
  const context = this[constants_js_1.kContext];
68
- context.operation = 'findMany';
68
+ context.endpoint = 'findMany';
69
69
  const requestHost = new http_request_observable_js_1.HttpRequestObservable(context, options);
70
70
  const request = requestHost[constants_js_1.kRequest];
71
71
  request.method = 'GET';
72
- request.url.join(context.resourceName);
72
+ request.url.join(context.resource);
73
73
  if (options?.include)
74
74
  request.params.set('$include', (0, putil_varhelpers_1.toArrayDef)(options.include, []).join(','));
75
75
  if (options?.pick)
@@ -94,11 +94,11 @@ class HttpCollectionNode {
94
94
  if (id == null)
95
95
  throw new TypeError(`'id' argument must have a value`);
96
96
  const context = this[constants_js_1.kContext];
97
- context.operation = 'update';
97
+ context.endpoint = 'update';
98
98
  const requestHost = new http_request_observable_js_1.HttpRequestObservable(context, options);
99
99
  const request = requestHost[constants_js_1.kRequest];
100
100
  request.method = 'PATCH';
101
- request.url.join({ resource: context.resourceName, key: id });
101
+ request.url.join({ resource: context.resource, key: id });
102
102
  request.body = data;
103
103
  if (options?.include)
104
104
  request.params.set('$include', String(options.include));
@@ -110,11 +110,11 @@ class HttpCollectionNode {
110
110
  }
111
111
  updateMany(data, options) {
112
112
  const context = this[constants_js_1.kContext];
113
- context.operation = 'updateMany';
113
+ context.endpoint = 'updateMany';
114
114
  const requestHost = new http_request_observable_js_1.HttpRequestObservable(context, options);
115
115
  const request = requestHost[constants_js_1.kRequest];
116
116
  request.method = 'PATCH';
117
- request.url.join(context.resourceName);
117
+ request.url.join(context.resource);
118
118
  request.body = data;
119
119
  if (options?.filter)
120
120
  request.params.set('$filter', String(options.filter));
package/cjs/constants.js CHANGED
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.kContext = exports.kRequest = exports.FORMDATA_CONTENT_TYPE_PATTERN = exports.TEXT_CONTENT_TYPE_PATTERN = exports.JSON_CONTENT_TYPE_PATTERN = void 0;
3
+ exports.kContext = exports.kRequest = exports.FORMDATA_CONTENT_TYPE_PATTERN = exports.TEXT_CONTENT_TYPE_PATTERN = exports.JSON_CONTENT_TYPE_PATTERN = exports.OPRA_JSON_CONTENT_TYPE_PATTERN = void 0;
4
+ exports.OPRA_JSON_CONTENT_TYPE_PATTERN = /^application\/\bopra\+json\b/i;
4
5
  exports.JSON_CONTENT_TYPE_PATTERN = /^application\/([\w-]+\+)?\bjson\b/i;
5
6
  exports.TEXT_CONTENT_TYPE_PATTERN = /^text\/.*$/i;
6
7
  exports.FORMDATA_CONTENT_TYPE_PATTERN = /^multipart\/\bform-data\b/i;
@@ -10,11 +10,11 @@ class HttpSingletonNode {
10
10
  }
11
11
  create(data, options) {
12
12
  const context = this[constants_js_1.kContext];
13
- context.operation = 'create';
13
+ context.endpoint = 'create';
14
14
  const requestHost = new http_request_observable_js_1.HttpRequestObservable(context, options);
15
15
  const request = requestHost[constants_js_1.kRequest];
16
16
  request.method = 'POST';
17
- request.url.join(context.resourceName);
17
+ request.url.join(context.resource);
18
18
  request.body = data;
19
19
  if (options?.include)
20
20
  request.params.set('$include', (0, putil_varhelpers_1.toArrayDef)(options.include, []).join(','));
@@ -26,20 +26,20 @@ class HttpSingletonNode {
26
26
  }
27
27
  delete(options) {
28
28
  const context = this[constants_js_1.kContext];
29
- context.operation = 'delete';
29
+ context.endpoint = 'delete';
30
30
  const requestHost = new http_request_observable_js_1.HttpRequestObservable(context, options);
31
31
  const request = requestHost[constants_js_1.kRequest];
32
32
  request.method = 'DELETE';
33
- request.url.join({ resource: context.resourceName });
33
+ request.url.join({ resource: context.resource });
34
34
  return requestHost;
35
35
  }
36
36
  get(options) {
37
37
  const context = this[constants_js_1.kContext];
38
- context.operation = 'get';
38
+ context.endpoint = 'get';
39
39
  const requestHost = new http_request_observable_js_1.HttpRequestObservable(context, options);
40
40
  const request = requestHost[constants_js_1.kRequest];
41
41
  request.method = 'GET';
42
- request.url.join({ resource: context.resourceName });
42
+ request.url.join({ resource: context.resource });
43
43
  if (options?.include)
44
44
  request.params.set('$include', (0, putil_varhelpers_1.toArrayDef)(options.include, []).join(','));
45
45
  if (options?.pick)
@@ -50,11 +50,11 @@ class HttpSingletonNode {
50
50
  }
51
51
  update(data, options) {
52
52
  const context = this[constants_js_1.kContext];
53
- context.operation = 'update';
53
+ context.endpoint = 'update';
54
54
  const requestHost = new http_request_observable_js_1.HttpRequestObservable(context, options);
55
55
  const request = requestHost[constants_js_1.kRequest];
56
56
  request.method = 'PATCH';
57
- request.url.join({ resource: context.resourceName });
57
+ request.url.join({ resource: context.resource });
58
58
  request.body = data;
59
59
  if (options?.include)
60
60
  request.params.set('$include', (0, putil_varhelpers_1.toArrayDef)(options.include, []).join(','));
package/esm/client.js CHANGED
@@ -3,7 +3,7 @@ import { isReadableStreamLike } from 'rxjs/internal/util/isReadableStreamLike';
3
3
  import { DocumentFactory, isBlob, OpraURL } from '@opra/common';
4
4
  import { ClientError } from './client-error.js';
5
5
  import { HttpCollectionNode } from './collection-node.js';
6
- import { FORMDATA_CONTENT_TYPE_PATTERN, JSON_CONTENT_TYPE_PATTERN, TEXT_CONTENT_TYPE_PATTERN } from './constants.js';
6
+ import { FORMDATA_CONTENT_TYPE_PATTERN, JSON_CONTENT_TYPE_PATTERN, OPRA_JSON_CONTENT_TYPE_PATTERN, TEXT_CONTENT_TYPE_PATTERN } from './constants.js';
7
7
  import { HttpRequest } from './http-request.js';
8
8
  import { HttpResponse } from './http-response.js';
9
9
  import { HttpSingletonNode } from './singleton-node.js';
@@ -38,13 +38,15 @@ export class OpraHttpClient {
38
38
  if (promise) {
39
39
  return promise;
40
40
  }
41
- this[kAssets].metadataPromise = promise = lastValueFrom(this._sendRequest('Singleton', 'get', HttpObserveType.Body, new HttpRequest({
41
+ this[kAssets].metadataPromise = promise = lastValueFrom(this._sendRequest(HttpObserveType.Body, new HttpRequest({
42
42
  method: 'GET',
43
- url: '$metadata',
43
+ url: '',
44
44
  headers: new Headers({ 'accept': 'application/json' })
45
45
  })));
46
46
  return await promise
47
47
  .then(async (body) => {
48
+ if (!body)
49
+ throw new Error(`No response returned.`);
48
50
  const api = await DocumentFactory.createDocument(body);
49
51
  this[kAssets].api = api;
50
52
  return api;
@@ -65,43 +67,43 @@ export class OpraHttpClient {
65
67
  resourceName = resourceName.name;
66
68
  const ctx = {
67
69
  client: this,
68
- resourceKind: 'Collection',
69
- operation: '',
70
- resourceName,
71
- send: (observe, request) => this._sendRequest('Collection', ctx.operation, observe, request, ctx),
70
+ sourceKind: 'Collection',
71
+ endpoint: '',
72
+ resource: resourceName,
73
+ send: (observe, request) => this._sendRequest(observe, request, 'Collection', ctx.endpoint, ctx),
72
74
  // requestInterceptors: [
73
75
  // // Validate resource exists and is a collection resource
74
76
  // async () => {
75
77
  // const metadata = await this.getMetadata();
76
- // metadata.getCollection(ctx.resourceName);
78
+ // metadata.getCollection(ctx.sourceName);
77
79
  // }
78
80
  // ],
79
81
  responseInterceptors: []
80
82
  };
81
83
  return new HttpCollectionNode(ctx);
82
84
  }
83
- singleton(resourceName) {
85
+ singleton(sourceName) {
84
86
  // If name argument is a class, we extract name from the class
85
- if (typeof resourceName === 'function')
86
- resourceName = resourceName.name;
87
+ if (typeof sourceName === 'function')
88
+ sourceName = sourceName.name;
87
89
  const ctx = {
88
90
  client: this,
89
- resourceKind: 'Singleton',
90
- operation: '',
91
- resourceName,
92
- send: (observe, request) => this._sendRequest('Singleton', ctx.operation, observe, request, ctx),
91
+ sourceKind: 'Singleton',
92
+ endpoint: '',
93
+ resource: sourceName,
94
+ send: (observe, request) => this._sendRequest(observe, request, 'Singleton', ctx.endpoint, ctx),
93
95
  // requestInterceptors: [
94
96
  // // Validate resource exists and is a singleton resource
95
97
  // async () => {
96
98
  // const metadata = await this.getMetadata();
97
- // metadata.getSingleton(ctx.resourceName);
99
+ // metadata.getSingleton(ctx.sourceName);
98
100
  // }
99
101
  // ],
100
102
  responseInterceptors: []
101
103
  };
102
104
  return new HttpSingletonNode(ctx);
103
105
  }
104
- _sendRequest(resourceKind, operation, observe, request, ctx) {
106
+ _sendRequest(observe, request, sourceKind, endpoint, ctx) {
105
107
  return new Observable(subscriber => {
106
108
  (async () => {
107
109
  request.inset(this.defaults);
@@ -158,7 +160,7 @@ export class OpraHttpClient {
158
160
  event: HttpEventType.Sent,
159
161
  });
160
162
  const response = await this._fetch(url.toString(), request);
161
- await this._handleResponse(resourceKind, operation, observe, subscriber, request, response, ctx);
163
+ await this._handleResponse(observe, subscriber, request, response, sourceKind, endpoint, ctx);
162
164
  })().catch(error => subscriber.error(error));
163
165
  });
164
166
  }
@@ -168,7 +170,7 @@ export class OpraHttpClient {
168
170
  _createResponse(init) {
169
171
  return new HttpResponse(init);
170
172
  }
171
- async _handleResponse(resourceKind, operation, observe, subscriber, request, fetchResponse, ctx) {
173
+ async _handleResponse(observe, subscriber, request, fetchResponse, sourceKind, endpoint, ctx) {
172
174
  const headers = fetchResponse.headers;
173
175
  if (observe === HttpObserveType.Events) {
174
176
  const response = this._createResponse({
@@ -187,12 +189,17 @@ export class OpraHttpClient {
187
189
  }
188
190
  let body;
189
191
  let totalCount;
192
+ let affected;
193
+ const contentType = headers.get('Content-Type') || '';
190
194
  if (fetchResponse.body) {
191
- if (JSON_CONTENT_TYPE_PATTERN.test(headers.get('Content-Type') || '')) {
195
+ if (JSON_CONTENT_TYPE_PATTERN.test(contentType)) {
192
196
  body = await fetchResponse.json();
193
197
  if (typeof body === 'string')
194
198
  body = JSON.parse(body);
195
- totalCount = body.totalCount;
199
+ if (OPRA_JSON_CONTENT_TYPE_PATTERN.test(contentType)) {
200
+ totalCount = body.totalCount;
201
+ affected = body.affected;
202
+ }
196
203
  }
197
204
  else if (TEXT_CONTENT_TYPE_PATTERN.test(headers.get('Content-Type') || ''))
198
205
  body = await fetchResponse.text();
@@ -222,6 +229,8 @@ export class OpraHttpClient {
222
229
  };
223
230
  if (totalCount != null)
224
231
  responseInit.totalCount = totalCount;
232
+ if (affected != null)
233
+ responseInit.affected = affected;
225
234
  const response = this._createResponse(responseInit);
226
235
  if (ctx) {
227
236
  const responseInterceptors = [
@@ -233,8 +242,7 @@ export class OpraHttpClient {
233
242
  }
234
243
  }
235
244
  if (observe === HttpObserveType.Body) {
236
- if ((resourceKind === 'Collection' || resourceKind === 'Singleton') &&
237
- (operation === 'create' || operation === 'get' || operation === 'findMany' || operation === 'update'))
245
+ if (OPRA_JSON_CONTENT_TYPE_PATTERN.test(contentType))
238
246
  subscriber.next(body.data);
239
247
  else
240
248
  subscriber.next(body);
@@ -7,11 +7,11 @@ export class HttpCollectionNode {
7
7
  }
8
8
  create(data, options) {
9
9
  const context = this[kContext];
10
- context.operation = 'create';
10
+ context.endpoint = 'create';
11
11
  const requestHost = new HttpRequestObservable(context, options);
12
12
  const request = requestHost[kRequest];
13
13
  request.method = 'POST';
14
- request.url.resolve(context.resourceName);
14
+ request.url.resolve(context.resource);
15
15
  request.body = data;
16
16
  if (options?.include)
17
17
  request.params.set('$include', toArrayDef(options.include, []).join(','));
@@ -25,20 +25,20 @@ export class HttpCollectionNode {
25
25
  if (id == null)
26
26
  throw new TypeError(`'id' argument must have a value`);
27
27
  const context = this[kContext];
28
- context.operation = 'delete';
28
+ context.endpoint = 'delete';
29
29
  const requestHost = new HttpRequestObservable(context, options);
30
30
  const request = requestHost[kRequest];
31
31
  request.method = 'DELETE';
32
- request.url.join({ resource: context.resourceName, key: id });
32
+ request.url.join({ resource: context.resource, key: id });
33
33
  return requestHost;
34
34
  }
35
35
  deleteMany(options) {
36
36
  const context = this[kContext];
37
- context.operation = 'deleteMany';
37
+ context.endpoint = 'deleteMany';
38
38
  const requestHost = new HttpRequestObservable(context, options);
39
39
  const request = requestHost[kRequest];
40
40
  request.method = 'DELETE';
41
- request.url.join(context.resourceName);
41
+ request.url.join(context.resource);
42
42
  if (options?.filter)
43
43
  request.params.set('$filter', String(options.filter));
44
44
  return requestHost;
@@ -47,11 +47,11 @@ export class HttpCollectionNode {
47
47
  if (id == null)
48
48
  throw new TypeError(`'id' argument must have a value`);
49
49
  const context = this[kContext];
50
- context.operation = 'get';
50
+ context.endpoint = 'get';
51
51
  const requestHost = new HttpRequestObservable(context, options);
52
52
  const request = requestHost[kRequest];
53
53
  request.method = 'GET';
54
- request.url.join({ resource: context.resourceName, key: id });
54
+ request.url.join({ resource: context.resource, key: id });
55
55
  if (options?.include)
56
56
  request.params.set('$include', toArrayDef(options.include, []).join(','));
57
57
  if (options?.pick)
@@ -62,11 +62,11 @@ export class HttpCollectionNode {
62
62
  }
63
63
  findMany(options) {
64
64
  const context = this[kContext];
65
- context.operation = 'findMany';
65
+ context.endpoint = 'findMany';
66
66
  const requestHost = new HttpRequestObservable(context, options);
67
67
  const request = requestHost[kRequest];
68
68
  request.method = 'GET';
69
- request.url.join(context.resourceName);
69
+ request.url.join(context.resource);
70
70
  if (options?.include)
71
71
  request.params.set('$include', toArrayDef(options.include, []).join(','));
72
72
  if (options?.pick)
@@ -91,11 +91,11 @@ export class HttpCollectionNode {
91
91
  if (id == null)
92
92
  throw new TypeError(`'id' argument must have a value`);
93
93
  const context = this[kContext];
94
- context.operation = 'update';
94
+ context.endpoint = 'update';
95
95
  const requestHost = new HttpRequestObservable(context, options);
96
96
  const request = requestHost[kRequest];
97
97
  request.method = 'PATCH';
98
- request.url.join({ resource: context.resourceName, key: id });
98
+ request.url.join({ resource: context.resource, key: id });
99
99
  request.body = data;
100
100
  if (options?.include)
101
101
  request.params.set('$include', String(options.include));
@@ -107,11 +107,11 @@ export class HttpCollectionNode {
107
107
  }
108
108
  updateMany(data, options) {
109
109
  const context = this[kContext];
110
- context.operation = 'updateMany';
110
+ context.endpoint = 'updateMany';
111
111
  const requestHost = new HttpRequestObservable(context, options);
112
112
  const request = requestHost[kRequest];
113
113
  request.method = 'PATCH';
114
- request.url.join(context.resourceName);
114
+ request.url.join(context.resource);
115
115
  request.body = data;
116
116
  if (options?.filter)
117
117
  request.params.set('$filter', String(options.filter));
package/esm/constants.js CHANGED
@@ -1,3 +1,4 @@
1
+ export const OPRA_JSON_CONTENT_TYPE_PATTERN = /^application\/\bopra\+json\b/i;
1
2
  export const JSON_CONTENT_TYPE_PATTERN = /^application\/([\w-]+\+)?\bjson\b/i;
2
3
  export const TEXT_CONTENT_TYPE_PATTERN = /^text\/.*$/i;
3
4
  export const FORMDATA_CONTENT_TYPE_PATTERN = /^multipart\/\bform-data\b/i;
@@ -7,11 +7,11 @@ export class HttpSingletonNode {
7
7
  }
8
8
  create(data, options) {
9
9
  const context = this[kContext];
10
- context.operation = 'create';
10
+ context.endpoint = 'create';
11
11
  const requestHost = new HttpRequestObservable(context, options);
12
12
  const request = requestHost[kRequest];
13
13
  request.method = 'POST';
14
- request.url.join(context.resourceName);
14
+ request.url.join(context.resource);
15
15
  request.body = data;
16
16
  if (options?.include)
17
17
  request.params.set('$include', toArrayDef(options.include, []).join(','));
@@ -23,20 +23,20 @@ export class HttpSingletonNode {
23
23
  }
24
24
  delete(options) {
25
25
  const context = this[kContext];
26
- context.operation = 'delete';
26
+ context.endpoint = 'delete';
27
27
  const requestHost = new HttpRequestObservable(context, options);
28
28
  const request = requestHost[kRequest];
29
29
  request.method = 'DELETE';
30
- request.url.join({ resource: context.resourceName });
30
+ request.url.join({ resource: context.resource });
31
31
  return requestHost;
32
32
  }
33
33
  get(options) {
34
34
  const context = this[kContext];
35
- context.operation = 'get';
35
+ context.endpoint = 'get';
36
36
  const requestHost = new HttpRequestObservable(context, options);
37
37
  const request = requestHost[kRequest];
38
38
  request.method = 'GET';
39
- request.url.join({ resource: context.resourceName });
39
+ request.url.join({ resource: context.resource });
40
40
  if (options?.include)
41
41
  request.params.set('$include', toArrayDef(options.include, []).join(','));
42
42
  if (options?.pick)
@@ -47,11 +47,11 @@ export class HttpSingletonNode {
47
47
  }
48
48
  update(data, options) {
49
49
  const context = this[kContext];
50
- context.operation = 'update';
50
+ context.endpoint = 'update';
51
51
  const requestHost = new HttpRequestObservable(context, options);
52
52
  const request = requestHost[kRequest];
53
53
  request.method = 'PATCH';
54
- request.url.join({ resource: context.resourceName });
54
+ request.url.join({ resource: context.resource });
55
55
  request.body = data;
56
56
  if (options?.include)
57
57
  request.params.set('$include', toArrayDef(options.include, []).join(','));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opra/client",
3
- "version": "0.23.2",
3
+ "version": "0.24.0",
4
4
  "description": "Opra Client package",
5
5
  "author": "Panates",
6
6
  "license": "MIT",
@@ -46,7 +46,7 @@
46
46
  "@browsery/i18next": "^0.6.0",
47
47
  "@browsery/stream": "^0.5.0",
48
48
  "@browsery/util": "^0.4.0",
49
- "@opra/common": "^0.23.2",
49
+ "@opra/common": "^0.24.0",
50
50
  "accepts": "^1.3.8",
51
51
  "buffer": "^6.0.3",
52
52
  "cookie": "^0.5.0",
package/types/client.d.ts CHANGED
@@ -36,10 +36,10 @@ export declare class OpraHttpClient {
36
36
  get serviceUrl(): string;
37
37
  getMetadata(): Promise<ApiDocument>;
38
38
  collection<TType = any>(resourceName: string | Type<TType>): HttpCollectionNode<TType>;
39
- singleton<TType = any>(resourceName: string | Type<TType>): HttpSingletonNode<TType>;
40
- protected _sendRequest<TBody>(resourceKind: OpraSchema.Resource.Kind, operation: string, observe: HttpObserveType, request: HttpRequest, ctx?: HttpClientContext): Observable<HttpResponse<TBody> | TBody | HttpEvent>;
39
+ singleton<TType = any>(sourceName: string | Type<TType>): HttpSingletonNode<TType>;
40
+ protected _sendRequest<TBody>(observe: HttpObserveType, request: HttpRequest, sourceKind?: OpraSchema.Resource.Kind, endpoint?: string, ctx?: HttpClientContext): Observable<HttpResponse<TBody> | TBody | HttpEvent>;
41
41
  protected _fetch(url: string, init?: RequestInit): Promise<Response>;
42
42
  protected _createResponse(init?: HttpResponse.Initiator): HttpResponse;
43
- protected _handleResponse(resourceKind: OpraSchema.Resource.Kind, operation: string, observe: HttpObserveType, subscriber: Subscriber<any>, request: HttpRequest, fetchResponse: Response, ctx?: HttpClientContext): Promise<void>;
43
+ protected _handleResponse(observe: HttpObserveType, subscriber: Subscriber<any>, request: HttpRequest, fetchResponse: Response, sourceKind?: OpraSchema.Resource.Kind, endpoint?: string, ctx?: HttpClientContext): Promise<void>;
44
44
  }
45
45
  export {};
@@ -1,3 +1,4 @@
1
+ export declare const OPRA_JSON_CONTENT_TYPE_PATTERN: RegExp;
1
2
  export declare const JSON_CONTENT_TYPE_PATTERN: RegExp;
2
3
  export declare const TEXT_CONTENT_TYPE_PATTERN: RegExp;
3
4
  export declare const FORMDATA_CONTENT_TYPE_PATTERN: RegExp;
@@ -7,6 +7,7 @@ export declare namespace HttpResponse {
7
7
  body?: any;
8
8
  hasBody?: boolean;
9
9
  totalCount?: number;
10
+ affected?: number;
10
11
  }
11
12
  }
12
13
  export declare class HttpResponse<TBody = any> {
@@ -35,6 +36,7 @@ export declare class HttpResponse<TBody = any> {
35
36
  */
36
37
  readonly body: TBody | null;
37
38
  readonly totalCount?: number;
39
+ readonly affected?: number;
38
40
  /**
39
41
  * Returns true if response has body to be received
40
42
  */
package/types/types.d.ts CHANGED
@@ -46,9 +46,9 @@ export declare enum HttpEventType {
46
46
  }
47
47
  export interface HttpClientContext {
48
48
  client: OpraHttpClient;
49
- resourceKind: OpraSchema.Resource.Kind;
50
- resourceName: string;
51
- operation: string;
49
+ sourceKind: OpraSchema.Resource.Kind;
50
+ resource: string;
51
+ endpoint: string;
52
52
  send: HttpRequestHandler;
53
53
  requestInterceptors?: RequestInterceptor[];
54
54
  responseInterceptors?: ResponseInterceptor[];