@akanjs/server 0.0.34 → 0.0.36

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,3781 @@
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 });
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 Enum = class {
65
+ constructor(values) {
66
+ this.values = values;
67
+ this.valueMap = new Map(values.map((value, idx) => [value, idx]));
68
+ }
69
+ value;
70
+ // for type
71
+ valueMap;
72
+ has(value) {
73
+ return this.valueMap.has(value);
74
+ }
75
+ indexOf(value) {
76
+ const idx = this.valueMap.get(value);
77
+ if (idx === void 0)
78
+ throw new Error(`Value ${value} is not in enum`);
79
+ return idx;
80
+ }
81
+ find(callback) {
82
+ const val = this.values.find(callback);
83
+ if (val === void 0)
84
+ throw new Error(`Value not found in enum`);
85
+ return val;
86
+ }
87
+ findIndex(callback) {
88
+ const idx = this.values.findIndex(callback);
89
+ if (idx === -1)
90
+ throw new Error(`Value not found in enum`);
91
+ return idx;
92
+ }
93
+ filter(callback) {
94
+ return this.values.filter(callback);
95
+ }
96
+ map(callback) {
97
+ return this.values.map(callback);
98
+ }
99
+ forEach(callback) {
100
+ this.values.forEach(callback);
101
+ }
102
+ };
103
+ var version = "0.9.0";
104
+ var logo = `
105
+ _ _ _
106
+ / \\ | | ____ _ _ __ (_)___
107
+ / _ \\ | |/ / _' | '_ \\ | / __|
108
+ / ___ \\| < (_| | | | |_ | \\__ \\
109
+ /_/ \\_\\_|\\_\\__,_|_| |_(_)/ |___/
110
+ |__/ ver ${version}
111
+ ? See more details on docs https://www.akanjs.com/docs
112
+ \u2605 Star Akanjs on GitHub https://github.com/aka-bassman/akanjs
113
+
114
+ `;
115
+
116
+ // pkgs/@akanjs/base/src/baseEnv.ts
117
+ var appName = process.env.NEXT_PUBLIC_APP_NAME ?? "unknown";
118
+ var repoName = process.env.NEXT_PUBLIC_REPO_NAME ?? "unknown";
119
+ var serveDomain = process.env.NEXT_PUBLIC_SERVE_DOMAIN ?? "unknown";
120
+ if (appName === "unknown")
121
+ throw new Error("environment variable NEXT_PUBLIC_APP_NAME is required");
122
+ if (repoName === "unknown")
123
+ throw new Error("environment variable NEXT_PUBLIC_REPO_NAME is required");
124
+ if (serveDomain === "unknown")
125
+ throw new Error("environment variable NEXT_PUBLIC_SERVE_DOMAIN is required");
126
+ var environment = process.env.NEXT_PUBLIC_ENV ?? "debug";
127
+ var operationType = typeof window !== "undefined" ? "client" : process.env.NEXT_RUNTIME ? "client" : "server";
128
+ var operationMode = process.env.NEXT_PUBLIC_OPERATION_MODE ?? "cloud";
129
+ var networkType = process.env.NEXT_PUBLIC_NETWORK_TYPE ?? (environment === "main" ? "mainnet" : environment === "develop" ? "testnet" : "debugnet");
130
+ var tunnelUsername = process.env.SSU_TUNNEL_USERNAME ?? "root";
131
+ var tunnelPassword = process.env.SSU_TUNNEL_PASSWORD ?? repoName;
132
+ var baseEnv = {
133
+ repoName,
134
+ serveDomain,
135
+ appName,
136
+ environment,
137
+ operationType,
138
+ operationMode,
139
+ networkType,
140
+ tunnelUsername,
141
+ tunnelPassword
142
+ };
143
+ var side = typeof window === "undefined" ? "server" : "client";
144
+ var renderMode = process.env.RENDER_ENV ?? "ssr";
145
+ var clientHost = process.env.NEXT_PUBLIC_CLIENT_HOST ?? (operationMode === "local" || side === "server" ? "localhost" : window.location.hostname);
146
+ var clientPort = parseInt(
147
+ process.env.NEXT_PUBLIC_CLIENT_PORT ?? (operationMode === "local" ? renderMode === "ssr" ? "4200" : "4201" : "443")
148
+ );
149
+ var clientHttpProtocol = side === "client" ? window.location.protocol : clientHost === "localhost" ? "http:" : "https:";
150
+ var clientHttpUri = `${clientHttpProtocol}//${clientHost}${clientPort === 443 ? "" : `:${clientPort}`}`;
151
+ 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");
152
+ var serverPort = parseInt(
153
+ process.env.SERVER_PORT ?? (operationMode === "local" || side === "server" ? "8080" : "443")
154
+ );
155
+ var serverHttpProtocol = side === "client" ? window.location.protocol : "http:";
156
+ var serverHttpUri = `${serverHttpProtocol}//${serverHost}${serverPort === 443 ? "" : `:${serverPort}`}/backend`;
157
+ var serverGraphqlUri = `${serverHttpUri}/graphql`;
158
+ var serverWsProtocol = serverHttpProtocol === "http:" ? "ws:" : "wss:";
159
+ var serverWsUri = `${serverWsProtocol}//${serverHost}${serverPort === 443 ? "" : `:${serverPort}`}`;
160
+ var baseClientEnv = {
161
+ ...baseEnv,
162
+ side,
163
+ renderMode,
164
+ websocket: true,
165
+ clientHost,
166
+ clientPort,
167
+ clientHttpProtocol,
168
+ clientHttpUri,
169
+ serverHost,
170
+ serverPort,
171
+ serverHttpProtocol,
172
+ serverHttpUri,
173
+ serverGraphqlUri,
174
+ serverWsProtocol,
175
+ serverWsUri
176
+ };
177
+
178
+ // pkgs/@akanjs/base/src/scalar.ts
179
+ var import_dayjs = __toESM(__require("dayjs"));
180
+ var dayjs = import_dayjs.default;
181
+ var Int = class {
182
+ __Scalar__;
183
+ };
184
+ var Upload = class {
185
+ __Scalar__;
186
+ filename;
187
+ mimetype;
188
+ encoding;
189
+ createReadStream;
190
+ };
191
+ var Float = class {
192
+ __Scalar__;
193
+ };
194
+ var ID = class {
195
+ __Scalar__;
196
+ };
197
+ var JSON2 = class {
198
+ __Scalar__;
199
+ };
200
+ var getNonArrayModel = (arraiedModel2) => {
201
+ let arrDepth = 0;
202
+ let target = arraiedModel2;
203
+ while (Array.isArray(target)) {
204
+ target = target[0];
205
+ arrDepth++;
206
+ }
207
+ return [target, arrDepth];
208
+ };
209
+ var arraiedModel = (modelRef, arrDepth = 0) => {
210
+ let target = modelRef;
211
+ for (let i = 0; i < arrDepth; i++)
212
+ target = [target];
213
+ return target;
214
+ };
215
+ var applyFnToArrayObjects = (arraiedData, fn) => {
216
+ if (Array.isArray(arraiedData))
217
+ return arraiedData.map((data) => applyFnToArrayObjects(data, fn));
218
+ return fn(arraiedData);
219
+ };
220
+ var scalarSet = /* @__PURE__ */ new Set([String, Boolean, Date, ID, Int, Float, Upload, JSON2, Map]);
221
+ var scalarNameMap = /* @__PURE__ */ new Map([
222
+ [ID, "ID"],
223
+ [Int, "Int"],
224
+ [Float, "Float"],
225
+ [String, "String"],
226
+ [Boolean, "Boolean"],
227
+ [Date, "Date"],
228
+ [Upload, "Upload"],
229
+ [JSON2, "JSON"],
230
+ [Map, "Map"]
231
+ ]);
232
+ var scalarArgMap = /* @__PURE__ */ new Map([
233
+ [ID, null],
234
+ [String, ""],
235
+ [Boolean, false],
236
+ [Date, dayjs(/* @__PURE__ */ new Date(-1))],
237
+ [Int, 0],
238
+ [Float, 0],
239
+ [JSON2, {}],
240
+ [Map, {}]
241
+ ]);
242
+ var scalarDefaultMap = /* @__PURE__ */ new Map([
243
+ [ID, null],
244
+ [String, ""],
245
+ [Boolean, false],
246
+ [Date, dayjs(/* @__PURE__ */ new Date(-1))],
247
+ [Int, 0],
248
+ [Float, 0],
249
+ [JSON2, {}]
250
+ ]);
251
+ var isGqlScalar = (modelRef) => scalarSet.has(modelRef);
252
+ var isGqlMap = (modelRef) => modelRef === Map;
253
+
254
+ // pkgs/@akanjs/constant/src/types.ts
255
+ var DEFAULT_PAGE_SIZE = 20;
256
+
257
+ // pkgs/@akanjs/constant/src/scalar.ts
258
+ var import_reflect_metadata = __require("reflect-metadata");
259
+ var scalarExampleMap = /* @__PURE__ */ new Map([
260
+ [ID, "1234567890abcdef12345678"],
261
+ [Int, 0],
262
+ [Float, 0],
263
+ [String, "String"],
264
+ [Boolean, true],
265
+ [Date, (/* @__PURE__ */ new Date()).toISOString()],
266
+ [Upload, "FileUpload"],
267
+ [JSON2, {}],
268
+ [Map, {}]
269
+ ]);
270
+ var getClassMeta = (modelRef) => {
271
+ const [target] = getNonArrayModel(modelRef);
272
+ const classMeta = Reflect.getMetadata("class", target.prototype);
273
+ if (!classMeta)
274
+ throw new Error(`No ClassMeta for this target ${target.name}`);
275
+ return classMeta;
276
+ };
277
+ var getFieldMetas = (modelRef) => {
278
+ const [target] = getNonArrayModel(modelRef);
279
+ const metadataMap = Reflect.getMetadata("fields", target.prototype) ?? /* @__PURE__ */ new Map();
280
+ const keySortMap = { id: -1, createdAt: 1, updatedAt: 2, removedAt: 3 };
281
+ return [...metadataMap.values()].sort((a, b) => (keySortMap[a.key] ?? 0) - (keySortMap[b.key] ?? 0));
282
+ };
283
+ var getFieldMetaMap = (modelRef) => {
284
+ const [target] = getNonArrayModel(modelRef);
285
+ const metadataMap = Reflect.getMetadata("fields", target.prototype) ?? /* @__PURE__ */ new Map();
286
+ return new Map(metadataMap);
287
+ };
288
+ var getFieldMetaMapOnPrototype = (prototype) => {
289
+ const metadataMap = Reflect.getMetadata("fields", prototype) ?? /* @__PURE__ */ new Map();
290
+ return new Map(metadataMap);
291
+ };
292
+ var setFieldMetaMapOnPrototype = (prototype, metadataMap) => {
293
+ Reflect.defineMetadata("fields", new Map(metadataMap), prototype);
294
+ };
295
+
296
+ // pkgs/@akanjs/constant/src/fieldMeta.ts
297
+ var applyFieldMeta = (modelRef, arrDepth, option, optionArrDepth) => {
298
+ const isArray = arrDepth > 0;
299
+ const isClass = !isGqlScalar(modelRef);
300
+ const isMap = isGqlMap(modelRef);
301
+ const { refName, type } = isClass ? getClassMeta(modelRef) : { refName: "", type: "scalar" };
302
+ const name = isClass ? refName : scalarNameMap.get(modelRef) ?? "Unknown";
303
+ if (isMap && !option.of)
304
+ throw new Error("Map type must have 'of' option");
305
+ return (prototype, key) => {
306
+ const metadata = {
307
+ nullable: option.nullable ?? false,
308
+ ref: option.ref,
309
+ refPath: option.refPath,
310
+ refType: option.refType,
311
+ default: option.default ?? (isArray ? [] : null),
312
+ type: option.type,
313
+ fieldType: option.fieldType ?? "property",
314
+ immutable: option.immutable ?? false,
315
+ min: option.min,
316
+ max: option.max,
317
+ enum: option.enum,
318
+ select: option.select ?? true,
319
+ minlength: option.minlength,
320
+ maxlength: option.maxlength,
321
+ query: option.query,
322
+ accumulate: option.accumulate,
323
+ example: option.example,
324
+ validate: option.validate,
325
+ key,
326
+ name,
327
+ isClass,
328
+ isScalar: type === "scalar",
329
+ modelRef,
330
+ arrDepth,
331
+ isArray,
332
+ optArrDepth: optionArrDepth,
333
+ isMap,
334
+ of: option.of,
335
+ text: option.text
336
+ };
337
+ const metadataMap = getFieldMetaMapOnPrototype(prototype);
338
+ metadataMap.set(key, metadata);
339
+ setFieldMetaMapOnPrototype(prototype, metadataMap);
340
+ };
341
+ };
342
+ var makeField = (customOption) => (returns, fieldOption) => {
343
+ const [modelRef, arrDepth] = getNonArrayModel(returns());
344
+ if (!fieldOption)
345
+ return applyFieldMeta(modelRef, arrDepth, { ...customOption }, arrDepth);
346
+ const [opt, optArrDepth] = getNonArrayModel(fieldOption);
347
+ return applyFieldMeta(modelRef, arrDepth, { ...opt, ...customOption }, optArrDepth);
348
+ };
349
+ var Field = {
350
+ Prop: makeField({ fieldType: "property" }),
351
+ Hidden: makeField({ fieldType: "hidden", nullable: true }),
352
+ Secret: makeField({ fieldType: "hidden", select: false, nullable: true }),
353
+ Resolve: makeField({ fieldType: "resolve" })
354
+ };
355
+
356
+ // pkgs/@akanjs/constant/src/constantDecorator.ts
357
+ var import_reflect_metadata2 = __require("reflect-metadata");
358
+ var CnstStorage = class {
359
+ };
360
+ var getCnstMeta = (refName) => {
361
+ const cnst = Reflect.getMetadata(refName, CnstStorage.prototype);
362
+ if (!cnst)
363
+ throw new Error(`No cnst meta for ${refName}`);
364
+ return cnst;
365
+ };
366
+
367
+ // pkgs/@akanjs/constant/src/filterMeta.ts
368
+ var getFilterMeta = (filterRef) => {
369
+ const filterMeta = Reflect.getMetadata("filter", filterRef.prototype);
370
+ if (!filterMeta)
371
+ throw new Error("filterMeta is not defined");
372
+ return filterMeta;
373
+ };
374
+ var setFilterMeta = (filterRef, filterMeta) => {
375
+ const existingFilterMeta = Reflect.getMetadata("filter", filterRef.prototype);
376
+ if (existingFilterMeta)
377
+ Object.assign(filterMeta.sort, existingFilterMeta.sort);
378
+ Reflect.defineMetadata("filter", filterMeta, filterRef.prototype);
379
+ };
380
+ var getFilterKeyMetaMapOnPrototype = (prototype) => {
381
+ const metadataMap = Reflect.getMetadata("filterKey", prototype) ?? /* @__PURE__ */ new Map();
382
+ return new Map(metadataMap);
383
+ };
384
+ var setFilterKeyMetaMapOnPrototype = (prototype, metadataMap) => {
385
+ Reflect.defineMetadata("filterKey", new Map(metadataMap), prototype);
386
+ };
387
+ var applyFilterKeyMeta = (option) => {
388
+ return (prototype, key, descriptor) => {
389
+ const metadata = { key, ...option, descriptor };
390
+ const metadataMap = getFilterKeyMetaMapOnPrototype(prototype);
391
+ metadataMap.set(key, metadata);
392
+ setFilterKeyMetaMapOnPrototype(prototype, metadataMap);
393
+ };
394
+ };
395
+ var makeFilter = (customOption) => (fieldOption) => {
396
+ return applyFilterKeyMeta({ ...customOption, ...fieldOption });
397
+ };
398
+ var getFilterArgMetasOnPrototype = (prototype, key) => {
399
+ const filterArgMetas = Reflect.getMetadata("filterArg", prototype, key) ?? [];
400
+ return filterArgMetas;
401
+ };
402
+ var setFilterArgMetasOnPrototype = (prototype, key, filterArgMetas) => {
403
+ Reflect.defineMetadata("filterArg", filterArgMetas, prototype, key);
404
+ };
405
+ var applyFilterArgMeta = (name, returns, argOption) => {
406
+ return (prototype, key, idx) => {
407
+ const [modelRef, arrDepth] = getNonArrayModel(returns());
408
+ const [opt, optArrDepth] = getNonArrayModel(argOption ?? {});
409
+ const filterArgMeta = { name, ...opt, modelRef, arrDepth, isArray: arrDepth > 0, optArrDepth };
410
+ const filterArgMetas = getFilterArgMetasOnPrototype(prototype, key);
411
+ filterArgMetas[idx] = filterArgMeta;
412
+ setFilterArgMetasOnPrototype(prototype, key, filterArgMetas);
413
+ };
414
+ };
415
+ var getFilterQuery = (filterRef, key) => {
416
+ const filterKeyMetaMap = getFilterKeyMetaMapOnPrototype(filterRef.prototype);
417
+ const filterKeyMeta = filterKeyMetaMap.get(key);
418
+ if (!filterKeyMeta?.descriptor.value)
419
+ throw new Error(`filterKeyMeta is not defined for key: ${key}`);
420
+ return filterKeyMeta.descriptor.value;
421
+ };
422
+ var getFilterSort = (filterRef, key) => {
423
+ const filterMeta = getFilterMeta(filterRef);
424
+ const sort = filterMeta.sort[key];
425
+ return sort;
426
+ };
427
+ var getFilterSortMap = (filterRef) => {
428
+ const filterMeta = getFilterMeta(filterRef);
429
+ return filterMeta.sort;
430
+ };
431
+ var Filter = {
432
+ Mongo: makeFilter({ type: "mongo" }),
433
+ // Meili: makeFilter({ fieldType: "hidden", nullable: true }),
434
+ Arg: applyFilterArgMeta
435
+ };
436
+
437
+ // pkgs/@akanjs/constant/src/baseGql.ts
438
+ var import_reflect_metadata3 = __require("reflect-metadata");
439
+
440
+ // pkgs/@akanjs/common/src/isDayjs.ts
441
+ var import_dayjs2 = __require("dayjs");
442
+
443
+ // pkgs/@akanjs/common/src/isQueryEqual.ts
444
+ var import_dayjs3 = __toESM(__require("dayjs"));
445
+
446
+ // pkgs/@akanjs/common/src/isValidDate.ts
447
+ var import_dayjs4 = __toESM(__require("dayjs"));
448
+ var import_customParseFormat = __toESM(__require("dayjs/plugin/customParseFormat"));
449
+ import_dayjs4.default.extend(import_customParseFormat.default);
450
+ var isValidDate = (d) => {
451
+ const format = "YYYY-MM-DD";
452
+ if (typeof d === "string") {
453
+ return (0, import_dayjs4.default)(d, format).isValid();
454
+ } else if ((0, import_dayjs2.isDayjs)(d))
455
+ return d.isValid();
456
+ else
457
+ return d instanceof Date && !isNaN(d.getTime());
458
+ };
459
+
460
+ // pkgs/@akanjs/common/src/pluralize.ts
461
+ var import_pluralize = __toESM(__require("pluralize"));
462
+
463
+ // pkgs/@akanjs/common/src/applyMixins.ts
464
+ var getAllPropertyDescriptors = (objRef) => {
465
+ const descriptors = {};
466
+ let current = objRef.prototype;
467
+ while (current) {
468
+ Object.getOwnPropertyNames(current).forEach((name) => {
469
+ descriptors[name] ??= Object.getOwnPropertyDescriptor(current, name);
470
+ });
471
+ current = Object.getPrototypeOf(current);
472
+ }
473
+ return descriptors;
474
+ };
475
+ var applyMixins = (derivedCtor, constructors, avoidKeys) => {
476
+ constructors.forEach((baseCtor) => {
477
+ Object.entries(getAllPropertyDescriptors(baseCtor)).forEach(([name, descriptor]) => {
478
+ if (name === "constructor" || avoidKeys?.has(name))
479
+ return;
480
+ Object.defineProperty(derivedCtor.prototype, name, { ...descriptor, configurable: true });
481
+ });
482
+ });
483
+ };
484
+
485
+ // pkgs/@akanjs/common/src/capitalize.ts
486
+ var capitalize = (str) => {
487
+ return str.charAt(0).toUpperCase() + str.slice(1);
488
+ };
489
+
490
+ // pkgs/@akanjs/common/src/Logger.ts
491
+ var import_dayjs5 = __toESM(__require("dayjs"));
492
+ var logLevels = ["trace", "verbose", "debug", "log", "info", "warn", "error"];
493
+ var clc = {
494
+ bold: (text) => `\x1B[1m${text}\x1B[0m`,
495
+ green: (text) => `\x1B[32m${text}\x1B[39m`,
496
+ yellow: (text) => `\x1B[33m${text}\x1B[39m`,
497
+ red: (text) => `\x1B[31m${text}\x1B[39m`,
498
+ magentaBright: (text) => `\x1B[95m${text}\x1B[39m`,
499
+ cyanBright: (text) => `\x1B[96m${text}\x1B[39m`
500
+ };
501
+ var colorizeMap = {
502
+ trace: clc.bold,
503
+ verbose: clc.cyanBright,
504
+ debug: clc.magentaBright,
505
+ log: clc.green,
506
+ info: clc.green,
507
+ warn: clc.yellow,
508
+ error: clc.red
509
+ };
510
+ var Logger = class _Logger {
511
+ static #ignoreCtxSet = /* @__PURE__ */ new Set([
512
+ "InstanceLoader",
513
+ "RoutesResolver",
514
+ "RouterExplorer",
515
+ "NestFactory",
516
+ "WebSocketsController",
517
+ "GraphQLModule",
518
+ "NestApplication"
519
+ ]);
520
+ static level = process.env.NEXT_PUBLIC_LOG_LEVEL ?? "log";
521
+ static #levelIdx = logLevels.findIndex((l) => l === process.env.NEXT_PUBLIC_LOG_LEVEL);
522
+ static #startAt = (0, import_dayjs5.default)();
523
+ static setLevel(level) {
524
+ this.level = level;
525
+ this.#levelIdx = logLevels.findIndex((l) => l === level);
526
+ }
527
+ name;
528
+ constructor(name) {
529
+ this.name = name;
530
+ }
531
+ trace(msg, context = "") {
532
+ if (_Logger.#levelIdx <= 0)
533
+ _Logger.#printMessages(this.name ?? "App", msg, context, "trace");
534
+ }
535
+ verbose(msg, context = "") {
536
+ if (_Logger.#levelIdx <= 1)
537
+ _Logger.#printMessages(this.name ?? "App", msg, context, "verbose");
538
+ }
539
+ debug(msg, context = "") {
540
+ if (_Logger.#levelIdx <= 2)
541
+ _Logger.#printMessages(this.name ?? "App", msg, context, "debug");
542
+ }
543
+ log(msg, context = "") {
544
+ if (_Logger.#levelIdx <= 3)
545
+ _Logger.#printMessages(this.name ?? "App", msg, context, "log");
546
+ }
547
+ info(msg, context = "") {
548
+ if (_Logger.#levelIdx <= 4)
549
+ _Logger.#printMessages(this.name ?? "App", msg, context, "info");
550
+ }
551
+ warn(msg, context = "") {
552
+ if (_Logger.#levelIdx <= 5)
553
+ _Logger.#printMessages(this.name ?? "App", msg, context, "warn");
554
+ }
555
+ error(msg, context = "") {
556
+ if (_Logger.#levelIdx <= 6)
557
+ _Logger.#printMessages(this.name ?? "App", msg, context, "error");
558
+ }
559
+ raw(msg, method) {
560
+ _Logger.rawLog(msg, method);
561
+ }
562
+ rawLog(msg, method) {
563
+ _Logger.rawLog(msg, method);
564
+ }
565
+ static trace(msg, context = "") {
566
+ if (_Logger.#levelIdx <= 0)
567
+ _Logger.#printMessages("App", msg, context, "trace");
568
+ }
569
+ static verbose(msg, context = "") {
570
+ if (_Logger.#levelIdx <= 1)
571
+ _Logger.#printMessages("App", msg, context, "verbose");
572
+ }
573
+ static debug(msg, context = "") {
574
+ if (_Logger.#levelIdx <= 2)
575
+ _Logger.#printMessages("App", msg, context, "debug");
576
+ }
577
+ static log(msg, context = "") {
578
+ if (_Logger.#levelIdx <= 3)
579
+ _Logger.#printMessages("App", msg, context, "log");
580
+ }
581
+ static info(msg, context = "") {
582
+ if (_Logger.#levelIdx <= 4)
583
+ _Logger.#printMessages("App", msg, context, "info");
584
+ }
585
+ static warn(msg, context = "") {
586
+ if (_Logger.#levelIdx <= 5)
587
+ _Logger.#printMessages("App", msg, context, "warn");
588
+ }
589
+ static error(msg, context = "") {
590
+ if (_Logger.#levelIdx <= 6)
591
+ _Logger.#printMessages("App", msg, context, "error");
592
+ }
593
+ static #colorize(msg, logLevel) {
594
+ return colorizeMap[logLevel](msg);
595
+ }
596
+ static #printMessages(name, content, context, logLevel, writeStreamType = logLevel === "error" ? "stderr" : "stdout") {
597
+ if (this.#ignoreCtxSet.has(context))
598
+ return;
599
+ const now = (0, import_dayjs5.default)();
600
+ const processMsg = this.#colorize(
601
+ `[${name ?? "App"}] ${global.process?.pid ?? "window"} -`,
602
+ logLevel
603
+ );
604
+ const timestampMsg = now.format("MM/DD/YYYY, HH:mm:ss A");
605
+ const logLevelMsg = this.#colorize(logLevel.toUpperCase().padStart(7, " "), logLevel);
606
+ const contextMsg = context ? clc.yellow(`[${context}] `) : "";
607
+ const contentMsg = this.#colorize(content, logLevel);
608
+ const timeDiffMsg = clc.yellow(`+${now.diff(_Logger.#startAt, "ms")}ms`);
609
+ if (typeof window === "undefined")
610
+ process[writeStreamType].write(
611
+ `${processMsg} ${timestampMsg} ${logLevelMsg} ${contextMsg} ${contentMsg} ${timeDiffMsg}
612
+ `
613
+ );
614
+ else
615
+ console.log(`${processMsg} ${timestampMsg} ${logLevelMsg} ${contextMsg} ${contentMsg} ${timeDiffMsg}
616
+ `);
617
+ }
618
+ static rawLog(msg, method) {
619
+ this.raw(`${msg}
620
+ `, method);
621
+ }
622
+ static raw(msg, method) {
623
+ if (typeof window === "undefined" && method !== "console" && global.process)
624
+ global.process.stdout.write(msg);
625
+ else
626
+ console.log(msg);
627
+ }
628
+ };
629
+
630
+ // pkgs/@akanjs/common/src/lowerlize.ts
631
+ var lowerlize = (str) => {
632
+ return str.charAt(0).toLowerCase() + str.slice(1);
633
+ };
634
+
635
+ // pkgs/@akanjs/common/src/sleep.ts
636
+ var sleep = async (ms) => {
637
+ return new Promise((resolve) => {
638
+ setTimeout(() => {
639
+ resolve(true);
640
+ }, ms);
641
+ });
642
+ };
643
+
644
+ // pkgs/@akanjs/constant/src/baseGql.ts
645
+ var defaultFieldMeta = {
646
+ fieldType: "property",
647
+ immutable: false,
648
+ select: true,
649
+ isClass: false,
650
+ isScalar: true,
651
+ nullable: false,
652
+ isArray: false,
653
+ arrDepth: 0,
654
+ optArrDepth: 0,
655
+ default: null,
656
+ isMap: false
657
+ };
658
+ var idFieldMeta = { ...defaultFieldMeta, key: "id", name: "ID", modelRef: ID };
659
+ var createdAtFieldMeta = { ...defaultFieldMeta, key: "createdAt", name: "Date", modelRef: Date };
660
+ var updatedAtFieldMeta = { ...defaultFieldMeta, key: "updatedAt", name: "Date", modelRef: Date };
661
+ var removedAtFieldMeta = {
662
+ ...defaultFieldMeta,
663
+ key: "removedAt",
664
+ name: "Date",
665
+ modelRef: Date,
666
+ nullable: true,
667
+ default: null
668
+ };
669
+
670
+ // pkgs/@akanjs/constant/src/classMeta.ts
671
+ var import_reflect_metadata4 = __require("reflect-metadata");
672
+ var InputModelStorage = class {
673
+ };
674
+ var LightModelStorage = class {
675
+ };
676
+ var FullModelStorage = class {
677
+ };
678
+ var ScalarModelStorage = class {
679
+ };
680
+ var FilterModelStorage = class {
681
+ };
682
+ var getFullModelRef = (refName) => {
683
+ const modelRef = Reflect.getMetadata(capitalize(refName), FullModelStorage.prototype);
684
+ if (!modelRef)
685
+ throw new Error(`FullModel not found - ${refName}`);
686
+ return modelRef;
687
+ };
688
+ var getInputModelRef = (refName) => {
689
+ const modelRef = Reflect.getMetadata(capitalize(refName), InputModelStorage.prototype);
690
+ if (!modelRef)
691
+ throw new Error(`InputModel not found - ${refName}`);
692
+ return modelRef;
693
+ };
694
+ var getChildClassRefs = (target) => {
695
+ const metadatas = getFieldMetas(target);
696
+ const refMap = /* @__PURE__ */ new Map();
697
+ const childRefs = metadatas.filter((metadata) => metadata.isClass).reduce((acc, metadata) => {
698
+ return [...acc, metadata.modelRef, ...getChildClassRefs(metadata.modelRef)];
699
+ }, []);
700
+ childRefs.filter((modelRef, idx) => childRefs.findIndex((ref) => ref.prototype === modelRef.prototype) === idx).map((modelRef) => refMap.set(getClassMeta(modelRef).refName, modelRef));
701
+ return [...refMap.values()];
702
+ };
703
+ var hasTextField = (modelRef) => {
704
+ const fieldMetas = getFieldMetas(modelRef);
705
+ return fieldMetas.some(
706
+ (fieldMeta) => !!fieldMeta.text || fieldMeta.isScalar && fieldMeta.isClass && fieldMeta.select && hasTextField(fieldMeta.modelRef)
707
+ );
708
+ };
709
+ var applyClassMeta = (type, modelType, storage) => {
710
+ return function(refName) {
711
+ return function(target) {
712
+ const modelRef = target;
713
+ const classMeta = { refName, type, modelType, modelRef, hasTextField: hasTextField(modelRef) };
714
+ Reflect.defineMetadata("class", classMeta, modelRef.prototype);
715
+ Reflect.defineMetadata(refName, modelRef, storage.prototype);
716
+ };
717
+ };
718
+ };
719
+ var applyFilterMeta = (storage) => {
720
+ return function(refName) {
721
+ return function(target) {
722
+ const modelRef = target;
723
+ setFilterMeta(modelRef, { refName, sort: {} });
724
+ Reflect.defineMetadata(refName, modelRef, storage.prototype);
725
+ };
726
+ };
727
+ };
728
+ var Model = {
729
+ Light: applyClassMeta("light", "data", LightModelStorage),
730
+ Object: applyClassMeta("full", "ephemeral", FullModelStorage),
731
+ Full: applyClassMeta("full", "data", FullModelStorage),
732
+ Input: applyClassMeta("input", "data", InputModelStorage),
733
+ Scalar: applyClassMeta("scalar", "data", ScalarModelStorage),
734
+ Summary: applyClassMeta("scalar", "summary", ScalarModelStorage),
735
+ Insight: applyClassMeta("scalar", "insight", ScalarModelStorage),
736
+ Filter: applyFilterMeta(FilterModelStorage)
737
+ };
738
+
739
+ // pkgs/@akanjs/server/src/gql.ts
740
+ var Nest = __toESM(__require("@nestjs/graphql"));
741
+ var import_graphql = __require("@nestjs/graphql");
742
+ var import_dayjs6 = __require("dayjs");
743
+ var import_graphql2 = __require("graphql");
744
+ var import_graphql_type_json = __toESM(__require("graphql-type-json"));
745
+ var DateScalar = class {
746
+ description = "Date custom scalar type";
747
+ parseValue(value) {
748
+ return dayjs(value);
749
+ }
750
+ serialize(value) {
751
+ if ((0, import_dayjs6.isDayjs)(value))
752
+ return value.toDate();
753
+ else
754
+ return new Date(value);
755
+ }
756
+ parseLiteral(ast) {
757
+ if (ast.kind === import_graphql2.Kind.INT)
758
+ return dayjs(ast.value);
759
+ else if (ast.kind === import_graphql2.Kind.STRING)
760
+ return dayjs(ast.value);
761
+ else
762
+ return null;
763
+ }
764
+ };
765
+ DateScalar = __decorateClass([
766
+ Nest.Scalar("Date", () => Date)
767
+ ], DateScalar);
768
+ var ObjectGqlStorage = class {
769
+ };
770
+ var InputGqlStorage = class {
771
+ };
772
+ var getPredefinedInqutGql = (refName) => {
773
+ const inputGql = Reflect.getMetadata(refName, InputGqlStorage.prototype);
774
+ return inputGql;
775
+ };
776
+ var setPredefinedInqutGql = (refName, inputGql) => {
777
+ Reflect.defineMetadata(refName, inputGql, InputGqlStorage.prototype);
778
+ };
779
+ var getPredefinedObjectGql = (refName) => {
780
+ const objectGql = Reflect.getMetadata(refName, ObjectGqlStorage.prototype);
781
+ return objectGql;
782
+ };
783
+ var setPredefinedObjectGql = (refName, objectGql) => {
784
+ Reflect.defineMetadata(refName, objectGql, ObjectGqlStorage.prototype);
785
+ };
786
+ var gqlNestFieldMap = /* @__PURE__ */ new Map([
787
+ [ID, Nest.ID],
788
+ [Int, Nest.Int],
789
+ [Float, Nest.Float],
790
+ [JSON2, import_graphql_type_json.default],
791
+ [Map, import_graphql_type_json.default]
792
+ ]);
793
+ var applyNestField = (model, fieldMeta, type = "object") => {
794
+ if (fieldMeta.fieldType === "hidden" && type === "object")
795
+ return;
796
+ const modelRef = fieldMeta.isClass ? type === "object" ? generateGql(fieldMeta.modelRef) : fieldMeta.isScalar ? generateGqlInput(fieldMeta.modelRef) : Nest.ID : gqlNestFieldMap.get(fieldMeta.modelRef) ?? fieldMeta.modelRef;
797
+ (0, import_graphql.Field)(() => arraiedModel(modelRef, fieldMeta.arrDepth), { nullable: fieldMeta.nullable })(
798
+ model.prototype,
799
+ fieldMeta.key
800
+ );
801
+ };
802
+ var generateGqlInput = (inputRef) => {
803
+ const classMeta = getClassMeta(inputRef);
804
+ const predefinedInputGql = getPredefinedInqutGql(classMeta.refName);
805
+ if (predefinedInputGql)
806
+ return predefinedInputGql;
807
+ const fieldMetas = getFieldMetas(inputRef);
808
+ class InputGql {
809
+ }
810
+ const inputGql = classMeta.type === "scalar" ? InputGql : getInputModelRef(classMeta.refName);
811
+ fieldMetas.forEach((fieldMeta) => {
812
+ applyNestField(inputGql, fieldMeta, "input");
813
+ });
814
+ (0, import_graphql.InputType)(classMeta.refName + (classMeta.type === "scalar" ? "Input" : ""))(inputGql);
815
+ setPredefinedInqutGql(classMeta.refName, inputGql);
816
+ return inputGql;
817
+ };
818
+ var generateGql = (objectRef) => {
819
+ const classMeta = getClassMeta(objectRef);
820
+ if (classMeta.type === "light") {
821
+ const fullModelRefName = classMeta.refName.slice(5);
822
+ const fullModelRef = getFullModelRef(fullModelRefName);
823
+ return generateGql(fullModelRef);
824
+ }
825
+ const predefinedObjectGql = getPredefinedObjectGql(classMeta.refName);
826
+ if (predefinedObjectGql)
827
+ return predefinedObjectGql;
828
+ const fieldMetas = getFieldMetas(objectRef);
829
+ class ObjectGql {
830
+ }
831
+ const objectGql = classMeta.type === "scalar" ? ObjectGql : getFullModelRef(classMeta.refName);
832
+ fieldMetas.forEach((fieldMeta) => {
833
+ applyNestField(objectGql, fieldMeta);
834
+ });
835
+ (0, import_graphql.ObjectType)(classMeta.refName)(objectGql);
836
+ setPredefinedObjectGql(classMeta.refName, objectGql);
837
+ return objectGql;
838
+ };
839
+
840
+ // pkgs/@akanjs/signal/src/client.ts
841
+ var import_core = __require("@urql/core");
842
+ var import_socket = __require("socket.io-client");
843
+ var SocketIo = class {
844
+ socket;
845
+ roomSubscribeMap = /* @__PURE__ */ new Map();
846
+ constructor(uri) {
847
+ this.socket = (0, import_socket.io)(uri, { transports: ["websocket"] });
848
+ this.socket.on("connect", () => {
849
+ this.roomSubscribeMap.forEach((option) => {
850
+ this.socket.emit(option.key, { ...option.message, __subscribe__: true });
851
+ });
852
+ });
853
+ }
854
+ on(event, callback) {
855
+ this.socket.on(event, callback);
856
+ }
857
+ removeListener(event, callback) {
858
+ this.socket.removeListener(event, callback);
859
+ }
860
+ removeAllListeners() {
861
+ this.socket.removeAllListeners();
862
+ }
863
+ hasListeners(event) {
864
+ return this.socket.hasListeners(event);
865
+ }
866
+ emit(key, data) {
867
+ this.socket.emit(key, data);
868
+ }
869
+ subscribe(option) {
870
+ if (!this.roomSubscribeMap.has(option.roomId)) {
871
+ this.roomSubscribeMap.set(option.roomId, option);
872
+ this.socket.emit(option.key, { ...option.message, __subscribe__: true });
873
+ }
874
+ this.socket.on(option.roomId, option.handleEvent);
875
+ }
876
+ unsubscribe(roomId, handleEvent) {
877
+ this.socket.removeListener(roomId, handleEvent);
878
+ const option = this.roomSubscribeMap.get(roomId);
879
+ if (this.hasListeners(roomId) || !option)
880
+ return;
881
+ this.roomSubscribeMap.delete(roomId);
882
+ this.socket.emit(option.key, { ...option.message, __subscribe__: false });
883
+ }
884
+ disconnect() {
885
+ this.socket.disconnect();
886
+ return this;
887
+ }
888
+ };
889
+ var Client = class _Client {
890
+ static globalIoMap = /* @__PURE__ */ new Map();
891
+ static tokenStore = /* @__PURE__ */ new Map();
892
+ async waitUntilWebSocketConnected(ws = baseClientEnv.serverWsUri) {
893
+ if (baseClientEnv.side === "server")
894
+ return true;
895
+ while (!this.getIo(ws).socket.connected) {
896
+ Logger.verbose("waiting for websocket to initialize...");
897
+ await sleep(300);
898
+ }
899
+ }
900
+ isInitialized = false;
901
+ uri = baseClientEnv.serverGraphqlUri;
902
+ ws = baseClientEnv.serverWsUri;
903
+ udp = null;
904
+ gql = (0, import_core.createClient)({ url: this.uri, fetch, exchanges: [import_core.cacheExchange, import_core.fetchExchange] });
905
+ jwt = null;
906
+ async getJwt() {
907
+ const isNextServer = baseClientEnv.side === "server" && baseEnv.operationType === "client";
908
+ if (isNextServer) {
909
+ const nextHeaders = __require("next/headers");
910
+ return (await nextHeaders.cookies?.())?.get("jwt")?.value ?? (await nextHeaders.headers?.())?.get("jwt") ?? this.jwt ?? null;
911
+ } else
912
+ return _Client.tokenStore.get(this) ?? null;
913
+ }
914
+ io = null;
915
+ init(data = {}) {
916
+ Object.assign(this, data);
917
+ this.setLink(data.uri);
918
+ this.setIo(data.ws);
919
+ this.isInitialized = true;
920
+ }
921
+ setIo(ws = baseClientEnv.serverWsUri) {
922
+ this.ws = ws;
923
+ const existingIo = _Client.globalIoMap.get(ws);
924
+ if (existingIo) {
925
+ this.io = existingIo;
926
+ return;
927
+ }
928
+ this.io = new SocketIo(ws);
929
+ _Client.globalIoMap.set(ws, this.io);
930
+ }
931
+ getIo(ws = baseClientEnv.serverWsUri) {
932
+ const existingIo = _Client.globalIoMap.get(ws);
933
+ if (existingIo)
934
+ return existingIo;
935
+ const io2 = new SocketIo(ws);
936
+ _Client.globalIoMap.set(ws, io2);
937
+ return io2;
938
+ }
939
+ setLink(uri = baseClientEnv.serverGraphqlUri) {
940
+ this.uri = uri;
941
+ this.gql = (0, import_core.createClient)({
942
+ url: this.uri,
943
+ fetch,
944
+ exchanges: [import_core.cacheExchange, import_core.fetchExchange],
945
+ // requestPolicy: "network-only",
946
+ fetchOptions: () => {
947
+ return {
948
+ headers: {
949
+ "apollo-require-preflight": "true",
950
+ ...this.jwt ? { authorization: `Bearer ${this.jwt}` } : {}
951
+ }
952
+ };
953
+ }
954
+ });
955
+ }
956
+ setJwt(jwt3) {
957
+ _Client.tokenStore.set(this, jwt3);
958
+ }
959
+ reset() {
960
+ this.io?.disconnect();
961
+ this.io = null;
962
+ this.jwt = null;
963
+ }
964
+ clone(data = {}) {
965
+ const newClient = new _Client();
966
+ newClient.init({ ...this, ...data });
967
+ if (data.jwt)
968
+ _Client.tokenStore.set(newClient, data.jwt);
969
+ return newClient;
970
+ }
971
+ terminate() {
972
+ this.reset();
973
+ _Client.globalIoMap.forEach((io2) => io2.disconnect());
974
+ this.isInitialized = false;
975
+ }
976
+ setUdp(udp) {
977
+ this.udp = udp;
978
+ }
979
+ };
980
+ var client = new Client();
981
+
982
+ // pkgs/@akanjs/signal/src/immerify.ts
983
+ var import_immer = __require("immer");
984
+
985
+ // pkgs/@akanjs/signal/src/signalDecorators.ts
986
+ var import_reflect_metadata5 = __require("reflect-metadata");
987
+ var SignalStorage = class {
988
+ };
989
+ var getSignalRefsOnStorage = (refName) => {
990
+ const sigRefs = Reflect.getMetadata(refName, SignalStorage.prototype);
991
+ return sigRefs ?? [];
992
+ };
993
+ var setSignalRefOnStorage = (refName, signalRef) => {
994
+ Reflect.defineMetadata(refName, [...getSignalRefsOnStorage(refName), signalRef], SignalStorage.prototype);
995
+ };
996
+ var getDefaultArg = (argRef) => {
997
+ const [modelRef, arrDepth] = getNonArrayModel(argRef);
998
+ if (arrDepth)
999
+ return [];
1000
+ const scalarArg = scalarArgMap.get(modelRef);
1001
+ if (scalarArg)
1002
+ return scalarArg;
1003
+ else
1004
+ return {};
1005
+ };
1006
+ function Signal(returnsOrObj) {
1007
+ const returns = typeof returnsOrObj === "function" ? returnsOrObj : void 0;
1008
+ const prefix = typeof returnsOrObj === "object" ? returnsOrObj.prefix : void 0;
1009
+ return function(target) {
1010
+ if (returns) {
1011
+ const modelRef = returns();
1012
+ const classMeta = getClassMeta(modelRef);
1013
+ const gqlMetas = getGqlMetas(target);
1014
+ const modelName = lowerlize(classMeta.refName);
1015
+ const listName = `${modelName}ListIn`;
1016
+ const slices = [
1017
+ { refName: modelName, sliceName: modelName, argLength: 1, defaultArgs: [{}] },
1018
+ ...gqlMetas.filter((gqlMeta) => {
1019
+ const name = gqlMeta.signalOption.name ?? gqlMeta.key;
1020
+ if (!name.includes(listName))
1021
+ return false;
1022
+ const [retRef, arrDepth] = getNonArrayModel(gqlMeta.returns());
1023
+ return retRef.prototype === modelRef.prototype && arrDepth === 1;
1024
+ }).map((gqlMeta) => {
1025
+ const name = gqlMeta.signalOption.name ?? gqlMeta.key;
1026
+ const sliceName = name.replace(listName, `${modelName}In`);
1027
+ const [argMetas] = getArgMetas(target, gqlMeta.key);
1028
+ const skipIdx = argMetas.findIndex((argMeta) => argMeta.name === "skip");
1029
+ if (skipIdx === -1)
1030
+ throw new Error(`Invalid Args for ${sliceName}`);
1031
+ const argLength = skipIdx;
1032
+ const queryArgRefs = argMetas.slice(0, skipIdx).map((argMeta) => argMeta.returns());
1033
+ const defaultArgs = queryArgRefs.map(
1034
+ (queryArgRef, idx) => argMetas[idx].argsOption.nullable ? null : getDefaultArg(queryArgRef)
1035
+ );
1036
+ return { refName: modelName, sliceName, argLength, defaultArgs };
1037
+ })
1038
+ ];
1039
+ setSigMeta(target, { returns, prefix, slices, refName: modelName });
1040
+ setSignalRefOnStorage(modelName, target);
1041
+ } else {
1042
+ const refName = typeof returnsOrObj === "object" ? lowerlize(returnsOrObj.name) : void 0;
1043
+ if (!refName)
1044
+ throw new Error("Signal name is required");
1045
+ setSigMeta(target, { returns, prefix, slices: [], refName });
1046
+ setSignalRefOnStorage(refName, target);
1047
+ }
1048
+ };
10
1049
  }
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 server_exports = {};
16
- module.exports = __toCommonJS(server_exports);
17
- __reExport(server_exports, require("./src"), module.exports);
18
- // Annotate the CommonJS export names for ESM import in node:
19
- 0 && (module.exports = {
20
- ...require("./src")
21
- });
1050
+ var createArgMetaDecorator = (type) => {
1051
+ return function(option = {}) {
1052
+ return function(prototype, key, idx) {
1053
+ const argMetas = getArgMetasOnPrototype(prototype, key);
1054
+ argMetas[idx] = { key, idx, type, option };
1055
+ setArgMetasOnPrototype(prototype, key, argMetas);
1056
+ };
1057
+ };
1058
+ };
1059
+ var Account = createArgMetaDecorator("Account");
1060
+ var defaultAccount = {
1061
+ __InternalArg__: "Account",
1062
+ appName: baseEnv.appName,
1063
+ environment: baseEnv.environment
1064
+ };
1065
+ var Self = createArgMetaDecorator("Self");
1066
+ var Me = createArgMetaDecorator("Me");
1067
+ var UserIp = createArgMetaDecorator("UserIp");
1068
+ var Access = createArgMetaDecorator("Access");
1069
+ var Req = createArgMetaDecorator("Req");
1070
+ var Res = createArgMetaDecorator("Res");
1071
+ var Ws = createArgMetaDecorator("Ws");
1072
+ var Job = createArgMetaDecorator("Job");
1073
+ var getQuery = (allow2) => function(returns, signalOption = {}, guards = []) {
1074
+ return (prototype, key, descriptor) => {
1075
+ const metadataMap = getGqlMetaMapOnPrototype(prototype);
1076
+ metadataMap.set(key, {
1077
+ returns,
1078
+ signalOption,
1079
+ key,
1080
+ descriptor,
1081
+ guards: [allow2, ...guards],
1082
+ type: "Query"
1083
+ });
1084
+ setGqlMetaMapOnPrototype(prototype, metadataMap);
1085
+ };
1086
+ };
1087
+ var getMutation = (allow2) => function(returns, signalOption = {}, guards = []) {
1088
+ return (prototype, key, descriptor) => {
1089
+ const metadataMap = getGqlMetaMapOnPrototype(prototype);
1090
+ metadataMap.set(key, {
1091
+ returns,
1092
+ signalOption,
1093
+ key,
1094
+ descriptor,
1095
+ guards: [allow2, ...guards],
1096
+ type: "Mutation"
1097
+ });
1098
+ setGqlMetaMapOnPrototype(prototype, metadataMap);
1099
+ };
1100
+ };
1101
+ var getMessage = (allow2) => function(returns, signalOption = {}, guards = []) {
1102
+ return (prototype, key, descriptor) => {
1103
+ const metadataMap = getGqlMetaMapOnPrototype(prototype);
1104
+ metadataMap.set(key, {
1105
+ returns,
1106
+ signalOption,
1107
+ key,
1108
+ descriptor,
1109
+ guards: [allow2, ...guards],
1110
+ type: "Message"
1111
+ });
1112
+ setGqlMetaMapOnPrototype(prototype, metadataMap);
1113
+ };
1114
+ };
1115
+ var getPubsub = (allow2) => function(returns, signalOption = {}, guards = []) {
1116
+ return (prototype, key, descriptor) => {
1117
+ const metadataMap = getGqlMetaMapOnPrototype(prototype);
1118
+ metadataMap.set(key, {
1119
+ returns,
1120
+ signalOption,
1121
+ key,
1122
+ descriptor,
1123
+ guards: [allow2, ...guards],
1124
+ type: "Pubsub"
1125
+ });
1126
+ setGqlMetaMapOnPrototype(prototype, metadataMap);
1127
+ };
1128
+ };
1129
+ var getProcess = (serverType) => function(returns, signalOption = {}) {
1130
+ return (prototype, key, descriptor) => {
1131
+ const metadataMap = getGqlMetaMapOnPrototype(prototype);
1132
+ metadataMap.set(key, {
1133
+ returns,
1134
+ signalOption: { ...signalOption, serverType: lowerlize(serverType) },
1135
+ key,
1136
+ descriptor,
1137
+ guards: ["None"],
1138
+ type: "Process"
1139
+ });
1140
+ setGqlMetaMapOnPrototype(prototype, metadataMap);
1141
+ };
1142
+ };
1143
+ var Query = {
1144
+ Public: getQuery("Public"),
1145
+ Every: getQuery("Every"),
1146
+ Admin: getQuery("Admin"),
1147
+ User: getQuery("User"),
1148
+ SuperAdmin: getQuery("SuperAdmin"),
1149
+ None: getQuery("None"),
1150
+ Owner: getQuery("Owner")
1151
+ };
1152
+ var Mutation = {
1153
+ Public: getMutation("Public"),
1154
+ Every: getMutation("Every"),
1155
+ Admin: getMutation("Admin"),
1156
+ User: getMutation("User"),
1157
+ SuperAdmin: getMutation("SuperAdmin"),
1158
+ None: getMutation("None"),
1159
+ Owner: getMutation("Owner")
1160
+ };
1161
+ var Message = {
1162
+ Public: getMessage("Public"),
1163
+ Every: getMessage("Every"),
1164
+ Admin: getMessage("Admin"),
1165
+ User: getMessage("User"),
1166
+ SuperAdmin: getMessage("SuperAdmin"),
1167
+ None: getMessage("None"),
1168
+ Owner: getMessage("Owner")
1169
+ };
1170
+ var Pubsub = {
1171
+ Public: getPubsub("Public"),
1172
+ Every: getPubsub("Every"),
1173
+ Admin: getPubsub("Admin"),
1174
+ User: getPubsub("User"),
1175
+ SuperAdmin: getPubsub("SuperAdmin"),
1176
+ None: getPubsub("None"),
1177
+ Owner: getPubsub("Owner")
1178
+ };
1179
+ var Process = {
1180
+ Federation: getProcess("Federation"),
1181
+ Batch: getProcess("Batch"),
1182
+ All: getProcess("All")
1183
+ };
1184
+ var getArg = (type) => function(name, returns, argsOption = {}) {
1185
+ return function(prototype, key, idx) {
1186
+ const argMetas = getArgMetasOnPrototype(prototype, key);
1187
+ argMetas[idx] = { name, returns, argsOption, key, idx, type };
1188
+ setArgMetasOnPrototype(prototype, key, argMetas);
1189
+ };
1190
+ };
1191
+ var Arg = {
1192
+ Body: getArg("Body"),
1193
+ Param: getArg("Param"),
1194
+ Query: getArg("Query"),
1195
+ Upload: getArg("Upload"),
1196
+ Msg: getArg("Msg"),
1197
+ Room: getArg("Room")
1198
+ };
1199
+ function LogSignal(srv) {
1200
+ class BaseSignal {
1201
+ }
1202
+ return BaseSignal;
1203
+ }
1204
+ var getSigMeta = (sigRef) => {
1205
+ const sigMeta = Reflect.getMetadata("signal", sigRef.prototype);
1206
+ if (!sigMeta)
1207
+ throw new Error(`No SignalMeta found for ${sigRef.name}`);
1208
+ return sigMeta;
1209
+ };
1210
+ var setSigMeta = (sigRef, sigMeta) => {
1211
+ Reflect.defineMetadata("signal", sigMeta, sigRef.prototype);
1212
+ };
1213
+ var getGqlMeta = (sigRef, key) => {
1214
+ const gqlMetaMap = Reflect.getMetadata("gql", sigRef.prototype);
1215
+ if (!gqlMetaMap)
1216
+ throw new Error(`No GqlMeta found for ${sigRef.name}`);
1217
+ const gqlMeta = gqlMetaMap.get(key);
1218
+ if (!gqlMeta)
1219
+ throw new Error(`No GqlMeta found for ${key}`);
1220
+ return gqlMeta;
1221
+ };
1222
+ var getGqlMetaMapOnPrototype = (prototype) => {
1223
+ const gqlMetaMap = Reflect.getMetadata("gql", prototype);
1224
+ return gqlMetaMap ?? /* @__PURE__ */ new Map();
1225
+ };
1226
+ var getGqlMetas = (sigRef) => {
1227
+ const gqlMetaMap = Reflect.getMetadata("gql", sigRef.prototype);
1228
+ return gqlMetaMap ? [...gqlMetaMap.values()] : [];
1229
+ };
1230
+ var setGqlMetaMapOnPrototype = (prototype, gqlMetaMap) => {
1231
+ Reflect.defineMetadata("gql", gqlMetaMap, prototype);
1232
+ };
1233
+ var getArgMetas = (sigRef, key) => {
1234
+ const metas = Reflect.getMetadata("args", sigRef.prototype, key) ?? [];
1235
+ const argMetas = metas.filter((meta) => !!meta.returns);
1236
+ const internalArgMetas = metas.filter((meta) => !meta.returns);
1237
+ return [argMetas, internalArgMetas];
1238
+ };
1239
+ var getArgMetasOnPrototype = (prototype, key) => {
1240
+ return Reflect.getMetadata("args", prototype, key) ?? [];
1241
+ };
1242
+ var setArgMetasOnPrototype = (prototype, key, argMetas) => {
1243
+ Reflect.defineMetadata("args", argMetas, prototype, key);
1244
+ };
1245
+ var getResolveFieldMetaMapOnPrototype = (prototype) => {
1246
+ const resolveFieldMetaMap = Reflect.getMetadata("resolveField", prototype);
1247
+ return resolveFieldMetaMap ?? /* @__PURE__ */ new Map();
1248
+ };
1249
+ var getResolveFieldMetas = (sigRef) => {
1250
+ const resolveFieldMetaMap = Reflect.getMetadata("resolveField", sigRef.prototype);
1251
+ return resolveFieldMetaMap ? [...resolveFieldMetaMap.values()] : [];
1252
+ };
1253
+ var setResolveFieldMetaMapOnPrototype = (prototype, resolveFieldMetaMap) => {
1254
+ Reflect.defineMetadata("resolveField", resolveFieldMetaMap, prototype);
1255
+ };
1256
+ var getControllerPrefix = (sigMeta) => {
1257
+ return sigMeta.returns ? lowerlize(getClassMeta(sigMeta.returns()).refName) : sigMeta.prefix;
1258
+ };
1259
+ var getControllerPath = (gqlMeta, paramArgMetas) => {
1260
+ return gqlMeta.signalOption.path ?? [gqlMeta.signalOption.name ?? gqlMeta.key, ...paramArgMetas.map((argMeta) => `:${argMeta.name}`)].join("/");
1261
+ };
1262
+ var copySignal = (sigRef) => {
1263
+ class CopiedSignal {
1264
+ }
1265
+ applyMixins(CopiedSignal, [sigRef]);
1266
+ const sigMeta = getSigMeta(sigRef);
1267
+ setSigMeta(CopiedSignal, sigMeta);
1268
+ const gqlMetaMap = getGqlMetaMapOnPrototype(sigRef.prototype);
1269
+ setGqlMetaMapOnPrototype(CopiedSignal.prototype, new Map(gqlMetaMap));
1270
+ const resolveFieldMetaMap = getResolveFieldMetaMapOnPrototype(sigRef.prototype);
1271
+ setResolveFieldMetaMapOnPrototype(CopiedSignal.prototype, new Map(resolveFieldMetaMap));
1272
+ for (const endpointMeta of [...gqlMetaMap.values(), ...resolveFieldMetaMap.values()]) {
1273
+ const argMetas = getArgMetasOnPrototype(sigRef.prototype, endpointMeta.key);
1274
+ setArgMetasOnPrototype(CopiedSignal.prototype, endpointMeta.key, [...argMetas]);
1275
+ const paramtypes = Reflect.getMetadata("design:paramtypes", sigRef.prototype, endpointMeta.key);
1276
+ const argParamtypes = argMetas.filter((argMeta) => !!argMeta.returns).map((argMeta) => Object);
1277
+ Reflect.defineMetadata("design:paramtypes", paramtypes ?? argParamtypes, CopiedSignal.prototype, endpointMeta.key);
1278
+ Reflect.defineMetadata("design:paramtypes", paramtypes ?? argParamtypes, CopiedSignal.prototype, endpointMeta.key);
1279
+ }
1280
+ return CopiedSignal;
1281
+ };
1282
+
1283
+ // pkgs/@akanjs/signal/src/gql.ts
1284
+ var DefaultStorage = class {
1285
+ };
1286
+ var getPredefinedDefault = (refName) => {
1287
+ const defaultData = Reflect.getMetadata(refName, DefaultStorage.prototype);
1288
+ return defaultData;
1289
+ };
1290
+ var setPredefinedDefault = (refName, defaultData) => {
1291
+ Reflect.defineMetadata(refName, defaultData, DefaultStorage.prototype);
1292
+ };
1293
+ var makeDefault = (target, option = {}) => {
1294
+ const classMeta = getClassMeta(target);
1295
+ const predefinedDefault = getPredefinedDefault(classMeta.refName);
1296
+ if (predefinedDefault && !option.overwrite)
1297
+ return predefinedDefault;
1298
+ if (option.isChild && classMeta.type !== "scalar")
1299
+ return null;
1300
+ const metadatas = getFieldMetas(target);
1301
+ const result = {};
1302
+ for (const metadata of metadatas) {
1303
+ if (metadata.fieldType === "hidden")
1304
+ result[metadata.key] = null;
1305
+ else if (metadata.default) {
1306
+ if (typeof metadata.default === "function")
1307
+ result[metadata.key] = metadata.default();
1308
+ else if (metadata.default instanceof Enum)
1309
+ result[metadata.key] = [...metadata.default.values];
1310
+ else
1311
+ result[metadata.key] = metadata.default;
1312
+ } else if (metadata.isArray)
1313
+ result[metadata.key] = [];
1314
+ else if (metadata.nullable)
1315
+ result[metadata.key] = null;
1316
+ else if (metadata.isClass)
1317
+ result[metadata.key] = metadata.isScalar ? makeDefault(metadata.modelRef) : null;
1318
+ else
1319
+ result[metadata.key] = scalarDefaultMap.get(metadata.modelRef);
1320
+ }
1321
+ setPredefinedDefault(classMeta.refName, result);
1322
+ return result;
1323
+ };
1324
+ var scalarDeserializeMap = /* @__PURE__ */ new Map([
1325
+ [Date, (value) => dayjs(value)],
1326
+ [String, (value) => value],
1327
+ [ID, (value) => value],
1328
+ [Boolean, (value) => value],
1329
+ [Int, (value) => value],
1330
+ [Float, (value) => value],
1331
+ [JSON2, (value) => value]
1332
+ ]);
1333
+ var getDeserializeFn = (inputRef) => {
1334
+ const deserializeFn = scalarDeserializeMap.get(inputRef);
1335
+ if (!deserializeFn)
1336
+ return (value) => value;
1337
+ return deserializeFn;
1338
+ };
1339
+ var deserializeInput = (value, inputRef, arrDepth) => {
1340
+ if (arrDepth && Array.isArray(value))
1341
+ return value.map((v) => deserializeInput(v, inputRef, arrDepth - 1));
1342
+ else if (inputRef.prototype === Map.prototype) {
1343
+ const [valueRef] = getNonArrayModel(inputRef);
1344
+ const deserializeFn = getDeserializeFn(valueRef);
1345
+ return Object.fromEntries(
1346
+ [...value.entries()].map(([key, val]) => [key, applyFnToArrayObjects(val, deserializeFn)])
1347
+ );
1348
+ } else if (isGqlScalar(inputRef)) {
1349
+ const deserializeFn = getDeserializeFn(inputRef);
1350
+ return deserializeFn(value);
1351
+ }
1352
+ const classMeta = getClassMeta(inputRef);
1353
+ if (classMeta.type !== "scalar")
1354
+ return value;
1355
+ else
1356
+ return Object.fromEntries(
1357
+ getFieldMetas(inputRef).map((fieldMeta) => [
1358
+ fieldMeta.key,
1359
+ deserializeInput(value[fieldMeta.key], fieldMeta.modelRef, fieldMeta.arrDepth)
1360
+ ])
1361
+ );
1362
+ };
1363
+ var deserializeArg = (argMeta, value) => {
1364
+ const [returnRef, arrDepth] = getNonArrayModel(argMeta.returns());
1365
+ if (argMeta.argsOption.nullable && (value === null || value === void 0))
1366
+ return null;
1367
+ else if (!argMeta.argsOption.nullable && (value === null || value === void 0))
1368
+ throw new Error(`Invalid Value (Nullable) in ${argMeta.name} for value ${value}`);
1369
+ return deserializeInput(value, returnRef, arrDepth);
1370
+ };
1371
+
1372
+ // pkgs/@akanjs/signal/src/baseFetch.ts
1373
+ var nativeFetch = fetch;
1374
+ var baseFetch = Object.assign(nativeFetch, {
1375
+ client,
1376
+ clone: function(option = {}) {
1377
+ return {
1378
+ ...this,
1379
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
1380
+ client: this.client.clone(option)
1381
+ };
1382
+ }
1383
+ });
1384
+
1385
+ // pkgs/@akanjs/nest/src/authorization.ts
1386
+ var import_apollo = __require("@nestjs/apollo");
1387
+ var jwt = __toESM(__require("jsonwebtoken"));
1388
+ var verifyToken = (secret, authorization) => {
1389
+ const [type, token] = authorization?.split(" ") ?? [void 0, void 0];
1390
+ if (!token || type !== "Bearer")
1391
+ return defaultAccount;
1392
+ try {
1393
+ const account = jwt.verify(token, secret);
1394
+ if (account.appName !== baseEnv.appName || account.environment !== baseEnv.environment)
1395
+ return defaultAccount;
1396
+ return {
1397
+ __InternalArg__: "Account",
1398
+ self: account.self && !account.self.removedAt ? account.self : void 0,
1399
+ me: account.me && !account.me.removedAt ? account.me : void 0,
1400
+ appName: account.appName,
1401
+ environment: account.environment
1402
+ };
1403
+ } catch (e) {
1404
+ return defaultAccount;
1405
+ }
1406
+ };
1407
+ var allow = (account, roles, userId) => {
1408
+ if (!account)
1409
+ throw new import_apollo.AuthenticationError("No Authentication Account");
1410
+ for (const role of roles) {
1411
+ if (role === "user" && account.self?.roles.includes("user"))
1412
+ return true;
1413
+ else if (role === "admin" && account.me?.roles.includes("admin"))
1414
+ return true;
1415
+ else if (role === "superAdmin" && account.me?.roles.includes("superAdmin"))
1416
+ return true;
1417
+ }
1418
+ throw new import_apollo.AuthenticationError(
1419
+ `No Authentication With Roles: ${roles.join(", ")}, Your roles are ${[
1420
+ ...account.self?.roles ?? [],
1421
+ ...account.me?.roles ?? []
1422
+ ].join(", ")}${!account.self?.roles.length && !account.me?.roles.length ? " (No Roles)" : ""}`
1423
+ );
1424
+ };
1425
+
1426
+ // pkgs/@akanjs/nest/src/authGuards.ts
1427
+ var authGuards_exports = {};
1428
+ __export(authGuards_exports, {
1429
+ Admin: () => Admin,
1430
+ Every: () => Every,
1431
+ None: () => None,
1432
+ Owner: () => Owner,
1433
+ Public: () => Public,
1434
+ SuperAdmin: () => SuperAdmin,
1435
+ User: () => User,
1436
+ getArgs: () => getArgs,
1437
+ getRequest: () => getRequest,
1438
+ getResponse: () => getResponse,
1439
+ getSocket: () => getSocket
1440
+ });
1441
+ var import_common6 = __require("@nestjs/common");
1442
+ var import_graphql3 = __require("@nestjs/graphql");
1443
+ var getRequest = (context) => {
1444
+ const type = context.getType();
1445
+ if (type === "ws")
1446
+ throw new Error("Getting Request in Websocket is not allowed");
1447
+ return type === "http" ? context.switchToHttp().getRequest() : import_graphql3.GqlExecutionContext.create(context).getContext().req;
1448
+ };
1449
+ var getResponse = (context) => {
1450
+ const type = context.getType();
1451
+ if (type === "ws")
1452
+ throw new Error("Getting Response in Websocket is not allowed");
1453
+ return type === "http" ? context.switchToHttp().getResponse() : import_graphql3.GqlExecutionContext.create(context).getContext().req.res;
1454
+ };
1455
+ var getArgs = (context) => {
1456
+ const type = context.getType();
1457
+ if (type === "ws")
1458
+ throw new Error("Getting Args in Websocket is not allowed");
1459
+ if (type === "graphql")
1460
+ return import_graphql3.GqlExecutionContext.create(context).getArgs();
1461
+ else if (type === "http") {
1462
+ const { params, query, body } = context.switchToHttp().getRequest();
1463
+ return { ...params, ...query, ...body };
1464
+ } else
1465
+ throw new Error("Getting Args in Unknown context is not allowed");
1466
+ };
1467
+ var getSocket = (context) => {
1468
+ const type = context.getType();
1469
+ if (type !== "ws")
1470
+ throw new Error("Getting Socket in Http or GraphQL is not allowed");
1471
+ const socket = context.getArgByIndex(0);
1472
+ return socket;
1473
+ };
1474
+ var Public = class {
1475
+ canActivate(context) {
1476
+ return true;
1477
+ }
1478
+ };
1479
+ Public = __decorateClass([
1480
+ (0, import_common6.Injectable)()
1481
+ ], Public);
1482
+ var None = class {
1483
+ canActivate() {
1484
+ return false;
1485
+ }
1486
+ };
1487
+ None = __decorateClass([
1488
+ (0, import_common6.Injectable)()
1489
+ ], None);
1490
+ var Every = class {
1491
+ canActivate(context) {
1492
+ const { account } = getRequest(context);
1493
+ return allow(account, ["user", "admin", "superAdmin"]);
1494
+ }
1495
+ };
1496
+ Every = __decorateClass([
1497
+ (0, import_common6.Injectable)()
1498
+ ], Every);
1499
+ var Owner = class {
1500
+ canActivate(context) {
1501
+ const { account } = getRequest(context);
1502
+ return allow(account, ["user", "admin", "superAdmin"]);
1503
+ }
1504
+ };
1505
+ Owner = __decorateClass([
1506
+ (0, import_common6.Injectable)()
1507
+ ], Owner);
1508
+ var Admin = class {
1509
+ canActivate(context) {
1510
+ const { account } = getRequest(context);
1511
+ return allow(account, ["admin", "superAdmin"]);
1512
+ }
1513
+ };
1514
+ Admin = __decorateClass([
1515
+ (0, import_common6.Injectable)()
1516
+ ], Admin);
1517
+ var SuperAdmin = class {
1518
+ canActivate(context) {
1519
+ const { account } = getRequest(context);
1520
+ return allow(account, ["superAdmin"]);
1521
+ }
1522
+ };
1523
+ SuperAdmin = __decorateClass([
1524
+ (0, import_common6.Injectable)()
1525
+ ], SuperAdmin);
1526
+ var User = class {
1527
+ canActivate(context) {
1528
+ const { account } = getRequest(context);
1529
+ return allow(account, ["user"]);
1530
+ }
1531
+ };
1532
+ User = __decorateClass([
1533
+ (0, import_common6.Injectable)()
1534
+ ], User);
1535
+
1536
+ // pkgs/@akanjs/nest/src/authentication.ts
1537
+ var import_common7 = __require("@nestjs/common");
1538
+ var import_ua_parser_js = __toESM(__require("ua-parser-js"));
1539
+ var Account3 = (0, import_common7.createParamDecorator)((option, context) => {
1540
+ const { account } = getRequest(context);
1541
+ return account;
1542
+ });
1543
+ var Self2 = (0, import_common7.createParamDecorator)((option, context) => {
1544
+ const { account } = getRequest(context);
1545
+ const self = account.self;
1546
+ if (!self && !option.nullable)
1547
+ throw new import_common7.UnauthorizedException("No or Invalid Account in Self (User)");
1548
+ return self;
1549
+ });
1550
+ var Me2 = (0, import_common7.createParamDecorator)((option, context) => {
1551
+ const { account } = getRequest(context);
1552
+ const me = account.me;
1553
+ if (!me && !option.nullable)
1554
+ throw new import_common7.UnauthorizedException("No or Invalid Account in Me (Admin)");
1555
+ return me;
1556
+ });
1557
+ var UserIp2 = (0, import_common7.createParamDecorator)((option, context) => {
1558
+ const req = getRequest(context);
1559
+ const ip = req.ip;
1560
+ if (!ip && !option.nullable)
1561
+ throw new import_common7.UnauthorizedException("Invalid IP");
1562
+ return { ip };
1563
+ });
1564
+ var Access2 = (0, import_common7.createParamDecorator)((option, context) => {
1565
+ const req = getRequest(context);
1566
+ const res = new import_ua_parser_js.default(req.userAgent).getResult();
1567
+ if (!req.userAgent && !option.nullable)
1568
+ throw new import_common7.UnauthorizedException("Invalid UserAgent");
1569
+ return {
1570
+ ...req.geolocation ? JSON.parse(req.geolocation) : {},
1571
+ osName: res.os.name,
1572
+ osVersion: res.os.version,
1573
+ browserName: res.browser.name,
1574
+ browserVersion: res.browser.version,
1575
+ mobileModel: res.device.model,
1576
+ mobileVendor: res.device.vendor,
1577
+ deviceType: res.device.type ?? "desktop",
1578
+ at: dayjs(),
1579
+ period: 0
1580
+ };
1581
+ });
1582
+ var Req2 = (0, import_common7.createParamDecorator)((option, context) => {
1583
+ return getRequest(context);
1584
+ });
1585
+ var Res2 = (0, import_common7.createParamDecorator)((option, context) => {
1586
+ return getResponse(context);
1587
+ });
1588
+ var Ws2 = (0, import_common7.createParamDecorator)((option, context) => {
1589
+ const socket = context.getArgByIndex(0);
1590
+ const { __subscribe__ } = context.getArgByIndex(1);
1591
+ return {
1592
+ socket,
1593
+ subscribe: __subscribe__,
1594
+ onDisconnect: (handler) => {
1595
+ socket.on("disconnect", handler);
1596
+ },
1597
+ onSubscribe: (handler) => {
1598
+ if (__subscribe__)
1599
+ handler();
1600
+ },
1601
+ onUnsubscribe: (handler) => {
1602
+ if (!__subscribe__)
1603
+ handler();
1604
+ }
1605
+ };
1606
+ });
1607
+
1608
+ // pkgs/@akanjs/nest/src/interceptors.ts
1609
+ var import_common9 = __require("@nestjs/common");
1610
+ var import_graphql4 = __require("@nestjs/graphql");
1611
+ var import_rxjs = __require("rxjs");
1612
+ var import_operators = __require("rxjs/operators");
1613
+ var _logger, _CACHE_PREFIX, _generateCacheKey, generateCacheKey_fn, _getCache, getCache_fn, _setCache, setCache_fn;
1614
+ var CacheInterceptor = class {
1615
+ constructor(redis) {
1616
+ this.redis = redis;
1617
+ __privateAdd(this, _generateCacheKey);
1618
+ __privateAdd(this, _getCache);
1619
+ __privateAdd(this, _setCache);
1620
+ __privateAdd(this, _logger, new Logger("CacheInterceptor"));
1621
+ __privateAdd(this, _CACHE_PREFIX, "signal:");
1622
+ }
1623
+ async intercept(context, next) {
1624
+ const handler = context.getHandler();
1625
+ const signalKey = handler.name;
1626
+ const gqlMeta = getGqlMeta(context.getClass(), signalKey);
1627
+ if (gqlMeta.type !== "Query" || !gqlMeta.signalOption.cache) {
1628
+ if (gqlMeta.signalOption.cache)
1629
+ __privateGet(this, _logger).warn(`CacheInterceptor: ${signalKey} is not Query endpoint or cache is not set`);
1630
+ return next.handle();
1631
+ }
1632
+ const args = getArgs(context);
1633
+ const cacheKey = __privateMethod(this, _generateCacheKey, generateCacheKey_fn).call(this, signalKey, args);
1634
+ const cachedData = await __privateMethod(this, _getCache, getCache_fn).call(this, cacheKey);
1635
+ if (cachedData) {
1636
+ __privateGet(this, _logger).debug(`Cache hit for key: ${cacheKey}`);
1637
+ return next.handle().pipe(
1638
+ (0, import_operators.map)(() => cachedData),
1639
+ (0, import_operators.catchError)((error) => {
1640
+ const errorMessage = error instanceof Error ? error.message : "Unknown error";
1641
+ __privateGet(this, _logger).error(`Error in cache interceptor for ${cacheKey}: ${errorMessage}`);
1642
+ return (0, import_rxjs.throwError)(() => error);
1643
+ })
1644
+ );
1645
+ }
1646
+ return next.handle().pipe(
1647
+ (0, import_operators.map)((data) => {
1648
+ const cacheDuration = gqlMeta.signalOption.cache;
1649
+ if (typeof cacheDuration === "number") {
1650
+ void __privateMethod(this, _setCache, setCache_fn).call(this, cacheKey, data, cacheDuration);
1651
+ __privateGet(this, _logger).debug(`Cache set for key: ${cacheKey}`);
1652
+ }
1653
+ return data;
1654
+ }),
1655
+ (0, import_operators.catchError)((error) => {
1656
+ const errorMessage = error instanceof Error ? error.message : "Unknown error";
1657
+ __privateGet(this, _logger).error(`Error in cache interceptor for ${cacheKey}: ${errorMessage}`);
1658
+ return (0, import_rxjs.throwError)(() => error);
1659
+ })
1660
+ );
1661
+ }
1662
+ };
1663
+ _logger = new WeakMap();
1664
+ _CACHE_PREFIX = new WeakMap();
1665
+ _generateCacheKey = new WeakSet();
1666
+ generateCacheKey_fn = function(signalKey, args) {
1667
+ return `${__privateGet(this, _CACHE_PREFIX)}${signalKey}:${JSON.stringify(args)}`;
1668
+ };
1669
+ _getCache = new WeakSet();
1670
+ getCache_fn = async function(key) {
1671
+ try {
1672
+ const cached = await this.redis.get(key);
1673
+ if (!cached)
1674
+ return null;
1675
+ const { data } = JSON.parse(cached);
1676
+ return data;
1677
+ } catch (error) {
1678
+ const errorMessage = error instanceof Error ? error.message : "Unknown error";
1679
+ __privateGet(this, _logger).error(`Error retrieving cache for key ${key}: ${errorMessage}`);
1680
+ return null;
1681
+ }
1682
+ };
1683
+ _setCache = new WeakSet();
1684
+ setCache_fn = async function(key, data, ttlMs) {
1685
+ try {
1686
+ const cacheData = { data, timestamp: Date.now() };
1687
+ await this.redis.set(key, JSON.stringify(cacheData), { PX: ttlMs });
1688
+ } catch (error) {
1689
+ const errorMessage = error instanceof Error ? error.message : "Unknown error";
1690
+ __privateGet(this, _logger).error(`Error setting cache for key ${key}: ${errorMessage}`);
1691
+ }
1692
+ };
1693
+ CacheInterceptor = __decorateClass([
1694
+ (0, import_common9.Injectable)(),
1695
+ __decorateParam(0, (0, import_common9.Inject)("REDIS_CLIENT"))
1696
+ ], CacheInterceptor);
1697
+ var TimeoutInterceptor = class {
1698
+ intercept(context, next) {
1699
+ const gqlMeta = getGqlMeta(context.getClass(), context.getHandler().name);
1700
+ const timeoutMs = gqlMeta.signalOption.timeout ?? 3e4;
1701
+ if (timeoutMs === 0)
1702
+ return next.handle();
1703
+ return next.handle().pipe(
1704
+ (0, import_operators.timeout)(timeoutMs),
1705
+ (0, import_operators.catchError)((err) => {
1706
+ if (err instanceof import_rxjs.TimeoutError)
1707
+ return (0, import_rxjs.throwError)(() => new import_common9.RequestTimeoutException());
1708
+ return (0, import_rxjs.throwError)(() => err);
1709
+ })
1710
+ );
1711
+ }
1712
+ };
1713
+ TimeoutInterceptor = __decorateClass([
1714
+ (0, import_common9.Injectable)()
1715
+ ], TimeoutInterceptor);
1716
+ var LoggingInterceptor = class {
1717
+ logger = new Logger("IO");
1718
+ intercept(context, next) {
1719
+ const gqlReq = context.getArgByIndex(3);
1720
+ const req = getRequest(context);
1721
+ const reqType = gqlReq?.parentType?.name ?? req.method;
1722
+ const reqName = gqlReq?.fieldName ?? req.url;
1723
+ const before = Date.now();
1724
+ const ip = import_graphql4.GqlExecutionContext.create(context).getContext().req.ip;
1725
+ this.logger.debug(`Before ${reqType}-${reqName} / ${ip} / ${before}`);
1726
+ return next.handle().pipe(
1727
+ (0, import_operators.tap)(() => {
1728
+ const after = Date.now();
1729
+ this.logger.debug(`After ${reqType}-${reqName} / ${ip} / ${after} (${after - before}ms)`);
1730
+ })
1731
+ );
1732
+ }
1733
+ };
1734
+ LoggingInterceptor = __decorateClass([
1735
+ (0, import_common9.Injectable)()
1736
+ ], LoggingInterceptor);
1737
+
1738
+ // pkgs/@akanjs/nest/src/redis-io.adapter.ts
1739
+ var import_platform_socket = __require("@nestjs/platform-socket.io");
1740
+ var import_redis_adapter = __require("@socket.io/redis-adapter");
1741
+ var import_redis = __require("redis");
1742
+ var RedisIoAdapter = class extends import_platform_socket.IoAdapter {
1743
+ adapterConstructor;
1744
+ logger = new Logger("RedisIoAdapter");
1745
+ server;
1746
+ pubClient;
1747
+ subClient;
1748
+ option;
1749
+ constructor(appOrHttpServer, option) {
1750
+ super(appOrHttpServer);
1751
+ this.option = option;
1752
+ }
1753
+ async connectToRedis(url) {
1754
+ this.pubClient = (0, import_redis.createClient)({ url });
1755
+ this.subClient = this.pubClient.duplicate();
1756
+ this.pubClient.on("disconnect", (err) => {
1757
+ this.logger.error(`Redis pub database is disconnected. Error: ${err}`);
1758
+ void this.pubClient.connect();
1759
+ });
1760
+ this.subClient.on("disconnect", (err) => {
1761
+ this.logger.error(`Redis sub database is disconnected. Error: ${err}`);
1762
+ void this.subClient.connect();
1763
+ });
1764
+ this.pubClient.on("error", (err) => {
1765
+ this.logger.error(`Redis pub database is errored. Error: ${err}`);
1766
+ const reconnect = async () => {
1767
+ await this.pubClient.quit();
1768
+ await sleep(1e3);
1769
+ await this.pubClient.connect();
1770
+ };
1771
+ void reconnect();
1772
+ });
1773
+ this.subClient.on("error", (err) => {
1774
+ this.logger.error(`Redis sub database is errored. Error: ${err}`);
1775
+ const reconnect = async () => {
1776
+ await this.subClient.quit();
1777
+ await sleep(1e3);
1778
+ await this.subClient.connect();
1779
+ };
1780
+ void reconnect();
1781
+ });
1782
+ await Promise.all([this.pubClient.connect(), this.subClient.connect()]);
1783
+ this.adapterConstructor = (0, import_redis_adapter.createAdapter)(this.pubClient, this.subClient);
1784
+ }
1785
+ createIOServer(port, options) {
1786
+ this.server = super.createIOServer(port, options);
1787
+ this.server.adapter(this.adapterConstructor);
1788
+ return this.server;
1789
+ }
1790
+ async destroy() {
1791
+ await Promise.all([this.pubClient.quit(), this.subClient.quit()]);
1792
+ await this.close(this.server);
1793
+ this.logger.log("RedisIoAdapter is closed");
1794
+ }
1795
+ };
1796
+
1797
+ // pkgs/@akanjs/nest/src/pipes.ts
1798
+ var import_common11 = __require("@nestjs/common");
1799
+ var import_stream = __require("stream");
1800
+ var ArrayifyPipe = class {
1801
+ transform(value, metadata) {
1802
+ return Array.isArray(value) ? value : value.split(",");
1803
+ }
1804
+ };
1805
+ ArrayifyPipe = __decorateClass([
1806
+ (0, import_common11.Injectable)()
1807
+ ], ArrayifyPipe);
1808
+ var IntPipe = class {
1809
+ transform(value, metadata) {
1810
+ return Array.isArray(value) ? value.map(parseInt) : [parseInt(value)];
1811
+ }
1812
+ };
1813
+ IntPipe = __decorateClass([
1814
+ (0, import_common11.Injectable)()
1815
+ ], IntPipe);
1816
+ var FloatPipe = class {
1817
+ transform(value, metadata) {
1818
+ return Array.isArray(value) ? value.map(parseFloat) : [parseFloat(value)];
1819
+ }
1820
+ };
1821
+ FloatPipe = __decorateClass([
1822
+ (0, import_common11.Injectable)()
1823
+ ], FloatPipe);
1824
+ var BooleanPipe = class {
1825
+ transform(value, metadata) {
1826
+ return Array.isArray(value) ? value.map((v) => Boolean(v)) : [Boolean(value)];
1827
+ }
1828
+ };
1829
+ BooleanPipe = __decorateClass([
1830
+ (0, import_common11.Injectable)()
1831
+ ], BooleanPipe);
1832
+ var DayjsPipe = class {
1833
+ transform(value, metadata) {
1834
+ return Array.isArray(value) ? value.map(dayjs) : [dayjs(value)];
1835
+ }
1836
+ };
1837
+ DayjsPipe = __decorateClass([
1838
+ (0, import_common11.Injectable)()
1839
+ ], DayjsPipe);
1840
+ var JSONPipe = class {
1841
+ transform(value, metadata) {
1842
+ const transformable = typeof value === "string" && value.length;
1843
+ const obj = transformable ? JSON.parse(atob(value)) : value;
1844
+ return obj;
1845
+ }
1846
+ };
1847
+ JSONPipe = __decorateClass([
1848
+ (0, import_common11.Injectable)()
1849
+ ], JSONPipe);
1850
+ var convertToFileStream = (value) => ({
1851
+ filename: value.originalname,
1852
+ mimetype: value.mimetype,
1853
+ encoding: value.encoding,
1854
+ createReadStream: () => import_stream.Readable.from(value.buffer)
1855
+ });
1856
+ var MulterToUploadPipe = class {
1857
+ transform(value, metadata) {
1858
+ return Array.isArray(value) ? value.map(convertToFileStream) : convertToFileStream(value);
1859
+ }
1860
+ };
1861
+ MulterToUploadPipe = __decorateClass([
1862
+ (0, import_common11.Injectable)()
1863
+ ], MulterToUploadPipe);
1864
+ var gqlScalarPipeMap = /* @__PURE__ */ new Map([
1865
+ [Int, IntPipe],
1866
+ [Float, FloatPipe],
1867
+ [Boolean, BooleanPipe],
1868
+ [Date, DayjsPipe],
1869
+ [JSON2, JSONPipe]
1870
+ ]);
1871
+ var getQueryPipes = (modelRef, arrDepth) => {
1872
+ const pipes = arrDepth ? [ArrayifyPipe] : [];
1873
+ const scalarPipe = gqlScalarPipeMap.get(modelRef);
1874
+ if (scalarPipe)
1875
+ pipes.push(scalarPipe);
1876
+ return pipes;
1877
+ };
1878
+ var getBodyPipes = (argMeta) => {
1879
+ const [returnRef] = getNonArrayModel(argMeta.returns());
1880
+ if (returnRef.prototype !== Date.prototype && !isGqlScalar(returnRef))
1881
+ return [];
1882
+ let BodyPipe = class {
1883
+ transform(value, metadata) {
1884
+ return deserializeArg(argMeta, value);
1885
+ }
1886
+ };
1887
+ BodyPipe = __decorateClass([
1888
+ (0, import_common11.Injectable)()
1889
+ ], BodyPipe);
1890
+ return [BodyPipe];
1891
+ };
1892
+
1893
+ // pkgs/@akanjs/nest/src/exporter.ts
1894
+ var fs = __toESM(__require("fs"));
1895
+
1896
+ // pkgs/@akanjs/nest/src/verifyPayment.ts
1897
+ var import_iap = __toESM(__require("iap"));
1898
+
1899
+ // pkgs/@akanjs/nest/src/sso.ts
1900
+ var import_common12 = __require("@nestjs/common");
1901
+ var import_passport = __require("@nestjs/passport");
1902
+ var appleSignin = __toESM(__require("apple-signin"));
1903
+ var jwt2 = __toESM(__require("jsonwebtoken"));
1904
+ var import_passport_apple = __require("passport-apple");
1905
+ var import_passport_facebook = __require("passport-facebook");
1906
+ var import_passport_github = __require("passport-github");
1907
+ var import_passport_google_oauth20 = __require("passport-google-oauth20");
1908
+ var import_passport_kakao = __require("passport-kakao");
1909
+ var import_passport_naver = __require("passport-naver");
1910
+
1911
+ // pkgs/@akanjs/nest/src/exceptions.ts
1912
+ var import_common14 = __require("@nestjs/common");
1913
+ var AllExceptionsFilter = class {
1914
+ logger = new Logger("Exception Filter");
1915
+ catch(exception, host) {
1916
+ if (host.getType() !== "http") {
1917
+ const gqlArgs = host.getArgByIndex(1);
1918
+ const gqlReq = host.getArgByIndex(3);
1919
+ const reqType2 = gqlReq?.parentType?.name ?? "unknown";
1920
+ const reqName2 = gqlReq?.fieldName ?? "unknown";
1921
+ this.logger.error(
1922
+ `GraphQL Error
1923
+ Request: ${reqType2}-${reqName2}
1924
+ Args: ${JSON.stringify(gqlArgs, null, 2)}
1925
+ ${exception.stack}`
1926
+ );
1927
+ throw exception;
1928
+ }
1929
+ const ctx = host.switchToHttp();
1930
+ const res = ctx.getResponse();
1931
+ const req = ctx.getRequest();
1932
+ const reqType = req.method;
1933
+ const reqName = req.url;
1934
+ const status = exception instanceof import_common14.HttpException ? exception.getStatus() : null;
1935
+ if (status) {
1936
+ res.status(status).json({
1937
+ statusCode: status,
1938
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
1939
+ path: req.url,
1940
+ message: exception instanceof import_common14.HttpException ? exception.getResponse() : exception.message
1941
+ });
1942
+ this.logger.error(
1943
+ `Http Error: ${status}
1944
+ Request: ${reqType}-${reqName}
1945
+ Body: ${JSON.stringify(req.body, null, 2)}
1946
+ ${exception.stack}`
1947
+ );
1948
+ }
1949
+ }
1950
+ };
1951
+ AllExceptionsFilter = __decorateClass([
1952
+ (0, import_common14.Catch)()
1953
+ ], AllExceptionsFilter);
1954
+
1955
+ // pkgs/@akanjs/nest/src/generateSecrets.ts
1956
+ var import_crypto = __require("crypto");
1957
+ var import_tunnel_ssh = __require("tunnel-ssh");
1958
+ var generateHexStringFromSeed = (seed, length = 256) => {
1959
+ let hexString = "";
1960
+ let currentSeed = seed;
1961
+ while (hexString.length < length * 2) {
1962
+ const hash = (0, import_crypto.createHash)("sha256").update(currentSeed).digest("hex");
1963
+ hexString += hash;
1964
+ currentSeed = hash;
1965
+ }
1966
+ return hexString.substring(0, length * 2);
1967
+ };
1968
+ var generateJwtSecret = (appName2, environment2) => {
1969
+ const seed = `${appName2}-${environment2}-jwt-secret`;
1970
+ return generateHexStringFromSeed(seed);
1971
+ };
1972
+ var DEFAULT_CLOUD_PORT = 3e4;
1973
+ var getEnvironmentPort = (environment2) => environment2 === "main" ? 2e3 : environment2 === "develop" ? 1e3 : environment2 === "debug" ? 0 : 0;
1974
+ var getServicePort = (appCode, service) => (service === "redis" ? 300 : service === "mongo" ? 400 : 500) + appCode % 10 * 10 + (appCode >= 10 ? 5 : 0);
1975
+ var createDatabaseTunnel = async ({
1976
+ appName: appName2,
1977
+ environment: environment2,
1978
+ type,
1979
+ port,
1980
+ sshOptions = {
1981
+ host: `${appName2}-${environment2}.${baseEnv.serveDomain}`,
1982
+ port: 32767,
1983
+ username: baseEnv.tunnelUsername,
1984
+ password: baseEnv.tunnelPassword
1985
+ }
1986
+ }) => {
1987
+ const tunnelOptions = { autoClose: true, reconnectOnError: false };
1988
+ const serverOptions = { port };
1989
+ const forwardOptions = {
1990
+ srcAddr: "0.0.0.0",
1991
+ srcPort: port,
1992
+ dstAddr: `${type}-0.${type}-svc.${appName2}-${environment2}`,
1993
+ dstPort: type === "mongo" ? 27017 : type === "redis" ? 6379 : 7700
1994
+ };
1995
+ const [server, client2] = await (0, import_tunnel_ssh.createTunnel)(tunnelOptions, serverOptions, sshOptions, forwardOptions);
1996
+ return `localhost:${port}`;
1997
+ };
1998
+ var generateRedisUri = async ({ appName: appName2, appCode, environment: environment2, operationMode: operationMode2, sshOptions }) => {
1999
+ if (process.env.REDIS_URI)
2000
+ return process.env.REDIS_URI;
2001
+ const port = operationMode2 === "local" ? DEFAULT_CLOUD_PORT + getEnvironmentPort(environment2) + getServicePort(appCode, "redis") : 6379;
2002
+ 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";
2003
+ const uri = `redis://${url}`;
2004
+ return uri;
2005
+ };
2006
+ var generateMongoUri = async ({
2007
+ appName: appName2,
2008
+ appCode,
2009
+ environment: environment2,
2010
+ operationMode: operationMode2,
2011
+ username = `${appName2}-${environment2}-mongo-user`,
2012
+ password,
2013
+ sshOptions
2014
+ }) => {
2015
+ if (process.env.MONGO_URI)
2016
+ return process.env.MONGO_URI;
2017
+ const record = operationMode2 === "cloud" ? "mongodb+srv" : "mongodb";
2018
+ const port = operationMode2 === "local" ? DEFAULT_CLOUD_PORT + getEnvironmentPort(environment2) + getServicePort(appCode, "mongo") : 27017;
2019
+ 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";
2020
+ const usernameEncoded = password ? encodeURIComponent(username) : null;
2021
+ const passwordEncoded = password ? encodeURIComponent(password) : null;
2022
+ const dbName = `${appName2}-${environment2}`;
2023
+ const directConnection = operationMode2 === "cloud" ? false : true;
2024
+ const authInfo = usernameEncoded ? `${usernameEncoded}:${passwordEncoded}@` : "";
2025
+ const uri = `${record}://${authInfo}${url}/${dbName}?authSource=${dbName}&readPreference=primary&ssl=false&retryWrites=true&directConnection=${directConnection}`;
2026
+ return uri;
2027
+ };
2028
+ var generateMeiliUri = ({ appName: appName2, appCode, environment: environment2, operationMode: operationMode2 }) => {
2029
+ if (process.env.MEILI_URI)
2030
+ return process.env.MEILI_URI;
2031
+ const protocol = operationMode2 === "local" ? "https" : "http";
2032
+ const url = operationMode2 === "cloud" ? `meili-0.meili-svc.${appName2}-${environment2}.svc.cluster.local:7700` : operationMode2 === "local" ? `${appName2}-${environment2}.${baseEnv.serveDomain}/search` : "localhost:7700";
2033
+ const uri = `${protocol}://${url}`;
2034
+ return uri;
2035
+ };
2036
+ var generateMeiliKey = ({ appName: appName2, environment: environment2 }) => {
2037
+ return `meilisearch-key-${appName2}-${environment2}`;
2038
+ };
2039
+
2040
+ // pkgs/@akanjs/nest/src/mongoose.ts
2041
+ var import_mongoose = __toESM(__require("mongoose"));
2042
+ var initMongoDB = ({
2043
+ logging,
2044
+ threshold = 5e3,
2045
+ sendReport = false
2046
+ }) => {
2047
+ const mongoDBLogger = new Logger("MongoDB");
2048
+ if (logging)
2049
+ import_mongoose.default.set("debug", function(collection, method, ...methodArgs) {
2050
+ mongoDBLogger.verbose(
2051
+ `${collection}.${method}(${methodArgs.slice(0, -1).map((arg) => JSON.stringify(arg)).join(", ")})`
2052
+ );
2053
+ });
2054
+ const originalExec = import_mongoose.default.Query.prototype.exec;
2055
+ const getQueryInfo = (queryAgent) => {
2056
+ const model = queryAgent.model;
2057
+ const collectionName = model.collection.collectionName;
2058
+ const dbName = model.db.name;
2059
+ const query = queryAgent.getQuery();
2060
+ const queryOptions = queryAgent.getOptions();
2061
+ return { dbName, collectionName, query, queryOptions };
2062
+ };
2063
+ import_mongoose.default.Query.prototype.exec = function(...args) {
2064
+ const start = Date.now();
2065
+ return originalExec.apply(this, args).then((result) => {
2066
+ const duration = Date.now() - start;
2067
+ const { dbName, collectionName, query, queryOptions } = getQueryInfo(this);
2068
+ if (logging)
2069
+ mongoDBLogger.verbose(
2070
+ `Queried ${dbName}.${collectionName}.query(${JSON.stringify(query)}, ${JSON.stringify(
2071
+ queryOptions
2072
+ )}) - ${duration}ms`
2073
+ );
2074
+ return result;
2075
+ });
2076
+ };
2077
+ const originalAggregate = import_mongoose.default.Model.aggregate;
2078
+ const getAggregateInfo = (aggregateModel) => {
2079
+ const dbName = aggregateModel.db.db?.databaseName ?? "unknown";
2080
+ const collectionName = aggregateModel.collection.collectionName;
2081
+ return { dbName, collectionName };
2082
+ };
2083
+ import_mongoose.default.Model.aggregate = function(...args) {
2084
+ const startTime = Date.now();
2085
+ return originalAggregate.apply(this, args).then((result) => {
2086
+ const duration = Date.now() - startTime;
2087
+ const { dbName, collectionName } = getAggregateInfo(this);
2088
+ if (logging)
2089
+ mongoDBLogger.verbose(
2090
+ `Aggregated ${dbName}.${collectionName}.aggregate(${args.map((arg) => JSON.stringify(arg)).join(", ")}) - ${duration}ms`
2091
+ );
2092
+ return result;
2093
+ });
2094
+ };
2095
+ import_mongoose.default.set("transactionAsyncLocalStorage", true);
2096
+ };
2097
+
2098
+ // pkgs/@akanjs/nest/src/searchClient.ts
2099
+ var import_common16 = __require("@nestjs/common");
2100
+ var SearchClient = class {
2101
+ meili;
2102
+ async getIndexNames() {
2103
+ const { results } = await this.meili.getIndexes({ limit: 1e3 });
2104
+ return results.map((index) => index.uid);
2105
+ }
2106
+ async getSearchResult(indexName, option) {
2107
+ const { skip = 0, limit = DEFAULT_PAGE_SIZE, sort = "", searchString } = option;
2108
+ if (!searchString) {
2109
+ const { results, total } = await this.meili.index(indexName).getDocuments({ offset: skip, limit });
2110
+ return { docs: results, skip, limit, sort, total };
2111
+ }
2112
+ const { hits, estimatedTotalHits } = await this.meili.index(indexName).search(searchString, { offset: skip, limit });
2113
+ return { docs: hits, skip, limit, sort, total: estimatedTotalHits, query: searchString };
2114
+ }
2115
+ async upsertDocuments(indexName, documents) {
2116
+ const task = await this.meili.index(indexName).addDocuments(documents);
2117
+ return task;
2118
+ }
2119
+ async dropIndex(indexName) {
2120
+ const task = await this.meili.index(indexName).delete();
2121
+ return task;
2122
+ }
2123
+ };
2124
+ __decorateClass([
2125
+ (0, import_common16.Inject)("MEILI_CLIENT")
2126
+ ], SearchClient.prototype, "meili", 2);
2127
+ SearchClient = __decorateClass([
2128
+ (0, import_common16.Injectable)()
2129
+ ], SearchClient);
2130
+
2131
+ // pkgs/@akanjs/nest/src/cacheClient.ts
2132
+ var import_common17 = __require("@nestjs/common");
2133
+ var CacheClient = class {
2134
+ redis;
2135
+ };
2136
+ __decorateClass([
2137
+ (0, import_common17.Inject)("REDIS_CLIENT")
2138
+ ], CacheClient.prototype, "redis", 2);
2139
+ CacheClient = __decorateClass([
2140
+ (0, import_common17.Injectable)()
2141
+ ], CacheClient);
2142
+
2143
+ // pkgs/@akanjs/nest/src/databaseClient.ts
2144
+ var import_common19 = __require("@nestjs/common");
2145
+ var import_mongoose2 = __require("@nestjs/mongoose");
2146
+ var DatabaseClient = class {
2147
+ connection;
2148
+ getModel(modelName) {
2149
+ const model = this.connection.models[capitalize(modelName)];
2150
+ return model;
2151
+ }
2152
+ };
2153
+ __decorateClass([
2154
+ (0, import_mongoose2.InjectConnection)()
2155
+ ], DatabaseClient.prototype, "connection", 2);
2156
+ DatabaseClient = __decorateClass([
2157
+ (0, import_common19.Injectable)()
2158
+ ], DatabaseClient);
2159
+
2160
+ // pkgs/@akanjs/nest/src/decorators.ts
2161
+ var import_reflect_metadata6 = __require("reflect-metadata");
2162
+ var import_schedule = __require("@nestjs/schedule");
2163
+ var Transaction = () => {
2164
+ return function(target, key, descriptor) {
2165
+ const originMethod = descriptor.value;
2166
+ descriptor.value = function(...args) {
2167
+ if (!this.connection)
2168
+ throw new Error(`No Connection in function ${key}`);
2169
+ return new Promise((resolve, reject) => {
2170
+ this.connection.transaction(async () => {
2171
+ const res = await originMethod.apply(this, args);
2172
+ resolve(res);
2173
+ }).catch(reject);
2174
+ });
2175
+ };
2176
+ return descriptor;
2177
+ };
2178
+ };
2179
+
2180
+ // pkgs/@akanjs/service/src/serviceDecorators.ts
2181
+ var import_reflect_metadata7 = __require("reflect-metadata");
2182
+ var import_common21 = __require("@nestjs/common");
2183
+ var import_mongoose3 = __require("@nestjs/mongoose");
2184
+ var ServiceStorage = class {
2185
+ };
2186
+ var getServiceRefs = (refName) => {
2187
+ return Reflect.getMetadata(refName, ServiceStorage.prototype) ?? [];
2188
+ };
2189
+ var isServiceDefined = (srvRef) => {
2190
+ return Reflect.getMetadata("service", srvRef.prototype) ?? false;
2191
+ };
2192
+ var setServiceDefined = (srvRef) => {
2193
+ Reflect.defineMetadata("service", true, srvRef.prototype);
2194
+ };
2195
+ var getServiceMeta = (srvRef) => {
2196
+ return Reflect.getMetadata("serviceMeta", srvRef.prototype);
2197
+ };
2198
+ var isServiceEnabled = (srvRef) => {
2199
+ const meta = getServiceMeta(srvRef);
2200
+ return meta?.enabled ?? false;
2201
+ };
2202
+ var getServiceInjectMetaMapOnPrototype = (prototype) => {
2203
+ return Reflect.getMetadata("inject", prototype) ?? /* @__PURE__ */ new Map();
2204
+ };
2205
+ var serviceOf = (srvRef) => {
2206
+ if (isServiceDefined(srvRef))
2207
+ return srvRef;
2208
+ const injectMetaMap = getServiceInjectMetaMapOnPrototype(srvRef.prototype);
2209
+ for (const injectMeta of [...injectMetaMap.values()]) {
2210
+ if (injectMeta.type === "Db")
2211
+ (0, import_mongoose3.InjectModel)(injectMeta.name)(srvRef.prototype, injectMeta.key);
2212
+ else if (injectMeta.type === "Use")
2213
+ (0, import_common21.Inject)(injectMeta.name)(srvRef.prototype, injectMeta.key);
2214
+ else if (injectMeta.type === "Srv") {
2215
+ const services = getServiceRefs(injectMeta.name);
2216
+ if (!services.length)
2217
+ throw new Error(`Service ${injectMeta.name} not found`);
2218
+ (0, import_common21.Inject)(services.at(-1))(srvRef.prototype, injectMeta.key);
2219
+ } else if (injectMeta.type === "Queue")
2220
+ (0, import_common21.Inject)(injectMeta.name)(srvRef.prototype, injectMeta.key);
2221
+ else
2222
+ (0, import_common21.Inject)(injectMeta.name)(srvRef.prototype, injectMeta.key);
2223
+ }
2224
+ (0, import_mongoose3.InjectConnection)()(srvRef.prototype, "connection");
2225
+ (0, import_common21.Injectable)()(srvRef);
2226
+ setServiceDefined(srvRef);
2227
+ return srvRef;
2228
+ };
2229
+
2230
+ // pkgs/@akanjs/server/src/resolver.ts
2231
+ var import_common23 = __require("@nestjs/common");
2232
+ var Nest2 = __toESM(__require("@nestjs/graphql"));
2233
+ var import_graphql_type_json2 = __toESM(__require("graphql-type-json"));
2234
+ var import_graphql_upload = __require("graphql-upload");
2235
+ var scalarNestReturnMap = /* @__PURE__ */ new Map([
2236
+ [Upload, import_graphql_upload.GraphQLUpload],
2237
+ [ID, Nest2.ID],
2238
+ [Int, Nest2.Int],
2239
+ [Float, Nest2.Float],
2240
+ [JSON2, import_graphql_type_json2.default],
2241
+ [Boolean, Boolean],
2242
+ [Date, Date],
2243
+ [String, String],
2244
+ [Map, import_graphql_type_json2.default]
2245
+ ]);
2246
+ var getNestReturn = (returns, type = "object") => {
2247
+ const [model, arrDepth] = getNonArrayModel(returns());
2248
+ const modelRef = scalarNestReturnMap.get(model) ?? (type === "object" ? generateGql(model) : generateGqlInput(model));
2249
+ return () => arraiedModel(modelRef, arrDepth);
2250
+ };
2251
+ var internalArgMap = {
2252
+ Parent: Nest2.Parent,
2253
+ Account: Account3,
2254
+ UserIp: UserIp2,
2255
+ Access: Access2,
2256
+ Self: Self2,
2257
+ Me: Me2,
2258
+ Req: Req2,
2259
+ Res: Res2
2260
+ };
2261
+ var resolverOf = (sigRef, allSrvs) => {
2262
+ const Rsv = copySignal(sigRef);
2263
+ const sigMeta = getSigMeta(Rsv);
2264
+ const gqlMetas = getGqlMetas(Rsv);
2265
+ Object.keys(allSrvs).forEach((srv) => {
2266
+ if (!isServiceEnabled(allSrvs[srv]))
2267
+ return;
2268
+ (0, import_common23.Inject)(allSrvs[srv])(Rsv.prototype, lowerlize(srv));
2269
+ });
2270
+ for (const gqlMeta of gqlMetas) {
2271
+ if (gqlMeta.guards.some((guard) => guard === "None") || gqlMeta.signalOption.onlyFor === "restapi" || !["Query", "Mutation"].includes(gqlMeta.type))
2272
+ continue;
2273
+ else if (gqlMeta.signalOption.sso)
2274
+ continue;
2275
+ const [argMetas, internalArgMetas] = getArgMetas(Rsv, gqlMeta.key);
2276
+ const descriptor = Object.getOwnPropertyDescriptor(Rsv.prototype, gqlMeta.key) ?? {};
2277
+ for (const argMeta of argMetas) {
2278
+ Nest2.Args({
2279
+ name: argMeta.name,
2280
+ type: getNestReturn(argMeta.returns, "input"),
2281
+ ...argMeta.argsOption
2282
+ })(Rsv.prototype, gqlMeta.key, argMeta.idx);
2283
+ }
2284
+ for (const internalArgMeta of internalArgMetas) {
2285
+ const decorate = internalArgMap[internalArgMeta.type];
2286
+ decorate(internalArgMeta.option ?? {})(Rsv.prototype, gqlMeta.key, internalArgMeta.idx);
2287
+ }
2288
+ (0, import_common23.UseGuards)(...gqlMeta.guards.map((guard) => authGuards_exports[guard]))(Rsv.prototype, gqlMeta.key, descriptor);
2289
+ if (gqlMeta.type === "Query")
2290
+ Nest2.Query(getNestReturn(gqlMeta.returns), gqlMeta.signalOption)(Rsv.prototype, gqlMeta.key, descriptor);
2291
+ else if (gqlMeta.type === "Mutation")
2292
+ Nest2.Mutation(getNestReturn(gqlMeta.returns), gqlMeta.signalOption)(Rsv.prototype, gqlMeta.key, descriptor);
2293
+ }
2294
+ const resolveFieldMetas = getResolveFieldMetas(Rsv);
2295
+ if (sigMeta.returns) {
2296
+ const modelRef = sigMeta.returns();
2297
+ const fieldMetas = getFieldMetas(modelRef);
2298
+ fieldMetas.filter((fieldMeta) => fieldMeta.isClass && !fieldMeta.isScalar).forEach((fieldMeta) => {
2299
+ const classMeta = getClassMeta(fieldMeta.modelRef);
2300
+ const modelName = lowerlize(classMeta.type === "light" ? classMeta.refName.slice(5) : classMeta.refName);
2301
+ const className = capitalize(modelName);
2302
+ const serviceName = `${modelName}Service`;
2303
+ Rsv.prototype[fieldMeta.key] = async function(parent) {
2304
+ const service = this[serviceName];
2305
+ return fieldMeta.arrDepth ? await service[`load${className}Many`](parent[fieldMeta.key]) : await service[`load${className}`](parent[fieldMeta.key]);
2306
+ };
2307
+ Nest2.Parent()(Rsv.prototype, fieldMeta.key, 0);
2308
+ Nest2.ResolveField(getNestReturn(() => arraiedModel(fieldMeta.modelRef, fieldMeta.arrDepth)))(
2309
+ Rsv.prototype,
2310
+ fieldMeta.key,
2311
+ Object.getOwnPropertyDescriptor(Rsv.prototype, fieldMeta.key) ?? {}
2312
+ );
2313
+ });
2314
+ }
2315
+ for (const resolveFieldMeta of resolveFieldMetas) {
2316
+ const [, internalArgMetas] = getArgMetas(Rsv, resolveFieldMeta.key);
2317
+ for (const internalArgMeta of internalArgMetas) {
2318
+ const decorate = internalArgMap[internalArgMeta.type];
2319
+ decorate(internalArgMeta.option ?? {})(Rsv.prototype, resolveFieldMeta.key, internalArgMeta.idx);
2320
+ }
2321
+ Nest2.ResolveField(getNestReturn(resolveFieldMeta.returns))(
2322
+ Rsv.prototype,
2323
+ resolveFieldMeta.key,
2324
+ Object.getOwnPropertyDescriptor(Rsv.prototype, resolveFieldMeta.key) ?? {}
2325
+ );
2326
+ }
2327
+ if (sigMeta.returns)
2328
+ Nest2.Resolver(getNestReturn(sigMeta.returns))(Rsv);
2329
+ else
2330
+ Nest2.Resolver()(Rsv);
2331
+ return Rsv;
2332
+ };
2333
+
2334
+ // pkgs/@akanjs/server/src/controller.ts
2335
+ var import_common25 = __require("@nestjs/common");
2336
+ var import_passport2 = __require("@nestjs/passport");
2337
+ var import_platform_express = __require("@nestjs/platform-express");
2338
+ var internalArgMap2 = {
2339
+ // Parent: Nest.Parent,
2340
+ Account: Account3,
2341
+ UserIp: UserIp2,
2342
+ Access: Access2,
2343
+ Self: Self2,
2344
+ Me: Me2,
2345
+ Req: Req2,
2346
+ Res: Res2
2347
+ };
2348
+ var controllerOf = (sigRef, allSrvs) => {
2349
+ const sigMeta = getSigMeta(sigRef);
2350
+ const gqlMetas = getGqlMetas(sigRef);
2351
+ const prefix = getControllerPrefix(sigMeta);
2352
+ const Ctrl = copySignal(sigRef);
2353
+ Object.keys(allSrvs).forEach((srv) => {
2354
+ if (!isServiceEnabled(allSrvs[srv]))
2355
+ return;
2356
+ (0, import_common25.Inject)(allSrvs[srv])(Ctrl.prototype, lowerlize(srv));
2357
+ });
2358
+ for (const gqlMeta of gqlMetas) {
2359
+ if (gqlMeta.guards.some((guard) => guard === "None") || gqlMeta.signalOption.onlyFor === "graphql" || !["Query", "Mutation"].includes(gqlMeta.type))
2360
+ continue;
2361
+ const [argMetas, internalArgMetas] = getArgMetas(Ctrl, gqlMeta.key);
2362
+ internalArgMetas.forEach((internalArgMeta) => {
2363
+ const internalDecorator = internalArgMap2[internalArgMeta.type];
2364
+ internalDecorator(internalArgMeta.option ?? {})(Ctrl.prototype, gqlMeta.key, internalArgMeta.idx);
2365
+ });
2366
+ const uploadArgMeta = argMetas.find((argMeta) => argMeta.type === "Upload");
2367
+ if (uploadArgMeta && gqlMeta.signalOption.onlyFor === "restapi") {
2368
+ const [modelRef, arrDepth] = getNonArrayModel(uploadArgMeta.returns());
2369
+ if (modelRef.prototype !== Upload.prototype)
2370
+ throw new Error("Upload must be Upload");
2371
+ else if (!arrDepth)
2372
+ throw new Error(`Only Array of Upload is allowed - ${sigMeta.refName}/${gqlMeta.key}`);
2373
+ (0, import_common25.UseInterceptors)((0, import_platform_express.FilesInterceptor)(uploadArgMeta.name))(Ctrl.prototype, gqlMeta.key, gqlMeta.descriptor);
2374
+ (0, import_common25.UploadedFiles)(MulterToUploadPipe)(Ctrl.prototype, gqlMeta.key, uploadArgMeta.idx);
2375
+ }
2376
+ const queryArgMetas = argMetas.filter((argMeta) => argMeta.type === "Query");
2377
+ queryArgMetas.forEach((argMeta) => {
2378
+ const [modelRef, arrDepth] = getNonArrayModel(argMeta.returns());
2379
+ (0, import_common25.Query)(argMeta.name, ...getQueryPipes(modelRef, arrDepth))(Ctrl.prototype, gqlMeta.key, argMeta.idx);
2380
+ });
2381
+ const paramArgMetas = argMetas.filter((argMeta) => argMeta.type === "Param");
2382
+ paramArgMetas.forEach((argMeta) => {
2383
+ (0, import_common25.Param)(argMeta.name)(Ctrl.prototype, gqlMeta.key, argMeta.idx);
2384
+ });
2385
+ const path = getControllerPath(gqlMeta, paramArgMetas);
2386
+ const bodyArgMetas = argMetas.filter((argMeta) => argMeta.type === "Body");
2387
+ if (bodyArgMetas.length)
2388
+ bodyArgMetas.forEach((argMeta) => {
2389
+ (0, import_common25.Body)(argMeta.name, ...getBodyPipes(argMeta))(Ctrl.prototype, gqlMeta.key, argMeta.idx);
2390
+ });
2391
+ (0, import_common25.UseGuards)(
2392
+ ...gqlMeta.guards.map((guard) => authGuards_exports[guard]),
2393
+ ...gqlMeta.signalOption.sso ? [(0, import_passport2.AuthGuard)(gqlMeta.signalOption.sso)] : []
2394
+ )(Ctrl.prototype, gqlMeta.key, gqlMeta.descriptor);
2395
+ if (gqlMeta.type === "Query")
2396
+ (0, import_common25.Get)(path)(Ctrl.prototype, gqlMeta.key, gqlMeta.descriptor);
2397
+ else if (gqlMeta.type === "Mutation")
2398
+ (0, import_common25.Post)(path)(Ctrl.prototype, gqlMeta.key, gqlMeta.descriptor);
2399
+ }
2400
+ if (prefix)
2401
+ (0, import_common25.Controller)(prefix)(Ctrl);
2402
+ else
2403
+ (0, import_common25.Controller)()(Ctrl);
2404
+ return Ctrl;
2405
+ };
2406
+
2407
+ // pkgs/@akanjs/server/src/processor.ts
2408
+ var import_bull = __require("@nestjs/bull");
2409
+ var import_common27 = __require("@nestjs/common");
2410
+ var convertProcessFunction = (gqlMeta, argMetas, internalArgMetas, fn) => {
2411
+ return async function(job, done) {
2412
+ const args = [];
2413
+ argMetas.forEach((argMeta) => {
2414
+ if (argMeta.type === "Msg")
2415
+ args[argMeta.idx] = deserializeArg(argMeta, job.data[argMeta.idx]);
2416
+ else
2417
+ throw new Error(`Invalid ArgMeta Type ${argMeta.type}`);
2418
+ });
2419
+ internalArgMetas.forEach((internalArgMeta) => {
2420
+ if (internalArgMeta.type === "Job")
2421
+ args[internalArgMeta.idx] = job;
2422
+ else
2423
+ throw new Error(`Invalid InternalArgMeta Type ${internalArgMeta.type}`);
2424
+ });
2425
+ this.logger?.log(`Process-${gqlMeta.key} started`);
2426
+ const result = await fn.apply(this, args);
2427
+ this.logger?.log(`Process-${gqlMeta.key} finished`);
2428
+ done(null, result);
2429
+ };
2430
+ };
2431
+ var processorOf = (sigRef, allSrvs) => {
2432
+ const sigMeta = getSigMeta(sigRef);
2433
+ const serverMode = process.env.SERVER_MODE ?? "federation";
2434
+ const gqlMetas = getGqlMetas(sigRef).filter((gqlMeta) => gqlMeta.type === "Process").filter(
2435
+ (gqlMeta) => gqlMeta.signalOption.serverType === "all" || serverMode === "all" || gqlMeta.signalOption.serverType === serverMode
2436
+ );
2437
+ class QueueProcessor {
2438
+ }
2439
+ Object.keys(allSrvs).forEach((srv) => {
2440
+ if (!isServiceEnabled(allSrvs[srv]))
2441
+ return;
2442
+ (0, import_common27.Inject)(allSrvs[srv])(QueueProcessor.prototype, lowerlize(srv));
2443
+ });
2444
+ for (const gqlMeta of gqlMetas) {
2445
+ const [argMetas, internalArgMetas] = getArgMetas(sigRef, gqlMeta.key);
2446
+ const descriptor = { ...Object.getOwnPropertyDescriptor(sigRef.prototype, gqlMeta.key) ?? {} };
2447
+ descriptor.value = convertProcessFunction(
2448
+ gqlMeta,
2449
+ argMetas,
2450
+ internalArgMetas,
2451
+ descriptor.value
2452
+ );
2453
+ Object.defineProperty(QueueProcessor.prototype, gqlMeta.key, descriptor);
2454
+ (0, import_bull.Process)(gqlMeta.key)(QueueProcessor.prototype, gqlMeta.key, descriptor);
2455
+ }
2456
+ (0, import_bull.Processor)(sigMeta.refName)(QueueProcessor);
2457
+ return QueueProcessor;
2458
+ };
2459
+ var queueOf = (sigRef, queue) => {
2460
+ const sigMeta = getSigMeta(sigRef);
2461
+ const gqlMetas = getGqlMetas(sigRef).filter((gqlMeta) => gqlMeta.type === "Process");
2462
+ for (const gqlMeta of gqlMetas) {
2463
+ if (queue[gqlMeta.key])
2464
+ throw new Error(`Queue already has ${gqlMeta.key} in ${sigMeta.refName}`);
2465
+ queue[gqlMeta.key] = (...args) => queue.add(gqlMeta.key, args);
2466
+ }
2467
+ return queue;
2468
+ };
2469
+
2470
+ // pkgs/@akanjs/document/src/dbDecorators.ts
2471
+ var ModelDatabaseStorage = class {
2472
+ };
2473
+ var getAllDatabaseModelNames = () => {
2474
+ const modelNames = Reflect.getMetadataKeys(ModelDatabaseStorage.prototype) ?? [];
2475
+ return modelNames;
2476
+ };
2477
+
2478
+ // pkgs/@akanjs/document/src/schema.ts
2479
+ var import_mongoose4 = __require("mongoose");
2480
+ var getDefaultSchemaOptions = () => ({
2481
+ toJSON: { getters: false, virtuals: true },
2482
+ toObject: { getters: false, virtuals: true },
2483
+ _id: true,
2484
+ id: true,
2485
+ timestamps: true,
2486
+ methods: {
2487
+ refresh: async function() {
2488
+ Object.assign(this, await this.constructor.findById(this._id));
2489
+ return this;
2490
+ }
2491
+ },
2492
+ statics: {
2493
+ pickOne: async function(query, projection) {
2494
+ const doc = await this.findOne(query, projection);
2495
+ if (!doc)
2496
+ throw new Error("No Document");
2497
+ return doc;
2498
+ },
2499
+ pickById: async function(docId, projection) {
2500
+ if (!docId)
2501
+ throw new Error("No Document ID");
2502
+ const doc = await this.findById(docId, projection);
2503
+ if (!doc)
2504
+ throw new Error("No Document");
2505
+ return doc;
2506
+ },
2507
+ sample: async function(query, size = 1, aggregations = []) {
2508
+ const objs = await this.aggregate([
2509
+ { $match: convertAggregateMatch(query) },
2510
+ { $sample: { size } },
2511
+ ...aggregations
2512
+ ]);
2513
+ return objs.map((obj) => new this(obj));
2514
+ },
2515
+ sampleOne: async function(query, aggregations = []) {
2516
+ const obj = await this.aggregate([
2517
+ { $match: convertAggregateMatch(query) },
2518
+ { $sample: { size: 1 } },
2519
+ ...aggregations
2520
+ ]);
2521
+ return obj.length ? new this(obj[0]) : null;
2522
+ },
2523
+ addSummary: async function(prefix = "total", num = 1) {
2524
+ const update = Array.isArray(prefix) ? {
2525
+ $inc: {
2526
+ ...prefix.reduce((acc, cur) => ({ ...acc, [`${cur}${this.modelName}`]: num }), {})
2527
+ }
2528
+ } : { $inc: { [`${prefix}${this.modelName}`]: num } };
2529
+ await this.db.collection("summaries").updateOne({ status: "active" }, update);
2530
+ },
2531
+ moveSummary: async function(prev, next, num = 1) {
2532
+ await this.db.collection("summaries").updateOne(
2533
+ { status: "active" },
2534
+ {
2535
+ $inc: {
2536
+ [`${prev}${this.modelName}`]: -num,
2537
+ [`${next}${this.modelName}`]: num
2538
+ }
2539
+ }
2540
+ );
2541
+ },
2542
+ subSummary: async function(prefix = "total", num = 1) {
2543
+ const update = Array.isArray(prefix) ? {
2544
+ $inc: {
2545
+ ...prefix.reduce((acc, cur) => ({ ...acc, [`${cur}${this.modelName}`]: -num }), {})
2546
+ }
2547
+ } : { $inc: { [`${prefix}${this.modelName}`]: -num } };
2548
+ await this.db.collection("summaries").updateOne({ status: "active" }, update);
2549
+ }
2550
+ }
2551
+ });
2552
+ var convertOperatorValue = (value) => {
2553
+ if (Array.isArray(value))
2554
+ return value.map((v) => convertOperatorValue(v));
2555
+ else if (!value)
2556
+ return value;
2557
+ else if ((0, import_mongoose4.isValidObjectId)(value))
2558
+ return new import_mongoose4.Types.ObjectId(value);
2559
+ else if (isValidDate(value))
2560
+ return dayjs(value).toDate();
2561
+ else if (value.constructor !== Object)
2562
+ return value;
2563
+ else if (typeof value !== "object")
2564
+ return value;
2565
+ else
2566
+ return Object.fromEntries(
2567
+ Object.entries(value).map(([key, value2]) => [key, convertOperatorValue(value2)])
2568
+ );
2569
+ };
2570
+ var convertAggregateMatch = (query) => {
2571
+ return Object.fromEntries(
2572
+ Object.entries(query).map(([key, value]) => {
2573
+ return [key, convertOperatorValue(value)];
2574
+ })
2575
+ );
2576
+ };
2577
+
2578
+ // pkgs/@akanjs/document/src/dataLoader.ts
2579
+ var import_dataloader = __toESM(__require("dataloader"));
2580
+ var import_lodash = __require("lodash");
2581
+ var import_mongoose5 = __require("mongoose");
2582
+ var Id = import_mongoose5.Types.ObjectId;
2583
+ var ObjectId = import_mongoose5.Schema.Types.ObjectId;
2584
+ var Mixed = import_mongoose5.Schema.Types.Mixed;
2585
+ var createLoader = (model, fieldName = "_id", defaultQuery = {}) => {
2586
+ return new import_dataloader.default(
2587
+ (fields) => {
2588
+ const query = { ...defaultQuery };
2589
+ query[fieldName] = { $in: fields };
2590
+ const data = model.find(query).then((list) => {
2591
+ const listByKey = (0, import_lodash.keyBy)(list, fieldName);
2592
+ return fields.map((id) => (0, import_lodash.get)(listByKey, id, null));
2593
+ });
2594
+ return data;
2595
+ },
2596
+ { name: "dataloader", cache: false }
2597
+ );
2598
+ };
2599
+ var createArrayLoader = (model, fieldName = "_id", defaultQuery = {}) => {
2600
+ return new import_dataloader.default((fields) => {
2601
+ const query = { ...defaultQuery };
2602
+ query[fieldName] = { $in: fields };
2603
+ const data = model.find(query).then((list) => {
2604
+ return fields.map((field) => list.filter((item) => field === item[fieldName]));
2605
+ });
2606
+ return data;
2607
+ });
2608
+ };
2609
+ var createQueryLoader = (model, queryKeys, defaultQuery = {}) => {
2610
+ return new import_dataloader.default(
2611
+ (queries) => {
2612
+ const query = {
2613
+ $and: [{ $or: queries }, defaultQuery]
2614
+ };
2615
+ const getQueryKey = (query2) => queryKeys.map((key) => query2[key].toString()).join("");
2616
+ const data = model.find(query).then((list) => {
2617
+ const listByKey = (0, import_lodash.keyBy)(list, getQueryKey);
2618
+ return queries.map((query2) => (0, import_lodash.get)(listByKey, getQueryKey(query2), null));
2619
+ });
2620
+ return data;
2621
+ },
2622
+ { name: "dataloader", cache: false }
2623
+ );
2624
+ };
2625
+ var getLoaderMetaMapByPrototype = (prototype) => {
2626
+ const loaderMetaMap = Reflect.getOwnMetadata("loaders", prototype) ?? /* @__PURE__ */ new Map();
2627
+ return loaderMetaMap;
2628
+ };
2629
+ var getLoaderMetas = (target) => {
2630
+ const metas = [...getLoaderMetaMapByPrototype(target.prototype).values()];
2631
+ return metas;
2632
+ };
2633
+
2634
+ // pkgs/@akanjs/document/src/database.ts
2635
+ var CacheDatabase = class {
2636
+ constructor(refName, redis) {
2637
+ this.refName = refName;
2638
+ this.redis = redis;
2639
+ this.logger = new Logger(`${refName}Cache`);
2640
+ }
2641
+ logger;
2642
+ async set(topic, key, value, option = {}) {
2643
+ const setOption = { PXAT: option.expireAt?.toDate().getTime() };
2644
+ await this.redis.set(`${this.refName}:${topic}:${key}`, value, setOption);
2645
+ }
2646
+ async get(topic, key) {
2647
+ const value = await this.redis.get(`${this.refName}:${topic}:${key}`);
2648
+ return value;
2649
+ }
2650
+ async delete(topic, key) {
2651
+ await this.redis.del(`${this.refName}:${topic}:${key}`);
2652
+ }
2653
+ };
2654
+ var SearchDatabase = class {
2655
+ constructor(refName, meili) {
2656
+ this.refName = refName;
2657
+ this.meili = meili;
2658
+ this.logger = new Logger(`${refName}Search`);
2659
+ this.index = meili.index(lowerlize(refName));
2660
+ }
2661
+ logger;
2662
+ index;
2663
+ async searchIds(searchText, option = {}) {
2664
+ const { skip = 0, limit = DEFAULT_PAGE_SIZE, sort } = option;
2665
+ if (!searchText) {
2666
+ const { results, total } = await this.index.getDocuments({ offset: skip ?? 0, limit: limit ?? 0 });
2667
+ return { ids: results.map((result) => result.id), total };
2668
+ }
2669
+ const { hits, estimatedTotalHits } = await this.index.search(searchText, {
2670
+ offset: skip ?? 0,
2671
+ limit: limit ?? 0,
2672
+ sort: sort ?? [],
2673
+ filter: option.filter,
2674
+ attributesToRetrieve: ["id"]
2675
+ });
2676
+ return { ids: hits.map((hit) => hit.id), total: estimatedTotalHits };
2677
+ }
2678
+ async count(searchText, option = {}) {
2679
+ const { skip = 0, limit = DEFAULT_PAGE_SIZE, sort = "" } = option;
2680
+ if (!searchText) {
2681
+ const { results, total } = await this.index.getDocuments({ offset: skip ?? 0, limit: limit ?? 0 });
2682
+ return total;
2683
+ }
2684
+ const { hits, estimatedTotalHits } = await this.index.search(searchText, {
2685
+ offset: skip ?? 0,
2686
+ limit: limit ?? 0,
2687
+ filter: option.filter,
2688
+ attributesToRetrieve: ["id"]
2689
+ });
2690
+ return estimatedTotalHits;
2691
+ }
2692
+ };
2693
+ var DatabaseModelStorage = class {
2694
+ __ModelType__ = "DatabaseModelStorage";
2695
+ };
2696
+ var databaseModelOf = (database, model, redis, meili) => {
2697
+ const [modelName, className] = [database.refName, capitalize(database.refName)];
2698
+ const insightFieldMetas = getFieldMetas(database.Insight);
2699
+ const accumulator = Object.fromEntries(insightFieldMetas.map((fieldMeta) => [fieldMeta.key, fieldMeta.accumulate]));
2700
+ const defaultInsight = Object.fromEntries(insightFieldMetas.map((fieldMeta) => [fieldMeta.key, fieldMeta.default]));
2701
+ const makeSafeQuery = (query) => ({ removedAt: { $exists: false }, ...query ?? {} });
2702
+ const makeSafeMatchStage = (query) => ({
2703
+ $match: { removedAt: { $exists: false }, ...convertAggregateMatch(query) }
2704
+ });
2705
+ const getListQuery = (query, queryOption) => {
2706
+ const find = makeSafeQuery(query);
2707
+ const sort = getFilterSort(database.Filter, queryOption?.sort ?? "latest");
2708
+ const skip = queryOption?.skip ?? 0;
2709
+ const limit = queryOption?.limit === null ? DEFAULT_PAGE_SIZE : queryOption?.limit ?? 0;
2710
+ const select = queryOption?.select;
2711
+ const sample = queryOption?.sample;
2712
+ return { find, sort, skip, limit, select, sample };
2713
+ };
2714
+ const getFindQuery = (query, queryOption) => {
2715
+ const find = makeSafeQuery(query);
2716
+ const sort = getFilterSort(database.Filter, queryOption?.sort ?? "latest");
2717
+ const skip = queryOption?.skip ?? 0;
2718
+ const select = queryOption?.select;
2719
+ const sample = queryOption?.sample ?? false;
2720
+ return { find, sort, skip, select, sample };
2721
+ };
2722
+ const getSearchSort = (sortKey) => {
2723
+ const sort = getFilterSort(database.Filter, sortKey ?? "latest");
2724
+ return Object.entries(sort).map(([key, value]) => `${key}:${value === 1 ? "asc" : "desc"}`);
2725
+ };
2726
+ const loader = createLoader(model);
2727
+ const cacheDatabase = new CacheDatabase(database.refName, redis);
2728
+ const searchDatabase = new SearchDatabase(database.refName, meili);
2729
+ const DatabaseModel = Reflect.getMetadata(database.refName, DatabaseModelStorage.prototype) ?? class DatabaseModel {
2730
+ logger = new Logger(`${modelName}Model`);
2731
+ __model = model;
2732
+ __cache = cacheDatabase;
2733
+ __search = searchDatabase;
2734
+ __loader = loader;
2735
+ async __list(query, queryOption) {
2736
+ const { find, sort, skip, limit, select, sample } = getListQuery(query, queryOption);
2737
+ return sample ? await this.__model.sample(find, limit) : await this.__model.find(find, select).sort(sort).skip(skip).limit(limit);
2738
+ }
2739
+ async __listIds(query, queryOption) {
2740
+ const { find, sort, skip, limit, sample } = getListQuery(query, queryOption);
2741
+ return (sample ? await this.__model.sample(find, limit, [{ $project: { _id: 1 } }]) : await this.__model.find(find).sort(sort).skip(skip).limit(limit).select("_id")).map(({ _id }) => _id.toString());
2742
+ }
2743
+ async __find(query, queryOption) {
2744
+ const { find, sort, skip, select, sample } = getFindQuery(query, queryOption);
2745
+ const doc = sample ? await this.__model.sampleOne(find) : await this.__model.findOne(find, select).sort(sort).skip(skip);
2746
+ if (!doc)
2747
+ return null;
2748
+ return doc;
2749
+ }
2750
+ async __findId(query, queryOption) {
2751
+ const { find, sort, skip, sample } = getFindQuery(query, queryOption);
2752
+ const doc = sample ? await this.__model.sampleOne(find, [{ $project: { _id: 1 } }]) : await this.__model.findOne(find).sort(sort).skip(skip).select("_id");
2753
+ if (!doc)
2754
+ return null;
2755
+ return doc._id.toString();
2756
+ }
2757
+ async __pick(query, queryOption) {
2758
+ const { find, sort, skip, select, sample } = getFindQuery(query, queryOption);
2759
+ const doc = sample ? await this.__model.sampleOne(find) : await this.__model.findOne(find, select).sort(sort).skip(skip);
2760
+ if (!doc)
2761
+ throw new Error(`No Document (${database.refName}): ${JSON.stringify(query)}`);
2762
+ return doc;
2763
+ }
2764
+ async __pickId(query, queryOption) {
2765
+ const { find, sort, skip, sample } = getFindQuery(query, queryOption);
2766
+ const doc = sample ? await this.__model.sampleOne(find, [{ $project: { _id: 1 } }]) : await this.__model.findOne(find).sort(sort).skip(skip).select("_id");
2767
+ if (!doc)
2768
+ throw new Error(`No Document (${database.refName}): ${JSON.stringify(query)}`);
2769
+ return doc._id.toString();
2770
+ }
2771
+ async __exists(query) {
2772
+ const find = makeSafeQuery(query);
2773
+ const existingId = await this.__model.exists(find);
2774
+ return existingId?.toString() ?? null;
2775
+ }
2776
+ async __count(query) {
2777
+ const find = makeSafeQuery(query);
2778
+ return await this.__model.countDocuments(find);
2779
+ }
2780
+ async __insight(query) {
2781
+ if (!accumulator)
2782
+ throw new Error(`No Insight (${database.refName})`);
2783
+ const res = await this.__model.aggregate([
2784
+ makeSafeMatchStage(query),
2785
+ { $group: { _id: null, ...accumulator } }
2786
+ ]);
2787
+ const data = res[0];
2788
+ return data ?? defaultInsight;
2789
+ }
2790
+ async getDefaultSummary(addQuery = {}) {
2791
+ if (!database.Summary)
2792
+ return {};
2793
+ const fieldMetas = getFieldMetas(database.Summary);
2794
+ const summary = {};
2795
+ await Promise.all(
2796
+ fieldMetas.filter((fieldMeta) => !!fieldMeta.query).map(async (fieldMeta) => {
2797
+ const query = typeof fieldMeta.query === "function" ? fieldMeta.query() : fieldMeta.query;
2798
+ summary[fieldMeta.key] = query ? await model.countDocuments({ ...query, ...addQuery }) : fieldMeta.default;
2799
+ })
2800
+ );
2801
+ return summary;
2802
+ }
2803
+ async [`get${className}`](id) {
2804
+ const doc = await this.__loader.load(id);
2805
+ if (!doc)
2806
+ throw new Error(`No Document (${database.refName}): ${id}`);
2807
+ return doc;
2808
+ }
2809
+ async [`load${className}`](id) {
2810
+ return id ? await this.__loader.load(id) : null;
2811
+ }
2812
+ async [`load${className}Many`](ids) {
2813
+ return await this.__loader.loadMany(ids);
2814
+ }
2815
+ async [`create${className}`](data) {
2816
+ return await new this.__model(data).save();
2817
+ }
2818
+ async [`update${className}`](id, data) {
2819
+ const doc = await this.__model.pickById(id);
2820
+ return await doc.set(data).save();
2821
+ }
2822
+ async [`remove${className}`](id) {
2823
+ const doc = await this.__model.pickById(id);
2824
+ return await doc.set({ removedAt: dayjs() }).save();
2825
+ }
2826
+ async [`search${className}`](searchText, queryOption = {}) {
2827
+ const { skip, limit, sort } = queryOption;
2828
+ const { ids, total } = await this.__search.searchIds(searchText, { skip, limit, sort: getSearchSort(sort) });
2829
+ const docs = await this.__loader.loadMany(ids);
2830
+ return { docs, count: total };
2831
+ }
2832
+ async [`searchDocs${className}`](searchText, queryOption = {}) {
2833
+ const { skip, limit, sort } = queryOption;
2834
+ const { ids } = await this.__search.searchIds(searchText, { skip, limit, sort: getSearchSort(sort) });
2835
+ return await this.__loader.loadMany(ids);
2836
+ }
2837
+ async [`searchCount${className}`](searchText) {
2838
+ return await this.__search.count(searchText);
2839
+ }
2840
+ };
2841
+ DatabaseModel.prototype[className] = model;
2842
+ DatabaseModel.prototype[`${modelName}Loader`] = loader;
2843
+ DatabaseModel.prototype[`${modelName}Cache`] = cacheDatabase;
2844
+ DatabaseModel.prototype[`${modelName}Search`] = searchDatabase;
2845
+ const getQueryDataFromKey = (queryKey, args) => {
2846
+ const lastArg = args.at(-1);
2847
+ const hasQueryOption = lastArg && typeof lastArg === "object" && (typeof lastArg.select === "object" || typeof lastArg.skip === "number" || typeof lastArg.limit === "number" || typeof lastArg.sort === "string");
2848
+ const queryFn = getFilterQuery(database.Filter, queryKey);
2849
+ const query = queryFn(...hasQueryOption ? args.slice(0, -1) : args);
2850
+ const queryOption = hasQueryOption ? lastArg : {};
2851
+ return { query, queryOption };
2852
+ };
2853
+ const filterKeyMetaMap = getFilterKeyMetaMapOnPrototype(database.Filter.prototype);
2854
+ const queryKeys = [...filterKeyMetaMap.keys()];
2855
+ queryKeys.forEach((queryKey) => {
2856
+ const queryFn = getFilterQuery(database.Filter, queryKey);
2857
+ DatabaseModel.prototype[`list${capitalize(queryKey)}`] = async function(...args) {
2858
+ const { query, queryOption } = getQueryDataFromKey(queryKey, args);
2859
+ return this.__list(query, queryOption);
2860
+ };
2861
+ DatabaseModel.prototype[`listIds${capitalize(queryKey)}`] = async function(...args) {
2862
+ const { query, queryOption } = getQueryDataFromKey(queryKey, args);
2863
+ return this.__listIds(query, queryOption);
2864
+ };
2865
+ DatabaseModel.prototype[`find${capitalize(queryKey)}`] = async function(...args) {
2866
+ const { query, queryOption } = getQueryDataFromKey(queryKey, args);
2867
+ return this.__find(query, queryOption);
2868
+ };
2869
+ DatabaseModel.prototype[`findId${capitalize(queryKey)}`] = async function(...args) {
2870
+ const { query, queryOption } = getQueryDataFromKey(queryKey, args);
2871
+ return this.__findId(query, queryOption);
2872
+ };
2873
+ DatabaseModel.prototype[`pick${capitalize(queryKey)}`] = async function(...args) {
2874
+ const { query, queryOption } = getQueryDataFromKey(queryKey, args);
2875
+ return this.__pick(query, queryOption);
2876
+ };
2877
+ DatabaseModel.prototype[`pickId${capitalize(queryKey)}`] = async function(...args) {
2878
+ const { query, queryOption } = getQueryDataFromKey(queryKey, args);
2879
+ return this.__pickId(query, queryOption);
2880
+ };
2881
+ DatabaseModel.prototype[`exists${capitalize(queryKey)}`] = async function(...args) {
2882
+ const query = queryFn(...args);
2883
+ return this.__exists(query);
2884
+ };
2885
+ DatabaseModel.prototype[`count${capitalize(queryKey)}`] = async function(...args) {
2886
+ const query = queryFn(...args);
2887
+ return this.__count(query);
2888
+ };
2889
+ DatabaseModel.prototype[`insight${capitalize(queryKey)}`] = async function(...args) {
2890
+ const query = queryFn(...args);
2891
+ return this.__insight(query);
2892
+ };
2893
+ });
2894
+ const loaderMetas = getLoaderMetas(database.Model);
2895
+ loaderMetas.forEach((loaderMeta) => {
2896
+ const loader2 = loaderMeta.type === "Field" ? createLoader(model, loaderMeta.fieldName) : loaderMeta.type === "ArrayField" ? createArrayLoader(model, loaderMeta.fieldName) : loaderMeta.type === "Query" ? createQueryLoader(model, loaderMeta.queryKeys ?? []) : null;
2897
+ DatabaseModel.prototype[loaderMeta.key] = loader2;
2898
+ });
2899
+ Object.getOwnPropertyNames(database.Model.prototype).forEach((key) => {
2900
+ DatabaseModel.prototype[key] = database.Model.prototype[key];
2901
+ });
2902
+ const createDescriptor = Object.getOwnPropertyDescriptor(DatabaseModel.prototype, `create${className}`);
2903
+ if (createDescriptor)
2904
+ Transaction()(DatabaseModel.prototype, `create${className}`, createDescriptor);
2905
+ const updateDescriptor = Object.getOwnPropertyDescriptor(DatabaseModel.prototype, `update${className}`);
2906
+ if (updateDescriptor)
2907
+ Transaction()(DatabaseModel.prototype, `update${className}`, updateDescriptor);
2908
+ const removeDescriptor = Object.getOwnPropertyDescriptor(DatabaseModel.prototype, `remove${className}`);
2909
+ if (removeDescriptor)
2910
+ Transaction()(DatabaseModel.prototype, `remove${className}`, removeDescriptor);
2911
+ Reflect.defineMetadata(database.refName, DatabaseModel, DatabaseModelStorage.prototype);
2912
+ return new DatabaseModel();
2913
+ };
2914
+
2915
+ // pkgs/@akanjs/server/src/module.ts
2916
+ var import_bull2 = __require("@nestjs/bull");
2917
+ var import_common34 = __require("@nestjs/common");
2918
+ var import_mongoose7 = __require("@nestjs/mongoose");
2919
+
2920
+ // pkgs/@akanjs/server/src/schema.ts
2921
+ var import_mongoose6 = __require("mongoose");
2922
+ var ScalarSchemaStorage = class {
2923
+ };
2924
+ var SchemaStorage = class {
2925
+ };
2926
+ var scalarMongoTypeMap = /* @__PURE__ */ new Map([
2927
+ [ID, ObjectId],
2928
+ [Int, Number],
2929
+ [Float, Number],
2930
+ [JSON2, import_mongoose6.Schema.Types.Mixed],
2931
+ [Map, Map],
2932
+ [String, String],
2933
+ [Boolean, Boolean],
2934
+ [Date, Date]
2935
+ ]);
2936
+ var applyMongoProp = (schemaProps, fieldMeta) => {
2937
+ if (["id", "createdAt", "updatedAt"].includes(fieldMeta.key) || fieldMeta.fieldType === "resolve")
2938
+ return;
2939
+ const type = fieldMeta.isClass ? fieldMeta.isScalar ? createSchema(fieldMeta.modelRef) : ObjectId : scalarMongoTypeMap.get(fieldMeta.modelRef) ?? fieldMeta.modelRef;
2940
+ let prop = {};
2941
+ if (fieldMeta.optArrDepth) {
2942
+ prop.type = type;
2943
+ prop.required = true;
2944
+ if (fieldMeta.isClass && !fieldMeta.refPath)
2945
+ prop.ref = getClassMeta(fieldMeta.modelRef).refName;
2946
+ if (fieldMeta.refPath)
2947
+ prop.refPath = fieldMeta.refPath;
2948
+ if (typeof fieldMeta.min === "number")
2949
+ prop.min = fieldMeta.min;
2950
+ if (typeof fieldMeta.max === "number")
2951
+ prop.max = fieldMeta.max;
2952
+ if (fieldMeta.enum)
2953
+ prop.enum = [...fieldMeta.enum.values, ...fieldMeta.nullable ? [null] : []];
2954
+ if (typeof fieldMeta.minlength === "number")
2955
+ prop.minlength = fieldMeta.minlength;
2956
+ if (typeof fieldMeta.maxlength === "number")
2957
+ prop.maxlength = fieldMeta.maxlength;
2958
+ if (fieldMeta.validate) {
2959
+ prop.validate = function(value) {
2960
+ return fieldMeta.validate?.(fieldMeta.name === "Date" && !!value ? dayjs() : value, this) ?? true;
2961
+ };
2962
+ }
2963
+ prop = { type: arraiedModel(prop, fieldMeta.optArrDepth), default: [], required: true };
2964
+ if (fieldMeta.modelRef.prototype === Date.prototype) {
2965
+ prop.get = (dates) => dates.map((date) => dayjs(date));
2966
+ prop.set = (days) => days.map((day) => day.toDate());
2967
+ }
2968
+ if (fieldMeta.isClass && !fieldMeta.isScalar || fieldMeta.modelRef.prototype === ID.prototype) {
2969
+ prop.get = (ids) => ids.map((id) => id.toString());
2970
+ prop.set = (ids) => ids.map((id) => new import_mongoose6.Types.ObjectId(id));
2971
+ }
2972
+ } else {
2973
+ prop.type = arraiedModel(type, fieldMeta.arrDepth);
2974
+ prop.required = !fieldMeta.nullable;
2975
+ if (fieldMeta.isMap) {
2976
+ prop.of = scalarMongoTypeMap.get(fieldMeta.of) ?? createSchema(fieldMeta.of);
2977
+ if (!fieldMeta.default)
2978
+ prop.default = /* @__PURE__ */ new Map();
2979
+ }
2980
+ if (fieldMeta.default !== null) {
2981
+ if (typeof fieldMeta.default === "function")
2982
+ prop.default = function() {
2983
+ const def = fieldMeta.default(this);
2984
+ return (0, import_dayjs2.isDayjs)(def) ? def.toDate() : def;
2985
+ };
2986
+ else
2987
+ prop.default = (0, import_dayjs2.isDayjs)(fieldMeta.default) ? fieldMeta.default.toDate() : fieldMeta.default instanceof Enum ? [...fieldMeta.default.values] : fieldMeta.default;
2988
+ }
2989
+ if (typeof fieldMeta.immutable !== "undefined")
2990
+ prop.immutable = fieldMeta.immutable;
2991
+ if (fieldMeta.isClass && !fieldMeta.refPath)
2992
+ prop.ref = getClassMeta(fieldMeta.modelRef).refName;
2993
+ if (fieldMeta.refPath)
2994
+ prop.refPath = fieldMeta.refPath;
2995
+ if (typeof fieldMeta.min === "number")
2996
+ prop.min = fieldMeta.min;
2997
+ if (typeof fieldMeta.max === "number")
2998
+ prop.max = fieldMeta.max;
2999
+ if (fieldMeta.enum)
3000
+ prop.enum = [...fieldMeta.enum.values, ...fieldMeta.nullable ? [null] : []];
3001
+ if (typeof fieldMeta.select === "boolean")
3002
+ prop.select = fieldMeta.select;
3003
+ if (typeof fieldMeta.minlength === "number")
3004
+ prop.minlength = fieldMeta.minlength;
3005
+ if (typeof fieldMeta.maxlength === "number")
3006
+ prop.maxlength = fieldMeta.maxlength;
3007
+ if (fieldMeta.nullable) {
3008
+ prop.get = (v) => v === void 0 ? void 0 : v;
3009
+ prop.set = (v) => v === null ? void 0 : v;
3010
+ }
3011
+ if (fieldMeta.modelRef.prototype === Date.prototype) {
3012
+ prop.get = (date) => date ? dayjs(date) : void 0;
3013
+ prop.set = (day) => day ? dayjs(day).toDate() : void 0;
3014
+ }
3015
+ if (fieldMeta.isClass && !fieldMeta.isScalar || fieldMeta.modelRef.prototype === ID.prototype) {
3016
+ prop.get = (id) => id ? id.toString() : void 0;
3017
+ prop.set = (id) => id ? new import_mongoose6.Types.ObjectId(id) : void 0;
3018
+ }
3019
+ if (fieldMeta.isClass && fieldMeta.isScalar && fieldMeta.default === null && !fieldMeta.nullable) {
3020
+ prop.default = makeDefault(fieldMeta.modelRef);
3021
+ }
3022
+ if (fieldMeta.validate) {
3023
+ prop.validate = function(value) {
3024
+ return fieldMeta.validate?.(fieldMeta.name === "Date" && !!value ? dayjs() : value, this) ?? true;
3025
+ };
3026
+ }
3027
+ }
3028
+ schemaProps[fieldMeta.key] = prop;
3029
+ };
3030
+ var createSchema = (modelRef) => {
3031
+ const classMeta = getClassMeta(modelRef);
3032
+ const schemaMeta = Reflect.getMetadata(classMeta.refName, ScalarSchemaStorage.prototype);
3033
+ if (schemaMeta)
3034
+ return schemaMeta;
3035
+ const fieldMetas = getFieldMetas(modelRef);
3036
+ const schemaProps = {};
3037
+ fieldMetas.forEach((fieldMeta) => {
3038
+ applyMongoProp(schemaProps, fieldMeta);
3039
+ });
3040
+ const schema = new import_mongoose6.Schema(schemaProps);
3041
+ Reflect.defineMetadata(classMeta.refName, schema, ScalarSchemaStorage.prototype);
3042
+ return schema;
3043
+ };
3044
+ var schemaOf = (modelRef, docRef, middleware) => {
3045
+ const classMeta = getClassMeta(docRef);
3046
+ const schemaMeta = Reflect.getMetadata(classMeta.refName, SchemaStorage.prototype);
3047
+ if (schemaMeta)
3048
+ return schemaMeta;
3049
+ const fieldMetas = getFieldMetas(docRef);
3050
+ const schemaProps = {
3051
+ createdAt: {
3052
+ type: Date,
3053
+ get: (date) => date ? dayjs(date) : date,
3054
+ set: (day) => day ? dayjs(day).toDate() : day
3055
+ },
3056
+ updatedAt: {
3057
+ type: Date,
3058
+ get: (date) => date ? dayjs(date) : date,
3059
+ set: (day) => day ? dayjs(day).toDate() : day
3060
+ }
3061
+ };
3062
+ fieldMetas.forEach((fieldMeta) => {
3063
+ applyMongoProp(schemaProps, fieldMeta);
3064
+ });
3065
+ const schema = new import_mongoose6.Schema(schemaProps, getDefaultSchemaOptions());
3066
+ schema.methods.refresh = async function() {
3067
+ Object.assign(this, await this.constructor.findById(this._id));
3068
+ return this;
3069
+ };
3070
+ Object.getOwnPropertyNames(docRef.prototype).forEach((name) => {
3071
+ if (name === "constructor")
3072
+ return;
3073
+ schema.methods[name] = Object.getOwnPropertyDescriptor(docRef.prototype, name)?.value;
3074
+ });
3075
+ schema.pre("save", async function(next) {
3076
+ const model = this.constructor;
3077
+ if (this.isNew)
3078
+ model.addSummary(["total", this.status]);
3079
+ else if (!!this.removedAt && this.isModified("removedAt"))
3080
+ model.subSummary(["total", this.status]);
3081
+ next();
3082
+ });
3083
+ const onSchema = Object.getOwnPropertyDescriptor(middleware.prototype, "onSchema")?.value;
3084
+ onSchema?.(schema);
3085
+ schema.index({ removedAt: -1 });
3086
+ Reflect.defineMetadata(classMeta.refName, schema, SchemaStorage.prototype);
3087
+ return schema;
3088
+ };
3089
+ var addSchema = (modelRef, docRef, inputRef, middleware) => {
3090
+ const originDocClassMeta = getClassMeta(docRef);
3091
+ const originInputClassMeta = getClassMeta(inputRef);
3092
+ const originDoc = getFullModelRef(originDocClassMeta.refName);
3093
+ const originInput = getInputModelRef(originInputClassMeta.refName);
3094
+ const classMeta = getClassMeta(docRef);
3095
+ const modelSchema = Reflect.getMetadata(classMeta.refName, SchemaStorage.prototype);
3096
+ if (!modelSchema)
3097
+ throw new Error(`Schema of ${classMeta.refName} not found`);
3098
+ const fieldMetas = getFieldMetas(docRef);
3099
+ const schemaProps = {
3100
+ createdAt: {
3101
+ type: Date,
3102
+ get: (date) => date ? dayjs(date) : date,
3103
+ set: (day) => day ? dayjs(day).toDate() : day
3104
+ },
3105
+ updatedAt: {
3106
+ type: Date,
3107
+ get: (date) => date ? dayjs(date) : date,
3108
+ set: (day) => day ? dayjs(day).toDate() : day
3109
+ }
3110
+ };
3111
+ fieldMetas.forEach((fieldMeta) => {
3112
+ applyMongoProp(schemaProps, fieldMeta);
3113
+ applyNestField(originDoc, fieldMeta);
3114
+ });
3115
+ const inputFieldMetas = getFieldMetas(inputRef);
3116
+ inputFieldMetas.forEach((fieldMeta) => {
3117
+ applyNestField(originInput, fieldMeta, "input");
3118
+ });
3119
+ const schema = new import_mongoose6.Schema(schemaProps, getDefaultSchemaOptions());
3120
+ modelSchema.add(schema);
3121
+ Object.getOwnPropertyNames(docRef.prototype).forEach((name) => {
3122
+ if (name === "constructor")
3123
+ return;
3124
+ modelSchema.methods[name] = Object.getOwnPropertyDescriptor(docRef.prototype, name)?.value;
3125
+ });
3126
+ const onSchema = Object.getOwnPropertyDescriptor(middleware.prototype, "onSchema")?.value;
3127
+ onSchema?.(modelSchema);
3128
+ return modelSchema;
3129
+ };
3130
+
3131
+ // pkgs/@akanjs/server/src/websocket.ts
3132
+ var import_common32 = __require("@nestjs/common");
3133
+ var import_websockets = __require("@nestjs/websockets");
3134
+ var import_operators2 = __require("rxjs/operators");
3135
+ var internalArgMap3 = { Account: Account3, UserIp: UserIp2, Access: Access2, Self: Self2, Me: Me2, Ws: Ws2 };
3136
+ var TransformInterceptor = class {
3137
+ intercept(context, next) {
3138
+ const [, gqlKey] = [context.getArgByIndex(1), context.getArgByIndex(3)];
3139
+ return next.handle().pipe((0, import_operators2.map)((data) => ({ event: gqlKey, data })));
3140
+ }
3141
+ };
3142
+ TransformInterceptor = __decorateClass([
3143
+ (0, import_common32.Injectable)()
3144
+ ], TransformInterceptor);
3145
+ var makeRoomId = (gqlKey, argValues) => `${gqlKey}-${argValues.join("-")}`;
3146
+ var getPubsubInterceptor = (argMetas) => {
3147
+ let PubsubInterceptor = class {
3148
+ async intercept(context, next) {
3149
+ const [socket, { __subscribe__, ...body }, gqlKey] = [context.getArgByIndex(0), context.getArgByIndex(1), context.getArgByIndex(3)];
3150
+ const roomId = makeRoomId(
3151
+ gqlKey,
3152
+ argMetas.map((argMeta) => body[argMeta.name])
3153
+ );
3154
+ if (__subscribe__)
3155
+ await socket.join(roomId);
3156
+ else
3157
+ await socket.leave(roomId);
3158
+ return next.handle().pipe((0, import_operators2.map)(() => ({ event: gqlKey, data: { roomId, __subscribe__ } })));
3159
+ }
3160
+ };
3161
+ PubsubInterceptor = __decorateClass([
3162
+ (0, import_common32.Injectable)()
3163
+ ], PubsubInterceptor);
3164
+ return PubsubInterceptor;
3165
+ };
3166
+ var websocketOf = (sigRef, allSrvs) => {
3167
+ const sigMeta = getSigMeta(sigRef);
3168
+ class WsGateway {
3169
+ __sigRef__ = sigRef;
3170
+ }
3171
+ Object.keys(allSrvs).forEach((srv) => {
3172
+ if (!isServiceEnabled(allSrvs[srv]))
3173
+ return;
3174
+ (0, import_common32.Inject)(allSrvs[srv])(WsGateway.prototype, lowerlize(srv));
3175
+ });
3176
+ const messageGqlMetas = getGqlMetas(sigRef).filter((gqlMeta) => gqlMeta.type === "Message");
3177
+ for (const gqlMeta of messageGqlMetas) {
3178
+ const descriptor = { ...Object.getOwnPropertyDescriptor(sigRef.prototype, gqlMeta.key) ?? {} };
3179
+ Object.defineProperty(WsGateway.prototype, gqlMeta.key, descriptor);
3180
+ const [argMetas, internalArgMetas] = getArgMetas(sigRef, gqlMeta.key);
3181
+ argMetas.forEach((argMeta) => {
3182
+ if (argMeta.type !== "Msg")
3183
+ throw new Error(`Argument of Message should be Msg ${sigMeta.refName}-${gqlMeta.key}-${argMeta.name}`);
3184
+ (0, import_websockets.MessageBody)(argMeta.name, ...getBodyPipes(argMeta))(WsGateway.prototype, gqlMeta.key, argMeta.idx);
3185
+ });
3186
+ internalArgMetas.forEach((internalArgMeta) => {
3187
+ const internalDecorator = internalArgMap3[internalArgMeta.type];
3188
+ internalDecorator(internalArgMeta.option ?? {})(WsGateway.prototype, gqlMeta.key, internalArgMeta.idx);
3189
+ });
3190
+ (0, import_common32.UseInterceptors)(TransformInterceptor)(WsGateway.prototype, gqlMeta.key, gqlMeta.descriptor);
3191
+ (0, import_websockets.SubscribeMessage)(gqlMeta.key)(WsGateway.prototype, gqlMeta.key, descriptor);
3192
+ }
3193
+ const pubsubGqlMetas = getGqlMetas(sigRef).filter((gqlMeta) => gqlMeta.type === "Pubsub");
3194
+ for (const gqlMeta of pubsubGqlMetas) {
3195
+ const descriptor = { ...Object.getOwnPropertyDescriptor(sigRef.prototype, gqlMeta.key) ?? {} };
3196
+ Object.defineProperty(WsGateway.prototype, gqlMeta.key, descriptor);
3197
+ const [argMetas, internalArgMetas] = getArgMetas(sigRef, gqlMeta.key);
3198
+ argMetas.forEach((argMeta) => {
3199
+ if (argMeta.type !== "Room")
3200
+ throw new Error(`Argument of Message should be Room ${sigMeta.refName}-${gqlMeta.key}-${argMeta.name}`);
3201
+ (0, import_websockets.MessageBody)(argMeta.name, ...getBodyPipes(argMeta))(WsGateway.prototype, gqlMeta.key, argMeta.idx);
3202
+ });
3203
+ internalArgMetas.forEach((internalArgMeta) => {
3204
+ const internalDecorator = internalArgMap3[internalArgMeta.type];
3205
+ internalDecorator(internalArgMeta.option ?? {})(WsGateway.prototype, gqlMeta.key, internalArgMeta.idx);
3206
+ });
3207
+ (0, import_common32.UseInterceptors)(getPubsubInterceptor(argMetas))(WsGateway.prototype, gqlMeta.key, gqlMeta.descriptor);
3208
+ (0, import_websockets.SubscribeMessage)(gqlMeta.key)(WsGateway.prototype, gqlMeta.key, descriptor);
3209
+ }
3210
+ (0, import_websockets.WebSocketGateway)({ cors: { origin: "*" }, transports: ["websocket"] })(WsGateway);
3211
+ return WsGateway;
3212
+ };
3213
+ var websocketServerOf = (sigRef) => {
3214
+ const pubsubGqlMetas = getGqlMetas(sigRef).filter((gqlMeta) => gqlMeta.type === "Pubsub");
3215
+ let Websocket = class {
3216
+ server;
3217
+ };
3218
+ __decorateClass([
3219
+ (0, import_websockets.WebSocketServer)()
3220
+ ], Websocket.prototype, "server", 2);
3221
+ Websocket = __decorateClass([
3222
+ (0, import_common32.Injectable)(),
3223
+ (0, import_websockets.WebSocketGateway)({ cors: { origin: "*" }, transports: ["websocket"] })
3224
+ ], Websocket);
3225
+ for (const gqlMeta of pubsubGqlMetas) {
3226
+ const [argMetas] = getArgMetas(sigRef, gqlMeta.key);
3227
+ Websocket.prototype[gqlMeta.key] = function(...args) {
3228
+ const roomId = makeRoomId(
3229
+ gqlMeta.key,
3230
+ argMetas.map((argMeta) => args[argMeta.idx])
3231
+ );
3232
+ this.server.to(roomId).emit(roomId, args.at(-1));
3233
+ };
3234
+ }
3235
+ return Websocket;
3236
+ };
3237
+
3238
+ // pkgs/@akanjs/server/src/module.ts
3239
+ var hasWebsocket = (signal) => getGqlMetas(signal).some((gqlMeta) => ["Message", "Pubsub"].includes(gqlMeta.type));
3240
+ var hasProcessor = (signal) => getGqlMetas(signal).some((gqlMeta) => gqlMeta.type === "Process");
3241
+ var filterSrvs = (srvs) => Object.fromEntries(Object.entries(srvs).filter(([_, srv]) => !!srv));
3242
+ var databaseModuleOf = ({
3243
+ constant,
3244
+ database,
3245
+ signal,
3246
+ service,
3247
+ uses = {},
3248
+ useAsyncs = {},
3249
+ providers = [],
3250
+ extended
3251
+ }, allSrvs) => {
3252
+ if (!isServiceEnabled(service))
3253
+ return null;
3254
+ const [modelName, className] = [lowerlize(constant.refName), capitalize(constant.refName)];
3255
+ const mongoToken = (0, import_mongoose7.getModelToken)(className);
3256
+ let DatabaseModule = class {
3257
+ };
3258
+ DatabaseModule = __decorateClass([
3259
+ (0, import_common34.Global)(),
3260
+ (0, import_common34.Module)({
3261
+ imports: [
3262
+ import_mongoose7.MongooseModule.forFeature([
3263
+ {
3264
+ name: className,
3265
+ schema: extended ? addSchema(database.Model, database.Doc, database.Input, database.Middleware) : schemaOf(database.Model, database.Doc, database.Middleware)
3266
+ }
3267
+ ]),
3268
+ ...hasProcessor(signal) ? [
3269
+ import_bull2.BullModule.registerQueue({
3270
+ name: modelName,
3271
+ defaultJobOptions: { removeOnComplete: true, removeOnFail: true }
3272
+ })
3273
+ ] : []
3274
+ ],
3275
+ providers: [
3276
+ serviceOf(service),
3277
+ resolverOf(signal, filterSrvs(allSrvs)),
3278
+ ...hasProcessor(signal) ? [
3279
+ processorOf(signal, filterSrvs(allSrvs)),
3280
+ { provide: `${className}Queue`, useFactory: (queue) => queue, inject: [(0, import_bull2.getQueueToken)(modelName)] }
3281
+ ] : [],
3282
+ ...hasWebsocket(signal) ? [websocketOf(signal, filterSrvs(allSrvs)), { provide: "Websocket", useClass: websocketServerOf(signal) }] : [],
3283
+ ...Object.entries(uses).map(([key, useValue]) => ({ provide: capitalize(key), useValue })),
3284
+ ...Object.entries(useAsyncs).map(([key, useFactory]) => ({ provide: capitalize(key), useFactory })),
3285
+ {
3286
+ provide: `${modelName}Model`,
3287
+ useFactory: (model, redis, meili) => {
3288
+ return databaseModelOf(database, model, redis, meili);
3289
+ },
3290
+ inject: [mongoToken, "REDIS_CLIENT", "MEILI_CLIENT"]
3291
+ },
3292
+ ...providers
3293
+ ],
3294
+ controllers: [controllerOf(signal, filterSrvs(allSrvs))],
3295
+ exports: [service]
3296
+ })
3297
+ ], DatabaseModule);
3298
+ return DatabaseModule;
3299
+ };
3300
+ var serviceModuleOf = ({ signal, service, uses = {}, useAsyncs = {}, providers = [] }, allSrvs) => {
3301
+ if (!isServiceEnabled(service))
3302
+ return null;
3303
+ const sigMeta = getSigMeta(signal);
3304
+ const [modelName, className] = [lowerlize(sigMeta.refName), capitalize(sigMeta.refName)];
3305
+ let ServiceModule = class {
3306
+ };
3307
+ ServiceModule = __decorateClass([
3308
+ (0, import_common34.Global)(),
3309
+ (0, import_common34.Module)({
3310
+ imports: [
3311
+ ...hasProcessor(signal) ? [
3312
+ import_bull2.BullModule.registerQueue({
3313
+ name: modelName,
3314
+ defaultJobOptions: { removeOnComplete: true, removeOnFail: true }
3315
+ })
3316
+ ] : []
3317
+ ],
3318
+ providers: [
3319
+ serviceOf(service),
3320
+ resolverOf(signal, filterSrvs(allSrvs)),
3321
+ ...hasWebsocket(signal) ? [websocketOf(signal, filterSrvs(allSrvs)), { provide: "Websocket", useClass: websocketServerOf(signal) }] : [],
3322
+ ...hasProcessor(signal) ? [
3323
+ processorOf(signal, filterSrvs(allSrvs)),
3324
+ { provide: `${className}Queue`, useFactory: (queue) => queue, inject: [(0, import_bull2.getQueueToken)(modelName)] }
3325
+ ] : [],
3326
+ ...Object.entries(uses).map(([key, useValue]) => ({ provide: capitalize(key), useValue })),
3327
+ ...Object.entries(useAsyncs).map(([key, useFactory]) => ({ provide: capitalize(key), useFactory })),
3328
+ ...providers
3329
+ ],
3330
+ controllers: [controllerOf(signal, filterSrvs(allSrvs))],
3331
+ exports: [service]
3332
+ })
3333
+ ], ServiceModule);
3334
+ return ServiceModule;
3335
+ };
3336
+ var scalarModuleOf = ({ signals, uses = {}, useAsyncs = {}, providers = [], enabled = true }, allSrvs) => {
3337
+ if (!enabled)
3338
+ return null;
3339
+ let ScalarModule = class {
3340
+ };
3341
+ ScalarModule = __decorateClass([
3342
+ (0, import_common34.Global)(),
3343
+ (0, import_common34.Module)({
3344
+ imports: [],
3345
+ providers: [
3346
+ ...signals.map((signal) => resolverOf(signal, filterSrvs(allSrvs))),
3347
+ ...signals.filter(hasWebsocket).map((signal) => [
3348
+ websocketOf(signal, filterSrvs(allSrvs)),
3349
+ { provide: "Websocket", useClass: websocketServerOf(signal) }
3350
+ ]).flat(),
3351
+ ...Object.entries(uses).map(([key, useValue]) => ({ provide: capitalize(key), useValue })),
3352
+ ...Object.entries(useAsyncs).map(([key, useFactory]) => ({ provide: capitalize(key), useFactory })),
3353
+ ...providers
3354
+ ],
3355
+ controllers: signals.map((signal) => controllerOf(signal, filterSrvs(allSrvs)))
3356
+ })
3357
+ ], ScalarModule);
3358
+ return ScalarModule;
3359
+ };
3360
+ var scalarModulesOf = ({ constants }, allSrvs) => {
3361
+ const signals = constants.filter((modelRef) => {
3362
+ const childRefs = getChildClassRefs(modelRef);
3363
+ return childRefs.some((childRef) => {
3364
+ const classMeta = getClassMeta(childRef);
3365
+ return ["full", "light"].includes(classMeta.type);
3366
+ });
3367
+ }).map((modelRef) => {
3368
+ let ScalarSignal = class extends LogSignal({}) {
3369
+ };
3370
+ ScalarSignal = __decorateClass([
3371
+ Signal(() => modelRef)
3372
+ ], ScalarSignal);
3373
+ return ScalarSignal;
3374
+ });
3375
+ let ScalarModule = class {
3376
+ };
3377
+ ScalarModule = __decorateClass([
3378
+ (0, import_common34.Global)(),
3379
+ (0, import_common34.Module)({
3380
+ imports: [],
3381
+ providers: [...signals.map((signal) => resolverOf(signal, filterSrvs(allSrvs)))]
3382
+ // controllers: signals.map((signal) => controllerOf(signal, filterSrvs(allSrvs))),
3383
+ })
3384
+ ], ScalarModule);
3385
+ return ScalarModule;
3386
+ };
3387
+ var batchModuleOf = ({
3388
+ service,
3389
+ uses = {},
3390
+ useAsyncs = {},
3391
+ providers = []
3392
+ }) => {
3393
+ if (!isServiceEnabled(service))
3394
+ return null;
3395
+ let BatchModule = class {
3396
+ };
3397
+ BatchModule = __decorateClass([
3398
+ (0, import_common34.Global)(),
3399
+ (0, import_common34.Module)({
3400
+ imports: [],
3401
+ providers: [
3402
+ serviceOf(service),
3403
+ ...Object.entries(uses).map(([key, useValue]) => ({ provide: capitalize(key), useValue })),
3404
+ ...Object.entries(useAsyncs).map(([key, useFactory]) => ({ provide: capitalize(key), useFactory })),
3405
+ ...providers
3406
+ ],
3407
+ exports: [service]
3408
+ })
3409
+ ], BatchModule);
3410
+ return BatchModule;
3411
+ };
3412
+ var useGlobals = ({ uses, useAsyncs, injects }) => {
3413
+ let GlobalsModule = class {
3414
+ };
3415
+ GlobalsModule = __decorateClass([
3416
+ (0, import_common34.Global)(),
3417
+ (0, import_common34.Module)({
3418
+ imports: [],
3419
+ providers: [
3420
+ ...Object.entries(uses ?? {}).map(([key, useValue]) => ({
3421
+ provide: capitalize(key),
3422
+ useValue
3423
+ })),
3424
+ ...Object.entries(useAsyncs ?? {}).map(([key, useFactory]) => ({ provide: capitalize(key), useFactory })),
3425
+ ...Object.entries(injects ?? {}).map(([key, inject]) => ({ provide: capitalize(key), useClass: inject }))
3426
+ ],
3427
+ exports: [
3428
+ ...Object.keys(uses ?? {}).map((key) => capitalize(key)),
3429
+ ...Object.keys(useAsyncs ?? {}).map((key) => capitalize(key)),
3430
+ ...Object.keys(injects ?? {}).map((key) => capitalize(key))
3431
+ ]
3432
+ })
3433
+ ], GlobalsModule);
3434
+ return GlobalsModule;
3435
+ };
3436
+
3437
+ // pkgs/@akanjs/server/src/boot.ts
3438
+ var import_apollo2 = __require("@nestjs/apollo");
3439
+ var import_bull3 = __require("@nestjs/bull");
3440
+ var import_common38 = __require("@nestjs/common");
3441
+ var import_core2 = __require("@nestjs/core");
3442
+ var import_graphql5 = __require("@nestjs/graphql");
3443
+ var import_mongoose9 = __require("@nestjs/mongoose");
3444
+ var import_schedule2 = __require("@nestjs/schedule");
3445
+ var import_body_parser = __require("body-parser");
3446
+ var import_cookie_parser = __toESM(__require("cookie-parser"));
3447
+ var import_dgram = __toESM(__require("dgram"));
3448
+ var import_events = __toESM(__require("events"));
3449
+ var import_graphql_upload2 = __require("graphql-upload");
3450
+ var import_meilisearch = __require("meilisearch");
3451
+ var import_path = __require("path");
3452
+ var import_redis2 = __require("redis");
3453
+
3454
+ // pkgs/@akanjs/server/src/searchDaemon.ts
3455
+ var import_common36 = __require("@nestjs/common");
3456
+ var import_mongoose8 = __require("@nestjs/mongoose");
3457
+ var hasTextField2 = (modelRef) => {
3458
+ const fieldMetas = getFieldMetas(modelRef);
3459
+ return fieldMetas.some(
3460
+ (fieldMeta) => !!fieldMeta.text || fieldMeta.isScalar && fieldMeta.isClass && fieldMeta.select && hasTextField2(fieldMeta.modelRef)
3461
+ );
3462
+ };
3463
+ var getTextFieldKeys = (modelRef) => {
3464
+ const allSearchFields = [];
3465
+ const allFilterFields = [];
3466
+ const fieldMetaMap = getFieldMetaMap(modelRef);
3467
+ const fieldMetas = [...fieldMetaMap.values()];
3468
+ const stringTextFields = fieldMetas.filter((fieldMeta) => !!fieldMeta.text).map((fieldMeta) => {
3469
+ if (fieldMeta.text === "filter")
3470
+ allFilterFields.push(fieldMeta.key);
3471
+ else if (fieldMeta.text === "search")
3472
+ allSearchFields.push(fieldMeta.key);
3473
+ return fieldMeta.key;
3474
+ });
3475
+ const scalarTextFields = fieldMetas.filter(
3476
+ (fieldMeta) => fieldMeta.isScalar && fieldMeta.isClass && fieldMeta.select && hasTextField2(fieldMeta.modelRef)
3477
+ ).map((fieldMeta) => fieldMeta.key);
3478
+ const deepFields = scalarTextFields.map((key) => {
3479
+ const fieldMeta = fieldMetaMap.get(key);
3480
+ if (!fieldMeta)
3481
+ throw new Error(`No fieldMeta for ${key}`);
3482
+ const { stringTextFields: stringTextFields2, allTextFields, allSearchFields: allSearchFields2, allFilterFields: allFilterFields2 } = getTextFieldKeys(
3483
+ fieldMeta.modelRef
3484
+ );
3485
+ allFilterFields2.push(...allSearchFields2.map((field) => `${key}.${field}`));
3486
+ allSearchFields2.push(...stringTextFields2.map((field) => `${key}.${field}`));
3487
+ return [
3488
+ ...stringTextFields2.map((field) => `${key}.${field}`),
3489
+ ...allTextFields.map((field) => `${key}.${field}`)
3490
+ ];
3491
+ }).flat();
3492
+ return {
3493
+ stringTextFields,
3494
+ scalarTextFields,
3495
+ allTextFields: [...stringTextFields, ...deepFields],
3496
+ allSearchFields,
3497
+ allFilterFields
3498
+ };
3499
+ };
3500
+ var makeTextFilter = (modelRef) => {
3501
+ const fieldMetaMap = getFieldMetaMap(modelRef);
3502
+ const { stringTextFields, scalarTextFields } = getTextFieldKeys(modelRef);
3503
+ const filterData = (data, assignObj = {}) => {
3504
+ if (Array.isArray(data))
3505
+ return data.map((d) => filterData(d));
3506
+ return Object.assign(
3507
+ Object.fromEntries([
3508
+ ...stringTextFields.map((key) => [key, data[key]]),
3509
+ ...scalarTextFields.map((key) => {
3510
+ const fieldMeta = fieldMetaMap.get(key);
3511
+ if (!fieldMeta)
3512
+ throw new Error(`No fieldMeta for ${key}`);
3513
+ const filterFunc = makeTextFilter(fieldMeta.modelRef);
3514
+ return [key, filterFunc(data[key])];
3515
+ })
3516
+ ]),
3517
+ assignObj
3518
+ );
3519
+ };
3520
+ return filterData;
3521
+ };
3522
+ var getSortableAttributes = (refName) => {
3523
+ const cnst = getCnstMeta(refName);
3524
+ const sortMap = getFilterSortMap(cnst.Filter);
3525
+ const sortFields = Object.values(sortMap).filter((val) => typeof val === "object").map((sort) => Object.keys(sort)).flat();
3526
+ return [...new Set(sortFields)];
3527
+ };
3528
+ var SearchDaemon = class {
3529
+ constructor(connection, meili) {
3530
+ this.connection = connection;
3531
+ this.meili = meili;
3532
+ }
3533
+ logger = new Logger("SearchDaemon");
3534
+ async onModuleInit() {
3535
+ const databaseModelNames = getAllDatabaseModelNames();
3536
+ const indexes = (await this.meili.getIndexes({ limit: 1e3 })).results;
3537
+ const indexMap = new Map(indexes.map((index) => [index.uid, index]));
3538
+ const indexCreationNames = [];
3539
+ const indexUpdateNames = [];
3540
+ for (const modelName of databaseModelNames) {
3541
+ const indexName = lowerlize(modelName);
3542
+ const modelRef = getFullModelRef(modelName);
3543
+ if (!hasTextField2(modelRef))
3544
+ continue;
3545
+ const index = indexMap.get(indexName);
3546
+ if (!index)
3547
+ indexCreationNames.push(indexName);
3548
+ else if (index.primaryKey !== "id")
3549
+ indexUpdateNames.push(indexName);
3550
+ }
3551
+ for (const indexName of indexCreationNames)
3552
+ await this.meili.createIndex(indexName, { primaryKey: "id" });
3553
+ for (const indexName of indexUpdateNames)
3554
+ await this.meili.updateIndex(indexName, { primaryKey: "id" });
3555
+ for (const modelName of databaseModelNames) {
3556
+ const indexName = lowerlize(modelName);
3557
+ const model = this.connection.models[modelName];
3558
+ const modelRef = getFullModelRef(modelName);
3559
+ if (!hasTextField2(modelRef))
3560
+ continue;
3561
+ const searchIndex = this.meili.index(indexName);
3562
+ const { stringTextFields, scalarTextFields, allSearchFields, allFilterFields } = getTextFieldKeys(modelRef);
3563
+ const settings = await searchIndex.getSettings();
3564
+ const allSearchFieldSet = new Set(allSearchFields);
3565
+ const allFilterFieldSet = new Set(allFilterFields);
3566
+ const searchFieldSet = new Set(settings.searchableAttributes);
3567
+ const filterFieldSet = new Set(settings.filterableAttributes);
3568
+ const needUpdateSetting = !allSearchFields.every((field) => searchFieldSet.has(field)) || !allFilterFields.every((field) => filterFieldSet.has(field)) || !settings.searchableAttributes?.every((field) => allSearchFieldSet.has(field)) || !settings.filterableAttributes?.every((field) => allFilterFieldSet.has(field));
3569
+ if (needUpdateSetting) {
3570
+ this.logger.info(`update index settings (${modelName})`);
3571
+ await searchIndex.updateSettings({
3572
+ searchableAttributes: allSearchFields,
3573
+ filterableAttributes: allFilterFields,
3574
+ sortableAttributes: getSortableAttributes(indexName)
3575
+ });
3576
+ }
3577
+ const stringTextFieldSet = new Set(stringTextFields);
3578
+ const scalarTextFieldSet = new Set(scalarTextFields);
3579
+ const filterText = makeTextFilter(modelRef);
3580
+ model.watch().on("change", async (data) => {
3581
+ try {
3582
+ const id = data.documentKey._id.toString();
3583
+ if (data.operationType === "delete") {
3584
+ this.logger.trace(`delete text doc (${modelName}): ${id}`);
3585
+ return await searchIndex.deleteDocument(id);
3586
+ } else if (data.operationType === "insert") {
3587
+ this.logger.trace(`insert text doc (${modelName}): ${data.documentKey._id}`);
3588
+ if (!data.fullDocument)
3589
+ throw new Error("No fullDocument");
3590
+ const textFilteredData = filterText(data.fullDocument);
3591
+ return await searchIndex.addDocuments([textFilteredData]);
3592
+ } else if (data.operationType === "update") {
3593
+ const updatedFields = data.updateDescription?.updatedFields ?? {};
3594
+ const isRemoved = !!updatedFields.removedAt;
3595
+ if (isRemoved) {
3596
+ this.logger.trace(`remove text doc (${modelName}): ${id}`);
3597
+ return await searchIndex.deleteDocument(id);
3598
+ }
3599
+ this.logger.trace(`update text doc (${modelName}): ${data.documentKey._id}`);
3600
+ const updatedFieldKeys = Object.keys(updatedFields);
3601
+ const removedFieldKeys = data.updateDescription?.removedFields ?? [];
3602
+ const isScalarTextFieldUpdated = [...updatedFieldKeys, ...removedFieldKeys].map((key) => key.split(".")[0]).some((key) => scalarTextFieldSet.has(key));
3603
+ if (isScalarTextFieldUpdated) {
3604
+ const doc = await model.findById(data.documentKey._id);
3605
+ if (!doc)
3606
+ this.logger.error(`No doc for ${data.documentKey._id}`);
3607
+ const textFilteredData = filterText(doc, { id });
3608
+ return await searchIndex.updateDocuments([textFilteredData]);
3609
+ } else {
3610
+ const updateKeys = updatedFieldKeys.filter((key) => stringTextFieldSet.has(key));
3611
+ const removeKeys = removedFieldKeys.filter((key) => stringTextFieldSet.has(key));
3612
+ if (!updateKeys.length && !removeKeys.length)
3613
+ return;
3614
+ const textFilteredData = Object.fromEntries([
3615
+ ["id", id],
3616
+ ...updateKeys.map((key) => [key, updatedFields[key]]),
3617
+ ...removeKeys.map((key) => [key, null])
3618
+ ]);
3619
+ return await searchIndex.updateDocuments([textFilteredData]);
3620
+ }
3621
+ }
3622
+ } catch (e) {
3623
+ this.logger.error(e);
3624
+ }
3625
+ });
3626
+ }
3627
+ }
3628
+ };
3629
+ SearchDaemon = __decorateClass([
3630
+ (0, import_common36.Injectable)(),
3631
+ __decorateParam(0, (0, import_mongoose8.InjectConnection)()),
3632
+ __decorateParam(1, (0, import_common36.Inject)("MEILI_CLIENT"))
3633
+ ], SearchDaemon);
3634
+ var SearchDaemonModule = class {
3635
+ };
3636
+ SearchDaemonModule = __decorateClass([
3637
+ (0, import_common36.Global)(),
3638
+ (0, import_common36.Module)({
3639
+ providers: [SearchDaemon]
3640
+ })
3641
+ ], SearchDaemonModule);
3642
+
3643
+ // pkgs/@akanjs/server/src/boot.ts
3644
+ var createNestApp = async ({ registerModules, serverMode = "federation", env, log = true }) => {
3645
+ const backendLogger = new Logger("Backend");
3646
+ if (log)
3647
+ backendLogger.rawLog(logo);
3648
+ const jwtSecret = generateJwtSecret(env.appName, env.environment);
3649
+ const [redisUri, mongoUri, meiliUri] = await Promise.all([
3650
+ env.redisUri ?? generateRedisUri({ ...env, ...env.redis?.sshOptions ? { sshOptions: env.redis.sshOptions } : {} }),
3651
+ env.mongoUri ?? generateMongoUri({
3652
+ ...env,
3653
+ ...env.mongo.username ? { username: env.mongo.username } : {},
3654
+ password: env.mongo.password,
3655
+ ...env.mongo.sshOptions ? { sshOptions: env.mongo.sshOptions } : {}
3656
+ }),
3657
+ env.meiliUri ?? generateMeiliUri(env)
3658
+ ]);
3659
+ if (env.operationMode === "local") {
3660
+ backendLogger.verbose(`connect to redis: ${redisUri}`);
3661
+ backendLogger.verbose(`connect to mongo: ${mongoUri}`);
3662
+ backendLogger.verbose(`connect to meili: ${meiliUri}`);
3663
+ }
3664
+ initMongoDB({ logging: baseEnv.environment !== "main", sendReport: false });
3665
+ import_events.default.EventEmitter.defaultMaxListeners = 1e3;
3666
+ let AuthMiddleWare = class {
3667
+ use(req, res, next) {
3668
+ const requestHeader = req;
3669
+ requestHeader.account = verifyToken(
3670
+ jwtSecret,
3671
+ requestHeader.headers.authorization ?? (requestHeader.cookies?.jwt ? `Bearer ${requestHeader.cookies.jwt}` : void 0)
3672
+ );
3673
+ requestHeader.userAgent = requestHeader["user-agent"];
3674
+ next();
3675
+ }
3676
+ };
3677
+ AuthMiddleWare = __decorateClass([
3678
+ (0, import_common38.Injectable)()
3679
+ ], AuthMiddleWare);
3680
+ const redisClient = await (0, import_redis2.createClient)({ url: redisUri }).connect();
3681
+ let SubDatabaseModule = class {
3682
+ };
3683
+ SubDatabaseModule = __decorateClass([
3684
+ (0, import_common38.Global)(),
3685
+ (0, import_common38.Module)({
3686
+ providers: [
3687
+ { provide: "REDIS_CLIENT", useValue: redisClient },
3688
+ {
3689
+ provide: "MEILI_CLIENT",
3690
+ useFactory: () => new import_meilisearch.MeiliSearch({ host: meiliUri, apiKey: generateMeiliKey(env) })
3691
+ }
3692
+ ],
3693
+ exports: ["REDIS_CLIENT", "MEILI_CLIENT"]
3694
+ })
3695
+ ], SubDatabaseModule);
3696
+ let AppModule = class {
3697
+ configure(consumer) {
3698
+ consumer.apply(AuthMiddleWare).forRoutes({ path: "*", method: import_common38.RequestMethod.ALL });
3699
+ }
3700
+ };
3701
+ AppModule = __decorateClass([
3702
+ (0, import_common38.Module)({
3703
+ imports: [
3704
+ import_bull3.BullModule.forRoot({ redis: redisUri }),
3705
+ import_schedule2.ScheduleModule.forRoot(),
3706
+ import_graphql5.GraphQLModule.forRootAsync({
3707
+ imports: [],
3708
+ useFactory: () => ({
3709
+ useGlobalPrefix: true,
3710
+ autoSchemaFile: (0, import_path.join)(process.cwd(), "src/schema.gql"),
3711
+ sortSchema: true,
3712
+ playground: baseEnv.environment !== "main",
3713
+ introspection: baseEnv.environment !== "main",
3714
+ uploads: false,
3715
+ debug: false
3716
+ }),
3717
+ driver: import_apollo2.ApolloDriver
3718
+ }),
3719
+ import_mongoose9.MongooseModule.forRootAsync({
3720
+ useFactory: () => ({ uri: mongoUri, autoIndex: baseEnv.environment !== "main" })
3721
+ }),
3722
+ SubDatabaseModule,
3723
+ useGlobals({
3724
+ injects: { SearchClient, DatabaseClient, CacheClient }
3725
+ }),
3726
+ ...["batch", "all"].includes(serverMode) && baseEnv.operationMode !== "edge" ? [SearchDaemonModule] : [],
3727
+ ...registerModules(env).filter((m) => !!m)
3728
+ ],
3729
+ providers: [DateScalar]
3730
+ })
3731
+ ], AppModule);
3732
+ const app = await import_core2.NestFactory.create(AppModule, { logger: backendLogger });
3733
+ const redisIoAdapter = new RedisIoAdapter(app, { jwtSecret });
3734
+ await redisIoAdapter.connectToRedis(redisUri);
3735
+ app.enableShutdownHooks();
3736
+ const udp = import_dgram.default.createSocket("udp4");
3737
+ client.setUdp(udp);
3738
+ if (["federation", "all"].includes(serverMode)) {
3739
+ app.setGlobalPrefix(process.env.GLOBAL_PREFIX ?? "/backend");
3740
+ app.enableCors({
3741
+ origin: "*",
3742
+ methods: "GET,HEAD,PUT,PATCH,POST,DELETE",
3743
+ preflightContinue: false,
3744
+ optionsSuccessStatus: 204,
3745
+ allowedHeaders: "DNT,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization,apollo-require-preflight"
3746
+ });
3747
+ if (env.operationMode !== "local" && process.env.USE_REDIS_IO_ADAPTER !== "false")
3748
+ app.useWebSocketAdapter(redisIoAdapter);
3749
+ app.use((0, import_body_parser.json)({ limit: "100mb" }));
3750
+ app.use((0, import_body_parser.urlencoded)({ limit: "100mb", extended: true }));
3751
+ app.use("/backend/graphql", (0, import_graphql_upload2.graphqlUploadExpress)());
3752
+ app.use((0, import_cookie_parser.default)());
3753
+ app.useGlobalInterceptors(new LoggingInterceptor());
3754
+ app.useGlobalInterceptors(new TimeoutInterceptor());
3755
+ app.useGlobalInterceptors(new CacheInterceptor(redisClient));
3756
+ app.useGlobalFilters(new AllExceptionsFilter());
3757
+ await app.listen(process.env.PORT ?? env.port ?? 8080);
3758
+ backendLogger.log(`\u{1F680} Server is running on: ${await app.getUrl()}`);
3759
+ } else {
3760
+ await app.init();
3761
+ backendLogger.log(`\u{1F680} Batch Server is running`);
3762
+ }
3763
+ if (module.hot) {
3764
+ module.hot.accept();
3765
+ module.hot.dispose(() => {
3766
+ void app.close();
3767
+ });
3768
+ }
3769
+ return {
3770
+ nestApp: app,
3771
+ close: async () => {
3772
+ await app.close();
3773
+ await redisIoAdapter.destroy();
3774
+ await redisClient.quit();
3775
+ }
3776
+ };
3777
+ };
3778
+ })();
3779
+ //! Nextjs는 환경변수를 build time에 그냥 하드코딩으로 값을 넣어버림. operationMode같은것들 잘 동작안할 수 있음. 추후 수정 필요.
3780
+ //! 임시 적용 테스트
3781
+ //! 잘되는지 확인 필요