@bleedingdev/modern-js-bff-core 3.2.0-ultramodern.120 → 3.2.0-ultramodern.121

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.
Files changed (30) hide show
  1. package/dist/cjs/adapter-kit/index.js +140 -0
  2. package/dist/cjs/adapter-kit/parity.js +546 -0
  3. package/dist/cjs/client/generateClient.js +65 -12
  4. package/dist/cjs/index.js +72 -34
  5. package/dist/cjs/security/crossProjectPolicy.js +10 -2
  6. package/dist/cjs/security/operationContracts.js +146 -54
  7. package/dist/cjs/security/resolveCrossProjectPolicy.js +65 -0
  8. package/dist/esm/adapter-kit/index.mjs +75 -0
  9. package/dist/esm/adapter-kit/parity.mjs +490 -0
  10. package/dist/esm/client/generateClient.mjs +66 -13
  11. package/dist/esm/index.mjs +2 -0
  12. package/dist/esm/rslib-runtime.mjs +18 -0
  13. package/dist/esm/security/crossProjectPolicy.mjs +10 -2
  14. package/dist/esm/security/operationContracts.mjs +111 -37
  15. package/dist/esm/security/resolveCrossProjectPolicy.mjs +27 -0
  16. package/dist/esm-node/adapter-kit/index.mjs +76 -0
  17. package/dist/esm-node/adapter-kit/parity.mjs +491 -0
  18. package/dist/esm-node/client/generateClient.mjs +66 -13
  19. package/dist/esm-node/index.mjs +2 -0
  20. package/dist/esm-node/rslib-runtime.mjs +19 -0
  21. package/dist/esm-node/security/crossProjectPolicy.mjs +10 -2
  22. package/dist/esm-node/security/operationContracts.mjs +111 -37
  23. package/dist/esm-node/security/resolveCrossProjectPolicy.mjs +28 -0
  24. package/dist/types/adapter-kit/index.d.ts +90 -0
  25. package/dist/types/adapter-kit/parity.d.ts +102 -0
  26. package/dist/types/index.d.ts +2 -0
  27. package/dist/types/security/crossProjectPolicy.d.ts +40 -1
  28. package/dist/types/security/operationContracts.d.ts +60 -4
  29. package/dist/types/security/resolveCrossProjectPolicy.d.ts +48 -0
  30. package/package.json +5 -3
@@ -31,10 +31,22 @@ __webpack_require__.d(__webpack_exports__, {
31
31
  INNER_CLIENT_REQUEST_CREATOR: ()=>INNER_CLIENT_REQUEST_CREATOR,
32
32
  generateClient: ()=>generateClient
33
33
  });
34
- require("path");
34
+ const external_path_namespaceObject = require("path");
35
35
  const index_js_namespaceObject = require("../router/index.js");
36
36
  const operationContracts_js_namespaceObject = require("../security/operationContracts.js");
37
37
  const external_result_js_namespaceObject = require("./result.js");
38
+ const getPackageInfo = (appDir)=>{
39
+ try {
40
+ const packageJsonPath = external_path_namespaceObject.resolve(appDir, './package.json');
41
+ const packageJson = require(packageJsonPath);
42
+ return {
43
+ name: packageJson.name,
44
+ version: packageJson.version
45
+ };
46
+ } catch (error) {
47
+ return {};
48
+ }
49
+ };
38
50
  const INNER_CLIENT_REQUEST_CREATOR = '@modern-js/plugin-bff/client';
39
51
  const generateClient = async ({ appDir, resourcePath, apiDir, lambdaDir, prefix, port, target, requestCreator, fetcher, requireResolve = require.resolve, httpMethodDecider, domain, requestId })=>{
40
52
  requestCreator = requestCreator || INNER_CLIENT_REQUEST_CREATOR;
@@ -47,25 +59,65 @@ const generateClient = async ({ appDir, resourcePath, apiDir, lambdaDir, prefix,
47
59
  });
48
60
  const handlerInfos = await apiRouter.getSingleModuleHandlers(resourcePath);
49
61
  if (!handlerInfos) return (0, external_result_js_namespaceObject.Err)(`generate client error: Cannot require module ${resourcePath}`);
50
- const operationEntries = (0, operationContracts_js_namespaceObject.createOperationEntries)(handlerInfos);
51
- const operationVersion = 1;
52
- const schemaHash = (0, operationContracts_js_namespaceObject.createOperationSchemaHash)(operationEntries, requestId || 'default');
62
+ const normalizedRequestId = requestId || 'default';
63
+ const operationVersion = (0, operationContracts_js_namespaceObject.deriveOperationVersion)(getPackageInfo(appDir).version);
64
+ const operationContracts = (0, operationContracts_js_namespaceObject.buildOperationContractMap)({
65
+ handlers: handlerInfos,
66
+ requestId: normalizedRequestId,
67
+ operationVersion
68
+ });
69
+ const operationEntries = handlerInfos.map((handlerInfo)=>{
70
+ const upperHttpMethod = handlerInfo.httpMethod.toUpperCase();
71
+ const contract = operationContracts[`${upperHttpMethod}:${handlerInfo.routePath}`];
72
+ return {
73
+ name: handlerInfo.name,
74
+ httpMethod: upperHttpMethod,
75
+ routePath: handlerInfo.routePath,
76
+ schemaHash: contract?.schemaHash ?? ''
77
+ };
78
+ }).sort((a, b)=>{
79
+ const keyA = `${a.routePath}:${a.httpMethod}:${a.name}`;
80
+ const keyB = `${b.routePath}:${b.httpMethod}:${b.name}`;
81
+ return keyA.localeCompare(keyB);
82
+ });
83
+ const schemaHash = (0, operationContracts_js_namespaceObject.createOperationSchemaHash)(operationEntries, normalizedRequestId);
84
+ let hasUploadHandler = false;
53
85
  let handlersCode = '';
54
86
  for (const handlerInfo of handlerInfos){
55
87
  const { name, httpMethod, routePath, action } = handlerInfo;
56
88
  let exportStatement = `var ${name} =`;
57
89
  if ('default' === name.toLowerCase()) exportStatement = 'default';
58
90
  const upperHttpMethod = httpMethod.toUpperCase();
59
- const serializedRouteName = JSON.stringify(routePath);
60
- const serializedMethod = JSON.stringify(upperHttpMethod);
61
- const serializedMethodDecider = JSON.stringify(httpMethodDecider ? httpMethodDecider : 'functionName');
62
- const serializedOperationContext = JSON.stringify({
91
+ const operationSchemaHash = operationContracts[`${upperHttpMethod}:${routePath}`]?.schemaHash ?? '';
92
+ const operationContext = {
63
93
  operationId: name,
64
94
  routePath,
65
95
  method: upperHttpMethod,
66
- schemaHash,
96
+ schemaHash: operationSchemaHash,
67
97
  operationVersion
68
- });
98
+ };
99
+ if ('upload' === action) {
100
+ hasUploadHandler = true;
101
+ const uploadOptions = {
102
+ path: routePath,
103
+ ...domain ? {
104
+ domain
105
+ } : {},
106
+ ...requestId ? {
107
+ requestId
108
+ } : {},
109
+ ...requestId ? {
110
+ operationContext
111
+ } : {}
112
+ };
113
+ handlersCode += `export ${exportStatement} createUploader(${JSON.stringify(uploadOptions)});
114
+ `;
115
+ continue;
116
+ }
117
+ const serializedRouteName = JSON.stringify(routePath);
118
+ const serializedMethod = JSON.stringify(upperHttpMethod);
119
+ const serializedMethodDecider = JSON.stringify(httpMethodDecider ? httpMethodDecider : 'functionName');
120
+ const serializedOperationContext = JSON.stringify(operationContext);
69
121
  const tailArgs = `, ${fetcher ? 'fetch' : 'undefined'}, ${requestId ? JSON.stringify(requestId) : 'undefined'}, ${serializedOperationContext}`;
70
122
  if ('server' === target) handlersCode += `export ${exportStatement} createRequest(${serializedRouteName}, ${serializedMethod}, process.env.PORT || ${String(port)}, ${serializedMethodDecider}${tailArgs});
71
123
  `;
@@ -74,9 +126,10 @@ const generateClient = async ({ appDir, resourcePath, apiDir, lambdaDir, prefix,
74
126
  }
75
127
  const serializedRequestCreator = JSON.stringify(requestCreator);
76
128
  const serializedFetcher = fetcher ? JSON.stringify(fetcher) : void 0;
129
+ const namedRequestImports = `createRequest${hasUploadHandler ? ', createUploader' : ''}`;
77
130
  const importCode = requestId ? `import * as requestRuntime from ${serializedRequestCreator};
78
- const { createRequest } = requestRuntime;
79
- ${serializedFetcher ? `import { fetch } from ${serializedFetcher};\n` : ''}` : `import { createRequest } from ${serializedRequestCreator};
131
+ const { ${namedRequestImports} } = requestRuntime;
132
+ ${serializedFetcher ? `import { fetch } from ${serializedFetcher};\n` : ''}` : `import { ${namedRequestImports} } from ${serializedRequestCreator};
80
133
  ${serializedFetcher ? `import { fetch } from ${serializedFetcher};\n` : ''}`;
81
134
  const bootstrapCode = requestId ? `export const initProducerClient = (options = {}) => {
82
135
  const configure = requestRuntime.configure;
package/dist/cjs/index.js CHANGED
@@ -1,5 +1,8 @@
1
1
  "use strict";
2
2
  var __webpack_modules__ = {
3
+ "./adapter-kit" (module) {
4
+ module.exports = require("./adapter-kit/index.js");
5
+ },
3
6
  "./api" (module) {
4
7
  module.exports = require("./api.js");
5
8
  },
@@ -24,6 +27,9 @@ var __webpack_modules__ = {
24
27
  "./security/operationContracts" (module) {
25
28
  module.exports = require("./security/operationContracts.js");
26
29
  },
30
+ "./security/resolveCrossProjectPolicy" (module) {
31
+ module.exports = require("./security/resolveCrossProjectPolicy.js");
32
+ },
27
33
  "./types" (module) {
28
34
  module.exports = require("./types.js");
29
35
  },
@@ -78,10 +84,42 @@ function __webpack_require__(moduleId) {
78
84
  var __webpack_exports__ = {};
79
85
  (()=>{
80
86
  __webpack_require__.r(__webpack_exports__);
81
- var _api__rspack_import_0 = __webpack_require__("./api");
82
- var _client__rspack_import_1 = __webpack_require__("./client");
87
+ var _adapter_kit__rspack_import_0 = __webpack_require__("./adapter-kit");
88
+ var __rspack_reexport = {};
89
+ for(const __rspack_import_key in _adapter_kit__rspack_import_0)if ([
90
+ "HttpError",
91
+ "registerPaths",
92
+ "createStorage",
93
+ "isWithMetaHandler",
94
+ "default",
95
+ "HANDLER_WITH_META",
96
+ "ValidationError",
97
+ "getRelativeRuntimePath",
98
+ "INPUT_PARAMS_DECIDER",
99
+ "isInputParamsDeciderHandler",
100
+ "Api"
101
+ ].indexOf(__rspack_import_key) < 0) __rspack_reexport[__rspack_import_key] = ()=>_adapter_kit__rspack_import_0[__rspack_import_key];
102
+ __webpack_require__.d(__webpack_exports__, __rspack_reexport);
103
+ var _api__rspack_import_1 = __webpack_require__("./api");
104
+ var _client__rspack_import_2 = __webpack_require__("./client");
105
+ var __rspack_reexport = {};
106
+ for(const __rspack_import_key in _client__rspack_import_2)if ([
107
+ "HttpError",
108
+ "registerPaths",
109
+ "createStorage",
110
+ "isWithMetaHandler",
111
+ "default",
112
+ "HANDLER_WITH_META",
113
+ "ValidationError",
114
+ "getRelativeRuntimePath",
115
+ "INPUT_PARAMS_DECIDER",
116
+ "isInputParamsDeciderHandler",
117
+ "Api"
118
+ ].indexOf(__rspack_import_key) < 0) __rspack_reexport[__rspack_import_key] = ()=>_client__rspack_import_2[__rspack_import_key];
119
+ __webpack_require__.d(__webpack_exports__, __rspack_reexport);
120
+ var _contracts_eventContracts__rspack_import_3 = __webpack_require__("./contracts/eventContracts");
83
121
  var __rspack_reexport = {};
84
- for(const __rspack_import_key in _client__rspack_import_1)if ([
122
+ for(const __rspack_import_key in _contracts_eventContracts__rspack_import_3)if ([
85
123
  "HttpError",
86
124
  "registerPaths",
87
125
  "createStorage",
@@ -93,11 +131,12 @@ var __webpack_exports__ = {};
93
131
  "INPUT_PARAMS_DECIDER",
94
132
  "isInputParamsDeciderHandler",
95
133
  "Api"
96
- ].indexOf(__rspack_import_key) < 0) __rspack_reexport[__rspack_import_key] = ()=>_client__rspack_import_1[__rspack_import_key];
134
+ ].indexOf(__rspack_import_key) < 0) __rspack_reexport[__rspack_import_key] = ()=>_contracts_eventContracts__rspack_import_3[__rspack_import_key];
97
135
  __webpack_require__.d(__webpack_exports__, __rspack_reexport);
98
- var _contracts_eventContracts__rspack_import_2 = __webpack_require__("./contracts/eventContracts");
136
+ var _errors_http__rspack_import_4 = __webpack_require__("./errors/http");
137
+ var _operators_http__rspack_import_5 = __webpack_require__("./operators/http");
99
138
  var __rspack_reexport = {};
100
- for(const __rspack_import_key in _contracts_eventContracts__rspack_import_2)if ([
139
+ for(const __rspack_import_key in _operators_http__rspack_import_5)if ([
101
140
  "HttpError",
102
141
  "registerPaths",
103
142
  "createStorage",
@@ -109,12 +148,11 @@ var __webpack_exports__ = {};
109
148
  "INPUT_PARAMS_DECIDER",
110
149
  "isInputParamsDeciderHandler",
111
150
  "Api"
112
- ].indexOf(__rspack_import_key) < 0) __rspack_reexport[__rspack_import_key] = ()=>_contracts_eventContracts__rspack_import_2[__rspack_import_key];
151
+ ].indexOf(__rspack_import_key) < 0) __rspack_reexport[__rspack_import_key] = ()=>_operators_http__rspack_import_5[__rspack_import_key];
113
152
  __webpack_require__.d(__webpack_exports__, __rspack_reexport);
114
- var _errors_http__rspack_import_3 = __webpack_require__("./errors/http");
115
- var _operators_http__rspack_import_4 = __webpack_require__("./operators/http");
153
+ var _router__rspack_import_6 = __webpack_require__("./router");
116
154
  var __rspack_reexport = {};
117
- for(const __rspack_import_key in _operators_http__rspack_import_4)if ([
155
+ for(const __rspack_import_key in _router__rspack_import_6)if ([
118
156
  "HttpError",
119
157
  "registerPaths",
120
158
  "createStorage",
@@ -126,11 +164,11 @@ var __webpack_exports__ = {};
126
164
  "INPUT_PARAMS_DECIDER",
127
165
  "isInputParamsDeciderHandler",
128
166
  "Api"
129
- ].indexOf(__rspack_import_key) < 0) __rspack_reexport[__rspack_import_key] = ()=>_operators_http__rspack_import_4[__rspack_import_key];
167
+ ].indexOf(__rspack_import_key) < 0) __rspack_reexport[__rspack_import_key] = ()=>_router__rspack_import_6[__rspack_import_key];
130
168
  __webpack_require__.d(__webpack_exports__, __rspack_reexport);
131
- var _router__rspack_import_5 = __webpack_require__("./router");
169
+ var _security_crossProjectPolicy__rspack_import_7 = __webpack_require__("./security/crossProjectPolicy");
132
170
  var __rspack_reexport = {};
133
- for(const __rspack_import_key in _router__rspack_import_5)if ([
171
+ for(const __rspack_import_key in _security_crossProjectPolicy__rspack_import_7)if ([
134
172
  "HttpError",
135
173
  "registerPaths",
136
174
  "createStorage",
@@ -142,11 +180,11 @@ var __webpack_exports__ = {};
142
180
  "INPUT_PARAMS_DECIDER",
143
181
  "isInputParamsDeciderHandler",
144
182
  "Api"
145
- ].indexOf(__rspack_import_key) < 0) __rspack_reexport[__rspack_import_key] = ()=>_router__rspack_import_5[__rspack_import_key];
183
+ ].indexOf(__rspack_import_key) < 0) __rspack_reexport[__rspack_import_key] = ()=>_security_crossProjectPolicy__rspack_import_7[__rspack_import_key];
146
184
  __webpack_require__.d(__webpack_exports__, __rspack_reexport);
147
- var _security_crossProjectPolicy__rspack_import_6 = __webpack_require__("./security/crossProjectPolicy");
185
+ var _security_operationContracts__rspack_import_8 = __webpack_require__("./security/operationContracts");
148
186
  var __rspack_reexport = {};
149
- for(const __rspack_import_key in _security_crossProjectPolicy__rspack_import_6)if ([
187
+ for(const __rspack_import_key in _security_operationContracts__rspack_import_8)if ([
150
188
  "HttpError",
151
189
  "registerPaths",
152
190
  "createStorage",
@@ -158,11 +196,11 @@ var __webpack_exports__ = {};
158
196
  "INPUT_PARAMS_DECIDER",
159
197
  "isInputParamsDeciderHandler",
160
198
  "Api"
161
- ].indexOf(__rspack_import_key) < 0) __rspack_reexport[__rspack_import_key] = ()=>_security_crossProjectPolicy__rspack_import_6[__rspack_import_key];
199
+ ].indexOf(__rspack_import_key) < 0) __rspack_reexport[__rspack_import_key] = ()=>_security_operationContracts__rspack_import_8[__rspack_import_key];
162
200
  __webpack_require__.d(__webpack_exports__, __rspack_reexport);
163
- var _security_operationContracts__rspack_import_7 = __webpack_require__("./security/operationContracts");
201
+ var _security_resolveCrossProjectPolicy__rspack_import_9 = __webpack_require__("./security/resolveCrossProjectPolicy");
164
202
  var __rspack_reexport = {};
165
- for(const __rspack_import_key in _security_operationContracts__rspack_import_7)if ([
203
+ for(const __rspack_import_key in _security_resolveCrossProjectPolicy__rspack_import_9)if ([
166
204
  "HttpError",
167
205
  "registerPaths",
168
206
  "createStorage",
@@ -174,11 +212,11 @@ var __webpack_exports__ = {};
174
212
  "INPUT_PARAMS_DECIDER",
175
213
  "isInputParamsDeciderHandler",
176
214
  "Api"
177
- ].indexOf(__rspack_import_key) < 0) __rspack_reexport[__rspack_import_key] = ()=>_security_operationContracts__rspack_import_7[__rspack_import_key];
215
+ ].indexOf(__rspack_import_key) < 0) __rspack_reexport[__rspack_import_key] = ()=>_security_resolveCrossProjectPolicy__rspack_import_9[__rspack_import_key];
178
216
  __webpack_require__.d(__webpack_exports__, __rspack_reexport);
179
- var _types__rspack_import_8 = __webpack_require__("./types");
217
+ var _types__rspack_import_10 = __webpack_require__("./types");
180
218
  var __rspack_reexport = {};
181
- for(const __rspack_import_key in _types__rspack_import_8)if ([
219
+ for(const __rspack_import_key in _types__rspack_import_10)if ([
182
220
  "HttpError",
183
221
  "registerPaths",
184
222
  "createStorage",
@@ -190,20 +228,20 @@ var __webpack_exports__ = {};
190
228
  "INPUT_PARAMS_DECIDER",
191
229
  "isInputParamsDeciderHandler",
192
230
  "Api"
193
- ].indexOf(__rspack_import_key) < 0) __rspack_reexport[__rspack_import_key] = ()=>_types__rspack_import_8[__rspack_import_key];
231
+ ].indexOf(__rspack_import_key) < 0) __rspack_reexport[__rspack_import_key] = ()=>_types__rspack_import_10[__rspack_import_key];
194
232
  __webpack_require__.d(__webpack_exports__, __rspack_reexport);
195
- var _utils__rspack_import_9 = __webpack_require__("./utils?637c");
233
+ var _utils__rspack_import_11 = __webpack_require__("./utils?637c");
196
234
  __webpack_require__.d(__webpack_exports__, {
197
- Api: ()=>_api__rspack_import_0.Api,
198
- HANDLER_WITH_META: ()=>_utils__rspack_import_9.HANDLER_WITH_META,
199
- HttpError: ()=>_errors_http__rspack_import_3.HttpError,
200
- INPUT_PARAMS_DECIDER: ()=>_utils__rspack_import_9.INPUT_PARAMS_DECIDER,
201
- ValidationError: ()=>_errors_http__rspack_import_3.ValidationError,
202
- createStorage: ()=>_utils__rspack_import_9.createStorage,
203
- getRelativeRuntimePath: ()=>_utils__rspack_import_9.getRelativeRuntimePath,
204
- isInputParamsDeciderHandler: ()=>_utils__rspack_import_9.isInputParamsDeciderHandler,
205
- isWithMetaHandler: ()=>_utils__rspack_import_9.isWithMetaHandler,
206
- registerPaths: ()=>_utils__rspack_import_9.registerPaths
235
+ Api: ()=>_api__rspack_import_1.Api,
236
+ HANDLER_WITH_META: ()=>_utils__rspack_import_11.HANDLER_WITH_META,
237
+ HttpError: ()=>_errors_http__rspack_import_4.HttpError,
238
+ INPUT_PARAMS_DECIDER: ()=>_utils__rspack_import_11.INPUT_PARAMS_DECIDER,
239
+ ValidationError: ()=>_errors_http__rspack_import_4.ValidationError,
240
+ createStorage: ()=>_utils__rspack_import_11.createStorage,
241
+ getRelativeRuntimePath: ()=>_utils__rspack_import_11.getRelativeRuntimePath,
242
+ isInputParamsDeciderHandler: ()=>_utils__rspack_import_11.isInputParamsDeciderHandler,
243
+ isWithMetaHandler: ()=>_utils__rspack_import_11.isWithMetaHandler,
244
+ registerPaths: ()=>_utils__rspack_import_11.registerPaths
207
245
  });
208
246
  })();
209
247
  exports.Api = __webpack_exports__.Api;
@@ -78,10 +78,18 @@ const evaluateCrossProjectPolicy = (headers, policy)=>{
78
78
  }
79
79
  const requestId = String(envelope.requestId || '').trim();
80
80
  if (!requestId) return createViolation('missing_request_id', 'Cross-project envelope does not include a valid requestId', status);
81
+ const claimedNamespace = extractNamespace(requestId);
82
+ let effectiveNamespace = claimedNamespace;
83
+ if ('function' == typeof policy.verifyProducerIdentity) {
84
+ const verifiedNamespaceRaw = policy.verifyProducerIdentity(headers);
85
+ const verifiedNamespace = 'string' == typeof verifiedNamespaceRaw ? verifiedNamespaceRaw.trim().toLowerCase() : void 0;
86
+ if (!verifiedNamespace) return createViolation('producer_identity_mismatch', 'Producer identity could not be verified for this request', status);
87
+ if (verifiedNamespace !== claimedNamespace) return createViolation('producer_identity_mismatch', `Envelope namespace "${claimedNamespace || 'unknown'}" does not match verified producer identity "${verifiedNamespace}"`, status);
88
+ effectiveNamespace = verifiedNamespace;
89
+ }
81
90
  const namespaces = (policy.allowedNamespaces || []).map((item)=>item.trim().toLowerCase()).filter(Boolean);
82
91
  if (namespaces.length > 0) {
83
- const namespace = extractNamespace(requestId);
84
- if (!namespace || !namespaces.includes(namespace)) return createViolation('namespace_not_allowed', `Producer namespace "${namespace || 'unknown'}" is not allowed`, status);
92
+ if (!effectiveNamespace || !namespaces.includes(effectiveNamespace)) return createViolation('namespace_not_allowed', `Producer namespace "${effectiveNamespace || 'unknown'}" is not allowed`, status);
85
93
  }
86
94
  if (requireOperationContext) {
87
95
  const operationContext = readHeader(headers, operationContextHeader);
@@ -1,5 +1,19 @@
1
1
  "use strict";
2
- var __webpack_require__ = {};
2
+ var __webpack_modules__ = {
3
+ zod (module) {
4
+ module.exports = require("zod");
5
+ }
6
+ };
7
+ var __webpack_module_cache__ = {};
8
+ function __webpack_require__(moduleId) {
9
+ var cachedModule = __webpack_module_cache__[moduleId];
10
+ if (void 0 !== cachedModule) return cachedModule.exports;
11
+ var module = __webpack_module_cache__[moduleId] = {
12
+ exports: {}
13
+ };
14
+ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
15
+ return module.exports;
16
+ }
3
17
  (()=>{
4
18
  __webpack_require__.d = (exports1, getters, values)=>{
5
19
  var define = (defs, kind)=>{
@@ -26,78 +40,156 @@ var __webpack_require__ = {};
26
40
  };
27
41
  })();
28
42
  var __webpack_exports__ = {};
29
- __webpack_require__.r(__webpack_exports__);
30
- __webpack_require__.d(__webpack_exports__, {
31
- DEFAULT_OPERATION_VERSION: ()=>DEFAULT_OPERATION_VERSION,
32
- buildOperationContractMap: ()=>buildOperationContractMap,
33
- createOperationEntries: ()=>createOperationEntries,
34
- createOperationSchemaHash: ()=>createOperationSchemaHash
35
- });
36
- const external_crypto_namespaceObject = require("crypto");
37
- const DEFAULT_OPERATION_VERSION = 1;
38
- const createOperationEntries = (handlers)=>handlers.map((item)=>({
39
- name: item.name,
40
- httpMethod: String(item.httpMethod || '').toUpperCase(),
41
- routePath: item.routePath
42
- })).sort((a, b)=>{
43
- const keyA = `${a.routePath}:${a.httpMethod}:${a.name}`;
44
- const keyB = `${b.routePath}:${b.httpMethod}:${b.name}`;
45
- return keyA.localeCompare(keyB);
43
+ (()=>{
44
+ __webpack_require__.r(__webpack_exports__);
45
+ __webpack_require__.d(__webpack_exports__, {
46
+ DEFAULT_OPERATION_VERSION: ()=>DEFAULT_OPERATION_VERSION,
47
+ buildOperationContractMap: ()=>buildOperationContractMap,
48
+ createOperationContractHash: ()=>createOperationContractHash,
49
+ createOperationEntries: ()=>createOperationEntries,
50
+ createOperationSchemaHash: ()=>createOperationSchemaHash,
51
+ deriveOperationVersion: ()=>deriveOperationVersion,
52
+ serializeOperationSchemas: ()=>serializeOperationSchemas
46
53
  });
47
- const createOperationSchemaHash = (operationEntries, requestId)=>(0, external_crypto_namespaceObject.createHash)('sha256').update(JSON.stringify({
48
- operations: operationEntries.map((item)=>({
54
+ const external_crypto_namespaceObject = require("crypto");
55
+ require("reflect-metadata");
56
+ const external_types_js_namespaceObject = require("../types.js");
57
+ const DEFAULT_OPERATION_VERSION = 1;
58
+ const deriveOperationVersion = (packageVersion)=>{
59
+ if ('string' != typeof packageVersion) return DEFAULT_OPERATION_VERSION;
60
+ const match = packageVersion.trim().match(/^v?(\d+)\./);
61
+ if (!match) return DEFAULT_OPERATION_VERSION;
62
+ const major = Number.parseInt(match[1], 10);
63
+ return Number.isInteger(major) && major >= 0 ? major : DEFAULT_OPERATION_VERSION;
64
+ };
65
+ const stableStringify = (value)=>{
66
+ if (Array.isArray(value)) return `[${value.map((item)=>stableStringify(item)).join(',')}]`;
67
+ if (value && 'object' == typeof value) {
68
+ const entries = Object.entries(value).filter(([, entryValue])=>void 0 !== entryValue).sort(([a], [b])=>a.localeCompare(b)).map(([key, entryValue])=>`${JSON.stringify(key)}:${stableStringify(entryValue)}`);
69
+ return `{${entries.join(',')}}`;
70
+ }
71
+ return JSON.stringify(value) ?? 'null';
72
+ };
73
+ const sha256 = (text)=>(0, external_crypto_namespaceObject.createHash)('sha256').update(text).digest('hex');
74
+ let cachedZodToJSONSchema;
75
+ const resolveZodToJSONSchema = ()=>{
76
+ if (void 0 !== cachedZodToJSONSchema) return cachedZodToJSONSchema;
77
+ try {
78
+ const zod = __webpack_require__("zod");
79
+ const candidate = zod?.toJSONSchema ?? zod?.z?.toJSONSchema;
80
+ cachedZodToJSONSchema = 'function' == typeof candidate ? candidate : null;
81
+ } catch {
82
+ cachedZodToJSONSchema = null;
83
+ }
84
+ return cachedZodToJSONSchema;
85
+ };
86
+ const INPUT_SCHEMA_METADATA_KEYS = [
87
+ external_types_js_namespaceObject.HttpMetadata.Data,
88
+ external_types_js_namespaceObject.HttpMetadata.Query,
89
+ external_types_js_namespaceObject.HttpMetadata.Params,
90
+ external_types_js_namespaceObject.HttpMetadata.Headers,
91
+ external_types_js_namespaceObject.HttpMetadata.Files
92
+ ];
93
+ const serializeSchema = (schema)=>{
94
+ const toJSONSchema = resolveZodToJSONSchema();
95
+ if (toJSONSchema) try {
96
+ return toJSONSchema(schema, {
97
+ io: 'input',
98
+ unrepresentable: 'any'
99
+ });
100
+ } catch {}
101
+ return {
102
+ __unserializableSchema: true
103
+ };
104
+ };
105
+ const serializeOperationSchemas = (handler)=>{
106
+ if ('function' != typeof handler) return;
107
+ const serialized = {};
108
+ for (const metadataKey of INPUT_SCHEMA_METADATA_KEYS){
109
+ let schema;
110
+ try {
111
+ schema = Reflect.getMetadata(metadataKey, handler);
112
+ } catch {
113
+ schema = void 0;
114
+ }
115
+ if (null != schema) serialized[metadataKey] = serializeSchema(schema);
116
+ }
117
+ return Object.keys(serialized).length > 0 ? serialized : void 0;
118
+ };
119
+ const createOperationContractHash = (operation, requestId)=>sha256(stableStringify({
120
+ httpMethod: String(operation.httpMethod || '').toUpperCase(),
121
+ name: operation.name,
122
+ requestId,
123
+ routePath: operation.routePath,
124
+ ...operation.schemas ? {
125
+ schemas: operation.schemas
126
+ } : {}
127
+ }));
128
+ const createOperationEntries = (handlers)=>handlers.map((item)=>({
49
129
  name: item.name,
50
- httpMethod: item.httpMethod,
130
+ httpMethod: String(item.httpMethod || '').toUpperCase(),
51
131
  routePath: item.routePath
52
- })),
53
- requestId
54
- })).digest('hex');
55
- const buildOperationContractMap = ({ handlers, requestId })=>{
56
- const normalizedRequestId = 'string' == typeof requestId && requestId.trim().length > 0 ? requestId.trim() : 'default';
57
- const byModule = new Map();
58
- handlers.forEach((item)=>{
59
- const moduleId = 'string' == typeof item.filename && item.filename.length > 0 ? item.filename : '__anonymous__';
60
- const group = byModule.get(moduleId) || [];
61
- group.push({
62
- name: item.name,
63
- httpMethod: item.httpMethod.toUpperCase(),
64
- routePath: item.routePath,
65
- filename: item.filename
132
+ })).sort((a, b)=>{
133
+ const keyA = `${a.routePath}:${a.httpMethod}:${a.name}`;
134
+ const keyB = `${b.routePath}:${b.httpMethod}:${b.name}`;
135
+ return keyA.localeCompare(keyB);
66
136
  });
67
- byModule.set(moduleId, group);
68
- });
69
- const contracts = {};
70
- byModule.forEach((moduleEntries)=>{
71
- const entries = createOperationEntries(moduleEntries);
72
- const schemaHash = createOperationSchemaHash(entries, normalizedRequestId);
73
- const filename = moduleEntries[0]?.filename;
74
- entries.forEach((entry)=>{
75
- const operationId = `${normalizedRequestId}:${entry.name}`;
137
+ const createOperationSchemaHash = (operationEntries, requestId)=>sha256(stableStringify({
138
+ operations: [
139
+ ...operationEntries
140
+ ].map((item)=>({
141
+ hash: item.schemaHash ?? createOperationContractHash({
142
+ name: item.name,
143
+ httpMethod: item.httpMethod,
144
+ routePath: item.routePath
145
+ }, requestId)
146
+ })).sort((a, b)=>a.hash.localeCompare(b.hash)),
147
+ requestId
148
+ }));
149
+ const buildOperationContractMap = ({ handlers, requestId, operationVersion })=>{
150
+ const normalizedRequestId = 'string' == typeof requestId && requestId.trim().length > 0 ? requestId.trim() : 'default';
151
+ const normalizedOperationVersion = 'number' == typeof operationVersion && Number.isInteger(operationVersion) ? operationVersion : DEFAULT_OPERATION_VERSION;
152
+ const contracts = {};
153
+ handlers.forEach((item)=>{
154
+ const httpMethod = String(item.httpMethod || '').toUpperCase();
155
+ const schemaHash = createOperationContractHash({
156
+ name: item.name,
157
+ httpMethod,
158
+ routePath: item.routePath,
159
+ schemas: serializeOperationSchemas(item.handler)
160
+ }, normalizedRequestId);
161
+ const operationId = `${normalizedRequestId}:${item.name}`;
76
162
  const contract = {
77
163
  requestId: normalizedRequestId,
78
- operationVersion: DEFAULT_OPERATION_VERSION,
164
+ operationVersion: normalizedOperationVersion,
79
165
  schemaHash,
80
- method: entry.httpMethod,
81
- routePath: entry.routePath,
166
+ method: httpMethod,
167
+ routePath: item.routePath,
82
168
  operationId,
83
- handlerName: entry.name,
84
- filename
169
+ handlerName: item.name,
170
+ filename: item.filename
85
171
  };
86
- contracts[`${entry.httpMethod}:${entry.routePath}`] = contract;
172
+ contracts[`${httpMethod}:${item.routePath}`] = contract;
87
173
  contracts[`operation:${operationId}`] = contract;
88
174
  });
89
- });
90
- return contracts;
91
- };
175
+ return contracts;
176
+ };
177
+ })();
92
178
  exports.DEFAULT_OPERATION_VERSION = __webpack_exports__.DEFAULT_OPERATION_VERSION;
93
179
  exports.buildOperationContractMap = __webpack_exports__.buildOperationContractMap;
180
+ exports.createOperationContractHash = __webpack_exports__.createOperationContractHash;
94
181
  exports.createOperationEntries = __webpack_exports__.createOperationEntries;
95
182
  exports.createOperationSchemaHash = __webpack_exports__.createOperationSchemaHash;
183
+ exports.deriveOperationVersion = __webpack_exports__.deriveOperationVersion;
184
+ exports.serializeOperationSchemas = __webpack_exports__.serializeOperationSchemas;
96
185
  for(var __rspack_i in __webpack_exports__)if (-1 === [
97
186
  "DEFAULT_OPERATION_VERSION",
98
187
  "buildOperationContractMap",
188
+ "createOperationContractHash",
99
189
  "createOperationEntries",
100
- "createOperationSchemaHash"
190
+ "createOperationSchemaHash",
191
+ "deriveOperationVersion",
192
+ "serializeOperationSchemas"
101
193
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
102
194
  Object.defineProperty(exports, '__esModule', {
103
195
  value: true
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, getters, values)=>{
5
+ var define = (defs, kind)=>{
6
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
7
+ enumerable: true,
8
+ [kind]: defs[key]
9
+ });
10
+ };
11
+ define(getters, "get");
12
+ define(values, "value");
13
+ };
14
+ })();
15
+ (()=>{
16
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
17
+ })();
18
+ (()=>{
19
+ __webpack_require__.r = (exports1)=>{
20
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
21
+ value: 'Module'
22
+ });
23
+ Object.defineProperty(exports1, '__esModule', {
24
+ value: true
25
+ });
26
+ };
27
+ })();
28
+ var __webpack_exports__ = {};
29
+ __webpack_require__.r(__webpack_exports__);
30
+ __webpack_require__.d(__webpack_exports__, {
31
+ resolveCrossProjectPolicy: ()=>resolveCrossProjectPolicy
32
+ });
33
+ const external_operationContracts_js_namespaceObject = require("./operationContracts.js");
34
+ const resolveCrossProjectPolicy = (input)=>{
35
+ const { crossProjectPolicy, handlers, requestId, isCrossProjectServer, operationVersion } = input;
36
+ if (!crossProjectPolicy && !isCrossProjectServer) return;
37
+ const policy = crossProjectPolicy ?? {};
38
+ const effectiveRequestId = 'string' == typeof requestId && requestId.trim().length > 0 ? requestId : 'default';
39
+ const generatedContracts = (0, external_operationContracts_js_namespaceObject.buildOperationContractMap)({
40
+ handlers,
41
+ requestId: effectiveRequestId,
42
+ operationVersion
43
+ });
44
+ return {
45
+ ...policy,
46
+ enabled: policy.enabled ?? Boolean(isCrossProjectServer),
47
+ requireEnvelope: policy.requireEnvelope ?? true,
48
+ requireOperationContext: policy.requireOperationContext ?? true,
49
+ requireOperationContextDetails: policy.requireOperationContextDetails ?? true,
50
+ requireOperationSchemaHash: policy.requireOperationSchemaHash ?? true,
51
+ requireOperationVersion: policy.requireOperationVersion ?? true,
52
+ allowUnknownOperations: policy.allowUnknownOperations ?? false,
53
+ expectedOperationContracts: {
54
+ ...policy.expectedOperationContracts ?? {},
55
+ ...generatedContracts
56
+ }
57
+ };
58
+ };
59
+ exports.resolveCrossProjectPolicy = __webpack_exports__.resolveCrossProjectPolicy;
60
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
61
+ "resolveCrossProjectPolicy"
62
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
63
+ Object.defineProperty(exports, '__esModule', {
64
+ value: true
65
+ });