@rest-vir/define-service 1.0.0 → 1.2.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.
@@ -5,7 +5,7 @@ import { type CommonWebSocket } from '../web-socket/common-web-socket.js';
5
5
  import { type ClientWebSocket, type GenericConnectWebSocketParams } from '../web-socket/overwrite-web-socket-methods.js';
6
6
  import { type GenericWebSocketDefinition } from '../web-socket/web-socket-definition.js';
7
7
  import { type CollapsedConnectWebSocketParams } from './connect-web-socket.js';
8
- import { type CollapsedFetchEndpointParams, type FetchEndpointOutput, type GenericFetchEndpointParams } from './fetch-endpoint.js';
8
+ import { buildEndpointUrl, type CollapsedFetchEndpointParams, type FetchEndpointOutput, type GenericFetchEndpointParams } from './fetch-endpoint.js';
9
9
  /**
10
10
  * An API generated by {@link generateApi}. This can be easily mocked by wrapping this API in
11
11
  * {@link makeMockApi}.
@@ -23,6 +23,7 @@ export declare class RestVirApi<SpecificService extends ServiceDefinition> {
23
23
  [EndpointPath in keyof SpecificService['endpoints']]: SpecificService['endpoints'][EndpointPath] extends GenericEndpointDefinition ? SpecificService['endpoints'][EndpointPath] & {
24
24
  /** Send a fetch request to this endpoint. */
25
25
  fetch(...params: CollapsedFetchEndpointParams<SpecificService['endpoints'][EndpointPath]>): Promise<FetchEndpointOutput<SpecificService['endpoints'][EndpointPath]>>;
26
+ buildUrl(params: Parameters<typeof buildEndpointUrl<SpecificService['endpoints'][EndpointPath]>>[1]): string;
26
27
  } : never;
27
28
  };
28
29
  /**
@@ -1,6 +1,6 @@
1
1
  import { mapObjectValues, } from '@augment-vir/common';
2
2
  import { connectWebSocket } from './connect-web-socket.js';
3
- import { fetchEndpoint, } from './fetch-endpoint.js';
3
+ import { buildEndpointUrl, fetchEndpoint, } from './fetch-endpoint.js';
4
4
  /**
5
5
  * An API generated by {@link generateApi}. This can be easily mocked by wrapping this API in
6
6
  * {@link makeMockApi}.
@@ -46,6 +46,9 @@ export class RestVirApi {
46
46
  ...params[0],
47
47
  });
48
48
  },
49
+ buildUrl(params) {
50
+ return buildEndpointUrl(endpointDefinition, params);
51
+ },
49
52
  };
50
53
  });
51
54
  this.webSockets = mapObjectValues(service.webSockets, (webSocketPath, webSocketDefinition) => {
@@ -25,7 +25,7 @@ url) {
25
25
  else {
26
26
  return {
27
27
  ...(endpointPath ? { endpointPath } : {}),
28
- ...(webSocketPath ? { webSocketPath: webSocketPath } : {}),
28
+ ...(webSocketPath ? { webSocketPath } : {}),
29
29
  };
30
30
  }
31
31
  }
@@ -0,0 +1,38 @@
1
+ import { type IncomingHttpHeaders, type OutgoingHttpHeaders } from 'node:http';
2
+ /**
3
+ * Allowed header types for header manipulation utilities:
4
+ *
5
+ * - {@link mergeHeaders}
6
+ * - {@link consolidateHeaders}
7
+ * - {@link headersToObject}
8
+ *
9
+ * @category Internal
10
+ * @category Package : @rest-vir/define-service
11
+ * @package [`@rest-vir/define-service`](https://www.npmjs.com/package/@rest-vir/define-service)
12
+ */
13
+ export type AllowedHeaders = HeadersInit | Record<string, string | string[]> | [string, string | string[]][] | IncomingHttpHeaders | OutgoingHttpHeaders;
14
+ /**
15
+ * Merges multiple headers containers into a single `Headers` instance.
16
+ *
17
+ * @category Internal
18
+ * @category Package : @rest-vir/define-service
19
+ * @package [`@rest-vir/define-service`](https://www.npmjs.com/package/@rest-vir/define-service)
20
+ */
21
+ export declare function mergeHeaders(...headers: AllowedHeaders[]): Headers;
22
+ /**
23
+ * Consolidate the headers input of whatever valid headers container into a `Headers` instance.
24
+ *
25
+ * @category Internal
26
+ * @category Package : @rest-vir/define-service
27
+ * @package [`@rest-vir/define-service`](https://www.npmjs.com/package/@rest-vir/define-service)
28
+ */
29
+ export declare function consolidateHeaders(headers: AllowedHeaders): Headers;
30
+ /**
31
+ * Consolidate the headers input of whatever valid headers container into an object of header
32
+ * values.
33
+ *
34
+ * @category Internal
35
+ * @category Package : @rest-vir/define-service
36
+ * @package [`@rest-vir/define-service`](https://www.npmjs.com/package/@rest-vir/define-service)
37
+ */
38
+ export declare function headersToObject(headers: AllowedHeaders): Record<string, string | string[]>;
@@ -0,0 +1,73 @@
1
+ import { check } from '@augment-vir/assert';
2
+ /**
3
+ * Merges multiple headers containers into a single `Headers` instance.
4
+ *
5
+ * @category Internal
6
+ * @category Package : @rest-vir/define-service
7
+ * @package [`@rest-vir/define-service`](https://www.npmjs.com/package/@rest-vir/define-service)
8
+ */
9
+ export function mergeHeaders(...headers) {
10
+ const finalHeaders = new Headers();
11
+ headers.forEach((headersInit) => {
12
+ const consolidatedHeadersInit = consolidateHeaders(headersInit);
13
+ Array.from(consolidatedHeadersInit.entries()).forEach(([key, value,]) => {
14
+ finalHeaders.append(key, value);
15
+ });
16
+ });
17
+ return finalHeaders;
18
+ }
19
+ /**
20
+ * Consolidate the headers input of whatever valid headers container into a `Headers` instance.
21
+ *
22
+ * @category Internal
23
+ * @category Package : @rest-vir/define-service
24
+ * @package [`@rest-vir/define-service`](https://www.npmjs.com/package/@rest-vir/define-service)
25
+ */
26
+ export function consolidateHeaders(headers) {
27
+ const newHeaders = new Headers();
28
+ const headersArray = headers instanceof Headers
29
+ ? Array.from(headers.entries())
30
+ : check.isArray(headers)
31
+ ? headers
32
+ : Object.entries(headers);
33
+ headersArray.forEach(([key, value,]) => {
34
+ if (value == undefined) {
35
+ return;
36
+ }
37
+ if (check.isArray(value)) {
38
+ value.forEach((innerValue) => newHeaders.append(key, innerValue));
39
+ }
40
+ else {
41
+ newHeaders.append(key, String(value));
42
+ }
43
+ });
44
+ return newHeaders;
45
+ }
46
+ /**
47
+ * Consolidate the headers input of whatever valid headers container into an object of header
48
+ * values.
49
+ *
50
+ * @category Internal
51
+ * @category Package : @rest-vir/define-service
52
+ * @package [`@rest-vir/define-service`](https://www.npmjs.com/package/@rest-vir/define-service)
53
+ */
54
+ export function headersToObject(headers) {
55
+ const consolidatedHeaders = consolidateHeaders(headers);
56
+ const headersObject = {};
57
+ Array.from(consolidatedHeaders.entries()).forEach(([key, value,]) => {
58
+ const existingValue = headersObject[key];
59
+ if (existingValue == undefined) {
60
+ headersObject[key] = value;
61
+ }
62
+ else if (check.isArray(existingValue)) {
63
+ existingValue.push(value);
64
+ }
65
+ else {
66
+ headersObject[key] = [
67
+ existingValue,
68
+ value,
69
+ ];
70
+ }
71
+ });
72
+ return headersObject;
73
+ }
@@ -43,7 +43,7 @@ export type MockResponseParams = Overwrite<Partial<Pick<Response, 'redirected' |
43
43
  * @category Package : @rest-vir/define-service
44
44
  * @package [`@rest-vir/define-service`](https://www.npmjs.com/package/@rest-vir/define-service)
45
45
  */
46
- export declare class MockResponseBodyStream extends ReadableStream<Uint8Array> {
46
+ export declare class MockResponseBodyStream extends ReadableStream<Uint8Array<ArrayBuffer>> {
47
47
  private getReaderCalled;
48
48
  constructor(body: unknown, getReaderCalled: () => void);
49
49
  getReader(...args: any): any;
@@ -60,6 +60,10 @@ export declare const originRequirementShape: import("object-shape-tester").Shape
60
60
  * - `boolean`: the origin was explicitly checked and passed (`true`) or failed (`false`)
61
61
  * - `undefined`: no origin checking occurred
62
62
  * - `AnyOrigin`: requirements explicitly allow any origin.
63
+ *
64
+ * @category Internal
65
+ * @category Package : @rest-vir/define-service
66
+ * @package [`@rest-vir/define-service`](https://www.npmjs.com/package/@rest-vir/define-service)
63
67
  */
64
68
  export type OriginRequirementResult = boolean | undefined | AnyOrigin;
65
69
  /**
@@ -133,6 +133,7 @@ export function overwriteWebSocketMethods(webSocketDefinition, rawWebSocket, web
133
133
  send(message) {
134
134
  originalSend.call(webSocket,
135
135
  /** The extra `String()` wrapper is to convert `undefined` into `'undefined'`. */
136
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-conversion
136
137
  String(JSON.stringify(verifyWebSocketMessage(webSocketDefinition, message, webSocketLocation))));
137
138
  },
138
139
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rest-vir/define-service",
3
- "version": "1.0.0",
3
+ "version": "1.2.0",
4
4
  "description": "Define an connect to a declarative and type safe REST and WebSocket service.",
5
5
  "keywords": [
6
6
  "rest",
@@ -40,14 +40,14 @@
40
40
  "test:update": "npm test update"
41
41
  },
42
42
  "dependencies": {
43
- "@augment-vir/assert": "^31.28.0",
44
- "@augment-vir/common": "^31.28.0",
43
+ "@augment-vir/assert": "^31.32.2",
44
+ "@augment-vir/common": "^31.32.2",
45
45
  "date-vir": "^7.4.0",
46
46
  "type-fest": "^4.41.0",
47
47
  "url-vir": "^2.1.3"
48
48
  },
49
49
  "devDependencies": {
50
- "@augment-vir/test": "^31.28.0",
50
+ "@augment-vir/test": "^31.32.2",
51
51
  "@web/dev-server-esbuild": "^1.0.4",
52
52
  "@web/test-runner": "^0.20.2",
53
53
  "@web/test-runner-commands": "^0.9.0",
@@ -56,7 +56,7 @@
56
56
  "istanbul-smart-text-reporter": "^1.1.5",
57
57
  "markdown-code-example-inserter": "^3.0.3",
58
58
  "object-shape-tester": "^5.3.0",
59
- "typedoc": "^0.28.8",
59
+ "typedoc": "^0.28.10",
60
60
  "ws": "^8.18.3"
61
61
  },
62
62
  "peerDependencies": {