@bleedingdev/modern-js-plugin-bff 3.4.0-ultramodern.2 → 3.4.0-ultramodern.4

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.
@@ -202,6 +202,41 @@ var __webpack_exports__ = {};
202
202
  }
203
203
  });
204
204
  }
205
+ function createJsonValidationResponse(message, status = 400) {
206
+ return new Response(JSON.stringify({
207
+ message
208
+ }), {
209
+ status,
210
+ headers: {
211
+ 'content-type': 'application/json; charset=utf-8'
212
+ }
213
+ });
214
+ }
215
+ function cloneWithoutJsonBodyHeaders(request) {
216
+ const headers = new Headers(request.headers);
217
+ headers.delete('content-type');
218
+ headers.delete('content-length');
219
+ return new Request(request.url, {
220
+ method: request.method,
221
+ headers,
222
+ signal: request.signal
223
+ });
224
+ }
225
+ async function prepareJsonRequestBody(request) {
226
+ const method = normalizeItemMethod(request.method);
227
+ if ('GET' === method || 'HEAD' === method) return request;
228
+ const contentType = (request.headers.get('content-type') || '').toLowerCase();
229
+ if (!contentType.includes('application/json')) return request;
230
+ if (null === request.body) return cloneWithoutJsonBodyHeaders(request);
231
+ try {
232
+ const bodyText = await request.clone().text();
233
+ if ('' === bodyText) return cloneWithoutJsonBodyHeaders(request);
234
+ JSON.parse(bodyText);
235
+ } catch {
236
+ return createJsonValidationResponse('Invalid JSON request body');
237
+ }
238
+ return request;
239
+ }
205
240
  function toBatchItemError(id, status, message) {
206
241
  return {
207
242
  id,
@@ -459,9 +494,11 @@ var __webpack_exports__ = {};
459
494
  const withDataPlatformValidation = async (request, context)=>{
460
495
  const policyDenial = options.validateRequest?.(request);
461
496
  if (policyDenial) return policyDenial;
462
- const validationError = validateDataPlatformRequestEnvelope(request, options.dataPlatform);
497
+ const preparedRequest = await prepareJsonRequestBody(request);
498
+ if (preparedRequest instanceof Response) return preparedRequest;
499
+ const validationError = validateDataPlatformRequestEnvelope(preparedRequest, options.dataPlatform);
463
500
  if (validationError) return validationError;
464
- return httpApiHandler.handler(request, context ?? emptyEffectServiceContext);
501
+ return httpApiHandler.handler(preparedRequest, context ?? emptyEffectServiceContext);
465
502
  };
466
503
  const handleBatchRequest = async (request, context)=>{
467
504
  const mountedPrefix = getMountedPrefixFromContext(request, context);
@@ -35,6 +35,7 @@ __webpack_require__.d(__webpack_exports__, {
35
35
  HttpApiEndpoint: ()=>httpapi_namespaceObject.HttpApiEndpoint,
36
36
  HttpApiGroup: ()=>httpapi_namespaceObject.HttpApiGroup,
37
37
  HttpApiSchema: ()=>httpapi_namespaceObject.HttpApiSchema,
38
+ HttpClientError: ()=>HttpClientError_namespaceObject,
38
39
  Layer: ()=>Layer_namespaceObject,
39
40
  Rpc: ()=>rpc_namespaceObject.Rpc,
40
41
  RpcClient: ()=>rpc_namespaceObject.RpcClient,
@@ -60,6 +61,7 @@ const http_namespaceObject = require("effect/unstable/http");
60
61
  const httpapi_namespaceObject = require("effect/unstable/httpapi");
61
62
  const rpc_namespaceObject = require("effect/unstable/rpc");
62
63
  const Schema_namespaceObject = require("effect/Schema");
64
+ const HttpClientError_namespaceObject = require("effect/unstable/http/HttpClientError");
63
65
  class EffectRpcClientError extends Data_namespaceObject.TaggedError('EffectRpcClientError') {
64
66
  }
65
67
  function isRecord(value) {
@@ -162,6 +164,7 @@ exports.HttpApiClient = __webpack_exports__.HttpApiClient;
162
164
  exports.HttpApiEndpoint = __webpack_exports__.HttpApiEndpoint;
163
165
  exports.HttpApiGroup = __webpack_exports__.HttpApiGroup;
164
166
  exports.HttpApiSchema = __webpack_exports__.HttpApiSchema;
167
+ exports.HttpClientError = __webpack_exports__.HttpClientError;
165
168
  exports.Layer = __webpack_exports__.Layer;
166
169
  exports.Rpc = __webpack_exports__.Rpc;
167
170
  exports.RpcClient = __webpack_exports__.RpcClient;
@@ -183,6 +186,7 @@ for(var __rspack_i in __webpack_exports__)if (-1 === [
183
186
  "HttpApiEndpoint",
184
187
  "HttpApiGroup",
185
188
  "HttpApiSchema",
189
+ "HttpClientError",
186
190
  "Layer",
187
191
  "Rpc",
188
192
  "RpcClient",
@@ -74,6 +74,41 @@ function createBatchValidationResponse(message, status = 400) {
74
74
  }
75
75
  });
76
76
  }
77
+ function createJsonValidationResponse(message, status = 400) {
78
+ return new Response(JSON.stringify({
79
+ message
80
+ }), {
81
+ status,
82
+ headers: {
83
+ 'content-type': 'application/json; charset=utf-8'
84
+ }
85
+ });
86
+ }
87
+ function cloneWithoutJsonBodyHeaders(request) {
88
+ const headers = new Headers(request.headers);
89
+ headers.delete('content-type');
90
+ headers.delete('content-length');
91
+ return new Request(request.url, {
92
+ method: request.method,
93
+ headers,
94
+ signal: request.signal
95
+ });
96
+ }
97
+ async function prepareJsonRequestBody(request) {
98
+ const method = normalizeItemMethod(request.method);
99
+ if ('GET' === method || 'HEAD' === method) return request;
100
+ const contentType = (request.headers.get('content-type') || '').toLowerCase();
101
+ if (!contentType.includes('application/json')) return request;
102
+ if (null === request.body) return cloneWithoutJsonBodyHeaders(request);
103
+ try {
104
+ const bodyText = await request.clone().text();
105
+ if ('' === bodyText) return cloneWithoutJsonBodyHeaders(request);
106
+ JSON.parse(bodyText);
107
+ } catch {
108
+ return createJsonValidationResponse('Invalid JSON request body');
109
+ }
110
+ return request;
111
+ }
77
112
  function toBatchItemError(id, status, message) {
78
113
  return {
79
114
  id,
@@ -331,9 +366,11 @@ function createHttpApiHandler(options) {
331
366
  const withDataPlatformValidation = async (request, context)=>{
332
367
  const policyDenial = options.validateRequest?.(request);
333
368
  if (policyDenial) return policyDenial;
334
- const validationError = validateDataPlatformRequestEnvelope(request, options.dataPlatform);
369
+ const preparedRequest = await prepareJsonRequestBody(request);
370
+ if (preparedRequest instanceof Response) return preparedRequest;
371
+ const validationError = validateDataPlatformRequestEnvelope(preparedRequest, options.dataPlatform);
335
372
  if (validationError) return validationError;
336
- return httpApiHandler.handler(request, context ?? emptyEffectServiceContext);
373
+ return httpApiHandler.handler(preparedRequest, context ?? emptyEffectServiceContext);
337
374
  };
338
375
  const handleBatchRequest = async (request, context)=>{
339
376
  const mountedPrefix = getMountedPrefixFromContext(request, context);
@@ -5,6 +5,7 @@ import { FetchHttpClient, HttpClient, HttpClientRequest } from "effect/unstable/
5
5
  import { HttpApi, HttpApiClient, HttpApiEndpoint, HttpApiGroup, HttpApiSchema } from "effect/unstable/httpapi";
6
6
  import { Rpc, RpcClient, RpcGroup, RpcSchema, RpcSerialization } from "effect/unstable/rpc";
7
7
  import * as __rspack_external_effect_Schema_f8472650 from "effect/Schema";
8
+ import * as __rspack_external_effect_unstable_http_HttpClientError_b9ead235 from "effect/unstable/http/HttpClientError";
8
9
  import * as __rspack_external_effect_Data_7c33fca9 from "effect/Data";
9
10
  import * as __rspack_external_effect_Exit_a10cfb96 from "effect/Exit";
10
11
  import * as __rspack_external_effect_ManagedRuntime_94dd2709 from "effect/ManagedRuntime";
@@ -104,4 +105,4 @@ function makeEffectRpcClient(group, options) {
104
105
  });
105
106
  }
106
107
  const runEffectRequest = __rspack_external_effect_Effect_194ac36c.runPromise;
107
- export { EffectRpcClientError, HttpApi, HttpApiClient, HttpApiEndpoint, HttpApiGroup, HttpApiSchema, Rpc, RpcClient, RpcGroup, RpcSchema, RpcSerialization, __rspack_external_effect_Effect_194ac36c as Effect, __rspack_external_effect_Layer_16f7a8fc as Layer, __rspack_external_effect_Schema_f8472650 as Schema, makeEffectHttpApiClient, makeEffectRpcClient, mask, runEffectRequest, runEffectView, view };
108
+ export { EffectRpcClientError, HttpApi, HttpApiClient, HttpApiEndpoint, HttpApiGroup, HttpApiSchema, Rpc, RpcClient, RpcGroup, RpcSchema, RpcSerialization, __rspack_external_effect_Effect_194ac36c as Effect, __rspack_external_effect_Layer_16f7a8fc as Layer, __rspack_external_effect_Schema_f8472650 as Schema, __rspack_external_effect_unstable_http_HttpClientError_b9ead235 as HttpClientError, makeEffectHttpApiClient, makeEffectRpcClient, mask, runEffectRequest, runEffectView, view };
@@ -75,6 +75,41 @@ function createBatchValidationResponse(message, status = 400) {
75
75
  }
76
76
  });
77
77
  }
78
+ function createJsonValidationResponse(message, status = 400) {
79
+ return new Response(JSON.stringify({
80
+ message
81
+ }), {
82
+ status,
83
+ headers: {
84
+ 'content-type': 'application/json; charset=utf-8'
85
+ }
86
+ });
87
+ }
88
+ function cloneWithoutJsonBodyHeaders(request) {
89
+ const headers = new Headers(request.headers);
90
+ headers.delete('content-type');
91
+ headers.delete('content-length');
92
+ return new Request(request.url, {
93
+ method: request.method,
94
+ headers,
95
+ signal: request.signal
96
+ });
97
+ }
98
+ async function prepareJsonRequestBody(request) {
99
+ const method = normalizeItemMethod(request.method);
100
+ if ('GET' === method || 'HEAD' === method) return request;
101
+ const contentType = (request.headers.get('content-type') || '').toLowerCase();
102
+ if (!contentType.includes('application/json')) return request;
103
+ if (null === request.body) return cloneWithoutJsonBodyHeaders(request);
104
+ try {
105
+ const bodyText = await request.clone().text();
106
+ if ('' === bodyText) return cloneWithoutJsonBodyHeaders(request);
107
+ JSON.parse(bodyText);
108
+ } catch {
109
+ return createJsonValidationResponse('Invalid JSON request body');
110
+ }
111
+ return request;
112
+ }
78
113
  function toBatchItemError(id, status, message) {
79
114
  return {
80
115
  id,
@@ -332,9 +367,11 @@ function createHttpApiHandler(options) {
332
367
  const withDataPlatformValidation = async (request, context)=>{
333
368
  const policyDenial = options.validateRequest?.(request);
334
369
  if (policyDenial) return policyDenial;
335
- const validationError = validateDataPlatformRequestEnvelope(request, options.dataPlatform);
370
+ const preparedRequest = await prepareJsonRequestBody(request);
371
+ if (preparedRequest instanceof Response) return preparedRequest;
372
+ const validationError = validateDataPlatformRequestEnvelope(preparedRequest, options.dataPlatform);
336
373
  if (validationError) return validationError;
337
- return httpApiHandler.handler(request, context ?? emptyEffectServiceContext);
374
+ return httpApiHandler.handler(preparedRequest, context ?? emptyEffectServiceContext);
338
375
  };
339
376
  const handleBatchRequest = async (request, context)=>{
340
377
  const mountedPrefix = getMountedPrefixFromContext(request, context);
@@ -6,6 +6,7 @@ import { FetchHttpClient, HttpClient, HttpClientRequest } from "effect/unstable/
6
6
  import { HttpApi, HttpApiClient, HttpApiEndpoint, HttpApiGroup, HttpApiSchema } from "effect/unstable/httpapi";
7
7
  import { Rpc, RpcClient, RpcGroup, RpcSchema, RpcSerialization } from "effect/unstable/rpc";
8
8
  import * as __rspack_external_effect_Schema_f8472650 from "effect/Schema";
9
+ import * as __rspack_external_effect_unstable_http_HttpClientError_b9ead235 from "effect/unstable/http/HttpClientError";
9
10
  import * as __rspack_external_effect_Data_7c33fca9 from "effect/Data";
10
11
  import * as __rspack_external_effect_Exit_a10cfb96 from "effect/Exit";
11
12
  import * as __rspack_external_effect_ManagedRuntime_94dd2709 from "effect/ManagedRuntime";
@@ -105,4 +106,4 @@ function makeEffectRpcClient(group, options) {
105
106
  });
106
107
  }
107
108
  const runEffectRequest = __rspack_external_effect_Effect_194ac36c.runPromise;
108
- export { EffectRpcClientError, HttpApi, HttpApiClient, HttpApiEndpoint, HttpApiGroup, HttpApiSchema, Rpc, RpcClient, RpcGroup, RpcSchema, RpcSerialization, __rspack_external_effect_Effect_194ac36c as Effect, __rspack_external_effect_Layer_16f7a8fc as Layer, __rspack_external_effect_Schema_f8472650 as Schema, makeEffectHttpApiClient, makeEffectRpcClient, mask, runEffectRequest, runEffectView, view };
109
+ export { EffectRpcClientError, HttpApi, HttpApiClient, HttpApiEndpoint, HttpApiGroup, HttpApiSchema, Rpc, RpcClient, RpcGroup, RpcSchema, RpcSerialization, __rspack_external_effect_Effect_194ac36c as Effect, __rspack_external_effect_Layer_16f7a8fc as Layer, __rspack_external_effect_Schema_f8472650 as Schema, __rspack_external_effect_unstable_http_HttpClientError_b9ead235 as HttpClientError, makeEffectHttpApiClient, makeEffectRpcClient, mask, runEffectRequest, runEffectView, view };
@@ -7,6 +7,7 @@ import { Rpc, RpcClient, RpcGroup, RpcSchema, RpcSerialization } from 'effect/un
7
7
  export * as Effect from 'effect/Effect';
8
8
  export * as Layer from 'effect/Layer';
9
9
  export * as Schema from 'effect/Schema';
10
+ export * as HttpClientError from 'effect/unstable/http/HttpClientError';
10
11
  export { HttpApi, HttpApiClient, HttpApiEndpoint, HttpApiGroup, HttpApiSchema, Rpc, RpcClient, RpcGroup, RpcSchema, RpcSerialization, };
11
12
  export type EffectHttpApiClientOptions = {
12
13
  baseUrl?: URL | string;
@@ -52,8 +53,6 @@ export type EffectRpcClientHandle<Rpcs extends Rpc.Any, Flatten extends boolean
52
53
  export declare function view<T>(): <const Selection extends EffectViewSelection<T>>(selection: Selection) => Selection;
53
54
  export declare function mask<T, const Selection extends EffectViewSelection<T>>(value: T, selection: Selection): EffectViewData<T, Selection>;
54
55
  export declare function runEffectView<T, const Selection extends EffectViewSelection<T>>(request: PromiseLike<T>, selection: Selection): Promise<EffectViewData<T, Selection>>;
55
- export declare function makeEffectHttpApiClient<ApiId extends string, Groups extends HttpApiGroup.Any>(api: HttpApi.HttpApi<ApiId, Groups>, options?: EffectHttpApiClientOptions): Effect.Effect<import("effect/Types").Simplify<{ readonly [Group in Extract<Groups, {
56
- readonly topLevel: false;
57
- }> as HttpApiGroup.Name<Group>]: HttpApiClient.Client.Group<Group, Group["identifier"], never, never>; } & { readonly [Method in HttpApiClient.Client.TopLevelMethods<Groups, never, never> as Method[0]]: Method[1]; }>, never, Exclude<import("effect/unstable/httpapi/HttpApiMiddleware").MiddlewareClient<HttpApiEndpoint.Middleware<HttpApiGroup.Endpoints<Groups>>>, HttpClient.HttpClient>>;
56
+ export declare function makeEffectHttpApiClient<ApiId extends string, Groups extends HttpApiGroup.Any>(api: HttpApi.HttpApi<ApiId, Groups>, options?: EffectHttpApiClientOptions): Effect.Effect<HttpApiClient.Client<Groups>, never, HttpApiGroup.MiddlewareClient<Groups>>;
58
57
  export declare function makeEffectRpcClient<Rpcs extends Rpc.Any, const Flatten extends boolean = false>(group: RpcGroup.RpcGroup<Rpcs>, options: EffectRpcClientOptions<Rpcs, Flatten>): Effect.Effect<EffectRpcClientHandle<Rpcs, Flatten>, EffectRpcClientError, never>;
59
58
  export declare const runEffectRequest: <A, E>(effect: Effect.Effect<A, E>, options?: Effect.RunOptions | undefined) => Promise<A>;
package/package.json CHANGED
@@ -17,7 +17,7 @@
17
17
  "modern",
18
18
  "modern.js"
19
19
  ],
20
- "version": "3.4.0-ultramodern.2",
20
+ "version": "3.4.0-ultramodern.4",
21
21
  "types": "./dist/types/cli.d.ts",
22
22
  "main": "./dist/cjs/cli.js",
23
23
  "exports": {
@@ -157,12 +157,12 @@
157
157
  "effect": "4.0.0-beta.89",
158
158
  "qs": "^6.15.3",
159
159
  "type-is": "^2.1.0",
160
- "@modern-js/builder": "npm:@bleedingdev/modern-js-builder@3.4.0-ultramodern.2",
161
- "@modern-js/create-request": "npm:@bleedingdev/modern-js-create-request@3.4.0-ultramodern.2",
162
- "@modern-js/server-core": "npm:@bleedingdev/modern-js-server-core@3.4.0-ultramodern.2",
163
- "@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.4.0-ultramodern.2",
164
- "@modern-js/bff-core": "npm:@bleedingdev/modern-js-bff-core@3.4.0-ultramodern.2",
165
- "@modern-js/server-utils": "npm:@bleedingdev/modern-js-server-utils@3.4.0-ultramodern.2"
160
+ "@modern-js/create-request": "npm:@bleedingdev/modern-js-create-request@3.4.0-ultramodern.4",
161
+ "@modern-js/bff-core": "npm:@bleedingdev/modern-js-bff-core@3.4.0-ultramodern.4",
162
+ "@modern-js/builder": "npm:@bleedingdev/modern-js-builder@3.4.0-ultramodern.4",
163
+ "@modern-js/server-core": "npm:@bleedingdev/modern-js-server-core@3.4.0-ultramodern.4",
164
+ "@modern-js/server-utils": "npm:@bleedingdev/modern-js-server-utils@3.4.0-ultramodern.4",
165
+ "@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.4.0-ultramodern.4"
166
166
  },
167
167
  "devDependencies": {
168
168
  "@rsbuild/core": "2.1.0",
@@ -174,12 +174,12 @@
174
174
  "memfs": "^4.57.8",
175
175
  "typescript": "^6.0.3",
176
176
  "zod": "^4.4.3",
177
- "@modern-js/bff-runtime": "npm:@bleedingdev/modern-js-bff-runtime@3.4.0-ultramodern.2",
178
- "@modern-js/app-tools": "npm:@bleedingdev/modern-js-app-tools@3.4.0-ultramodern.2",
179
- "@modern-js/plugin": "npm:@bleedingdev/modern-js-plugin@3.4.0-ultramodern.2",
180
- "@modern-js/runtime": "npm:@bleedingdev/modern-js-runtime@3.4.0-ultramodern.2",
181
- "@modern-js/types": "npm:@bleedingdev/modern-js-types@3.4.0-ultramodern.2",
182
- "@scripts/rstest-config": "2.66.0"
177
+ "@modern-js/app-tools": "npm:@bleedingdev/modern-js-app-tools@3.4.0-ultramodern.4",
178
+ "@modern-js/plugin": "npm:@bleedingdev/modern-js-plugin@3.4.0-ultramodern.4",
179
+ "@modern-js/bff-runtime": "npm:@bleedingdev/modern-js-bff-runtime@3.4.0-ultramodern.4",
180
+ "@modern-js/runtime": "npm:@bleedingdev/modern-js-runtime@3.4.0-ultramodern.4",
181
+ "@scripts/rstest-config": "2.66.0",
182
+ "@modern-js/types": "npm:@bleedingdev/modern-js-types@3.4.0-ultramodern.4"
183
183
  },
184
184
  "sideEffects": false,
185
185
  "publishConfig": {