@akanjs/nest 0.0.33 → 0.0.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.js CHANGED
@@ -1,21 +1,2134 @@
1
- var __defProp = Object.defineProperty;
2
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
- var __getOwnPropNames = Object.getOwnPropertyNames;
4
- var __hasOwnProp = Object.prototype.hasOwnProperty;
5
- var __copyProps = (to, from, except, desc) => {
6
- if (from && typeof from === "object" || typeof from === "function") {
7
- for (let key of __getOwnPropNames(from))
8
- if (!__hasOwnProp.call(to, key) && key !== except)
9
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
10
- }
11
- return to;
12
- };
13
- var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
14
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
- var nest_exports = {};
16
- module.exports = __toCommonJS(nest_exports);
17
- __reExport(nest_exports, require("./src"), module.exports);
18
- // Annotate the CommonJS export names for ESM import in node:
19
- 0 && (module.exports = {
20
- ...require("./src")
21
- });
1
+ (() => {
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 __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
9
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
10
+ }) : x)(function(x) {
11
+ if (typeof require !== "undefined")
12
+ return require.apply(this, arguments);
13
+ throw Error('Dynamic require of "' + x + '" is not supported');
14
+ });
15
+ var __export = (target, all) => {
16
+ for (var name in all)
17
+ __defProp(target, name, { get: all[name], enumerable: true });
18
+ };
19
+ var __copyProps = (to, from, except, desc) => {
20
+ if (from && typeof from === "object" || typeof from === "function") {
21
+ for (let key of __getOwnPropNames(from))
22
+ if (!__hasOwnProp.call(to, key) && key !== except)
23
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
24
+ }
25
+ return to;
26
+ };
27
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
28
+ // If the importer is in node compatibility mode or this is not an ESM
29
+ // file that has been converted to a CommonJS file using a Babel-
30
+ // compatible transform (i.e. "__esModule" has not been set), then set
31
+ // "default" to the CommonJS "module.exports" for node compatibility.
32
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
33
+ mod
34
+ ));
35
+ var __decorateClass = (decorators, target, key, kind) => {
36
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
37
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
38
+ if (decorator = decorators[i])
39
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
40
+ if (kind && result)
41
+ __defProp(target, key, result);
42
+ return result;
43
+ };
44
+ var __decorateParam = (index, decorator) => (target, key) => decorator(target, key, index);
45
+ var __accessCheck = (obj, member, msg) => {
46
+ if (!member.has(obj))
47
+ throw TypeError("Cannot " + msg);
48
+ };
49
+ var __privateGet = (obj, member, getter) => {
50
+ __accessCheck(obj, member, "read from private field");
51
+ return getter ? getter.call(obj) : member.get(obj);
52
+ };
53
+ var __privateAdd = (obj, member, value) => {
54
+ if (member.has(obj))
55
+ throw TypeError("Cannot add the same private member more than once");
56
+ member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
57
+ };
58
+ var __privateMethod = (obj, member, method) => {
59
+ __accessCheck(obj, member, "access private method");
60
+ return method;
61
+ };
62
+
63
+ // pkgs/@akanjs/base/src/base.ts
64
+ var version = "0.9.0";
65
+ var logo = `
66
+ _ _ _
67
+ / \\ | | ____ _ _ __ (_)___
68
+ / _ \\ | |/ / _' | '_ \\ | / __|
69
+ / ___ \\| < (_| | | | |_ | \\__ \\
70
+ /_/ \\_\\_|\\_\\__,_|_| |_(_)/ |___/
71
+ |__/ ver ${version}
72
+ ? See more details on docs https://www.akanjs.com/docs
73
+ \u2605 Star Akanjs on GitHub https://github.com/aka-bassman/akanjs
74
+
75
+ `;
76
+
77
+ // pkgs/@akanjs/base/src/baseEnv.ts
78
+ var appName = process.env.NEXT_PUBLIC_APP_NAME ?? "unknown";
79
+ var repoName = process.env.NEXT_PUBLIC_REPO_NAME ?? "unknown";
80
+ var serveDomain = process.env.NEXT_PUBLIC_SERVE_DOMAIN ?? "unknown";
81
+ if (appName === "unknown")
82
+ throw new Error("environment variable NEXT_PUBLIC_APP_NAME is required");
83
+ if (repoName === "unknown")
84
+ throw new Error("environment variable NEXT_PUBLIC_REPO_NAME is required");
85
+ if (serveDomain === "unknown")
86
+ throw new Error("environment variable NEXT_PUBLIC_SERVE_DOMAIN is required");
87
+ var environment = process.env.NEXT_PUBLIC_ENV ?? "debug";
88
+ var operationType = typeof window !== "undefined" ? "client" : process.env.NEXT_RUNTIME ? "client" : "server";
89
+ var operationMode = process.env.NEXT_PUBLIC_OPERATION_MODE ?? "cloud";
90
+ var networkType = process.env.NEXT_PUBLIC_NETWORK_TYPE ?? (environment === "main" ? "mainnet" : environment === "develop" ? "testnet" : "debugnet");
91
+ var tunnelUsername = process.env.SSU_TUNNEL_USERNAME ?? "root";
92
+ var tunnelPassword = process.env.SSU_TUNNEL_PASSWORD ?? repoName;
93
+ var baseEnv = {
94
+ repoName,
95
+ serveDomain,
96
+ appName,
97
+ environment,
98
+ operationType,
99
+ operationMode,
100
+ networkType,
101
+ tunnelUsername,
102
+ tunnelPassword
103
+ };
104
+ var side = typeof window === "undefined" ? "server" : "client";
105
+ var renderMode = process.env.RENDER_ENV ?? "ssr";
106
+ var clientHost = process.env.NEXT_PUBLIC_CLIENT_HOST ?? (operationMode === "local" || side === "server" ? "localhost" : window.location.hostname);
107
+ var clientPort = parseInt(
108
+ process.env.NEXT_PUBLIC_CLIENT_PORT ?? (operationMode === "local" ? renderMode === "ssr" ? "4200" : "4201" : "443")
109
+ );
110
+ var clientHttpProtocol = side === "client" ? window.location.protocol : clientHost === "localhost" ? "http:" : "https:";
111
+ var clientHttpUri = `${clientHttpProtocol}//${clientHost}${clientPort === 443 ? "" : `:${clientPort}`}`;
112
+ var serverHost = process.env.SERVER_HOST ?? (operationMode === "local" ? typeof window === "undefined" ? "localhost" : window.location.host.split(":")[0] : renderMode === "csr" ? `${appName}-${environment}.${serveDomain}` : side === "client" ? window.location.host.split(":")[0] : operationMode === "cloud" ? `backend-svc.${appName}-${environment}.svc.cluster.local` : "localhost");
113
+ var serverPort = parseInt(
114
+ process.env.SERVER_PORT ?? (operationMode === "local" || side === "server" ? "8080" : "443")
115
+ );
116
+ var serverHttpProtocol = side === "client" ? window.location.protocol : "http:";
117
+ var serverHttpUri = `${serverHttpProtocol}//${serverHost}${serverPort === 443 ? "" : `:${serverPort}`}/backend`;
118
+ var serverGraphqlUri = `${serverHttpUri}/graphql`;
119
+ var serverWsProtocol = serverHttpProtocol === "http:" ? "ws:" : "wss:";
120
+ var serverWsUri = `${serverWsProtocol}//${serverHost}${serverPort === 443 ? "" : `:${serverPort}`}`;
121
+ var baseClientEnv = {
122
+ ...baseEnv,
123
+ side,
124
+ renderMode,
125
+ websocket: true,
126
+ clientHost,
127
+ clientPort,
128
+ clientHttpProtocol,
129
+ clientHttpUri,
130
+ serverHost,
131
+ serverPort,
132
+ serverHttpProtocol,
133
+ serverHttpUri,
134
+ serverGraphqlUri,
135
+ serverWsProtocol,
136
+ serverWsUri
137
+ };
138
+
139
+ // pkgs/@akanjs/base/src/scalar.ts
140
+ var import_dayjs = __toESM(__require("dayjs"));
141
+ var dayjs = import_dayjs.default;
142
+ var Int = class {
143
+ __Scalar__;
144
+ };
145
+ var Upload = class {
146
+ __Scalar__;
147
+ filename;
148
+ mimetype;
149
+ encoding;
150
+ createReadStream;
151
+ };
152
+ var Float = class {
153
+ __Scalar__;
154
+ };
155
+ var ID = class {
156
+ __Scalar__;
157
+ };
158
+ var JSON2 = class {
159
+ __Scalar__;
160
+ };
161
+ var getNonArrayModel = (arraiedModel2) => {
162
+ let arrDepth = 0;
163
+ let target = arraiedModel2;
164
+ while (Array.isArray(target)) {
165
+ target = target[0];
166
+ arrDepth++;
167
+ }
168
+ return [target, arrDepth];
169
+ };
170
+ var applyFnToArrayObjects = (arraiedData, fn) => {
171
+ if (Array.isArray(arraiedData))
172
+ return arraiedData.map((data) => applyFnToArrayObjects(data, fn));
173
+ return fn(arraiedData);
174
+ };
175
+ var scalarSet = /* @__PURE__ */ new Set([String, Boolean, Date, ID, Int, Float, Upload, JSON2, Map]);
176
+ var scalarNameMap = /* @__PURE__ */ new Map([
177
+ [ID, "ID"],
178
+ [Int, "Int"],
179
+ [Float, "Float"],
180
+ [String, "String"],
181
+ [Boolean, "Boolean"],
182
+ [Date, "Date"],
183
+ [Upload, "Upload"],
184
+ [JSON2, "JSON"],
185
+ [Map, "Map"]
186
+ ]);
187
+ var scalarArgMap = /* @__PURE__ */ new Map([
188
+ [ID, null],
189
+ [String, ""],
190
+ [Boolean, false],
191
+ [Date, dayjs(/* @__PURE__ */ new Date(-1))],
192
+ [Int, 0],
193
+ [Float, 0],
194
+ [JSON2, {}],
195
+ [Map, {}]
196
+ ]);
197
+ var scalarDefaultMap = /* @__PURE__ */ new Map([
198
+ [ID, null],
199
+ [String, ""],
200
+ [Boolean, false],
201
+ [Date, dayjs(/* @__PURE__ */ new Date(-1))],
202
+ [Int, 0],
203
+ [Float, 0],
204
+ [JSON2, {}]
205
+ ]);
206
+ var isGqlScalar = (modelRef) => scalarSet.has(modelRef);
207
+ var isGqlMap = (modelRef) => modelRef === Map;
208
+
209
+ // pkgs/@akanjs/common/src/isDayjs.ts
210
+ var import_dayjs2 = __require("dayjs");
211
+
212
+ // pkgs/@akanjs/common/src/isQueryEqual.ts
213
+ var import_dayjs3 = __toESM(__require("dayjs"));
214
+
215
+ // pkgs/@akanjs/common/src/isValidDate.ts
216
+ var import_dayjs4 = __toESM(__require("dayjs"));
217
+ var import_customParseFormat = __toESM(__require("dayjs/plugin/customParseFormat"));
218
+ import_dayjs4.default.extend(import_customParseFormat.default);
219
+
220
+ // pkgs/@akanjs/common/src/pluralize.ts
221
+ var import_pluralize = __toESM(__require("pluralize"));
222
+
223
+ // pkgs/@akanjs/common/src/capitalize.ts
224
+ var capitalize = (str) => {
225
+ return str.charAt(0).toUpperCase() + str.slice(1);
226
+ };
227
+
228
+ // pkgs/@akanjs/common/src/Logger.ts
229
+ var import_dayjs5 = __toESM(__require("dayjs"));
230
+ var logLevels = ["trace", "verbose", "debug", "log", "info", "warn", "error"];
231
+ var clc = {
232
+ bold: (text) => `\x1B[1m${text}\x1B[0m`,
233
+ green: (text) => `\x1B[32m${text}\x1B[39m`,
234
+ yellow: (text) => `\x1B[33m${text}\x1B[39m`,
235
+ red: (text) => `\x1B[31m${text}\x1B[39m`,
236
+ magentaBright: (text) => `\x1B[95m${text}\x1B[39m`,
237
+ cyanBright: (text) => `\x1B[96m${text}\x1B[39m`
238
+ };
239
+ var colorizeMap = {
240
+ trace: clc.bold,
241
+ verbose: clc.cyanBright,
242
+ debug: clc.magentaBright,
243
+ log: clc.green,
244
+ info: clc.green,
245
+ warn: clc.yellow,
246
+ error: clc.red
247
+ };
248
+ var Logger = class _Logger {
249
+ static #ignoreCtxSet = /* @__PURE__ */ new Set([
250
+ "InstanceLoader",
251
+ "RoutesResolver",
252
+ "RouterExplorer",
253
+ "NestFactory",
254
+ "WebSocketsController",
255
+ "GraphQLModule",
256
+ "NestApplication"
257
+ ]);
258
+ static level = process.env.NEXT_PUBLIC_LOG_LEVEL ?? "log";
259
+ static #levelIdx = logLevels.findIndex((l) => l === process.env.NEXT_PUBLIC_LOG_LEVEL);
260
+ static #startAt = (0, import_dayjs5.default)();
261
+ static setLevel(level) {
262
+ this.level = level;
263
+ this.#levelIdx = logLevels.findIndex((l) => l === level);
264
+ }
265
+ name;
266
+ constructor(name) {
267
+ this.name = name;
268
+ }
269
+ trace(msg, context = "") {
270
+ if (_Logger.#levelIdx <= 0)
271
+ _Logger.#printMessages(this.name ?? "App", msg, context, "trace");
272
+ }
273
+ verbose(msg, context = "") {
274
+ if (_Logger.#levelIdx <= 1)
275
+ _Logger.#printMessages(this.name ?? "App", msg, context, "verbose");
276
+ }
277
+ debug(msg, context = "") {
278
+ if (_Logger.#levelIdx <= 2)
279
+ _Logger.#printMessages(this.name ?? "App", msg, context, "debug");
280
+ }
281
+ log(msg, context = "") {
282
+ if (_Logger.#levelIdx <= 3)
283
+ _Logger.#printMessages(this.name ?? "App", msg, context, "log");
284
+ }
285
+ info(msg, context = "") {
286
+ if (_Logger.#levelIdx <= 4)
287
+ _Logger.#printMessages(this.name ?? "App", msg, context, "info");
288
+ }
289
+ warn(msg, context = "") {
290
+ if (_Logger.#levelIdx <= 5)
291
+ _Logger.#printMessages(this.name ?? "App", msg, context, "warn");
292
+ }
293
+ error(msg, context = "") {
294
+ if (_Logger.#levelIdx <= 6)
295
+ _Logger.#printMessages(this.name ?? "App", msg, context, "error");
296
+ }
297
+ raw(msg, method) {
298
+ _Logger.rawLog(msg, method);
299
+ }
300
+ rawLog(msg, method) {
301
+ _Logger.rawLog(msg, method);
302
+ }
303
+ static trace(msg, context = "") {
304
+ if (_Logger.#levelIdx <= 0)
305
+ _Logger.#printMessages("App", msg, context, "trace");
306
+ }
307
+ static verbose(msg, context = "") {
308
+ if (_Logger.#levelIdx <= 1)
309
+ _Logger.#printMessages("App", msg, context, "verbose");
310
+ }
311
+ static debug(msg, context = "") {
312
+ if (_Logger.#levelIdx <= 2)
313
+ _Logger.#printMessages("App", msg, context, "debug");
314
+ }
315
+ static log(msg, context = "") {
316
+ if (_Logger.#levelIdx <= 3)
317
+ _Logger.#printMessages("App", msg, context, "log");
318
+ }
319
+ static info(msg, context = "") {
320
+ if (_Logger.#levelIdx <= 4)
321
+ _Logger.#printMessages("App", msg, context, "info");
322
+ }
323
+ static warn(msg, context = "") {
324
+ if (_Logger.#levelIdx <= 5)
325
+ _Logger.#printMessages("App", msg, context, "warn");
326
+ }
327
+ static error(msg, context = "") {
328
+ if (_Logger.#levelIdx <= 6)
329
+ _Logger.#printMessages("App", msg, context, "error");
330
+ }
331
+ static #colorize(msg, logLevel) {
332
+ return colorizeMap[logLevel](msg);
333
+ }
334
+ static #printMessages(name, content, context, logLevel, writeStreamType = logLevel === "error" ? "stderr" : "stdout") {
335
+ if (this.#ignoreCtxSet.has(context))
336
+ return;
337
+ const now = (0, import_dayjs5.default)();
338
+ const processMsg = this.#colorize(
339
+ `[${name ?? "App"}] ${global.process?.pid ?? "window"} -`,
340
+ logLevel
341
+ );
342
+ const timestampMsg = now.format("MM/DD/YYYY, HH:mm:ss A");
343
+ const logLevelMsg = this.#colorize(logLevel.toUpperCase().padStart(7, " "), logLevel);
344
+ const contextMsg = context ? clc.yellow(`[${context}] `) : "";
345
+ const contentMsg = this.#colorize(content, logLevel);
346
+ const timeDiffMsg = clc.yellow(`+${now.diff(_Logger.#startAt, "ms")}ms`);
347
+ if (typeof window === "undefined")
348
+ process[writeStreamType].write(
349
+ `${processMsg} ${timestampMsg} ${logLevelMsg} ${contextMsg} ${contentMsg} ${timeDiffMsg}
350
+ `
351
+ );
352
+ else
353
+ console.log(`${processMsg} ${timestampMsg} ${logLevelMsg} ${contextMsg} ${contentMsg} ${timeDiffMsg}
354
+ `);
355
+ }
356
+ static rawLog(msg, method) {
357
+ this.raw(`${msg}
358
+ `, method);
359
+ }
360
+ static raw(msg, method) {
361
+ if (typeof window === "undefined" && method !== "console" && global.process)
362
+ global.process.stdout.write(msg);
363
+ else
364
+ console.log(msg);
365
+ }
366
+ };
367
+
368
+ // pkgs/@akanjs/common/src/lowerlize.ts
369
+ var lowerlize = (str) => {
370
+ return str.charAt(0).toLowerCase() + str.slice(1);
371
+ };
372
+
373
+ // pkgs/@akanjs/common/src/sleep.ts
374
+ var sleep = async (ms) => {
375
+ return new Promise((resolve) => {
376
+ setTimeout(() => {
377
+ resolve(true);
378
+ }, ms);
379
+ });
380
+ };
381
+
382
+ // pkgs/@akanjs/signal/src/client.ts
383
+ var import_core = __require("@urql/core");
384
+ var import_socket = __require("socket.io-client");
385
+ var SocketIo = class {
386
+ socket;
387
+ roomSubscribeMap = /* @__PURE__ */ new Map();
388
+ constructor(uri) {
389
+ this.socket = (0, import_socket.io)(uri, { transports: ["websocket"] });
390
+ this.socket.on("connect", () => {
391
+ this.roomSubscribeMap.forEach((option) => {
392
+ this.socket.emit(option.key, { ...option.message, __subscribe__: true });
393
+ });
394
+ });
395
+ }
396
+ on(event, callback) {
397
+ this.socket.on(event, callback);
398
+ }
399
+ removeListener(event, callback) {
400
+ this.socket.removeListener(event, callback);
401
+ }
402
+ removeAllListeners() {
403
+ this.socket.removeAllListeners();
404
+ }
405
+ hasListeners(event) {
406
+ return this.socket.hasListeners(event);
407
+ }
408
+ emit(key, data) {
409
+ this.socket.emit(key, data);
410
+ }
411
+ subscribe(option) {
412
+ if (!this.roomSubscribeMap.has(option.roomId)) {
413
+ this.roomSubscribeMap.set(option.roomId, option);
414
+ this.socket.emit(option.key, { ...option.message, __subscribe__: true });
415
+ }
416
+ this.socket.on(option.roomId, option.handleEvent);
417
+ }
418
+ unsubscribe(roomId, handleEvent) {
419
+ this.socket.removeListener(roomId, handleEvent);
420
+ const option = this.roomSubscribeMap.get(roomId);
421
+ if (this.hasListeners(roomId) || !option)
422
+ return;
423
+ this.roomSubscribeMap.delete(roomId);
424
+ this.socket.emit(option.key, { ...option.message, __subscribe__: false });
425
+ }
426
+ disconnect() {
427
+ this.socket.disconnect();
428
+ return this;
429
+ }
430
+ };
431
+ var Client = class _Client {
432
+ static globalIoMap = /* @__PURE__ */ new Map();
433
+ static tokenStore = /* @__PURE__ */ new Map();
434
+ async waitUntilWebSocketConnected(ws = baseClientEnv.serverWsUri) {
435
+ if (baseClientEnv.side === "server")
436
+ return true;
437
+ while (!this.getIo(ws).socket.connected) {
438
+ Logger.verbose("waiting for websocket to initialize...");
439
+ await sleep(300);
440
+ }
441
+ }
442
+ isInitialized = false;
443
+ uri = baseClientEnv.serverGraphqlUri;
444
+ ws = baseClientEnv.serverWsUri;
445
+ udp = null;
446
+ gql = (0, import_core.createClient)({ url: this.uri, fetch, exchanges: [import_core.cacheExchange, import_core.fetchExchange] });
447
+ jwt = null;
448
+ async getJwt() {
449
+ const isNextServer = baseClientEnv.side === "server" && baseEnv.operationType === "client";
450
+ if (isNextServer) {
451
+ const nextHeaders = __require("next/headers");
452
+ return (await nextHeaders.cookies?.())?.get("jwt")?.value ?? (await nextHeaders.headers?.())?.get("jwt") ?? this.jwt ?? null;
453
+ } else
454
+ return _Client.tokenStore.get(this) ?? null;
455
+ }
456
+ io = null;
457
+ init(data = {}) {
458
+ Object.assign(this, data);
459
+ this.setLink(data.uri);
460
+ this.setIo(data.ws);
461
+ this.isInitialized = true;
462
+ }
463
+ setIo(ws = baseClientEnv.serverWsUri) {
464
+ this.ws = ws;
465
+ const existingIo = _Client.globalIoMap.get(ws);
466
+ if (existingIo) {
467
+ this.io = existingIo;
468
+ return;
469
+ }
470
+ this.io = new SocketIo(ws);
471
+ _Client.globalIoMap.set(ws, this.io);
472
+ }
473
+ getIo(ws = baseClientEnv.serverWsUri) {
474
+ const existingIo = _Client.globalIoMap.get(ws);
475
+ if (existingIo)
476
+ return existingIo;
477
+ const io2 = new SocketIo(ws);
478
+ _Client.globalIoMap.set(ws, io2);
479
+ return io2;
480
+ }
481
+ setLink(uri = baseClientEnv.serverGraphqlUri) {
482
+ this.uri = uri;
483
+ this.gql = (0, import_core.createClient)({
484
+ url: this.uri,
485
+ fetch,
486
+ exchanges: [import_core.cacheExchange, import_core.fetchExchange],
487
+ // requestPolicy: "network-only",
488
+ fetchOptions: () => {
489
+ return {
490
+ headers: {
491
+ "apollo-require-preflight": "true",
492
+ ...this.jwt ? { authorization: `Bearer ${this.jwt}` } : {}
493
+ }
494
+ };
495
+ }
496
+ });
497
+ }
498
+ setJwt(jwt3) {
499
+ _Client.tokenStore.set(this, jwt3);
500
+ }
501
+ reset() {
502
+ this.io?.disconnect();
503
+ this.io = null;
504
+ this.jwt = null;
505
+ }
506
+ clone(data = {}) {
507
+ const newClient = new _Client();
508
+ newClient.init({ ...this, ...data });
509
+ if (data.jwt)
510
+ _Client.tokenStore.set(newClient, data.jwt);
511
+ return newClient;
512
+ }
513
+ terminate() {
514
+ this.reset();
515
+ _Client.globalIoMap.forEach((io2) => io2.disconnect());
516
+ this.isInitialized = false;
517
+ }
518
+ setUdp(udp) {
519
+ this.udp = udp;
520
+ }
521
+ };
522
+ var client = new Client();
523
+
524
+ // pkgs/@akanjs/constant/src/types.ts
525
+ var DEFAULT_PAGE_SIZE = 20;
526
+
527
+ // pkgs/@akanjs/constant/src/scalar.ts
528
+ var import_reflect_metadata = __require("reflect-metadata");
529
+ var scalarExampleMap = /* @__PURE__ */ new Map([
530
+ [ID, "1234567890abcdef12345678"],
531
+ [Int, 0],
532
+ [Float, 0],
533
+ [String, "String"],
534
+ [Boolean, true],
535
+ [Date, (/* @__PURE__ */ new Date()).toISOString()],
536
+ [Upload, "FileUpload"],
537
+ [JSON2, {}],
538
+ [Map, {}]
539
+ ]);
540
+ var getClassMeta = (modelRef) => {
541
+ const [target] = getNonArrayModel(modelRef);
542
+ const classMeta = Reflect.getMetadata("class", target.prototype);
543
+ if (!classMeta)
544
+ throw new Error(`No ClassMeta for this target ${target.name}`);
545
+ return classMeta;
546
+ };
547
+ var getFieldMetas = (modelRef) => {
548
+ const [target] = getNonArrayModel(modelRef);
549
+ const metadataMap = Reflect.getMetadata("fields", target.prototype) ?? /* @__PURE__ */ new Map();
550
+ const keySortMap = { id: -1, createdAt: 1, updatedAt: 2, removedAt: 3 };
551
+ return [...metadataMap.values()].sort((a, b) => (keySortMap[a.key] ?? 0) - (keySortMap[b.key] ?? 0));
552
+ };
553
+ var getFieldMetaMapOnPrototype = (prototype) => {
554
+ const metadataMap = Reflect.getMetadata("fields", prototype) ?? /* @__PURE__ */ new Map();
555
+ return new Map(metadataMap);
556
+ };
557
+ var setFieldMetaMapOnPrototype = (prototype, metadataMap) => {
558
+ Reflect.defineMetadata("fields", new Map(metadataMap), prototype);
559
+ };
560
+
561
+ // pkgs/@akanjs/constant/src/fieldMeta.ts
562
+ var applyFieldMeta = (modelRef, arrDepth, option, optionArrDepth) => {
563
+ const isArray = arrDepth > 0;
564
+ const isClass = !isGqlScalar(modelRef);
565
+ const isMap = isGqlMap(modelRef);
566
+ const { refName, type } = isClass ? getClassMeta(modelRef) : { refName: "", type: "scalar" };
567
+ const name = isClass ? refName : scalarNameMap.get(modelRef) ?? "Unknown";
568
+ if (isMap && !option.of)
569
+ throw new Error("Map type must have 'of' option");
570
+ return (prototype, key) => {
571
+ const metadata = {
572
+ nullable: option.nullable ?? false,
573
+ ref: option.ref,
574
+ refPath: option.refPath,
575
+ refType: option.refType,
576
+ default: option.default ?? (isArray ? [] : null),
577
+ type: option.type,
578
+ fieldType: option.fieldType ?? "property",
579
+ immutable: option.immutable ?? false,
580
+ min: option.min,
581
+ max: option.max,
582
+ enum: option.enum,
583
+ select: option.select ?? true,
584
+ minlength: option.minlength,
585
+ maxlength: option.maxlength,
586
+ query: option.query,
587
+ accumulate: option.accumulate,
588
+ example: option.example,
589
+ validate: option.validate,
590
+ key,
591
+ name,
592
+ isClass,
593
+ isScalar: type === "scalar",
594
+ modelRef,
595
+ arrDepth,
596
+ isArray,
597
+ optArrDepth: optionArrDepth,
598
+ isMap,
599
+ of: option.of,
600
+ text: option.text
601
+ };
602
+ const metadataMap = getFieldMetaMapOnPrototype(prototype);
603
+ metadataMap.set(key, metadata);
604
+ setFieldMetaMapOnPrototype(prototype, metadataMap);
605
+ };
606
+ };
607
+ var makeField = (customOption) => (returns, fieldOption) => {
608
+ const [modelRef, arrDepth] = getNonArrayModel(returns());
609
+ if (!fieldOption)
610
+ return applyFieldMeta(modelRef, arrDepth, { ...customOption }, arrDepth);
611
+ const [opt, optArrDepth] = getNonArrayModel(fieldOption);
612
+ return applyFieldMeta(modelRef, arrDepth, { ...opt, ...customOption }, optArrDepth);
613
+ };
614
+ var Field = {
615
+ Prop: makeField({ fieldType: "property" }),
616
+ Hidden: makeField({ fieldType: "hidden", nullable: true }),
617
+ Secret: makeField({ fieldType: "hidden", select: false, nullable: true }),
618
+ Resolve: makeField({ fieldType: "resolve" })
619
+ };
620
+
621
+ // pkgs/@akanjs/constant/src/constantDecorator.ts
622
+ var import_reflect_metadata2 = __require("reflect-metadata");
623
+
624
+ // pkgs/@akanjs/constant/src/filterMeta.ts
625
+ var setFilterMeta = (filterRef, filterMeta) => {
626
+ const existingFilterMeta = Reflect.getMetadata("filter", filterRef.prototype);
627
+ if (existingFilterMeta)
628
+ Object.assign(filterMeta.sort, existingFilterMeta.sort);
629
+ Reflect.defineMetadata("filter", filterMeta, filterRef.prototype);
630
+ };
631
+ var getFilterKeyMetaMapOnPrototype = (prototype) => {
632
+ const metadataMap = Reflect.getMetadata("filterKey", prototype) ?? /* @__PURE__ */ new Map();
633
+ return new Map(metadataMap);
634
+ };
635
+ var setFilterKeyMetaMapOnPrototype = (prototype, metadataMap) => {
636
+ Reflect.defineMetadata("filterKey", new Map(metadataMap), prototype);
637
+ };
638
+ var applyFilterKeyMeta = (option) => {
639
+ return (prototype, key, descriptor) => {
640
+ const metadata = { key, ...option, descriptor };
641
+ const metadataMap = getFilterKeyMetaMapOnPrototype(prototype);
642
+ metadataMap.set(key, metadata);
643
+ setFilterKeyMetaMapOnPrototype(prototype, metadataMap);
644
+ };
645
+ };
646
+ var makeFilter = (customOption) => (fieldOption) => {
647
+ return applyFilterKeyMeta({ ...customOption, ...fieldOption });
648
+ };
649
+ var getFilterArgMetasOnPrototype = (prototype, key) => {
650
+ const filterArgMetas = Reflect.getMetadata("filterArg", prototype, key) ?? [];
651
+ return filterArgMetas;
652
+ };
653
+ var setFilterArgMetasOnPrototype = (prototype, key, filterArgMetas) => {
654
+ Reflect.defineMetadata("filterArg", filterArgMetas, prototype, key);
655
+ };
656
+ var applyFilterArgMeta = (name, returns, argOption) => {
657
+ return (prototype, key, idx) => {
658
+ const [modelRef, arrDepth] = getNonArrayModel(returns());
659
+ const [opt, optArrDepth] = getNonArrayModel(argOption ?? {});
660
+ const filterArgMeta = { name, ...opt, modelRef, arrDepth, isArray: arrDepth > 0, optArrDepth };
661
+ const filterArgMetas = getFilterArgMetasOnPrototype(prototype, key);
662
+ filterArgMetas[idx] = filterArgMeta;
663
+ setFilterArgMetasOnPrototype(prototype, key, filterArgMetas);
664
+ };
665
+ };
666
+ var Filter = {
667
+ Mongo: makeFilter({ type: "mongo" }),
668
+ // Meili: makeFilter({ fieldType: "hidden", nullable: true }),
669
+ Arg: applyFilterArgMeta
670
+ };
671
+
672
+ // pkgs/@akanjs/constant/src/baseGql.ts
673
+ var import_reflect_metadata3 = __require("reflect-metadata");
674
+ var defaultFieldMeta = {
675
+ fieldType: "property",
676
+ immutable: false,
677
+ select: true,
678
+ isClass: false,
679
+ isScalar: true,
680
+ nullable: false,
681
+ isArray: false,
682
+ arrDepth: 0,
683
+ optArrDepth: 0,
684
+ default: null,
685
+ isMap: false
686
+ };
687
+ var idFieldMeta = { ...defaultFieldMeta, key: "id", name: "ID", modelRef: ID };
688
+ var createdAtFieldMeta = { ...defaultFieldMeta, key: "createdAt", name: "Date", modelRef: Date };
689
+ var updatedAtFieldMeta = { ...defaultFieldMeta, key: "updatedAt", name: "Date", modelRef: Date };
690
+ var removedAtFieldMeta = {
691
+ ...defaultFieldMeta,
692
+ key: "removedAt",
693
+ name: "Date",
694
+ modelRef: Date,
695
+ nullable: true,
696
+ default: null
697
+ };
698
+
699
+ // pkgs/@akanjs/constant/src/classMeta.ts
700
+ var import_reflect_metadata4 = __require("reflect-metadata");
701
+ var InputModelStorage = class {
702
+ };
703
+ var LightModelStorage = class {
704
+ };
705
+ var FullModelStorage = class {
706
+ };
707
+ var ScalarModelStorage = class {
708
+ };
709
+ var FilterModelStorage = class {
710
+ };
711
+ var hasTextField = (modelRef) => {
712
+ const fieldMetas = getFieldMetas(modelRef);
713
+ return fieldMetas.some(
714
+ (fieldMeta) => !!fieldMeta.text || fieldMeta.isScalar && fieldMeta.isClass && fieldMeta.select && hasTextField(fieldMeta.modelRef)
715
+ );
716
+ };
717
+ var applyClassMeta = (type, modelType, storage) => {
718
+ return function(refName) {
719
+ return function(target) {
720
+ const modelRef = target;
721
+ const classMeta = { refName, type, modelType, modelRef, hasTextField: hasTextField(modelRef) };
722
+ Reflect.defineMetadata("class", classMeta, modelRef.prototype);
723
+ Reflect.defineMetadata(refName, modelRef, storage.prototype);
724
+ };
725
+ };
726
+ };
727
+ var applyFilterMeta = (storage) => {
728
+ return function(refName) {
729
+ return function(target) {
730
+ const modelRef = target;
731
+ setFilterMeta(modelRef, { refName, sort: {} });
732
+ Reflect.defineMetadata(refName, modelRef, storage.prototype);
733
+ };
734
+ };
735
+ };
736
+ var Model = {
737
+ Light: applyClassMeta("light", "data", LightModelStorage),
738
+ Object: applyClassMeta("full", "ephemeral", FullModelStorage),
739
+ Full: applyClassMeta("full", "data", FullModelStorage),
740
+ Input: applyClassMeta("input", "data", InputModelStorage),
741
+ Scalar: applyClassMeta("scalar", "data", ScalarModelStorage),
742
+ Summary: applyClassMeta("scalar", "summary", ScalarModelStorage),
743
+ Insight: applyClassMeta("scalar", "insight", ScalarModelStorage),
744
+ Filter: applyFilterMeta(FilterModelStorage)
745
+ };
746
+
747
+ // pkgs/@akanjs/signal/src/immerify.ts
748
+ var import_immer = __require("immer");
749
+
750
+ // pkgs/@akanjs/signal/src/signalDecorators.ts
751
+ var import_reflect_metadata5 = __require("reflect-metadata");
752
+ var createArgMetaDecorator = (type) => {
753
+ return function(option = {}) {
754
+ return function(prototype, key, idx) {
755
+ const argMetas = getArgMetasOnPrototype(prototype, key);
756
+ argMetas[idx] = { key, idx, type, option };
757
+ setArgMetasOnPrototype(prototype, key, argMetas);
758
+ };
759
+ };
760
+ };
761
+ var Account = createArgMetaDecorator("Account");
762
+ var defaultAccount = {
763
+ __InternalArg__: "Account",
764
+ appName: baseEnv.appName,
765
+ environment: baseEnv.environment
766
+ };
767
+ var Self = createArgMetaDecorator("Self");
768
+ var Me = createArgMetaDecorator("Me");
769
+ var UserIp = createArgMetaDecorator("UserIp");
770
+ var Access = createArgMetaDecorator("Access");
771
+ var Req = createArgMetaDecorator("Req");
772
+ var Res = createArgMetaDecorator("Res");
773
+ var Ws = createArgMetaDecorator("Ws");
774
+ var Job = createArgMetaDecorator("Job");
775
+ var getQuery = (allow2) => function(returns, signalOption = {}, guards = []) {
776
+ return (prototype, key, descriptor) => {
777
+ const metadataMap = getGqlMetaMapOnPrototype(prototype);
778
+ metadataMap.set(key, {
779
+ returns,
780
+ signalOption,
781
+ key,
782
+ descriptor,
783
+ guards: [allow2, ...guards],
784
+ type: "Query"
785
+ });
786
+ setGqlMetaMapOnPrototype(prototype, metadataMap);
787
+ };
788
+ };
789
+ var getMutation = (allow2) => function(returns, signalOption = {}, guards = []) {
790
+ return (prototype, key, descriptor) => {
791
+ const metadataMap = getGqlMetaMapOnPrototype(prototype);
792
+ metadataMap.set(key, {
793
+ returns,
794
+ signalOption,
795
+ key,
796
+ descriptor,
797
+ guards: [allow2, ...guards],
798
+ type: "Mutation"
799
+ });
800
+ setGqlMetaMapOnPrototype(prototype, metadataMap);
801
+ };
802
+ };
803
+ var getMessage = (allow2) => function(returns, signalOption = {}, guards = []) {
804
+ return (prototype, key, descriptor) => {
805
+ const metadataMap = getGqlMetaMapOnPrototype(prototype);
806
+ metadataMap.set(key, {
807
+ returns,
808
+ signalOption,
809
+ key,
810
+ descriptor,
811
+ guards: [allow2, ...guards],
812
+ type: "Message"
813
+ });
814
+ setGqlMetaMapOnPrototype(prototype, metadataMap);
815
+ };
816
+ };
817
+ var getPubsub = (allow2) => function(returns, signalOption = {}, guards = []) {
818
+ return (prototype, key, descriptor) => {
819
+ const metadataMap = getGqlMetaMapOnPrototype(prototype);
820
+ metadataMap.set(key, {
821
+ returns,
822
+ signalOption,
823
+ key,
824
+ descriptor,
825
+ guards: [allow2, ...guards],
826
+ type: "Pubsub"
827
+ });
828
+ setGqlMetaMapOnPrototype(prototype, metadataMap);
829
+ };
830
+ };
831
+ var getProcess = (serverType) => function(returns, signalOption = {}) {
832
+ return (prototype, key, descriptor) => {
833
+ const metadataMap = getGqlMetaMapOnPrototype(prototype);
834
+ metadataMap.set(key, {
835
+ returns,
836
+ signalOption: { ...signalOption, serverType: lowerlize(serverType) },
837
+ key,
838
+ descriptor,
839
+ guards: ["None"],
840
+ type: "Process"
841
+ });
842
+ setGqlMetaMapOnPrototype(prototype, metadataMap);
843
+ };
844
+ };
845
+ var Query = {
846
+ Public: getQuery("Public"),
847
+ Every: getQuery("Every"),
848
+ Admin: getQuery("Admin"),
849
+ User: getQuery("User"),
850
+ SuperAdmin: getQuery("SuperAdmin"),
851
+ None: getQuery("None"),
852
+ Owner: getQuery("Owner")
853
+ };
854
+ var Mutation = {
855
+ Public: getMutation("Public"),
856
+ Every: getMutation("Every"),
857
+ Admin: getMutation("Admin"),
858
+ User: getMutation("User"),
859
+ SuperAdmin: getMutation("SuperAdmin"),
860
+ None: getMutation("None"),
861
+ Owner: getMutation("Owner")
862
+ };
863
+ var Message = {
864
+ Public: getMessage("Public"),
865
+ Every: getMessage("Every"),
866
+ Admin: getMessage("Admin"),
867
+ User: getMessage("User"),
868
+ SuperAdmin: getMessage("SuperAdmin"),
869
+ None: getMessage("None"),
870
+ Owner: getMessage("Owner")
871
+ };
872
+ var Pubsub = {
873
+ Public: getPubsub("Public"),
874
+ Every: getPubsub("Every"),
875
+ Admin: getPubsub("Admin"),
876
+ User: getPubsub("User"),
877
+ SuperAdmin: getPubsub("SuperAdmin"),
878
+ None: getPubsub("None"),
879
+ Owner: getPubsub("Owner")
880
+ };
881
+ var Process = {
882
+ Federation: getProcess("Federation"),
883
+ Batch: getProcess("Batch"),
884
+ All: getProcess("All")
885
+ };
886
+ var getArg = (type) => function(name, returns, argsOption = {}) {
887
+ return function(prototype, key, idx) {
888
+ const argMetas = getArgMetasOnPrototype(prototype, key);
889
+ argMetas[idx] = { name, returns, argsOption, key, idx, type };
890
+ setArgMetasOnPrototype(prototype, key, argMetas);
891
+ };
892
+ };
893
+ var Arg = {
894
+ Body: getArg("Body"),
895
+ Param: getArg("Param"),
896
+ Query: getArg("Query"),
897
+ Upload: getArg("Upload"),
898
+ Msg: getArg("Msg"),
899
+ Room: getArg("Room")
900
+ };
901
+ var getGqlMeta = (sigRef, key) => {
902
+ const gqlMetaMap = Reflect.getMetadata("gql", sigRef.prototype);
903
+ if (!gqlMetaMap)
904
+ throw new Error(`No GqlMeta found for ${sigRef.name}`);
905
+ const gqlMeta = gqlMetaMap.get(key);
906
+ if (!gqlMeta)
907
+ throw new Error(`No GqlMeta found for ${key}`);
908
+ return gqlMeta;
909
+ };
910
+ var getGqlMetaMapOnPrototype = (prototype) => {
911
+ const gqlMetaMap = Reflect.getMetadata("gql", prototype);
912
+ return gqlMetaMap ?? /* @__PURE__ */ new Map();
913
+ };
914
+ var setGqlMetaMapOnPrototype = (prototype, gqlMetaMap) => {
915
+ Reflect.defineMetadata("gql", gqlMetaMap, prototype);
916
+ };
917
+ var getArgMetasOnPrototype = (prototype, key) => {
918
+ return Reflect.getMetadata("args", prototype, key) ?? [];
919
+ };
920
+ var setArgMetasOnPrototype = (prototype, key, argMetas) => {
921
+ Reflect.defineMetadata("args", argMetas, prototype, key);
922
+ };
923
+
924
+ // pkgs/@akanjs/signal/src/gql.ts
925
+ var scalarDeserializeMap = /* @__PURE__ */ new Map([
926
+ [Date, (value) => dayjs(value)],
927
+ [String, (value) => value],
928
+ [ID, (value) => value],
929
+ [Boolean, (value) => value],
930
+ [Int, (value) => value],
931
+ [Float, (value) => value],
932
+ [JSON2, (value) => value]
933
+ ]);
934
+ var getDeserializeFn = (inputRef) => {
935
+ const deserializeFn = scalarDeserializeMap.get(inputRef);
936
+ if (!deserializeFn)
937
+ return (value) => value;
938
+ return deserializeFn;
939
+ };
940
+ var deserializeInput = (value, inputRef, arrDepth) => {
941
+ if (arrDepth && Array.isArray(value))
942
+ return value.map((v) => deserializeInput(v, inputRef, arrDepth - 1));
943
+ else if (inputRef.prototype === Map.prototype) {
944
+ const [valueRef] = getNonArrayModel(inputRef);
945
+ const deserializeFn = getDeserializeFn(valueRef);
946
+ return Object.fromEntries(
947
+ [...value.entries()].map(([key, val]) => [key, applyFnToArrayObjects(val, deserializeFn)])
948
+ );
949
+ } else if (isGqlScalar(inputRef)) {
950
+ const deserializeFn = getDeserializeFn(inputRef);
951
+ return deserializeFn(value);
952
+ }
953
+ const classMeta = getClassMeta(inputRef);
954
+ if (classMeta.type !== "scalar")
955
+ return value;
956
+ else
957
+ return Object.fromEntries(
958
+ getFieldMetas(inputRef).map((fieldMeta) => [
959
+ fieldMeta.key,
960
+ deserializeInput(value[fieldMeta.key], fieldMeta.modelRef, fieldMeta.arrDepth)
961
+ ])
962
+ );
963
+ };
964
+ var deserializeArg = (argMeta, value) => {
965
+ const [returnRef, arrDepth] = getNonArrayModel(argMeta.returns());
966
+ if (argMeta.argsOption.nullable && (value === null || value === void 0))
967
+ return null;
968
+ else if (!argMeta.argsOption.nullable && (value === null || value === void 0))
969
+ throw new Error(`Invalid Value (Nullable) in ${argMeta.name} for value ${value}`);
970
+ return deserializeInput(value, returnRef, arrDepth);
971
+ };
972
+
973
+ // pkgs/@akanjs/signal/src/baseFetch.ts
974
+ var nativeFetch = fetch;
975
+ var baseFetch = Object.assign(nativeFetch, {
976
+ client,
977
+ clone: function(option = {}) {
978
+ return {
979
+ ...this,
980
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
981
+ client: this.client.clone(option)
982
+ };
983
+ }
984
+ });
985
+
986
+ // pkgs/@akanjs/nest/src/authorization.ts
987
+ var import_apollo = __require("@nestjs/apollo");
988
+ var jwt = __toESM(__require("jsonwebtoken"));
989
+ var verifyToken = (secret, authorization) => {
990
+ const [type, token] = authorization?.split(" ") ?? [void 0, void 0];
991
+ if (!token || type !== "Bearer")
992
+ return defaultAccount;
993
+ try {
994
+ const account = jwt.verify(token, secret);
995
+ if (account.appName !== baseEnv.appName || account.environment !== baseEnv.environment)
996
+ return defaultAccount;
997
+ return {
998
+ __InternalArg__: "Account",
999
+ self: account.self && !account.self.removedAt ? account.self : void 0,
1000
+ me: account.me && !account.me.removedAt ? account.me : void 0,
1001
+ appName: account.appName,
1002
+ environment: account.environment
1003
+ };
1004
+ } catch (e) {
1005
+ return defaultAccount;
1006
+ }
1007
+ };
1008
+ var allow = (account, roles, userId) => {
1009
+ if (!account)
1010
+ throw new import_apollo.AuthenticationError("No Authentication Account");
1011
+ for (const role of roles) {
1012
+ if (role === "user" && account.self?.roles.includes("user"))
1013
+ return true;
1014
+ else if (role === "admin" && account.me?.roles.includes("admin"))
1015
+ return true;
1016
+ else if (role === "superAdmin" && account.me?.roles.includes("superAdmin"))
1017
+ return true;
1018
+ }
1019
+ throw new import_apollo.AuthenticationError(
1020
+ `No Authentication With Roles: ${roles.join(", ")}, Your roles are ${[
1021
+ ...account.self?.roles ?? [],
1022
+ ...account.me?.roles ?? []
1023
+ ].join(", ")}${!account.self?.roles.length && !account.me?.roles.length ? " (No Roles)" : ""}`
1024
+ );
1025
+ };
1026
+
1027
+ // pkgs/@akanjs/nest/src/authGuards.ts
1028
+ var authGuards_exports = {};
1029
+ __export(authGuards_exports, {
1030
+ Admin: () => Admin,
1031
+ Every: () => Every,
1032
+ None: () => None,
1033
+ Owner: () => Owner,
1034
+ Public: () => Public,
1035
+ SuperAdmin: () => SuperAdmin,
1036
+ User: () => User,
1037
+ getArgs: () => getArgs,
1038
+ getRequest: () => getRequest,
1039
+ getResponse: () => getResponse,
1040
+ getSocket: () => getSocket
1041
+ });
1042
+ var import_common6 = __require("@nestjs/common");
1043
+ var import_graphql = __require("@nestjs/graphql");
1044
+ var getRequest = (context) => {
1045
+ const type = context.getType();
1046
+ if (type === "ws")
1047
+ throw new Error("Getting Request in Websocket is not allowed");
1048
+ return type === "http" ? context.switchToHttp().getRequest() : import_graphql.GqlExecutionContext.create(context).getContext().req;
1049
+ };
1050
+ var getResponse = (context) => {
1051
+ const type = context.getType();
1052
+ if (type === "ws")
1053
+ throw new Error("Getting Response in Websocket is not allowed");
1054
+ return type === "http" ? context.switchToHttp().getResponse() : import_graphql.GqlExecutionContext.create(context).getContext().req.res;
1055
+ };
1056
+ var getArgs = (context) => {
1057
+ const type = context.getType();
1058
+ if (type === "ws")
1059
+ throw new Error("Getting Args in Websocket is not allowed");
1060
+ if (type === "graphql")
1061
+ return import_graphql.GqlExecutionContext.create(context).getArgs();
1062
+ else if (type === "http") {
1063
+ const { params, query, body } = context.switchToHttp().getRequest();
1064
+ return { ...params, ...query, ...body };
1065
+ } else
1066
+ throw new Error("Getting Args in Unknown context is not allowed");
1067
+ };
1068
+ var getSocket = (context) => {
1069
+ const type = context.getType();
1070
+ if (type !== "ws")
1071
+ throw new Error("Getting Socket in Http or GraphQL is not allowed");
1072
+ const socket = context.getArgByIndex(0);
1073
+ return socket;
1074
+ };
1075
+ var Public = class {
1076
+ canActivate(context) {
1077
+ return true;
1078
+ }
1079
+ };
1080
+ Public = __decorateClass([
1081
+ (0, import_common6.Injectable)()
1082
+ ], Public);
1083
+ var None = class {
1084
+ canActivate() {
1085
+ return false;
1086
+ }
1087
+ };
1088
+ None = __decorateClass([
1089
+ (0, import_common6.Injectable)()
1090
+ ], None);
1091
+ var Every = class {
1092
+ canActivate(context) {
1093
+ const { account } = getRequest(context);
1094
+ return allow(account, ["user", "admin", "superAdmin"]);
1095
+ }
1096
+ };
1097
+ Every = __decorateClass([
1098
+ (0, import_common6.Injectable)()
1099
+ ], Every);
1100
+ var Owner = class {
1101
+ canActivate(context) {
1102
+ const { account } = getRequest(context);
1103
+ return allow(account, ["user", "admin", "superAdmin"]);
1104
+ }
1105
+ };
1106
+ Owner = __decorateClass([
1107
+ (0, import_common6.Injectable)()
1108
+ ], Owner);
1109
+ var Admin = class {
1110
+ canActivate(context) {
1111
+ const { account } = getRequest(context);
1112
+ return allow(account, ["admin", "superAdmin"]);
1113
+ }
1114
+ };
1115
+ Admin = __decorateClass([
1116
+ (0, import_common6.Injectable)()
1117
+ ], Admin);
1118
+ var SuperAdmin = class {
1119
+ canActivate(context) {
1120
+ const { account } = getRequest(context);
1121
+ return allow(account, ["superAdmin"]);
1122
+ }
1123
+ };
1124
+ SuperAdmin = __decorateClass([
1125
+ (0, import_common6.Injectable)()
1126
+ ], SuperAdmin);
1127
+ var User = class {
1128
+ canActivate(context) {
1129
+ const { account } = getRequest(context);
1130
+ return allow(account, ["user"]);
1131
+ }
1132
+ };
1133
+ User = __decorateClass([
1134
+ (0, import_common6.Injectable)()
1135
+ ], User);
1136
+
1137
+ // pkgs/@akanjs/nest/src/authentication.ts
1138
+ var import_common7 = __require("@nestjs/common");
1139
+ var import_ua_parser_js = __toESM(__require("ua-parser-js"));
1140
+ var Account3 = (0, import_common7.createParamDecorator)((option, context) => {
1141
+ const { account } = getRequest(context);
1142
+ return account;
1143
+ });
1144
+ var Self2 = (0, import_common7.createParamDecorator)((option, context) => {
1145
+ const { account } = getRequest(context);
1146
+ const self = account.self;
1147
+ if (!self && !option.nullable)
1148
+ throw new import_common7.UnauthorizedException("No or Invalid Account in Self (User)");
1149
+ return self;
1150
+ });
1151
+ var Me2 = (0, import_common7.createParamDecorator)((option, context) => {
1152
+ const { account } = getRequest(context);
1153
+ const me = account.me;
1154
+ if (!me && !option.nullable)
1155
+ throw new import_common7.UnauthorizedException("No or Invalid Account in Me (Admin)");
1156
+ return me;
1157
+ });
1158
+ var UserIp2 = (0, import_common7.createParamDecorator)((option, context) => {
1159
+ const req = getRequest(context);
1160
+ const ip = req.ip;
1161
+ if (!ip && !option.nullable)
1162
+ throw new import_common7.UnauthorizedException("Invalid IP");
1163
+ return { ip };
1164
+ });
1165
+ var Access2 = (0, import_common7.createParamDecorator)((option, context) => {
1166
+ const req = getRequest(context);
1167
+ const res = new import_ua_parser_js.default(req.userAgent).getResult();
1168
+ if (!req.userAgent && !option.nullable)
1169
+ throw new import_common7.UnauthorizedException("Invalid UserAgent");
1170
+ return {
1171
+ ...req.geolocation ? JSON.parse(req.geolocation) : {},
1172
+ osName: res.os.name,
1173
+ osVersion: res.os.version,
1174
+ browserName: res.browser.name,
1175
+ browserVersion: res.browser.version,
1176
+ mobileModel: res.device.model,
1177
+ mobileVendor: res.device.vendor,
1178
+ deviceType: res.device.type ?? "desktop",
1179
+ at: dayjs(),
1180
+ period: 0
1181
+ };
1182
+ });
1183
+ var Req2 = (0, import_common7.createParamDecorator)((option, context) => {
1184
+ return getRequest(context);
1185
+ });
1186
+ var Res2 = (0, import_common7.createParamDecorator)((option, context) => {
1187
+ return getResponse(context);
1188
+ });
1189
+ var Ws2 = (0, import_common7.createParamDecorator)((option, context) => {
1190
+ const socket = context.getArgByIndex(0);
1191
+ const { __subscribe__ } = context.getArgByIndex(1);
1192
+ return {
1193
+ socket,
1194
+ subscribe: __subscribe__,
1195
+ onDisconnect: (handler) => {
1196
+ socket.on("disconnect", handler);
1197
+ },
1198
+ onSubscribe: (handler) => {
1199
+ if (__subscribe__)
1200
+ handler();
1201
+ },
1202
+ onUnsubscribe: (handler) => {
1203
+ if (!__subscribe__)
1204
+ handler();
1205
+ }
1206
+ };
1207
+ });
1208
+
1209
+ // pkgs/@akanjs/nest/src/interceptors.ts
1210
+ var import_common9 = __require("@nestjs/common");
1211
+ var import_graphql2 = __require("@nestjs/graphql");
1212
+ var import_rxjs = __require("rxjs");
1213
+ var import_operators = __require("rxjs/operators");
1214
+ var _logger, _CACHE_PREFIX, _generateCacheKey, generateCacheKey_fn, _getCache, getCache_fn, _setCache, setCache_fn;
1215
+ var CacheInterceptor = class {
1216
+ constructor(redis) {
1217
+ this.redis = redis;
1218
+ __privateAdd(this, _generateCacheKey);
1219
+ __privateAdd(this, _getCache);
1220
+ __privateAdd(this, _setCache);
1221
+ __privateAdd(this, _logger, new Logger("CacheInterceptor"));
1222
+ __privateAdd(this, _CACHE_PREFIX, "signal:");
1223
+ }
1224
+ async intercept(context, next) {
1225
+ const handler = context.getHandler();
1226
+ const signalKey = handler.name;
1227
+ const gqlMeta = getGqlMeta(context.getClass(), signalKey);
1228
+ if (gqlMeta.type !== "Query" || !gqlMeta.signalOption.cache) {
1229
+ if (gqlMeta.signalOption.cache)
1230
+ __privateGet(this, _logger).warn(`CacheInterceptor: ${signalKey} is not Query endpoint or cache is not set`);
1231
+ return next.handle();
1232
+ }
1233
+ const args = getArgs(context);
1234
+ const cacheKey = __privateMethod(this, _generateCacheKey, generateCacheKey_fn).call(this, signalKey, args);
1235
+ const cachedData = await __privateMethod(this, _getCache, getCache_fn).call(this, cacheKey);
1236
+ if (cachedData) {
1237
+ __privateGet(this, _logger).debug(`Cache hit for key: ${cacheKey}`);
1238
+ return next.handle().pipe(
1239
+ (0, import_operators.map)(() => cachedData),
1240
+ (0, import_operators.catchError)((error) => {
1241
+ const errorMessage = error instanceof Error ? error.message : "Unknown error";
1242
+ __privateGet(this, _logger).error(`Error in cache interceptor for ${cacheKey}: ${errorMessage}`);
1243
+ return (0, import_rxjs.throwError)(() => error);
1244
+ })
1245
+ );
1246
+ }
1247
+ return next.handle().pipe(
1248
+ (0, import_operators.map)((data) => {
1249
+ const cacheDuration = gqlMeta.signalOption.cache;
1250
+ if (typeof cacheDuration === "number") {
1251
+ void __privateMethod(this, _setCache, setCache_fn).call(this, cacheKey, data, cacheDuration);
1252
+ __privateGet(this, _logger).debug(`Cache set for key: ${cacheKey}`);
1253
+ }
1254
+ return data;
1255
+ }),
1256
+ (0, import_operators.catchError)((error) => {
1257
+ const errorMessage = error instanceof Error ? error.message : "Unknown error";
1258
+ __privateGet(this, _logger).error(`Error in cache interceptor for ${cacheKey}: ${errorMessage}`);
1259
+ return (0, import_rxjs.throwError)(() => error);
1260
+ })
1261
+ );
1262
+ }
1263
+ };
1264
+ _logger = new WeakMap();
1265
+ _CACHE_PREFIX = new WeakMap();
1266
+ _generateCacheKey = new WeakSet();
1267
+ generateCacheKey_fn = function(signalKey, args) {
1268
+ return `${__privateGet(this, _CACHE_PREFIX)}${signalKey}:${JSON.stringify(args)}`;
1269
+ };
1270
+ _getCache = new WeakSet();
1271
+ getCache_fn = async function(key) {
1272
+ try {
1273
+ const cached = await this.redis.get(key);
1274
+ if (!cached)
1275
+ return null;
1276
+ const { data } = JSON.parse(cached);
1277
+ return data;
1278
+ } catch (error) {
1279
+ const errorMessage = error instanceof Error ? error.message : "Unknown error";
1280
+ __privateGet(this, _logger).error(`Error retrieving cache for key ${key}: ${errorMessage}`);
1281
+ return null;
1282
+ }
1283
+ };
1284
+ _setCache = new WeakSet();
1285
+ setCache_fn = async function(key, data, ttlMs) {
1286
+ try {
1287
+ const cacheData = { data, timestamp: Date.now() };
1288
+ await this.redis.set(key, JSON.stringify(cacheData), { PX: ttlMs });
1289
+ } catch (error) {
1290
+ const errorMessage = error instanceof Error ? error.message : "Unknown error";
1291
+ __privateGet(this, _logger).error(`Error setting cache for key ${key}: ${errorMessage}`);
1292
+ }
1293
+ };
1294
+ CacheInterceptor = __decorateClass([
1295
+ (0, import_common9.Injectable)(),
1296
+ __decorateParam(0, (0, import_common9.Inject)("REDIS_CLIENT"))
1297
+ ], CacheInterceptor);
1298
+ var TimeoutInterceptor = class {
1299
+ intercept(context, next) {
1300
+ const gqlMeta = getGqlMeta(context.getClass(), context.getHandler().name);
1301
+ const timeoutMs = gqlMeta.signalOption.timeout ?? 3e4;
1302
+ if (timeoutMs === 0)
1303
+ return next.handle();
1304
+ return next.handle().pipe(
1305
+ (0, import_operators.timeout)(timeoutMs),
1306
+ (0, import_operators.catchError)((err) => {
1307
+ if (err instanceof import_rxjs.TimeoutError)
1308
+ return (0, import_rxjs.throwError)(() => new import_common9.RequestTimeoutException());
1309
+ return (0, import_rxjs.throwError)(() => err);
1310
+ })
1311
+ );
1312
+ }
1313
+ };
1314
+ TimeoutInterceptor = __decorateClass([
1315
+ (0, import_common9.Injectable)()
1316
+ ], TimeoutInterceptor);
1317
+ var LoggingInterceptor = class {
1318
+ logger = new Logger("IO");
1319
+ intercept(context, next) {
1320
+ const gqlReq = context.getArgByIndex(3);
1321
+ const req = getRequest(context);
1322
+ const reqType = gqlReq?.parentType?.name ?? req.method;
1323
+ const reqName = gqlReq?.fieldName ?? req.url;
1324
+ const before = Date.now();
1325
+ const ip = import_graphql2.GqlExecutionContext.create(context).getContext().req.ip;
1326
+ this.logger.debug(`Before ${reqType}-${reqName} / ${ip} / ${before}`);
1327
+ return next.handle().pipe(
1328
+ (0, import_operators.tap)(() => {
1329
+ const after = Date.now();
1330
+ this.logger.debug(`After ${reqType}-${reqName} / ${ip} / ${after} (${after - before}ms)`);
1331
+ })
1332
+ );
1333
+ }
1334
+ };
1335
+ LoggingInterceptor = __decorateClass([
1336
+ (0, import_common9.Injectable)()
1337
+ ], LoggingInterceptor);
1338
+
1339
+ // pkgs/@akanjs/nest/src/redis-io.adapter.ts
1340
+ var import_platform_socket = __require("@nestjs/platform-socket.io");
1341
+ var import_redis_adapter = __require("@socket.io/redis-adapter");
1342
+ var import_redis = __require("redis");
1343
+ var RedisIoAdapter = class extends import_platform_socket.IoAdapter {
1344
+ adapterConstructor;
1345
+ logger = new Logger("RedisIoAdapter");
1346
+ server;
1347
+ pubClient;
1348
+ subClient;
1349
+ option;
1350
+ constructor(appOrHttpServer, option) {
1351
+ super(appOrHttpServer);
1352
+ this.option = option;
1353
+ }
1354
+ async connectToRedis(url) {
1355
+ this.pubClient = (0, import_redis.createClient)({ url });
1356
+ this.subClient = this.pubClient.duplicate();
1357
+ this.pubClient.on("disconnect", (err) => {
1358
+ this.logger.error(`Redis pub database is disconnected. Error: ${err}`);
1359
+ void this.pubClient.connect();
1360
+ });
1361
+ this.subClient.on("disconnect", (err) => {
1362
+ this.logger.error(`Redis sub database is disconnected. Error: ${err}`);
1363
+ void this.subClient.connect();
1364
+ });
1365
+ this.pubClient.on("error", (err) => {
1366
+ this.logger.error(`Redis pub database is errored. Error: ${err}`);
1367
+ const reconnect = async () => {
1368
+ await this.pubClient.quit();
1369
+ await sleep(1e3);
1370
+ await this.pubClient.connect();
1371
+ };
1372
+ void reconnect();
1373
+ });
1374
+ this.subClient.on("error", (err) => {
1375
+ this.logger.error(`Redis sub database is errored. Error: ${err}`);
1376
+ const reconnect = async () => {
1377
+ await this.subClient.quit();
1378
+ await sleep(1e3);
1379
+ await this.subClient.connect();
1380
+ };
1381
+ void reconnect();
1382
+ });
1383
+ await Promise.all([this.pubClient.connect(), this.subClient.connect()]);
1384
+ this.adapterConstructor = (0, import_redis_adapter.createAdapter)(this.pubClient, this.subClient);
1385
+ }
1386
+ createIOServer(port, options) {
1387
+ this.server = super.createIOServer(port, options);
1388
+ this.server.adapter(this.adapterConstructor);
1389
+ return this.server;
1390
+ }
1391
+ async destroy() {
1392
+ await Promise.all([this.pubClient.quit(), this.subClient.quit()]);
1393
+ await this.close(this.server);
1394
+ this.logger.log("RedisIoAdapter is closed");
1395
+ }
1396
+ };
1397
+
1398
+ // pkgs/@akanjs/nest/src/pipes.ts
1399
+ var import_common11 = __require("@nestjs/common");
1400
+ var import_stream = __require("stream");
1401
+ var ArrayifyPipe = class {
1402
+ transform(value, metadata) {
1403
+ return Array.isArray(value) ? value : value.split(",");
1404
+ }
1405
+ };
1406
+ ArrayifyPipe = __decorateClass([
1407
+ (0, import_common11.Injectable)()
1408
+ ], ArrayifyPipe);
1409
+ var IntPipe = class {
1410
+ transform(value, metadata) {
1411
+ return Array.isArray(value) ? value.map(parseInt) : [parseInt(value)];
1412
+ }
1413
+ };
1414
+ IntPipe = __decorateClass([
1415
+ (0, import_common11.Injectable)()
1416
+ ], IntPipe);
1417
+ var FloatPipe = class {
1418
+ transform(value, metadata) {
1419
+ return Array.isArray(value) ? value.map(parseFloat) : [parseFloat(value)];
1420
+ }
1421
+ };
1422
+ FloatPipe = __decorateClass([
1423
+ (0, import_common11.Injectable)()
1424
+ ], FloatPipe);
1425
+ var BooleanPipe = class {
1426
+ transform(value, metadata) {
1427
+ return Array.isArray(value) ? value.map((v) => Boolean(v)) : [Boolean(value)];
1428
+ }
1429
+ };
1430
+ BooleanPipe = __decorateClass([
1431
+ (0, import_common11.Injectable)()
1432
+ ], BooleanPipe);
1433
+ var DayjsPipe = class {
1434
+ transform(value, metadata) {
1435
+ return Array.isArray(value) ? value.map(dayjs) : [dayjs(value)];
1436
+ }
1437
+ };
1438
+ DayjsPipe = __decorateClass([
1439
+ (0, import_common11.Injectable)()
1440
+ ], DayjsPipe);
1441
+ var JSONPipe = class {
1442
+ transform(value, metadata) {
1443
+ const transformable = typeof value === "string" && value.length;
1444
+ const obj = transformable ? JSON.parse(atob(value)) : value;
1445
+ return obj;
1446
+ }
1447
+ };
1448
+ JSONPipe = __decorateClass([
1449
+ (0, import_common11.Injectable)()
1450
+ ], JSONPipe);
1451
+ var convertToFileStream = (value) => ({
1452
+ filename: value.originalname,
1453
+ mimetype: value.mimetype,
1454
+ encoding: value.encoding,
1455
+ createReadStream: () => import_stream.Readable.from(value.buffer)
1456
+ });
1457
+ var MulterToUploadPipe = class {
1458
+ transform(value, metadata) {
1459
+ return Array.isArray(value) ? value.map(convertToFileStream) : convertToFileStream(value);
1460
+ }
1461
+ };
1462
+ MulterToUploadPipe = __decorateClass([
1463
+ (0, import_common11.Injectable)()
1464
+ ], MulterToUploadPipe);
1465
+ var gqlScalarPipeMap = /* @__PURE__ */ new Map([
1466
+ [Int, IntPipe],
1467
+ [Float, FloatPipe],
1468
+ [Boolean, BooleanPipe],
1469
+ [Date, DayjsPipe],
1470
+ [JSON2, JSONPipe]
1471
+ ]);
1472
+ var getQueryPipes = (modelRef, arrDepth) => {
1473
+ const pipes = arrDepth ? [ArrayifyPipe] : [];
1474
+ const scalarPipe = gqlScalarPipeMap.get(modelRef);
1475
+ if (scalarPipe)
1476
+ pipes.push(scalarPipe);
1477
+ return pipes;
1478
+ };
1479
+ var getBodyPipes = (argMeta) => {
1480
+ const [returnRef] = getNonArrayModel(argMeta.returns());
1481
+ if (returnRef.prototype !== Date.prototype && !isGqlScalar(returnRef))
1482
+ return [];
1483
+ let BodyPipe = class {
1484
+ transform(value, metadata) {
1485
+ return deserializeArg(argMeta, value);
1486
+ }
1487
+ };
1488
+ BodyPipe = __decorateClass([
1489
+ (0, import_common11.Injectable)()
1490
+ ], BodyPipe);
1491
+ return [BodyPipe];
1492
+ };
1493
+
1494
+ // pkgs/@akanjs/nest/src/exporter.ts
1495
+ var exporter_exports = {};
1496
+ __export(exporter_exports, {
1497
+ FileSystem: () => FileSystem,
1498
+ exportToCsv: () => exportToCsv,
1499
+ exportToJson: () => exportToJson,
1500
+ objPath: () => objPath,
1501
+ readJson: () => readJson
1502
+ });
1503
+ var fs = __toESM(__require("fs"));
1504
+ var objPath = (o, p) => p.split(".").reduce((a, v) => a[v], o);
1505
+ var FileSystem = class {
1506
+ filename = "";
1507
+ dirname = "./";
1508
+ writeStream;
1509
+ constructor(dirname = "./", filename = "") {
1510
+ this.dirname = dirname;
1511
+ this.filename = filename;
1512
+ }
1513
+ async init() {
1514
+ return new Promise((resolve, reject) => {
1515
+ fs.mkdirSync(this.dirname, { recursive: true });
1516
+ const writeStream = fs.createWriteStream(`${this.dirname}/${this.filename}.csv`);
1517
+ if (!writeStream) {
1518
+ reject(new Error("No WriteStream"));
1519
+ return;
1520
+ }
1521
+ writeStream.once(`open`, () => {
1522
+ this.writeStream = writeStream;
1523
+ resolve(writeStream);
1524
+ });
1525
+ });
1526
+ }
1527
+ write(body) {
1528
+ if (!this.writeStream)
1529
+ throw new Error("no write stream");
1530
+ return this.writeStream.write(`${body.replace(/\n/g, "")}
1531
+ `);
1532
+ }
1533
+ // async finish() {}
1534
+ };
1535
+ var exportToCsv = async ({ items, path, fields, delimiter, options }) => {
1536
+ return new Promise((resolve, reject) => {
1537
+ const dirs = path.split("/");
1538
+ if (dirs.length > 1) {
1539
+ const dirname = dirs.slice(-1).join("/");
1540
+ if (!fs.existsSync(dirname))
1541
+ fs.mkdirSync(dirname, { recursive: true });
1542
+ }
1543
+ if (!fields)
1544
+ throw new Error("Fields Required");
1545
+ const writeStream = !options?.append && fs.createWriteStream(path);
1546
+ const header = fields.reduce((acc, cur) => acc + (delimiter ?? `,`) + cur) + `
1547
+ `;
1548
+ if (!writeStream) {
1549
+ reject(new Error("No WriteStream"));
1550
+ return;
1551
+ }
1552
+ writeStream.once(`open`, () => {
1553
+ writeStream.write(header);
1554
+ for (const item of items) {
1555
+ const data = fields.map((field) => objPath(item, field) ?? null).map((field) => String(field).replace(/\n/g, "").replace(/,/g, ""));
1556
+ const body = data.reduce((acc, cur) => acc + (delimiter ?? `,`) + cur) + `
1557
+ `;
1558
+ if (options?.append)
1559
+ fs.appendFileSync(path, body);
1560
+ }
1561
+ resolve();
1562
+ });
1563
+ });
1564
+ };
1565
+ var exportToJson = (items, localPath) => {
1566
+ const dirname = localPath.split("/").slice(0, -1).join("/");
1567
+ if (!fs.existsSync(dirname))
1568
+ fs.mkdirSync(dirname, { recursive: true });
1569
+ fs.writeFileSync(localPath, JSON.stringify(items));
1570
+ };
1571
+ var readJson = (localPath) => JSON.parse(fs.readFileSync(localPath).toString("utf-8"));
1572
+
1573
+ // pkgs/@akanjs/nest/src/verifyPayment.ts
1574
+ var import_iap = __toESM(__require("iap"));
1575
+ var verifyPayment = async (payment) => {
1576
+ return new Promise(
1577
+ (resolve, reject) => (
1578
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
1579
+ import_iap.default.verifyPayment(payment.platform, { ...payment }, (error, response) => {
1580
+ if (error)
1581
+ reject(`App Purchase Verify Failed. ${response}`);
1582
+ else
1583
+ resolve(response);
1584
+ })
1585
+ )
1586
+ );
1587
+ };
1588
+
1589
+ // pkgs/@akanjs/nest/src/sso.ts
1590
+ var import_common12 = __require("@nestjs/common");
1591
+ var import_passport = __require("@nestjs/passport");
1592
+ var appleSignin = __toESM(__require("apple-signin"));
1593
+ var jwt2 = __toESM(__require("jsonwebtoken"));
1594
+ var import_passport_apple = __require("passport-apple");
1595
+ var import_passport_facebook = __require("passport-facebook");
1596
+ var import_passport_github = __require("passport-github");
1597
+ var import_passport_google_oauth20 = __require("passport-google-oauth20");
1598
+ var import_passport_kakao = __require("passport-kakao");
1599
+ var import_passport_naver = __require("passport-naver");
1600
+ var getSsoProviders = (host, ssoOptions) => {
1601
+ const origin = host === "localhost" ? "http://localhost:8080/backend" : `https://${host}/backend`;
1602
+ const providers = [];
1603
+ if (ssoOptions.kakao) {
1604
+ let KakaoOauthStrategy = class extends (0, import_passport.PassportStrategy)(import_passport_kakao.Strategy, "kakao") {
1605
+ constructor() {
1606
+ super({
1607
+ ...ssoOptions.kakao,
1608
+ callbackURL: `${origin}/user/kakao/callback`,
1609
+ scope: ["account_email", "profile_nickname"]
1610
+ });
1611
+ }
1612
+ validate(jwt3, refreshToken, profile) {
1613
+ return {
1614
+ name: profile.displayName,
1615
+ email: profile._json.kakao_account.email,
1616
+ password: profile.id
1617
+ };
1618
+ }
1619
+ };
1620
+ KakaoOauthStrategy = __decorateClass([
1621
+ (0, import_common12.Injectable)()
1622
+ ], KakaoOauthStrategy);
1623
+ providers.push(KakaoOauthStrategy);
1624
+ }
1625
+ if (ssoOptions.naver) {
1626
+ let NaverOauthStrategy = class extends (0, import_passport.PassportStrategy)(import_passport_naver.Strategy, "naver") {
1627
+ constructor() {
1628
+ super({ ...ssoOptions.naver, callbackURL: `${origin}/user/naver/callback` });
1629
+ }
1630
+ validate(jwt3, refreshToken, profile) {
1631
+ return {
1632
+ name: profile.displayName,
1633
+ email: profile._json.email,
1634
+ password: profile.id
1635
+ };
1636
+ }
1637
+ };
1638
+ NaverOauthStrategy = __decorateClass([
1639
+ (0, import_common12.Injectable)()
1640
+ ], NaverOauthStrategy);
1641
+ providers.push(NaverOauthStrategy);
1642
+ }
1643
+ if (ssoOptions.github) {
1644
+ let GithubOauthStrategy = class extends (0, import_passport.PassportStrategy)(import_passport_github.Strategy, "github") {
1645
+ constructor() {
1646
+ super({ ...ssoOptions.github, callbackURL: `${origin}/user/github/callback`, scope: ["user"] });
1647
+ }
1648
+ validate(accessToken, _refreshToken, profile) {
1649
+ return profile;
1650
+ }
1651
+ };
1652
+ GithubOauthStrategy = __decorateClass([
1653
+ (0, import_common12.Injectable)()
1654
+ ], GithubOauthStrategy);
1655
+ providers.push(GithubOauthStrategy);
1656
+ }
1657
+ if (ssoOptions.google) {
1658
+ let GoogleOauthStrategy = class extends (0, import_passport.PassportStrategy)(import_passport_google_oauth20.Strategy, "google") {
1659
+ constructor() {
1660
+ super({ ...ssoOptions.google, callbackURL: `${origin}/user/google/callback`, scope: ["email", "profile"] });
1661
+ }
1662
+ validate(_accessToken, _refreshToken, profile) {
1663
+ return profile;
1664
+ }
1665
+ };
1666
+ GoogleOauthStrategy = __decorateClass([
1667
+ (0, import_common12.Injectable)()
1668
+ ], GoogleOauthStrategy);
1669
+ providers.push(GoogleOauthStrategy);
1670
+ }
1671
+ if (ssoOptions.facebook) {
1672
+ let FacebookOauthStrategy = class extends (0, import_passport.PassportStrategy)(import_passport_facebook.Strategy, "facebook") {
1673
+ constructor() {
1674
+ super({
1675
+ ...ssoOptions.facebook,
1676
+ callbackURL: `${origin}/user/facebook/callback`,
1677
+ scope: ["email"],
1678
+ profileFields: ["emails", "name"]
1679
+ });
1680
+ }
1681
+ validate(_accessToken, _refreshToken, profile) {
1682
+ return profile;
1683
+ }
1684
+ };
1685
+ FacebookOauthStrategy = __decorateClass([
1686
+ (0, import_common12.Injectable)()
1687
+ ], FacebookOauthStrategy);
1688
+ providers.push(FacebookOauthStrategy);
1689
+ }
1690
+ if (ssoOptions.apple) {
1691
+ let AppleOauthStrategy = class extends (0, import_passport.PassportStrategy)(import_passport_apple.Strategy, "apple") {
1692
+ constructor() {
1693
+ super({
1694
+ ...ssoOptions.apple,
1695
+ callbackURL: `${origin}/user/apple/callback`,
1696
+ passReqToCallback: true,
1697
+ scope: ["name", "email"]
1698
+ });
1699
+ }
1700
+ validate(req, accessToken, refreshToken, idToken, profile, cb) {
1701
+ cb(null, idToken);
1702
+ }
1703
+ };
1704
+ AppleOauthStrategy = __decorateClass([
1705
+ (0, import_common12.Injectable)()
1706
+ ], AppleOauthStrategy);
1707
+ providers.push(AppleOauthStrategy);
1708
+ }
1709
+ return providers;
1710
+ };
1711
+ var verifyAppleUser = async (payload, origin, sso) => {
1712
+ const signinAgent = appleSignin;
1713
+ const clientSecret = signinAgent.getClientSecret({
1714
+ clientID: sso.clientID,
1715
+ teamId: sso.teamID,
1716
+ keyIdentifier: sso.keyID,
1717
+ privateKeyPath: sso.keyFilePath
1718
+ });
1719
+ const tokens = await signinAgent.getAuthorizationToken(payload.code, {
1720
+ clientID: sso.clientID,
1721
+ clientSecret,
1722
+ redirectUri: `${origin}/user/apple/callback`
1723
+ });
1724
+ if (!tokens.id_token) {
1725
+ throw new Error("No id_token found in Apple's response");
1726
+ }
1727
+ const data = jwt2.decode(tokens.id_token);
1728
+ return { tokens, data };
1729
+ };
1730
+
1731
+ // pkgs/@akanjs/nest/src/exceptions.ts
1732
+ var import_common14 = __require("@nestjs/common");
1733
+ var AllExceptionsFilter = class {
1734
+ logger = new Logger("Exception Filter");
1735
+ catch(exception, host) {
1736
+ if (host.getType() !== "http") {
1737
+ const gqlArgs = host.getArgByIndex(1);
1738
+ const gqlReq = host.getArgByIndex(3);
1739
+ const reqType2 = gqlReq?.parentType?.name ?? "unknown";
1740
+ const reqName2 = gqlReq?.fieldName ?? "unknown";
1741
+ this.logger.error(
1742
+ `GraphQL Error
1743
+ Request: ${reqType2}-${reqName2}
1744
+ Args: ${JSON.stringify(gqlArgs, null, 2)}
1745
+ ${exception.stack}`
1746
+ );
1747
+ throw exception;
1748
+ }
1749
+ const ctx = host.switchToHttp();
1750
+ const res = ctx.getResponse();
1751
+ const req = ctx.getRequest();
1752
+ const reqType = req.method;
1753
+ const reqName = req.url;
1754
+ const status = exception instanceof import_common14.HttpException ? exception.getStatus() : null;
1755
+ if (status) {
1756
+ res.status(status).json({
1757
+ statusCode: status,
1758
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
1759
+ path: req.url,
1760
+ message: exception instanceof import_common14.HttpException ? exception.getResponse() : exception.message
1761
+ });
1762
+ this.logger.error(
1763
+ `Http Error: ${status}
1764
+ Request: ${reqType}-${reqName}
1765
+ Body: ${JSON.stringify(req.body, null, 2)}
1766
+ ${exception.stack}`
1767
+ );
1768
+ }
1769
+ }
1770
+ };
1771
+ AllExceptionsFilter = __decorateClass([
1772
+ (0, import_common14.Catch)()
1773
+ ], AllExceptionsFilter);
1774
+
1775
+ // pkgs/@akanjs/nest/src/generateSecrets.ts
1776
+ var import_crypto = __require("crypto");
1777
+ var import_tunnel_ssh = __require("tunnel-ssh");
1778
+ var generateHexStringFromSeed = (seed, length = 256) => {
1779
+ let hexString = "";
1780
+ let currentSeed = seed;
1781
+ while (hexString.length < length * 2) {
1782
+ const hash = (0, import_crypto.createHash)("sha256").update(currentSeed).digest("hex");
1783
+ hexString += hash;
1784
+ currentSeed = hash;
1785
+ }
1786
+ return hexString.substring(0, length * 2);
1787
+ };
1788
+ var generateJwtSecret = (appName2, environment2) => {
1789
+ const seed = `${appName2}-${environment2}-jwt-secret`;
1790
+ return generateHexStringFromSeed(seed);
1791
+ };
1792
+ var generateAeskey = (appName2, environment2) => {
1793
+ const seed = `${appName2}-${environment2}-aes-key`;
1794
+ return (0, import_crypto.createHash)("sha256").update(seed).digest("hex");
1795
+ };
1796
+ var DEFAULT_CLOUD_PORT = 3e4;
1797
+ var getEnvironmentPort = (environment2) => environment2 === "main" ? 2e3 : environment2 === "develop" ? 1e3 : environment2 === "debug" ? 0 : 0;
1798
+ var getServicePort = (appCode, service) => (service === "redis" ? 300 : service === "mongo" ? 400 : 500) + appCode % 10 * 10 + (appCode >= 10 ? 5 : 0);
1799
+ var createDatabaseTunnel = async ({
1800
+ appName: appName2,
1801
+ environment: environment2,
1802
+ type,
1803
+ port,
1804
+ sshOptions = {
1805
+ host: `${appName2}-${environment2}.${baseEnv.serveDomain}`,
1806
+ port: 32767,
1807
+ username: baseEnv.tunnelUsername,
1808
+ password: baseEnv.tunnelPassword
1809
+ }
1810
+ }) => {
1811
+ const tunnelOptions = { autoClose: true, reconnectOnError: false };
1812
+ const serverOptions = { port };
1813
+ const forwardOptions = {
1814
+ srcAddr: "0.0.0.0",
1815
+ srcPort: port,
1816
+ dstAddr: `${type}-0.${type}-svc.${appName2}-${environment2}`,
1817
+ dstPort: type === "mongo" ? 27017 : type === "redis" ? 6379 : 7700
1818
+ };
1819
+ const [server, client2] = await (0, import_tunnel_ssh.createTunnel)(tunnelOptions, serverOptions, sshOptions, forwardOptions);
1820
+ return `localhost:${port}`;
1821
+ };
1822
+ var generateRedisUri = async ({ appName: appName2, appCode, environment: environment2, operationMode: operationMode2, sshOptions }) => {
1823
+ if (process.env.REDIS_URI)
1824
+ return process.env.REDIS_URI;
1825
+ const port = operationMode2 === "local" ? DEFAULT_CLOUD_PORT + getEnvironmentPort(environment2) + getServicePort(appCode, "redis") : 6379;
1826
+ const url = operationMode2 === "cloud" ? `redis-svc.${appName2}-${environment2}.svc.cluster.local` : operationMode2 === "local" ? await createDatabaseTunnel({ appName: appName2, environment: environment2, type: "redis", port, sshOptions }) : "localhost:6379";
1827
+ const uri = `redis://${url}`;
1828
+ return uri;
1829
+ };
1830
+ var generateMongoUri = async ({
1831
+ appName: appName2,
1832
+ appCode,
1833
+ environment: environment2,
1834
+ operationMode: operationMode2,
1835
+ username = `${appName2}-${environment2}-mongo-user`,
1836
+ password,
1837
+ sshOptions
1838
+ }) => {
1839
+ if (process.env.MONGO_URI)
1840
+ return process.env.MONGO_URI;
1841
+ const record = operationMode2 === "cloud" ? "mongodb+srv" : "mongodb";
1842
+ const port = operationMode2 === "local" ? DEFAULT_CLOUD_PORT + getEnvironmentPort(environment2) + getServicePort(appCode, "mongo") : 27017;
1843
+ const url = operationMode2 === "cloud" ? `mongo-svc.${appName2}-${environment2}.svc.cluster.local` : operationMode2 === "local" ? await createDatabaseTunnel({ appName: appName2, environment: environment2, type: "mongo", port, sshOptions }) : "localhost:27017";
1844
+ const usernameEncoded = password ? encodeURIComponent(username) : null;
1845
+ const passwordEncoded = password ? encodeURIComponent(password) : null;
1846
+ const dbName = `${appName2}-${environment2}`;
1847
+ const directConnection = operationMode2 === "cloud" ? false : true;
1848
+ const authInfo = usernameEncoded ? `${usernameEncoded}:${passwordEncoded}@` : "";
1849
+ const uri = `${record}://${authInfo}${url}/${dbName}?authSource=${dbName}&readPreference=primary&ssl=false&retryWrites=true&directConnection=${directConnection}`;
1850
+ return uri;
1851
+ };
1852
+ var generateMeiliUri = ({ appName: appName2, appCode, environment: environment2, operationMode: operationMode2 }) => {
1853
+ if (process.env.MEILI_URI)
1854
+ return process.env.MEILI_URI;
1855
+ const protocol = operationMode2 === "local" ? "https" : "http";
1856
+ const url = operationMode2 === "cloud" ? `meili-0.meili-svc.${appName2}-${environment2}.svc.cluster.local:7700` : operationMode2 === "local" ? `${appName2}-${environment2}.${baseEnv.serveDomain}/search` : "localhost:7700";
1857
+ const uri = `${protocol}://${url}`;
1858
+ return uri;
1859
+ };
1860
+ var SALT_ROUNDS = 11;
1861
+ var generateHost = (env) => {
1862
+ if (process.env.HOST_NAME)
1863
+ return process.env.HOST_NAME;
1864
+ else if (env.hostname)
1865
+ return env.hostname;
1866
+ else if (env.operationMode === "local")
1867
+ return "localhost";
1868
+ else
1869
+ return `${env.appName}-${env.environment}.${baseEnv.serveDomain}`;
1870
+ };
1871
+ var generateMeiliKey = ({ appName: appName2, environment: environment2 }) => {
1872
+ return `meilisearch-key-${appName2}-${environment2}`;
1873
+ };
1874
+
1875
+ // pkgs/@akanjs/nest/src/mongoose.ts
1876
+ var import_mongoose = __toESM(__require("mongoose"));
1877
+ var initMongoDB = ({
1878
+ logging,
1879
+ threshold = 5e3,
1880
+ sendReport = false
1881
+ }) => {
1882
+ const mongoDBLogger = new Logger("MongoDB");
1883
+ if (logging)
1884
+ import_mongoose.default.set("debug", function(collection, method, ...methodArgs) {
1885
+ mongoDBLogger.verbose(
1886
+ `${collection}.${method}(${methodArgs.slice(0, -1).map((arg) => JSON.stringify(arg)).join(", ")})`
1887
+ );
1888
+ });
1889
+ const originalExec = import_mongoose.default.Query.prototype.exec;
1890
+ const getQueryInfo = (queryAgent) => {
1891
+ const model = queryAgent.model;
1892
+ const collectionName = model.collection.collectionName;
1893
+ const dbName = model.db.name;
1894
+ const query = queryAgent.getQuery();
1895
+ const queryOptions = queryAgent.getOptions();
1896
+ return { dbName, collectionName, query, queryOptions };
1897
+ };
1898
+ import_mongoose.default.Query.prototype.exec = function(...args) {
1899
+ const start = Date.now();
1900
+ return originalExec.apply(this, args).then((result) => {
1901
+ const duration = Date.now() - start;
1902
+ const { dbName, collectionName, query, queryOptions } = getQueryInfo(this);
1903
+ if (logging)
1904
+ mongoDBLogger.verbose(
1905
+ `Queried ${dbName}.${collectionName}.query(${JSON.stringify(query)}, ${JSON.stringify(
1906
+ queryOptions
1907
+ )}) - ${duration}ms`
1908
+ );
1909
+ return result;
1910
+ });
1911
+ };
1912
+ const originalAggregate = import_mongoose.default.Model.aggregate;
1913
+ const getAggregateInfo = (aggregateModel) => {
1914
+ const dbName = aggregateModel.db.db?.databaseName ?? "unknown";
1915
+ const collectionName = aggregateModel.collection.collectionName;
1916
+ return { dbName, collectionName };
1917
+ };
1918
+ import_mongoose.default.Model.aggregate = function(...args) {
1919
+ const startTime = Date.now();
1920
+ return originalAggregate.apply(this, args).then((result) => {
1921
+ const duration = Date.now() - startTime;
1922
+ const { dbName, collectionName } = getAggregateInfo(this);
1923
+ if (logging)
1924
+ mongoDBLogger.verbose(
1925
+ `Aggregated ${dbName}.${collectionName}.aggregate(${args.map((arg) => JSON.stringify(arg)).join(", ")}) - ${duration}ms`
1926
+ );
1927
+ return result;
1928
+ });
1929
+ };
1930
+ import_mongoose.default.set("transactionAsyncLocalStorage", true);
1931
+ };
1932
+
1933
+ // pkgs/@akanjs/nest/src/searchClient.ts
1934
+ var import_common16 = __require("@nestjs/common");
1935
+ var SearchClient = class {
1936
+ meili;
1937
+ async getIndexNames() {
1938
+ const { results } = await this.meili.getIndexes({ limit: 1e3 });
1939
+ return results.map((index) => index.uid);
1940
+ }
1941
+ async getSearchResult(indexName, option) {
1942
+ const { skip = 0, limit = DEFAULT_PAGE_SIZE, sort = "", searchString } = option;
1943
+ if (!searchString) {
1944
+ const { results, total } = await this.meili.index(indexName).getDocuments({ offset: skip, limit });
1945
+ return { docs: results, skip, limit, sort, total };
1946
+ }
1947
+ const { hits, estimatedTotalHits } = await this.meili.index(indexName).search(searchString, { offset: skip, limit });
1948
+ return { docs: hits, skip, limit, sort, total: estimatedTotalHits, query: searchString };
1949
+ }
1950
+ async upsertDocuments(indexName, documents) {
1951
+ const task = await this.meili.index(indexName).addDocuments(documents);
1952
+ return task;
1953
+ }
1954
+ async dropIndex(indexName) {
1955
+ const task = await this.meili.index(indexName).delete();
1956
+ return task;
1957
+ }
1958
+ };
1959
+ __decorateClass([
1960
+ (0, import_common16.Inject)("MEILI_CLIENT")
1961
+ ], SearchClient.prototype, "meili", 2);
1962
+ SearchClient = __decorateClass([
1963
+ (0, import_common16.Injectable)()
1964
+ ], SearchClient);
1965
+
1966
+ // pkgs/@akanjs/nest/src/cacheClient.ts
1967
+ var import_common17 = __require("@nestjs/common");
1968
+ var CacheClient = class {
1969
+ redis;
1970
+ };
1971
+ __decorateClass([
1972
+ (0, import_common17.Inject)("REDIS_CLIENT")
1973
+ ], CacheClient.prototype, "redis", 2);
1974
+ CacheClient = __decorateClass([
1975
+ (0, import_common17.Injectable)()
1976
+ ], CacheClient);
1977
+
1978
+ // pkgs/@akanjs/nest/src/databaseClient.ts
1979
+ var import_common19 = __require("@nestjs/common");
1980
+ var import_mongoose2 = __require("@nestjs/mongoose");
1981
+ var DatabaseClient = class {
1982
+ connection;
1983
+ getModel(modelName) {
1984
+ const model = this.connection.models[capitalize(modelName)];
1985
+ return model;
1986
+ }
1987
+ };
1988
+ __decorateClass([
1989
+ (0, import_mongoose2.InjectConnection)()
1990
+ ], DatabaseClient.prototype, "connection", 2);
1991
+ DatabaseClient = __decorateClass([
1992
+ (0, import_common19.Injectable)()
1993
+ ], DatabaseClient);
1994
+
1995
+ // pkgs/@akanjs/nest/src/decorators.ts
1996
+ var import_reflect_metadata6 = __require("reflect-metadata");
1997
+ var import_schedule = __require("@nestjs/schedule");
1998
+ var Try = () => {
1999
+ return function(target, key, descriptor) {
2000
+ const originMethod = descriptor.value;
2001
+ descriptor.value = async function(...args) {
2002
+ try {
2003
+ const result = await originMethod.apply(this, args);
2004
+ return result;
2005
+ } catch (e) {
2006
+ this.logger?.warn(`${key} action error return: ${e}`);
2007
+ }
2008
+ };
2009
+ };
2010
+ };
2011
+ var Cron = (cronTime, { lock = true, serverMode, enabled = true } = {}) => {
2012
+ return function(target, key, descriptor) {
2013
+ const originMethod = descriptor.value;
2014
+ let isRunning = false;
2015
+ descriptor.value = async function(...args) {
2016
+ if (lock && isRunning)
2017
+ return this.logger?.warn(`Cronjob-${key} is already running, skipped`);
2018
+ try {
2019
+ isRunning = true;
2020
+ this.logger?.verbose(`Cron Job-${key} started`);
2021
+ const res = await originMethod.apply(this, args);
2022
+ this.logger?.verbose(`Cron Job-${key} finished`);
2023
+ isRunning = false;
2024
+ return res;
2025
+ } catch (e) {
2026
+ this.logger?.error(`Cron Job-${key} error return: ${e}`);
2027
+ isRunning = false;
2028
+ }
2029
+ };
2030
+ if (!enabled)
2031
+ return;
2032
+ if (!serverMode || process.env.SERVER_MODE === "all" || serverMode === process.env.SERVER_MODE)
2033
+ (0, import_schedule.Cron)(cronTime)(target, key, descriptor);
2034
+ };
2035
+ };
2036
+ var getIntervalMetaMap = (prototype) => {
2037
+ return Reflect.getMetadata("serviceInterval", prototype) ?? /* @__PURE__ */ new Map();
2038
+ };
2039
+ var setIntervalMetaMap = (prototype, intervalMetaMap) => {
2040
+ Reflect.defineMetadata("serviceInterval", intervalMetaMap, prototype);
2041
+ };
2042
+ var Interval = (ms, { lock = true, serverMode, enabled = true } = {}) => {
2043
+ return function(target, key, descriptor) {
2044
+ const intervalMetaMap = getIntervalMetaMap(target);
2045
+ if (intervalMetaMap.has(key))
2046
+ return descriptor;
2047
+ intervalMetaMap.set(key, descriptor.value);
2048
+ setIntervalMetaMap(target, intervalMetaMap);
2049
+ const originMethod = descriptor.value;
2050
+ let isRunning = false;
2051
+ descriptor.value = async function(...args) {
2052
+ if (lock && isRunning)
2053
+ return this.logger?.warn(`Cronjob-${key} is already running, skipped`);
2054
+ try {
2055
+ isRunning = true;
2056
+ this.logger?.verbose(`Interval Job-${key} started`);
2057
+ const res = await originMethod.apply(this, args);
2058
+ this.logger?.verbose(`Interval Job-${key} finished`);
2059
+ isRunning = false;
2060
+ return res;
2061
+ } catch (e) {
2062
+ this.logger?.error(`Cronjob-${key} error return: ${e}`);
2063
+ isRunning = false;
2064
+ }
2065
+ };
2066
+ if (!enabled)
2067
+ return;
2068
+ if (!serverMode || process.env.SERVER_MODE === "all" || serverMode === process.env.SERVER_MODE)
2069
+ (0, import_schedule.Interval)(ms)(target, key, descriptor);
2070
+ };
2071
+ };
2072
+ var Transaction = () => {
2073
+ return function(target, key, descriptor) {
2074
+ const originMethod = descriptor.value;
2075
+ descriptor.value = function(...args) {
2076
+ if (!this.connection)
2077
+ throw new Error(`No Connection in function ${key}`);
2078
+ return new Promise((resolve, reject) => {
2079
+ this.connection.transaction(async () => {
2080
+ const res = await originMethod.apply(this, args);
2081
+ resolve(res);
2082
+ }).catch(reject);
2083
+ });
2084
+ };
2085
+ return descriptor;
2086
+ };
2087
+ };
2088
+ var Cache = (timeout2 = 1e3, getCacheKey) => {
2089
+ return function(target, key, descriptor) {
2090
+ const originMethod = descriptor.value;
2091
+ const cacheMap = /* @__PURE__ */ new Map();
2092
+ const timerMap = /* @__PURE__ */ new Map();
2093
+ descriptor.value = async function(...args) {
2094
+ const classType = this.__model ? "doc" : this.__databaseModel ? "service" : "class";
2095
+ const model = this.__model ?? this.__databaseModel?.__model;
2096
+ const cache = this.__cache ?? this.__databaseModel?.__cache;
2097
+ const getCacheKeyFn = getCacheKey ?? JSON.stringify;
2098
+ const cacheKey = `${classType}:${model.modelName}:${key}:${getCacheKeyFn(...args)}`;
2099
+ const getCache = async (cacheKey2) => {
2100
+ if (classType === "class")
2101
+ return cacheMap.get(cacheKey2);
2102
+ const cached = await cache.get(cacheKey2);
2103
+ if (cached)
2104
+ return JSON.parse(cached);
2105
+ return null;
2106
+ };
2107
+ const setCache = async (cacheKey2, value) => {
2108
+ if (classType === "class") {
2109
+ const existingTimer = timerMap.get(cacheKey2);
2110
+ if (existingTimer)
2111
+ clearTimeout(existingTimer);
2112
+ cacheMap.set(cacheKey2, value);
2113
+ const timer = setTimeout(() => {
2114
+ cacheMap.delete(cacheKey2);
2115
+ timerMap.delete(cacheKey2);
2116
+ }, timeout2);
2117
+ timerMap.set(cacheKey2, timer);
2118
+ } else
2119
+ await cache.set(cacheKey2, JSON.stringify(value), { PX: timeout2 });
2120
+ };
2121
+ const cachedData = await getCache(cacheKey);
2122
+ if (cachedData) {
2123
+ this.logger?.trace(`${model.modelName} cache hit: ${cacheKey}`);
2124
+ return cachedData;
2125
+ }
2126
+ const result = await originMethod.apply(this, args);
2127
+ await setCache(cacheKey, result);
2128
+ this.logger?.trace(`${model.modelName} cache set: ${cacheKey}`);
2129
+ return result;
2130
+ };
2131
+ };
2132
+ };
2133
+ })();
2134
+ //! Nextjs는 환경변수를 build time에 그냥 하드코딩으로 값을 넣어버림. operationMode같은것들 잘 동작안할 수 있음. 추후 수정 필요.