@xfe-repo/bff-transform 1.0.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.
Files changed (42) hide show
  1. package/README.md +3 -0
  2. package/dist/chunk-G2JFFY2W.mjs +103 -0
  3. package/dist/chunk-MWZOUQAS.mjs +51 -0
  4. package/dist/chunk-NZ6LDQJI.mjs +564 -0
  5. package/dist/chunk-O7SEPPUS.mjs +23 -0
  6. package/dist/chunk-Q7G5RLD4.mjs +9 -0
  7. package/dist/chunk-V62BSXTW.mjs +28 -0
  8. package/dist/chunk-XUGPHFIH.mjs +49 -0
  9. package/dist/chunk-YP5H6IG4.mjs +130 -0
  10. package/dist/index.d.mts +79 -0
  11. package/dist/index.d.ts +79 -0
  12. package/dist/index.js +1042 -0
  13. package/dist/index.mjs +147 -0
  14. package/dist/transform.decorators.d.mts +13 -0
  15. package/dist/transform.decorators.d.ts +13 -0
  16. package/dist/transform.decorators.js +50 -0
  17. package/dist/transform.decorators.mjs +9 -0
  18. package/dist/transform.interceptor.d.mts +16 -0
  19. package/dist/transform.interceptor.d.ts +16 -0
  20. package/dist/transform.interceptor.js +289 -0
  21. package/dist/transform.interceptor.mjs +10 -0
  22. package/dist/transform.iplugin.d.mts +22 -0
  23. package/dist/transform.iplugin.d.ts +22 -0
  24. package/dist/transform.iplugin.js +72 -0
  25. package/dist/transform.iplugin.mjs +9 -0
  26. package/dist/transform.metadata-storage.d.mts +9 -0
  27. package/dist/transform.metadata-storage.d.ts +9 -0
  28. package/dist/transform.metadata-storage.js +55 -0
  29. package/dist/transform.metadata-storage.mjs +7 -0
  30. package/dist/transform.module.d.mts +14 -0
  31. package/dist/transform.module.d.ts +14 -0
  32. package/dist/transform.module.js +887 -0
  33. package/dist/transform.module.mjs +12 -0
  34. package/dist/transform.plugin.manager.d.mts +21 -0
  35. package/dist/transform.plugin.manager.d.ts +21 -0
  36. package/dist/transform.plugin.manager.js +247 -0
  37. package/dist/transform.plugin.manager.mjs +9 -0
  38. package/dist/traverse.utils.d.mts +15 -0
  39. package/dist/traverse.utils.d.ts +15 -0
  40. package/dist/traverse.utils.js +124 -0
  41. package/dist/traverse.utils.mjs +7 -0
  42. package/package.json +50 -0
package/dist/index.js ADDED
@@ -0,0 +1,1042 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
9
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
10
+ var __export = (target, all) => {
11
+ for (var name in all)
12
+ __defProp(target, name, { get: all[name], enumerable: true });
13
+ };
14
+ var __copyProps = (to, from, except, desc) => {
15
+ if (from && typeof from === "object" || typeof from === "function") {
16
+ for (let key of __getOwnPropNames(from))
17
+ if (!__hasOwnProp.call(to, key) && key !== except)
18
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
19
+ }
20
+ return to;
21
+ };
22
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
23
+ // If the importer is in node compatibility mode or this is not an ESM
24
+ // file that has been converted to a CommonJS file using a Babel-
25
+ // compatible transform (i.e. "__esModule" has not been set), then set
26
+ // "default" to the CommonJS "module.exports" for node compatibility.
27
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
28
+ mod
29
+ ));
30
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
31
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
32
+
33
+ // src/index.ts
34
+ var src_exports = {};
35
+ __export(src_exports, {
36
+ Privacy: () => Privacy,
37
+ PrivacyPlugin: () => PrivacyPlugin,
38
+ TransformCurrency: () => TransformCurrency,
39
+ TransformMetadataStorage: () => TransformMetadataStorage,
40
+ TransformModule: () => TransformModule,
41
+ TransformPluginManager: () => TransformPluginManager,
42
+ TransformTyped: () => TransformTyped,
43
+ UnionQuery: () => UnionQuery,
44
+ UnionQueryFactory: () => UnionQueryFactory,
45
+ traverse: () => traverse
46
+ });
47
+ module.exports = __toCommonJS(src_exports);
48
+
49
+ // src/privacy/privacy.decorators.ts
50
+ var import_swagger = require("@nestjs/swagger");
51
+
52
+ // src/privacy/privacy.metadata-storage.ts
53
+ var import_class_transformer = require("class-transformer");
54
+
55
+ // src/transform.metadata-storage.ts
56
+ var classTransformer = __toESM(require("class-transformer/cjs/storage"));
57
+ var defaultMetadataStorage2 = classTransformer.defaultMetadataStorage;
58
+ var _TransformMetadataStorage = class _TransformMetadataStorage {
59
+ constructor() {
60
+ /** 继承原实例数据 */
61
+ __publicField(this, "metadataStorage", defaultMetadataStorage2);
62
+ }
63
+ getMetadataStorage() {
64
+ return this.metadataStorage;
65
+ }
66
+ };
67
+ __name(_TransformMetadataStorage, "TransformMetadataStorage");
68
+ var TransformMetadataStorage = _TransformMetadataStorage;
69
+
70
+ // src/privacy/privacy.metadata-storage.ts
71
+ var PrivacyTransformEnum = /* @__PURE__ */ function(PrivacyTransformEnum2) {
72
+ PrivacyTransformEnum2["PrivacyEncrypt"] = "PrivacyEncrypt";
73
+ PrivacyTransformEnum2["PrivacyDesensitize"] = "PrivacyDesensitize";
74
+ PrivacyTransformEnum2["PrivacyIsPermitted"] = "PrivacyIsPermitted";
75
+ return PrivacyTransformEnum2;
76
+ }({});
77
+ var _a;
78
+ var PrivacyTransformMetadataStorage = (_a = class extends TransformMetadataStorage {
79
+ /**
80
+ * 添加隐私协议转换元数据
81
+ * @param metadata 隐私协议转换元数据
82
+ */
83
+ addPrivacyMetadata(metadata) {
84
+ this.getMetadataStorage().addTransformMetadata(metadata);
85
+ }
86
+ /**
87
+ * 查找隐私协议转换元数据
88
+ * @param target
89
+ * @param propertyName
90
+ * @param transformationType
91
+ * @returns
92
+ */
93
+ findPrivacyMetadata(target, propertyName, transformName) {
94
+ const unionQueryMetadatas = this.getMetadataStorage().findTransformMetadatas(target, propertyName, import_class_transformer.TransformationType.PLAIN_TO_CLASS);
95
+ return unionQueryMetadatas.find((meta) => meta.options?.transformName === transformName);
96
+ }
97
+ }, __name(_a, "PrivacyTransformMetadataStorage"), _a);
98
+ var privacyMetadataStorage = new PrivacyTransformMetadataStorage();
99
+
100
+ // src/privacy/privacy.decorators.ts
101
+ var Privacy = {
102
+ /**
103
+ * 字段脱敏装饰器
104
+ * @description 注意:必须配合 TransformInterceptor(@OutDtoTransform)使用
105
+ *
106
+ * 根据配置的脱敏方法对字段值进行脱敏展示:
107
+ * - 设置权限码:有权限用户看到原始值,无权限用户看到脱敏值
108
+ * - 不设置权限码:所有用户都看到脱敏值
109
+ *
110
+ * @param options 脱敏配置选项
111
+ */
112
+ desensitize(options) {
113
+ return (target, propertyName) => {
114
+ privacyMetadataStorage.addPrivacyMetadata({
115
+ target: target.constructor,
116
+ propertyName,
117
+ transformFn: /* @__PURE__ */ __name((ctx) => ctx.value, "transformFn"),
118
+ options: {
119
+ ...options,
120
+ transformName: PrivacyTransformEnum.PrivacyDesensitize
121
+ }
122
+ });
123
+ };
124
+ },
125
+ /**
126
+ * 字段加密装饰器
127
+ * @description 注意:必须配合 TransformInterceptor(@OutDtoTransform)使用
128
+ *
129
+ * 根据用户权限决定是否添加加密字段,并自动为加密字段添加 Swagger 文档:
130
+ * - 当用户有对应权限码时,会额外创建一个 `{字段名}Encrypted` 的字段,包含原始值的加密结果
131
+ * - 自动在 Swagger 文档中添加加密字段的描述
132
+ *
133
+ * @param options 加密配置选项
134
+ */
135
+ encrypt(options) {
136
+ return (target, propertyKey) => {
137
+ const propertyName = propertyKey.toString();
138
+ privacyMetadataStorage.addPrivacyMetadata({
139
+ target: target.constructor,
140
+ propertyName,
141
+ transformFn: /* @__PURE__ */ __name((ctx) => ctx.value, "transformFn"),
142
+ options: {
143
+ ...options,
144
+ transformName: PrivacyTransformEnum.PrivacyEncrypt
145
+ }
146
+ });
147
+ const encryptedPropertyKey = `${propertyName}Encrypted`;
148
+ (0, import_swagger.ApiProperty)({
149
+ name: encryptedPropertyKey,
150
+ description: options.description ?? `${propertyName}\uFF08\u52A0\u5BC6\uFF09`,
151
+ type: String,
152
+ required: false
153
+ })(target, encryptedPropertyKey);
154
+ };
155
+ },
156
+ /**
157
+ * 权限判断装饰器
158
+ * @description 注意:必须配合 TransformInterceptor(@OutDtoTransform)使用
159
+ *
160
+ * 根据用户权限和可选条件,将字段值设置为布尔类型:
161
+ * - 如果配置了权限码 (permissionCode):
162
+ * - 用户拥有该权限码且满足条件 (condition) 时,字段值为 true
163
+ * - 用户不拥有该权限码或不满足条件时,字段值为 false
164
+ * - 如果未配置权限码:
165
+ * - 满足条件 (condition) 时,字段值为 true
166
+ * - 不满足条件时,字段值为 false
167
+ *
168
+ * 通常用于控制前端操作按钮的显示与隐藏,或某些基于权限的布尔状态
169
+ *
170
+ * @param options 权限判断配置选项
171
+ */
172
+ isPermitted(options) {
173
+ return (target, propertyName) => {
174
+ privacyMetadataStorage.addPrivacyMetadata({
175
+ target: target.constructor,
176
+ propertyName,
177
+ // 此回调需必传,处理 默认值 填充,以便 privacy.interceptor 中的遍历可以正常运作
178
+ transformFn: /* @__PURE__ */ __name((ctx) => ctx.value || false, "transformFn"),
179
+ options: {
180
+ ...options,
181
+ transformName: PrivacyTransformEnum.PrivacyIsPermitted
182
+ }
183
+ });
184
+ };
185
+ }
186
+ };
187
+
188
+ // src/transform.decorators.ts
189
+ var import_common = require("@nestjs/common");
190
+ var import_class_transformer2 = require("class-transformer");
191
+ var TransformTyped = /* @__PURE__ */ __name((transformFn, options) => {
192
+ const _transformFn = /* @__PURE__ */ __name((params) => transformFn(params.obj), "_transformFn");
193
+ return (0, import_class_transformer2.Transform)(_transformFn, {
194
+ toClassOnly: true,
195
+ ...options
196
+ });
197
+ }, "TransformTyped");
198
+ function TransformCurrency(props) {
199
+ const { unit } = props;
200
+ return (0, import_common.applyDecorators)((0, import_class_transformer2.Transform)(({ value }) => {
201
+ return unit === "Fen2Yuan" ? value / 100 : value * 100;
202
+ }, {
203
+ toClassOnly: true
204
+ }));
205
+ }
206
+ __name(TransformCurrency, "TransformCurrency");
207
+
208
+ // src/transform.module.ts
209
+ var import_common6 = require("@nestjs/common");
210
+ var import_core3 = require("@nestjs/core");
211
+
212
+ // src/privacy/privacy.plugin.ts
213
+ var import_common2 = require("@nestjs/common");
214
+
215
+ // src/transform.iplugin.ts
216
+ var INJECT_TRANSFORM_PLUGINS = "INJECT_TRANSFORM_PLUGINS";
217
+ var _ITransformPlugin = class _ITransformPlugin {
218
+ /**
219
+ * 初始化插件
220
+ * 该方法会在插件被注册时调用
221
+ * 可以用于插件的初始化逻辑,例如加载配置、注册事件等
222
+ * 如果插件不需要初始化逻辑,可以不实现该方法
223
+ * @param request
224
+ */
225
+ initialize(_request) {
226
+ }
227
+ /**
228
+ * 执行前的钩子函数
229
+ * @returns {boolean} 返回 true 表示需要执行该插件,false 则不执行
230
+ * 这个方法可以用于判断插件是否需要在当前数据上执行操作
231
+ * 例如:可以根据插件的配置选项或数据状态来决定是否执行
232
+ * 如果返回 false,则该插件在当前数据上不执行任何操作
233
+ * 如果返回 true,则会执行 execute 方法
234
+ */
235
+ executeBefore(_request) {
236
+ return true;
237
+ }
238
+ /**
239
+ * 执行后的钩子函数
240
+ * 这个方法会在所有数据处理完成后被调用
241
+ * 可以用于清理资源或执行一些收尾工作
242
+ */
243
+ executeAfter(_request) {
244
+ }
245
+ };
246
+ __name(_ITransformPlugin, "ITransformPlugin");
247
+ /**
248
+ * 插件的名称
249
+ * 用于标识插件,避免重复注册
250
+ * 每个插件必须有唯一的名称
251
+ */
252
+ __publicField(_ITransformPlugin, "pluginName");
253
+ var ITransformPlugin = _ITransformPlugin;
254
+
255
+ // src/privacy/desensitize.tool.ts
256
+ var desensitizeMobile = /* @__PURE__ */ __name((mobile) => {
257
+ if (!mobile) return "";
258
+ return String(mobile).replace(/(\d{3})\d*(\d{4})/, "$1****$2");
259
+ }, "desensitizeMobile");
260
+ var desensitizeName = /* @__PURE__ */ __name((name = "", format = "firstAndLast") => {
261
+ const str = String(name || "").trim();
262
+ const len = str.length;
263
+ if (format === "first") {
264
+ return str.replace(/(?<=.)./g, "*");
265
+ }
266
+ if (format === "all") {
267
+ return "*";
268
+ }
269
+ if (format === "firstAndLast") {
270
+ if (len < 3) return str;
271
+ return `${str[0] || ""}${"*".repeat(len - 2)}${str[len - 1] || ""}`;
272
+ }
273
+ if (format === "pre2AndLast") {
274
+ if (len < 4) return str;
275
+ return `${str.slice(0, 2) || ""}${"*".repeat(len - 3)}${str[len - 1] || ""}`;
276
+ }
277
+ if (format === "maxFourLetter") {
278
+ if (len < 3) return `${str[0] || ""}*`;
279
+ return str.replace(/^(.).+(.)$/g, "$1**$2");
280
+ }
281
+ return str;
282
+ }, "desensitizeName");
283
+ var desensitizeEnterpriseName = /* @__PURE__ */ __name((str) => {
284
+ str = String(str || "").trim();
285
+ const len = str?.length;
286
+ if (!str || len < 3) return str;
287
+ return `${str.substring(0, 2)}${"*".repeat(len - 3)}${str[len - 1] || ""}`;
288
+ }, "desensitizeEnterpriseName");
289
+ var desensitizeEnterpriseNo = /* @__PURE__ */ __name((str) => {
290
+ if (!str) return str;
291
+ return str.replace(/SAAS\d+(?=\d{4})/, "SAAS****");
292
+ }, "desensitizeEnterpriseNo");
293
+ var desensitizeAddress = /* @__PURE__ */ __name((str = "", maskAll = false) => {
294
+ if (!str) return str;
295
+ if (maskAll) {
296
+ return "*".repeat(str.length);
297
+ }
298
+ return str.replace(/\d+(?=[室|号|楼])/g, "**");
299
+ }, "desensitizeAddress");
300
+ var desensitizePrice = /* @__PURE__ */ __name((len = 3, showUnit) => {
301
+ return `${showUnit ? "\xA5" : ""} ${"*".repeat(len)}`;
302
+ }, "desensitizePrice");
303
+ var desensitizeAmount = /* @__PURE__ */ __name((_value, options) => {
304
+ const { length = 3, showUnit = false } = options || {};
305
+ return `${showUnit ? "\xA5" : ""} ${"*".repeat(length)}`;
306
+ }, "desensitizeAmount");
307
+ var desensitizeNameAll = /* @__PURE__ */ __name((name = "") => {
308
+ return desensitizeName(name, "all");
309
+ }, "desensitizeNameAll");
310
+ var desensitizeUtil = {
311
+ mobile: desensitizeMobile,
312
+ name: desensitizeName,
313
+ enterpriseName: desensitizeEnterpriseName,
314
+ enterpriseNo: desensitizeEnterpriseNo,
315
+ address: desensitizeAddress,
316
+ price: desensitizePrice,
317
+ /** 和 price / desensitizeAmount 调用执行结果一致,但方法封装参数不一致 */
318
+ amount: desensitizeAmount,
319
+ nameAll: desensitizeNameAll
320
+ };
321
+ var desensitize_tool_default = desensitizeUtil;
322
+
323
+ // src/privacy/apply/desensitize.ts
324
+ function applyDesensitize(data, fieldName, originalValue, options, userPermission) {
325
+ const { permissionCode, method, params } = options;
326
+ if (originalValue == null) {
327
+ return;
328
+ }
329
+ if (permissionCode && userPermission?.includes(permissionCode)) {
330
+ return;
331
+ }
332
+ try {
333
+ const desensitizeFn = desensitize_tool_default[method];
334
+ data[fieldName] = desensitizeFn(originalValue, params);
335
+ } catch (error) {
336
+ console.error("\u8131\u654F\u5931\u8D25:", error);
337
+ }
338
+ }
339
+ __name(applyDesensitize, "applyDesensitize");
340
+
341
+ // src/privacy/utils.ts
342
+ var ENCRYPTION_KEY = "Ff3UCEPfizZmCjke1Xfi";
343
+ function encryptValue(value) {
344
+ try {
345
+ const stringValue = String(value || "");
346
+ const key = Buffer.from(ENCRYPTION_KEY);
347
+ const data = Buffer.from(stringValue);
348
+ const result = Buffer.alloc(data.length);
349
+ for (let i = 0; i < data.length; i++) {
350
+ result[i] = data[i] ^ key[i % key.length];
351
+ }
352
+ return result.toString("base64");
353
+ } catch (error) {
354
+ console.error("\u52A0\u5BC6\u5931\u8D25:", error);
355
+ return `error:${Buffer.from(String(value || "")).toString("base64")}`;
356
+ }
357
+ }
358
+ __name(encryptValue, "encryptValue");
359
+
360
+ // src/privacy/apply/encryption.ts
361
+ function applyEncryption(data, fieldName, originalValue, options, userPermission) {
362
+ const { permissionCode } = options;
363
+ data[fieldName] = null;
364
+ const encryptedFieldName = `${fieldName}Encrypted`;
365
+ data[encryptedFieldName] = null;
366
+ const hasPermission = userPermission?.includes(permissionCode);
367
+ if (hasPermission && originalValue != null) {
368
+ try {
369
+ const stringValue = String(originalValue);
370
+ const encryptedValue = encryptValue(stringValue);
371
+ data[encryptedFieldName] = encryptedValue;
372
+ } catch (error) {
373
+ console.error("\u52A0\u5BC6\u5931\u8D25:", error);
374
+ }
375
+ }
376
+ }
377
+ __name(applyEncryption, "applyEncryption");
378
+
379
+ // src/privacy/apply/isPermitted.ts
380
+ function applyIsPermitted(data, fieldName, options, userPermission) {
381
+ const { permissionCode, condition = /* @__PURE__ */ __name((_data) => true, "condition") } = options;
382
+ const hasRequiredPermission = !permissionCode || (userPermission?.includes(permissionCode) ?? false);
383
+ data[fieldName] = hasRequiredPermission && condition(data);
384
+ }
385
+ __name(applyIsPermitted, "applyIsPermitted");
386
+
387
+ // src/privacy/privacy.plugin.ts
388
+ function _ts_decorate(decorators, target, key, desc) {
389
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
390
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
391
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
392
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
393
+ }
394
+ __name(_ts_decorate, "_ts_decorate");
395
+ var _PrivacyPlugin = class _PrivacyPlugin extends ITransformPlugin {
396
+ execute(request, { parent, key, value }) {
397
+ const userPermission = request.user?.permission || [];
398
+ this.collectAndExcuteFields(parent, key, value, userPermission);
399
+ }
400
+ /**
401
+ * 处理对象的隐私字段
402
+ * @param data 待处理的对象数据
403
+ * @param privacyFields 隐私字段元数据
404
+ * @param userPermission 当前用户信息
405
+ */
406
+ collectAndExcuteFields(data, key, value, userPermission) {
407
+ if (typeof key !== "string") return;
408
+ const targetClass = data?.constructor;
409
+ if (!targetClass) return;
410
+ const originalValue = value;
411
+ const encryptOptions = privacyMetadataStorage.findPrivacyMetadata(targetClass, key, PrivacyTransformEnum.PrivacyEncrypt)?.options;
412
+ if (encryptOptions) {
413
+ applyEncryption(data, key, originalValue, encryptOptions, userPermission);
414
+ }
415
+ const desensitizeOptions = privacyMetadataStorage.findPrivacyMetadata(targetClass, key, PrivacyTransformEnum.PrivacyDesensitize)?.options;
416
+ if (desensitizeOptions) {
417
+ applyDesensitize(data, key, originalValue, desensitizeOptions, userPermission);
418
+ }
419
+ const isPermittedOptions = privacyMetadataStorage.findPrivacyMetadata(targetClass, key, PrivacyTransformEnum.PrivacyIsPermitted)?.options;
420
+ if (isPermittedOptions) {
421
+ applyIsPermitted(data, key, isPermittedOptions, userPermission);
422
+ }
423
+ }
424
+ };
425
+ __name(_PrivacyPlugin, "PrivacyPlugin");
426
+ __publicField(_PrivacyPlugin, "pluginName", _PrivacyPlugin.name);
427
+ var PrivacyPlugin = _PrivacyPlugin;
428
+ PrivacyPlugin = _ts_decorate([
429
+ (0, import_common2.Injectable)()
430
+ ], PrivacyPlugin);
431
+
432
+ // src/transform.interceptor.ts
433
+ var import_common4 = require("@nestjs/common");
434
+ var import_operators = require("rxjs/operators");
435
+
436
+ // src/transform.plugin.manager.ts
437
+ var import_bff_core = require("@xfe-repo/bff-core");
438
+ var import_common3 = require("@nestjs/common");
439
+ var import_core = require("@nestjs/core");
440
+
441
+ // src/traverse.utils.ts
442
+ function traverse(obj, callback, options = {}) {
443
+ const { maxDepth = Infinity, detectCircular = false, method = "iterative" } = options;
444
+ if (method === "recursive") {
445
+ recursiveTraverse(obj, callback, maxDepth, detectCircular);
446
+ } else {
447
+ iterativeTraverse(obj, callback, maxDepth, detectCircular);
448
+ }
449
+ }
450
+ __name(traverse, "traverse");
451
+ function recursiveTraverse(current, callback, maxDepth, detectCircular, path = [], parent = null, seen = /* @__PURE__ */ new WeakSet()) {
452
+ if (path.length > maxDepth) return;
453
+ const key = path.length > 0 ? path[path.length - 1] : null;
454
+ callback({
455
+ value: current,
456
+ key,
457
+ path,
458
+ parent
459
+ });
460
+ if (detectCircular && typeof current === "object" && current !== null) {
461
+ if (seen.has(current)) return;
462
+ seen.add(current);
463
+ }
464
+ if (current !== null && typeof current === "object" && path.length < maxDepth) {
465
+ if (Array.isArray(current)) {
466
+ for (let i = 0; i < current.length; i++) {
467
+ recursiveTraverse(current[i], callback, maxDepth, detectCircular, [
468
+ ...path,
469
+ i
470
+ ], current, seen);
471
+ }
472
+ } else {
473
+ for (const [k, v] of Object.entries(current)) {
474
+ recursiveTraverse(v, callback, maxDepth, detectCircular, [
475
+ ...path,
476
+ k
477
+ ], current, seen);
478
+ }
479
+ }
480
+ }
481
+ }
482
+ __name(recursiveTraverse, "recursiveTraverse");
483
+ function iterativeTraverse(root, callback, maxDepth, detectCircular) {
484
+ const stack = [
485
+ {
486
+ value: root,
487
+ path: [],
488
+ parent: null
489
+ }
490
+ ];
491
+ const seen = detectCircular ? /* @__PURE__ */ new WeakSet() : null;
492
+ while (stack.length > 0) {
493
+ const { value, path, parent } = stack.pop();
494
+ if (path.length > maxDepth) continue;
495
+ const key = path.length > 0 ? path[path.length - 1] : null;
496
+ callback({
497
+ value,
498
+ key,
499
+ path,
500
+ parent
501
+ });
502
+ if (value !== null && typeof value === "object" && path.length < maxDepth) {
503
+ if (detectCircular) {
504
+ if (seen.has(value)) continue;
505
+ seen.add(value);
506
+ }
507
+ if (Array.isArray(value)) {
508
+ for (let i = value.length - 1; i >= 0; i--) {
509
+ stack.push({
510
+ value: value[i],
511
+ path: [
512
+ ...path,
513
+ i
514
+ ],
515
+ parent: value
516
+ });
517
+ }
518
+ } else {
519
+ const keys = Object.keys(value);
520
+ for (let i = keys.length - 1; i >= 0; i--) {
521
+ const k = keys[i];
522
+ stack.push({
523
+ value: value[k],
524
+ path: [
525
+ ...path,
526
+ k
527
+ ],
528
+ parent: value
529
+ });
530
+ }
531
+ }
532
+ }
533
+ }
534
+ }
535
+ __name(iterativeTraverse, "iterativeTraverse");
536
+
537
+ // src/transform.plugin.manager.ts
538
+ function _ts_decorate2(decorators, target, key, desc) {
539
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
540
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
541
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
542
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
543
+ }
544
+ __name(_ts_decorate2, "_ts_decorate");
545
+ function _ts_metadata(k, v) {
546
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
547
+ }
548
+ __name(_ts_metadata, "_ts_metadata");
549
+ function _ts_param(paramIndex, decorator) {
550
+ return function(target, key) {
551
+ decorator(target, key, paramIndex);
552
+ };
553
+ }
554
+ __name(_ts_param, "_ts_param");
555
+ var _TransformPluginManager = class _TransformPluginManager {
556
+ constructor(ctx, moduleRef, plugins) {
557
+ __publicField(this, "ctx");
558
+ __publicField(this, "moduleRef");
559
+ __publicField(this, "logger", new import_common3.Logger(_TransformPluginManager.name));
560
+ __publicField(this, "plugins", []);
561
+ this.ctx = ctx;
562
+ this.moduleRef = moduleRef;
563
+ this.registerAsyncPlugins(plugins);
564
+ }
565
+ async registerAsyncPlugins(plugins) {
566
+ const uniquePlugins = /* @__PURE__ */ new Map();
567
+ for (const plugin of plugins) {
568
+ if (!plugin.pluginName) {
569
+ this.logger.error(`${plugin.name} \u7F3A\u5C11\u63D2\u4EF6\u540D\u79F0 static readonly pluginName \u5C5E\u6027, \u8BF7\u786E\u4FDD\u6BCF\u4E2A\u63D2\u4EF6\u90FD\u6709\u552F\u4E00\u7684\u540D\u79F0\u3002`);
570
+ continue;
571
+ }
572
+ if (!uniquePlugins.has(plugin.pluginName)) {
573
+ const pluginInstance = await this.moduleRef.create(plugin);
574
+ uniquePlugins.set(plugin.pluginName, pluginInstance);
575
+ }
576
+ }
577
+ this.plugins = Array.from(uniquePlugins.values());
578
+ }
579
+ /**
580
+ * 主入口方法,处理请求数据
581
+ * @param data 实例化的数据对象
582
+ * @param request 请求对象, 非必传,如果没有传入,则从请求上下文中获取
583
+ */
584
+ async main(data) {
585
+ const request = this.ctx.req;
586
+ request.data = data;
587
+ this.initialize(request);
588
+ const excutePlugins = await this.executeBefore(request);
589
+ this.execute(request, excutePlugins);
590
+ await this.executeAfter(request, excutePlugins);
591
+ }
592
+ /**
593
+ * 初始化插件
594
+ * 可以用于插件的初始化逻辑,例如加载配置、注册事件等
595
+ * 如果插件不需要初始化逻辑,可以不实现该方法
596
+ * @param request 请求对象
597
+ */
598
+ initialize(request) {
599
+ this.plugins.forEach((plugin) => plugin.initialize?.(request));
600
+ }
601
+ /**
602
+ * 执行插件的 before 钩子函数
603
+ * 该方法会返回需要执行的插件列表
604
+ * 如果插件的 executeBefore 返回 false,则不执行该插件
605
+ * @param request 请求对象
606
+ */
607
+ async executeBefore(request) {
608
+ const beforeResList = await Promise.all(this.plugins.map((plugin) => plugin.executeBefore?.(request)));
609
+ return this.plugins.filter((_, index) => beforeResList[index]);
610
+ }
611
+ /**
612
+ * 执行插件的主要逻辑
613
+ * 该方法会在数据遍历过程中被调用
614
+ * 这个方法是插件的核心逻辑,用于处理数据的每个字段
615
+ * 此方法只调用一次递归遍历函数, 优化多个插件时的遍历性能
616
+ * @param request 请求对
617
+ * @param excutePlugins 需要执行的插件列表
618
+ */
619
+ execute(request, excutePlugins) {
620
+ traverse(request.data, (traverseFnOptions) => {
621
+ excutePlugins.forEach((plugin) => {
622
+ plugin.execute(request, traverseFnOptions);
623
+ });
624
+ });
625
+ }
626
+ /**
627
+ * 执行插件的 after 钩子函数
628
+ * 这个方法会在所有数据处理完成后被调用
629
+ * 可以用于清理资源或执行一些收尾工作
630
+ * @param request 请求对象
631
+ * @param excutePlugins 需要执行的插件列表
632
+ */
633
+ async executeAfter(request, excutePlugins) {
634
+ await Promise.all(excutePlugins.map((plugin) => plugin.executeAfter?.(request)));
635
+ }
636
+ };
637
+ __name(_TransformPluginManager, "TransformPluginManager");
638
+ var TransformPluginManager = _TransformPluginManager;
639
+ TransformPluginManager = _ts_decorate2([
640
+ (0, import_common3.Injectable)(),
641
+ _ts_param(2, (0, import_common3.Inject)(INJECT_TRANSFORM_PLUGINS)),
642
+ _ts_metadata("design:type", Function),
643
+ _ts_metadata("design:paramtypes", [
644
+ typeof import_bff_core.CtxService === "undefined" ? Object : import_bff_core.CtxService,
645
+ typeof import_core.ModuleRef === "undefined" ? Object : import_core.ModuleRef,
646
+ Array
647
+ ])
648
+ ], TransformPluginManager);
649
+
650
+ // src/transform.interceptor.ts
651
+ function _ts_decorate3(decorators, target, key, desc) {
652
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
653
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
654
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
655
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
656
+ }
657
+ __name(_ts_decorate3, "_ts_decorate");
658
+ function _ts_metadata2(k, v) {
659
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
660
+ }
661
+ __name(_ts_metadata2, "_ts_metadata");
662
+ var _TransformInterceptor = class _TransformInterceptor {
663
+ constructor(transformPluginManager) {
664
+ __publicField(this, "transformPluginManager");
665
+ __publicField(this, "logger", new import_common4.Logger(_TransformInterceptor.name));
666
+ this.transformPluginManager = transformPluginManager;
667
+ }
668
+ intercept(_context, next) {
669
+ return next.handle().pipe((0, import_operators.mergeMap)(async (data) => {
670
+ if (!data) return data;
671
+ await this.transformPluginManager.main(data).catch((error) => {
672
+ this.logger.error("PluginManager execute failed:", error);
673
+ });
674
+ return data;
675
+ }));
676
+ }
677
+ };
678
+ __name(_TransformInterceptor, "TransformInterceptor");
679
+ var TransformInterceptor = _TransformInterceptor;
680
+ TransformInterceptor = _ts_decorate3([
681
+ (0, import_common4.Injectable)(),
682
+ _ts_metadata2("design:type", Function),
683
+ _ts_metadata2("design:paramtypes", [
684
+ typeof TransformPluginManager === "undefined" ? Object : TransformPluginManager
685
+ ])
686
+ ], TransformInterceptor);
687
+
688
+ // src/unionQuery/unionQuery.plugin.ts
689
+ var import_common5 = require("@nestjs/common");
690
+ var import_core2 = require("@nestjs/core");
691
+ var import_bff_cache2 = require("@xfe-repo/bff-cache");
692
+
693
+ // src/unionQuery/tasks/collectTasks.ts
694
+ var import_qs = __toESM(require("qs"));
695
+
696
+ // src/unionQuery/unionquery.metadata-storage.ts
697
+ var import_class_transformer3 = require("class-transformer");
698
+ var UnionQueryTransformEnum = /* @__PURE__ */ function(UnionQueryTransformEnum2) {
699
+ UnionQueryTransformEnum2["UnionQuery"] = "UnionQuery";
700
+ return UnionQueryTransformEnum2;
701
+ }({});
702
+ var _a2;
703
+ var UnionQueryTransformMetadataStorage = (_a2 = class extends TransformMetadataStorage {
704
+ /**
705
+ * 添加联合查询转换元数据
706
+ * @param metadata 联合查询转换元数据
707
+ */
708
+ addUnionQueryMetadata(metadata) {
709
+ const options = {
710
+ ...metadata.options,
711
+ toClassOnly: true
712
+ };
713
+ this.getMetadataStorage().addTransformMetadata({
714
+ ...metadata,
715
+ options
716
+ });
717
+ }
718
+ /**
719
+ * 查找联合查询转换元数据
720
+ * @param target
721
+ * @param propertyName
722
+ * @param transformationType
723
+ * @returns
724
+ */
725
+ findUnionQueryMetadata(target, propertyName) {
726
+ const unionQueryMetadatas = this.getMetadataStorage().findTransformMetadatas(target, propertyName, import_class_transformer3.TransformationType.PLAIN_TO_CLASS);
727
+ return unionQueryMetadatas.find((meta) => meta.options?.transformName === "UnionQuery");
728
+ }
729
+ }, __name(_a2, "UnionQueryTransformMetadataStorage"), _a2);
730
+ var unionQueryMetadataStorage = new UnionQueryTransformMetadataStorage();
731
+
732
+ // src/unionQuery/tasks/utils.ts
733
+ var import_constants = require("@nestjs/common/constants");
734
+ function isNullOrUndefined(x) {
735
+ return x === null || x === void 0;
736
+ }
737
+ __name(isNullOrUndefined, "isNullOrUndefined");
738
+ function getServiceName(service) {
739
+ if (typeof service === "function") return service.name;
740
+ if (typeof service === "object" && service !== null && "provide" in service) {
741
+ const token = service.provide;
742
+ if (typeof token === "string" || typeof token === "symbol") return token.toString();
743
+ if (typeof token === "function") return token.name;
744
+ }
745
+ return "\u672A\u77E5\u670D\u52A1";
746
+ }
747
+ __name(getServiceName, "getServiceName");
748
+ function getServiceToken(service) {
749
+ if (typeof service === "function") return service;
750
+ if (typeof service === "object" && service !== null && "provide" in service) return service.provide;
751
+ throw new Error(`\u65E0\u6548\u7684\u670D\u52A1\u914D\u7F6E: ${JSON.stringify(service)}`);
752
+ }
753
+ __name(getServiceToken, "getServiceToken");
754
+ var getServiceInstance = /* @__PURE__ */ __name((service, moduleRef) => {
755
+ const serviceName = getServiceName(service);
756
+ try {
757
+ const token = getServiceToken(service);
758
+ const instance = moduleRef.get(token, {
759
+ strict: false
760
+ });
761
+ if (!instance) {
762
+ throw new Error(`\u672A\u627E\u5230\u670D\u52A1 ${serviceName}\uFF0C\u8BF7\u68C0\u67E5 Provider \u914D\u7F6E\u3002`);
763
+ }
764
+ return instance;
765
+ } catch (error) {
766
+ throw new Error(`\u83B7\u53D6\u670D\u52A1\u5B9E\u4F8B ${serviceName} \u51FA\u9519: ${error instanceof Error ? error.message : String(error)}${error instanceof Error ? error.stack : ""}`);
767
+ }
768
+ }, "getServiceInstance");
769
+
770
+ // src/unionQuery/tasks/collectTasks.ts
771
+ var TTL = 10 * 60 * 1e3;
772
+ function collectTasks(data, propertyKey, _value, options) {
773
+ const { tasks, logger } = options;
774
+ if (typeof propertyKey !== "string") return;
775
+ const targetClass = data?.constructor;
776
+ if (!targetClass) return;
777
+ const UnionQueryOptions = unionQueryMetadataStorage.findUnionQueryMetadata(targetClass, propertyKey)?.options;
778
+ if (UnionQueryOptions) {
779
+ const { service, methodFn, inFn, cacheFn, ttl = TTL } = UnionQueryOptions;
780
+ let extractedObject;
781
+ try {
782
+ extractedObject = inFn?.(data) || {};
783
+ } catch (e) {
784
+ logger(`\u6267\u884C inFn \u51FA\u9519 (${targetClass.name}.${propertyKey}): ${e.message}, ${e.stack}`);
785
+ }
786
+ const methodName = String(methodFn).split(".")[1];
787
+ const taskKey = `${getServiceName(service)}:${String(methodFn)}`;
788
+ let task = tasks.get(taskKey);
789
+ if (!task) {
790
+ task = {
791
+ taskKey,
792
+ targetName: targetClass.name,
793
+ service,
794
+ methodFn,
795
+ methodName,
796
+ ttl,
797
+ paramAggregators: {},
798
+ cacheKeyList: [],
799
+ contexts: []
800
+ };
801
+ }
802
+ const context = {
803
+ context: data,
804
+ propertyKey,
805
+ options: UnionQueryOptions
806
+ };
807
+ if (cacheFn) {
808
+ const cacheKey = `${task.taskKey}:${import_qs.default.stringify(extractedObject)}`;
809
+ if (!task.cacheKeyList.includes(cacheKey)) {
810
+ task.cacheKeyList.push(cacheKey);
811
+ }
812
+ context.cacheKey = cacheKey;
813
+ }
814
+ for (const [extractedKey, extractedValue] of Object.entries(extractedObject)) {
815
+ if (!task.paramAggregators[extractedKey]) {
816
+ task.paramAggregators[extractedKey] = [];
817
+ }
818
+ if (!isNullOrUndefined(extractedValue) && !task.paramAggregators[extractedKey].includes(extractedValue)) {
819
+ task.paramAggregators[extractedKey].push(extractedValue);
820
+ }
821
+ }
822
+ task.contexts.push(context);
823
+ tasks.set(taskKey, task);
824
+ }
825
+ }
826
+ __name(collectTasks, "collectTasks");
827
+
828
+ // src/unionQuery/tasks/executeTask.ts
829
+ var import_bff_cache = require("@xfe-repo/bff-cache");
830
+ var import_qs2 = __toESM(require("qs"));
831
+ async function executeTask(task, options) {
832
+ const { moduleRef, cacheManagerService, logger } = options;
833
+ const serviceName = getServiceName(task.service);
834
+ const methodName = task.methodName;
835
+ const loggerPrifixed = `\u3010Vo: ${task.targetName}, key: ${task.taskKey}, params: ${JSON.stringify(task.paramAggregators)}}\u3011`;
836
+ const cacheResultList = await cacheManagerService.mget(import_bff_cache.CachePrefix.UnionQuery, task.cacheKeyList);
837
+ const cacheResultDic = {};
838
+ cacheResultList.forEach((result, index) => {
839
+ if (result) {
840
+ const cacheKey = task.cacheKeyList[index];
841
+ cacheResultDic[cacheKey] = result;
842
+ const inFnParamsFromCacheKey = import_qs2.default.parse(cacheKey.split(":")[2]);
843
+ for (const paramsKey in inFnParamsFromCacheKey) {
844
+ const paramsValue = inFnParamsFromCacheKey[paramsKey];
845
+ task.paramAggregators[paramsKey] = task.paramAggregators[paramsKey].filter((param) => param !== paramsValue);
846
+ }
847
+ }
848
+ });
849
+ const aggregatedParams = {};
850
+ for (const inField in task.paramAggregators) {
851
+ aggregatedParams[inField] = task.paramAggregators[inField].join(",");
852
+ }
853
+ try {
854
+ let unionResult = {};
855
+ const hasCacheResult = Object.keys(cacheResultDic).length > 0;
856
+ const hasAggregatedParams = Object.values(aggregatedParams).filter(Boolean).length > 0;
857
+ const shouldCallService = !hasCacheResult || hasAggregatedParams;
858
+ if (shouldCallService) {
859
+ const serviceInstance = getServiceInstance(task.service, moduleRef);
860
+ if (!serviceInstance) return;
861
+ const serviceMethod = task.methodFn(serviceInstance);
862
+ unionResult = await serviceMethod.call(serviceInstance, aggregatedParams);
863
+ logger(`${loggerPrifixed}\u6267\u884C\u67E5\u8BE2: ${serviceName}.${serviceMethod.name}(${JSON.stringify(aggregatedParams)})`, "Access");
864
+ } else {
865
+ logger(`${loggerPrifixed}\u4ECE\u7F13\u5B58\u83B7\u53D6\u6570\u636E\uFF0C\u5DF2\u8DF3\u8FC7\u67E5\u8BE2\u3002`, "Access");
866
+ }
867
+ const setCacheKeyList = [];
868
+ task.contexts.forEach((contextItem) => {
869
+ const { options: options2, context, propertyKey, cacheKey } = contextItem;
870
+ try {
871
+ const { cacheFn, outFn } = options2;
872
+ if (cacheFn && cacheKey) {
873
+ const cacheResult = cacheResultDic[cacheKey];
874
+ if (cacheResult) {
875
+ context[propertyKey] = outFn(cacheResult, context);
876
+ return;
877
+ }
878
+ const cachedValue = cacheFn(unionResult, context) || {};
879
+ const newValue = outFn(cachedValue, context);
880
+ context[propertyKey] = newValue;
881
+ if (!setCacheKeyList.find((item) => item.key === cacheKey)) {
882
+ setCacheKeyList.push({
883
+ key: cacheKey,
884
+ value: cachedValue
885
+ });
886
+ }
887
+ } else {
888
+ const newValue = outFn(unionResult, context);
889
+ context[propertyKey] = newValue;
890
+ }
891
+ } catch (e) {
892
+ logger(`${loggerPrifixed}\u6267\u884C ${String(propertyKey)}.outFn \u51FA\u9519: ${e.message} ${e.stack}`);
893
+ }
894
+ });
895
+ if (setCacheKeyList.length > 0) {
896
+ cacheManagerService.mset(import_bff_cache.CachePrefix.UnionQuery, setCacheKeyList, task.ttl);
897
+ }
898
+ } catch (error) {
899
+ logger(`${loggerPrifixed}\u6267\u884C ${serviceName}#${methodName}(${JSON.stringify(aggregatedParams)}) \u5931\u8D25: ${error instanceof Error ? error.message : String(error)} ${error instanceof Error ? error.stack : ""}`);
900
+ }
901
+ }
902
+ __name(executeTask, "executeTask");
903
+
904
+ // src/unionQuery/unionQuery.plugin.ts
905
+ function _ts_decorate4(decorators, target, key, desc) {
906
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
907
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
908
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
909
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
910
+ }
911
+ __name(_ts_decorate4, "_ts_decorate");
912
+ function _ts_metadata3(k, v) {
913
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
914
+ }
915
+ __name(_ts_metadata3, "_ts_metadata");
916
+ var _UnionQueryPlugin = class _UnionQueryPlugin extends ITransformPlugin {
917
+ constructor(moduleRef, cacheManagerService) {
918
+ super();
919
+ __publicField(this, "moduleRef");
920
+ __publicField(this, "cacheManagerService");
921
+ __publicField(this, "logger", new import_common5.Logger(_UnionQueryPlugin.name));
922
+ __publicField(this, "emitLogger", /* @__PURE__ */ __name((message, type = "Error") => {
923
+ this.logger.log(`${type}: ${message}`);
924
+ }, "emitLogger"));
925
+ this.moduleRef = moduleRef, this.cacheManagerService = cacheManagerService;
926
+ }
927
+ initialize(request) {
928
+ if (!request._union_query_tasks) {
929
+ request._union_query_tasks = /* @__PURE__ */ new Map();
930
+ }
931
+ }
932
+ execute(request, { parent, key, value }) {
933
+ collectTasks(parent, key, value, {
934
+ tasks: request._union_query_tasks,
935
+ logger: this.emitLogger
936
+ });
937
+ }
938
+ async executeAfter(request) {
939
+ const { _union_query_tasks: tasks } = request;
940
+ if (tasks.size === 0) return;
941
+ const excuteTaskOptions = {
942
+ moduleRef: this.moduleRef,
943
+ cacheManagerService: this.cacheManagerService,
944
+ logger: this.emitLogger
945
+ };
946
+ await Promise.all(Array.from(tasks.values()).map((task) => executeTask(task, excuteTaskOptions)));
947
+ }
948
+ };
949
+ __name(_UnionQueryPlugin, "UnionQueryPlugin");
950
+ __publicField(_UnionQueryPlugin, "pluginName", _UnionQueryPlugin.name);
951
+ var UnionQueryPlugin = _UnionQueryPlugin;
952
+ UnionQueryPlugin = _ts_decorate4([
953
+ (0, import_common5.Injectable)(),
954
+ _ts_metadata3("design:type", Function),
955
+ _ts_metadata3("design:paramtypes", [
956
+ typeof import_core2.ModuleRef === "undefined" ? Object : import_core2.ModuleRef,
957
+ typeof import_bff_cache2.CacheManagerService === "undefined" ? Object : import_bff_cache2.CacheManagerService
958
+ ])
959
+ ], UnionQueryPlugin);
960
+
961
+ // src/transform.module.ts
962
+ function _ts_decorate5(decorators, target, key, desc) {
963
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
964
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
965
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
966
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
967
+ }
968
+ __name(_ts_decorate5, "_ts_decorate");
969
+ var _TransformModule = class _TransformModule {
970
+ /* 注册插件
971
+ * @param global 是否全局模块,默认值为 false
972
+ * @param plugins 扩展插件列表
973
+ * @returns {DynamicModule} 动态模块
974
+ */
975
+ static register(options = {}) {
976
+ const corePlugins = [
977
+ UnionQueryPlugin,
978
+ PrivacyPlugin
979
+ ];
980
+ return {
981
+ global: options.global,
982
+ module: _TransformModule,
983
+ providers: [
984
+ {
985
+ provide: INJECT_TRANSFORM_PLUGINS,
986
+ // 将核心插件和自定义插件合并
987
+ // 此处注意约定注册顺序为: 自定义插件早于内置插件, 如果有同名插件, 可以保证自定义插件可以覆盖内置插件
988
+ useValue: options.plugins ? [
989
+ ...options.plugins,
990
+ ...corePlugins
991
+ ] : corePlugins
992
+ }
993
+ ]
994
+ };
995
+ }
996
+ };
997
+ __name(_TransformModule, "TransformModule");
998
+ var TransformModule = _TransformModule;
999
+ TransformModule = _ts_decorate5([
1000
+ (0, import_common6.Module)({
1001
+ providers: [
1002
+ TransformPluginManager,
1003
+ {
1004
+ provide: import_core3.APP_INTERCEPTOR,
1005
+ useClass: TransformInterceptor
1006
+ }
1007
+ ]
1008
+ })
1009
+ ], TransformModule);
1010
+
1011
+ // src/unionQuery/unionQuery.decorators.ts
1012
+ function UnionQuery(options) {
1013
+ return (target, propertyName) => {
1014
+ unionQueryMetadataStorage.addUnionQueryMetadata({
1015
+ target: target.constructor,
1016
+ propertyName,
1017
+ // 此回调需必传,处理默认值填充,以便 unionQuery.interceptor 中的遍历可以正常运作
1018
+ transformFn: /* @__PURE__ */ __name((ctx) => ctx.value || "", "transformFn"),
1019
+ options: {
1020
+ ...options,
1021
+ transformName: UnionQueryTransformEnum.UnionQuery
1022
+ }
1023
+ });
1024
+ };
1025
+ }
1026
+ __name(UnionQuery, "UnionQuery");
1027
+ var UnionQueryFactory = /* @__PURE__ */ __name(() => (options) => {
1028
+ return UnionQuery(options);
1029
+ }, "UnionQueryFactory");
1030
+ // Annotate the CommonJS export names for ESM import in node:
1031
+ 0 && (module.exports = {
1032
+ Privacy,
1033
+ PrivacyPlugin,
1034
+ TransformCurrency,
1035
+ TransformMetadataStorage,
1036
+ TransformModule,
1037
+ TransformPluginManager,
1038
+ TransformTyped,
1039
+ UnionQuery,
1040
+ UnionQueryFactory,
1041
+ traverse
1042
+ });