fets 0.2.6 → 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/cjs/Response.js CHANGED
@@ -6,26 +6,28 @@ exports.LAZY_SERIALIZED_RESPONSE = Symbol('LAZY_SERIALIZED_RESPONSE');
6
6
  const defaultSerializer = obj => JSON.stringify(obj);
7
7
  exports.defaultSerializer = defaultSerializer;
8
8
  function isLazySerializedResponse(response) {
9
- return response != null && response[exports.LAZY_SERIALIZED_RESPONSE];
9
+ return response[exports.LAZY_SERIALIZED_RESPONSE];
10
10
  }
11
11
  exports.isLazySerializedResponse = isLazySerializedResponse;
12
12
  function isHeadersLike(headers) {
13
- return headers.get && headers.forEach;
13
+ return headers?.get && headers?.forEach;
14
14
  }
15
+ const JSON_CONTENT_TYPE = 'application/json; charset=utf-8';
15
16
  function getHeadersFromHeadersInit(init) {
16
17
  let headers;
17
- if (init != null && isHeadersLike(init)) {
18
+ if (isHeadersLike(init)) {
18
19
  headers = init;
19
20
  }
20
21
  else {
21
22
  headers = new fetch_1.Headers(init);
22
23
  }
23
- headers.set('content-type', 'application/json; charset=utf-8');
24
+ if (!headers.has('content-type')) {
25
+ headers.set('content-type', JSON_CONTENT_TYPE);
26
+ }
24
27
  return headers;
25
28
  }
26
29
  function createLazySerializedResponse(jsonObj, init = {}) {
27
30
  let actualResponse;
28
- let _serializerSet = false;
29
31
  let headers;
30
32
  function getHeaders() {
31
33
  if (headers == null) {
@@ -40,17 +42,13 @@ function createLazySerializedResponse(jsonObj, init = {}) {
40
42
  },
41
43
  [exports.LAZY_SERIALIZED_RESPONSE]: true,
42
44
  init,
43
- get serializerSet() {
44
- return _serializerSet;
45
- },
46
45
  resolveWithSerializer(serializer) {
47
46
  const serialized = serializer(jsonObj);
48
- _serializerSet = true;
49
47
  init.headers = getHeaders();
50
48
  actualResponse = new fetch_1.Response(serialized, init);
51
49
  },
52
- async json() {
53
- return jsonObj;
50
+ json() {
51
+ return Promise.resolve(jsonObj);
54
52
  },
55
53
  get status() {
56
54
  return (init?.status || 200);
@@ -105,20 +105,19 @@ function createRouterBase({ fetchAPI: givenFetchAPI, base: basePath = '/', plugi
105
105
  });
106
106
  for (const handler of handlers) {
107
107
  const handlerResult = await handler(routerRequest, context);
108
- if ((0, Response_js_1.isLazySerializedResponse)(handlerResult)) {
109
- for (const onSerializeResponseHook of onSerializeResponseHooks) {
110
- onSerializeResponseHook({
111
- request: routerRequest,
112
- lazyResponse: handlerResult,
113
- serverContext: context,
114
- });
115
- }
116
- if (!handlerResult.serializerSet) {
117
- return fetchAPI.Response.json(handlerResult.jsonObj, handlerResult.init);
108
+ if (handlerResult) {
109
+ if ((0, Response_js_1.isLazySerializedResponse)(handlerResult)) {
110
+ for (const onSerializeResponseHook of onSerializeResponseHooks) {
111
+ onSerializeResponseHook({
112
+ request: routerRequest,
113
+ path: pattern.pathname,
114
+ lazyResponse: handlerResult,
115
+ serverContext: context,
116
+ });
117
+ }
118
+ return (handlerResult.actualResponse ||
119
+ fetchAPI.Response.json(handlerResult.jsonObj, handlerResult.init));
118
120
  }
119
- return handlerResult.actualResponse;
120
- }
121
- else if (handlerResult) {
122
121
  return handlerResult;
123
122
  }
124
123
  }
@@ -53,9 +53,9 @@ function useAjv({ components = {}, } = {}) {
53
53
  return date instanceof Date;
54
54
  },
55
55
  });
56
- const serializersByCtx = new WeakMap();
56
+ const serializersByPath = new Map();
57
57
  return {
58
- onRoute({ schemas, handlers }) {
58
+ onRoute({ path, schemas, handlers }) {
59
59
  const validationMiddlewares = new Map();
60
60
  if (schemas?.request?.headers && !(0, types_js_1.isZodSchema)(schemas.request.headers)) {
61
61
  const validateFn = ajv.compile({
@@ -172,9 +172,7 @@ function useAjv({ components = {}, } = {}) {
172
172
  serializerByStatusCode.set(Number(statusCode), serializer);
173
173
  }
174
174
  }
175
- handlers.unshift((_request, ctx) => {
176
- serializersByCtx.set(ctx, serializerByStatusCode);
177
- });
175
+ serializersByPath.set(path, serializerByStatusCode);
178
176
  }
179
177
  if (validationMiddlewares.size > 0) {
180
178
  handlers.unshift(async (request) => {
@@ -201,8 +199,8 @@ function useAjv({ components = {}, } = {}) {
201
199
  });
202
200
  }
203
201
  },
204
- onSerializeResponse({ serverContext, lazyResponse }) {
205
- const serializers = serializersByCtx.get(serverContext);
202
+ onSerializeResponse({ path, lazyResponse }) {
203
+ const serializers = serializersByPath.get(path);
206
204
  if (serializers) {
207
205
  const serializer = serializers.get(lazyResponse.init?.status || 200);
208
206
  if (serializer) {
package/esm/Response.js CHANGED
@@ -2,25 +2,27 @@ import { Headers, Response as OriginalResponse } from '@whatwg-node/fetch';
2
2
  export const LAZY_SERIALIZED_RESPONSE = Symbol('LAZY_SERIALIZED_RESPONSE');
3
3
  export const defaultSerializer = obj => JSON.stringify(obj);
4
4
  export function isLazySerializedResponse(response) {
5
- return response != null && response[LAZY_SERIALIZED_RESPONSE];
5
+ return response[LAZY_SERIALIZED_RESPONSE];
6
6
  }
7
7
  function isHeadersLike(headers) {
8
- return headers.get && headers.forEach;
8
+ return headers?.get && headers?.forEach;
9
9
  }
10
+ const JSON_CONTENT_TYPE = 'application/json; charset=utf-8';
10
11
  function getHeadersFromHeadersInit(init) {
11
12
  let headers;
12
- if (init != null && isHeadersLike(init)) {
13
+ if (isHeadersLike(init)) {
13
14
  headers = init;
14
15
  }
15
16
  else {
16
17
  headers = new Headers(init);
17
18
  }
18
- headers.set('content-type', 'application/json; charset=utf-8');
19
+ if (!headers.has('content-type')) {
20
+ headers.set('content-type', JSON_CONTENT_TYPE);
21
+ }
19
22
  return headers;
20
23
  }
21
24
  export function createLazySerializedResponse(jsonObj, init = {}) {
22
25
  let actualResponse;
23
- let _serializerSet = false;
24
26
  let headers;
25
27
  function getHeaders() {
26
28
  if (headers == null) {
@@ -35,17 +37,13 @@ export function createLazySerializedResponse(jsonObj, init = {}) {
35
37
  },
36
38
  [LAZY_SERIALIZED_RESPONSE]: true,
37
39
  init,
38
- get serializerSet() {
39
- return _serializerSet;
40
- },
41
40
  resolveWithSerializer(serializer) {
42
41
  const serialized = serializer(jsonObj);
43
- _serializerSet = true;
44
42
  init.headers = getHeaders();
45
43
  actualResponse = new OriginalResponse(serialized, init);
46
44
  },
47
- async json() {
48
- return jsonObj;
45
+ json() {
46
+ return Promise.resolve(jsonObj);
49
47
  },
50
48
  get status() {
51
49
  return (init?.status || 200);
@@ -101,20 +101,19 @@ export function createRouterBase({ fetchAPI: givenFetchAPI, base: basePath = '/'
101
101
  });
102
102
  for (const handler of handlers) {
103
103
  const handlerResult = await handler(routerRequest, context);
104
- if (isLazySerializedResponse(handlerResult)) {
105
- for (const onSerializeResponseHook of onSerializeResponseHooks) {
106
- onSerializeResponseHook({
107
- request: routerRequest,
108
- lazyResponse: handlerResult,
109
- serverContext: context,
110
- });
111
- }
112
- if (!handlerResult.serializerSet) {
113
- return fetchAPI.Response.json(handlerResult.jsonObj, handlerResult.init);
104
+ if (handlerResult) {
105
+ if (isLazySerializedResponse(handlerResult)) {
106
+ for (const onSerializeResponseHook of onSerializeResponseHooks) {
107
+ onSerializeResponseHook({
108
+ request: routerRequest,
109
+ path: pattern.pathname,
110
+ lazyResponse: handlerResult,
111
+ serverContext: context,
112
+ });
113
+ }
114
+ return (handlerResult.actualResponse ||
115
+ fetchAPI.Response.json(handlerResult.jsonObj, handlerResult.init));
114
116
  }
115
- return handlerResult.actualResponse;
116
- }
117
- else if (handlerResult) {
118
117
  return handlerResult;
119
118
  }
120
119
  }
@@ -49,9 +49,9 @@ export function useAjv({ components = {}, } = {}) {
49
49
  return date instanceof Date;
50
50
  },
51
51
  });
52
- const serializersByCtx = new WeakMap();
52
+ const serializersByPath = new Map();
53
53
  return {
54
- onRoute({ schemas, handlers }) {
54
+ onRoute({ path, schemas, handlers }) {
55
55
  const validationMiddlewares = new Map();
56
56
  if (schemas?.request?.headers && !isZodSchema(schemas.request.headers)) {
57
57
  const validateFn = ajv.compile({
@@ -168,9 +168,7 @@ export function useAjv({ components = {}, } = {}) {
168
168
  serializerByStatusCode.set(Number(statusCode), serializer);
169
169
  }
170
170
  }
171
- handlers.unshift((_request, ctx) => {
172
- serializersByCtx.set(ctx, serializerByStatusCode);
173
- });
171
+ serializersByPath.set(path, serializerByStatusCode);
174
172
  }
175
173
  if (validationMiddlewares.size > 0) {
176
174
  handlers.unshift(async (request) => {
@@ -197,8 +195,8 @@ export function useAjv({ components = {}, } = {}) {
197
195
  });
198
196
  }
199
197
  },
200
- onSerializeResponse({ serverContext, lazyResponse }) {
201
- const serializers = serializersByCtx.get(serverContext);
198
+ onSerializeResponse({ path, lazyResponse }) {
199
+ const serializers = serializersByPath.get(path);
202
200
  if (serializers) {
203
201
  const serializer = serializers.get(lazyResponse.init?.status || 200);
204
202
  if (serializer) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fets",
3
- "version": "0.2.6",
3
+ "version": "0.2.7",
4
4
  "description": "TypeScript HTTP Framework focusing on e2e type-safety, easy setup, performance & great developer experience",
5
5
  "sideEffects": false,
6
6
  "dependencies": {
@@ -6,7 +6,6 @@ export interface LazySerializedResponse {
6
6
  [LAZY_SERIALIZED_RESPONSE]: true;
7
7
  resolveWithSerializer(serializer: JSONSerializer): void;
8
8
  init?: ResponseInit;
9
- serializerSet: boolean;
10
9
  actualResponse: Response;
11
10
  jsonObj: any;
12
11
  json: () => Promise<any>;
@@ -6,7 +6,6 @@ export interface LazySerializedResponse {
6
6
  [LAZY_SERIALIZED_RESPONSE]: true;
7
7
  resolveWithSerializer(serializer: JSONSerializer): void;
8
8
  init?: ResponseInit;
9
- serializerSet: boolean;
10
9
  actualResponse: Response;
11
10
  jsonObj: any;
12
11
  json: () => Promise<any>;
@@ -133,6 +133,7 @@ export type OnRouteHookPayload<TServerContext> = {
133
133
  export type OnRouterInitHook<TServerContext> = (router: Router<TServerContext, any, any>) => void;
134
134
  export type OnSerializeResponsePayload<TServerContext> = {
135
135
  request: TypedRequest;
136
+ path: string;
136
137
  serverContext: TServerContext;
137
138
  lazyResponse: LazySerializedResponse;
138
139
  };
@@ -133,6 +133,7 @@ export type OnRouteHookPayload<TServerContext> = {
133
133
  export type OnRouterInitHook<TServerContext> = (router: Router<TServerContext, any, any>) => void;
134
134
  export type OnSerializeResponsePayload<TServerContext> = {
135
135
  request: TypedRequest;
136
+ path: string;
136
137
  serverContext: TServerContext;
137
138
  lazyResponse: LazySerializedResponse;
138
139
  };