@devbro/pashmak 0.1.49 → 0.1.52
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/dist/DatabaseServiceProvider.d.mts +2 -2
- package/dist/DatabaseServiceProvider.mjs +5 -1
- package/dist/DatabaseServiceProvider.mjs.map +1 -1
- package/dist/app/console/generate/GenerateApiDocsCommand.mjs +5 -5
- package/dist/app/console/generate/GenerateApiDocsCommand.mjs.map +1 -1
- package/dist/app/console/project/base_project/src/config/default.mts.tpl +16 -1
- package/dist/bin/DatabaseServiceProvider.cjs +4 -0
- package/dist/bin/app/console/DefaultCommand.cjs +97 -58
- package/dist/bin/app/console/KeyGenerateCommand.cjs +97 -58
- package/dist/bin/app/console/StartCommand.cjs +97 -58
- package/dist/bin/app/console/generate/GenerateApiDocsCommand.cjs +102 -63
- package/dist/bin/app/console/generate/GenerateControllerCommand.cjs +97 -58
- package/dist/bin/app/console/generate/index.cjs +102 -63
- package/dist/bin/app/console/index.cjs +102 -63
- package/dist/bin/app/console/migrate/GenerateMigrateCommand.cjs +97 -58
- package/dist/bin/app/console/migrate/MigrateCommand.cjs +97 -58
- package/dist/bin/app/console/migrate/MigrateRollbackCommand.cjs +97 -58
- package/dist/bin/app/console/migrate/index.cjs +97 -58
- package/dist/bin/app/console/queue/GenerateQueueMigrateCommand.cjs +97 -58
- package/dist/bin/cache.cjs +97 -58
- package/dist/bin/facades.cjs +97 -58
- package/dist/bin/factories.cjs +97 -58
- package/dist/bin/http.cjs +97 -58
- package/dist/bin/index.cjs +106 -63
- package/dist/bin/middlewares.cjs +97 -58
- package/dist/bin/queue.cjs +97 -58
- package/dist/facades.d.mts +6 -6
- package/dist/facades.mjs +97 -58
- package/dist/facades.mjs.map +1 -1
- package/package.json +1 -1
package/dist/bin/middlewares.cjs
CHANGED
|
@@ -689,27 +689,58 @@ import_neko_storage.StorageProviderFactory.register("sftp", (opt) => {
|
|
|
689
689
|
// src/facades.mts
|
|
690
690
|
var import_neko_cache2 = require("@devbro/neko-cache");
|
|
691
691
|
var import_neko_queue2 = require("@devbro/neko-queue");
|
|
692
|
+
function wrapSingletonWithAccessors(singletonFn) {
|
|
693
|
+
let methodsInitialized = false;
|
|
694
|
+
const initializeMethods = /* @__PURE__ */ __name(() => {
|
|
695
|
+
if (methodsInitialized) return;
|
|
696
|
+
const defaultInstance = singletonFn();
|
|
697
|
+
const prototype = Object.getPrototypeOf(defaultInstance);
|
|
698
|
+
const methodNames = Object.getOwnPropertyNames(prototype).filter(
|
|
699
|
+
(name) => name !== "constructor" && typeof prototype[name] === "function"
|
|
700
|
+
);
|
|
701
|
+
for (const methodName of methodNames) {
|
|
702
|
+
singletonFn[methodName] = (...args) => {
|
|
703
|
+
const instance = singletonFn();
|
|
704
|
+
return instance[methodName](...args);
|
|
705
|
+
};
|
|
706
|
+
}
|
|
707
|
+
methodsInitialized = true;
|
|
708
|
+
}, "initializeMethods");
|
|
709
|
+
return new Proxy(singletonFn, {
|
|
710
|
+
get(target, prop, receiver) {
|
|
711
|
+
if (typeof prop === "string" && !Reflect.has(target, prop)) {
|
|
712
|
+
initializeMethods();
|
|
713
|
+
}
|
|
714
|
+
return Reflect.get(target, prop, receiver);
|
|
715
|
+
}
|
|
716
|
+
});
|
|
717
|
+
}
|
|
718
|
+
__name(wrapSingletonWithAccessors, "wrapSingletonWithAccessors");
|
|
692
719
|
var router = (0, import_neko_helper3.createSingleton)(() => new Router());
|
|
693
|
-
var scheduler = (
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
720
|
+
var scheduler = wrapSingletonWithAccessors(
|
|
721
|
+
(0, import_neko_helper3.createSingleton)(() => {
|
|
722
|
+
const rc = new import_neko_scheduler.Scheduler();
|
|
723
|
+
rc.setErrorHandler((err, job) => {
|
|
724
|
+
logger().error({
|
|
725
|
+
msg: "Scheduled job error",
|
|
726
|
+
err,
|
|
727
|
+
job_name: job.getName()
|
|
728
|
+
});
|
|
700
729
|
});
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
730
|
+
return rc;
|
|
731
|
+
})
|
|
732
|
+
);
|
|
704
733
|
var db = /* @__PURE__ */ __name((label = "default") => (0, import_neko_context3.ctx)().getOrThrow(["database", label]), "db");
|
|
705
|
-
var storage = (
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
734
|
+
var storage = wrapSingletonWithAccessors(
|
|
735
|
+
(0, import_neko_helper3.createSingleton)((label = "default") => {
|
|
736
|
+
let storage_config = import_neko_config.config.get(["storages", label].join("."));
|
|
737
|
+
const provider = import_neko_storage2.StorageProviderFactory.create(
|
|
738
|
+
storage_config.provider,
|
|
739
|
+
storage_config.config
|
|
740
|
+
);
|
|
741
|
+
return new import_neko_storage2.Storage(provider);
|
|
742
|
+
})
|
|
743
|
+
);
|
|
713
744
|
var cli = (0, import_neko_helper3.createSingleton)(() => {
|
|
714
745
|
const [node, app, ...args] = process.argv;
|
|
715
746
|
return new import_clipanion.Cli({
|
|
@@ -724,46 +755,54 @@ var httpServer = (0, import_neko_helper3.createSingleton)(() => {
|
|
|
724
755
|
server.setRouter(router());
|
|
725
756
|
return server;
|
|
726
757
|
});
|
|
727
|
-
var logger = (
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
mailer_config.config
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
queue_config.
|
|
752
|
-
queue_config
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
}
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
});
|
|
758
|
+
var logger = wrapSingletonWithAccessors(
|
|
759
|
+
(0, import_neko_helper3.createSingleton)((label) => {
|
|
760
|
+
const logger_config = import_neko_config.config.get(["loggers", label].join("."));
|
|
761
|
+
const rc = new import_neko_logger.Logger(logger_config);
|
|
762
|
+
rc.setExtrasFunction((message) => {
|
|
763
|
+
message.requestId = (0, import_neko_context3.ctxSafe)()?.get("requestId") || "N/A";
|
|
764
|
+
return message;
|
|
765
|
+
});
|
|
766
|
+
return rc;
|
|
767
|
+
})
|
|
768
|
+
);
|
|
769
|
+
var mailer = wrapSingletonWithAccessors(
|
|
770
|
+
(0, import_neko_helper3.createSingleton)((label) => {
|
|
771
|
+
const mailer_config = import_neko_config.config.get(["mailer", label].join("."));
|
|
772
|
+
const provider = import_neko_mailer2.MailerProviderFactory.create(
|
|
773
|
+
mailer_config.provider,
|
|
774
|
+
mailer_config.config
|
|
775
|
+
);
|
|
776
|
+
const rc = new import_neko_mailer2.Mailer(provider);
|
|
777
|
+
return rc;
|
|
778
|
+
})
|
|
779
|
+
);
|
|
780
|
+
var queue = wrapSingletonWithAccessors(
|
|
781
|
+
(0, import_neko_helper3.createSingleton)((label) => {
|
|
782
|
+
const queue_config = import_neko_config.config.get(["queues", label].join("."));
|
|
783
|
+
if (!queue_config) {
|
|
784
|
+
throw new Error(`Queue configuration for '${label}' not found`);
|
|
785
|
+
}
|
|
786
|
+
const provider = import_neko_queue2.QueueTransportFactory.create(
|
|
787
|
+
queue_config.provider,
|
|
788
|
+
queue_config.config
|
|
789
|
+
);
|
|
790
|
+
return new import_neko_queue2.QueueConnection(provider);
|
|
791
|
+
})
|
|
792
|
+
);
|
|
793
|
+
var cache = wrapSingletonWithAccessors(
|
|
794
|
+
(0, import_neko_helper3.createSingleton)((label) => {
|
|
795
|
+
const cache_config = import_neko_config.config.get(["caches", label].join("."));
|
|
796
|
+
if (!cache_config) {
|
|
797
|
+
throw new Error(`Cache configuration for '${label}' not found`);
|
|
798
|
+
}
|
|
799
|
+
const provider = CacheProviderFactory.create(
|
|
800
|
+
cache_config.provider,
|
|
801
|
+
cache_config.config
|
|
802
|
+
);
|
|
803
|
+
return new import_neko_cache2.Cache(provider);
|
|
804
|
+
})
|
|
805
|
+
);
|
|
767
806
|
|
|
768
807
|
// src/middlewares.mts
|
|
769
808
|
var import_neko_http2 = require("@devbro/neko-http");
|
package/dist/bin/queue.cjs
CHANGED
|
@@ -585,27 +585,58 @@ import_neko_storage.StorageProviderFactory.register("sftp", (opt) => {
|
|
|
585
585
|
// src/facades.mts
|
|
586
586
|
var import_neko_cache2 = require("@devbro/neko-cache");
|
|
587
587
|
var import_neko_queue2 = require("@devbro/neko-queue");
|
|
588
|
+
function wrapSingletonWithAccessors(singletonFn) {
|
|
589
|
+
let methodsInitialized = false;
|
|
590
|
+
const initializeMethods = /* @__PURE__ */ __name(() => {
|
|
591
|
+
if (methodsInitialized) return;
|
|
592
|
+
const defaultInstance = singletonFn();
|
|
593
|
+
const prototype = Object.getPrototypeOf(defaultInstance);
|
|
594
|
+
const methodNames = Object.getOwnPropertyNames(prototype).filter(
|
|
595
|
+
(name) => name !== "constructor" && typeof prototype[name] === "function"
|
|
596
|
+
);
|
|
597
|
+
for (const methodName of methodNames) {
|
|
598
|
+
singletonFn[methodName] = (...args) => {
|
|
599
|
+
const instance = singletonFn();
|
|
600
|
+
return instance[methodName](...args);
|
|
601
|
+
};
|
|
602
|
+
}
|
|
603
|
+
methodsInitialized = true;
|
|
604
|
+
}, "initializeMethods");
|
|
605
|
+
return new Proxy(singletonFn, {
|
|
606
|
+
get(target, prop, receiver) {
|
|
607
|
+
if (typeof prop === "string" && !Reflect.has(target, prop)) {
|
|
608
|
+
initializeMethods();
|
|
609
|
+
}
|
|
610
|
+
return Reflect.get(target, prop, receiver);
|
|
611
|
+
}
|
|
612
|
+
});
|
|
613
|
+
}
|
|
614
|
+
__name(wrapSingletonWithAccessors, "wrapSingletonWithAccessors");
|
|
588
615
|
var router = (0, import_neko_helper2.createSingleton)(() => new Router());
|
|
589
|
-
var scheduler = (
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
616
|
+
var scheduler = wrapSingletonWithAccessors(
|
|
617
|
+
(0, import_neko_helper2.createSingleton)(() => {
|
|
618
|
+
const rc = new import_neko_scheduler.Scheduler();
|
|
619
|
+
rc.setErrorHandler((err, job) => {
|
|
620
|
+
logger().error({
|
|
621
|
+
msg: "Scheduled job error",
|
|
622
|
+
err,
|
|
623
|
+
job_name: job.getName()
|
|
624
|
+
});
|
|
596
625
|
});
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
626
|
+
return rc;
|
|
627
|
+
})
|
|
628
|
+
);
|
|
600
629
|
var db = /* @__PURE__ */ __name((label = "default") => (0, import_neko_context2.ctx)().getOrThrow(["database", label]), "db");
|
|
601
|
-
var storage = (
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
630
|
+
var storage = wrapSingletonWithAccessors(
|
|
631
|
+
(0, import_neko_helper2.createSingleton)((label = "default") => {
|
|
632
|
+
let storage_config = import_neko_config.config.get(["storages", label].join("."));
|
|
633
|
+
const provider = import_neko_storage2.StorageProviderFactory.create(
|
|
634
|
+
storage_config.provider,
|
|
635
|
+
storage_config.config
|
|
636
|
+
);
|
|
637
|
+
return new import_neko_storage2.Storage(provider);
|
|
638
|
+
})
|
|
639
|
+
);
|
|
609
640
|
var cli = (0, import_neko_helper2.createSingleton)(() => {
|
|
610
641
|
const [node, app, ...args] = process.argv;
|
|
611
642
|
return new import_clipanion.Cli({
|
|
@@ -620,46 +651,54 @@ var httpServer = (0, import_neko_helper2.createSingleton)(() => {
|
|
|
620
651
|
server.setRouter(router());
|
|
621
652
|
return server;
|
|
622
653
|
});
|
|
623
|
-
var logger = (
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
mailer_config.config
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
queue_config.
|
|
648
|
-
queue_config
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
}
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
});
|
|
654
|
+
var logger = wrapSingletonWithAccessors(
|
|
655
|
+
(0, import_neko_helper2.createSingleton)((label) => {
|
|
656
|
+
const logger_config = import_neko_config.config.get(["loggers", label].join("."));
|
|
657
|
+
const rc = new import_neko_logger.Logger(logger_config);
|
|
658
|
+
rc.setExtrasFunction((message) => {
|
|
659
|
+
message.requestId = (0, import_neko_context2.ctxSafe)()?.get("requestId") || "N/A";
|
|
660
|
+
return message;
|
|
661
|
+
});
|
|
662
|
+
return rc;
|
|
663
|
+
})
|
|
664
|
+
);
|
|
665
|
+
var mailer = wrapSingletonWithAccessors(
|
|
666
|
+
(0, import_neko_helper2.createSingleton)((label) => {
|
|
667
|
+
const mailer_config = import_neko_config.config.get(["mailer", label].join("."));
|
|
668
|
+
const provider = import_neko_mailer2.MailerProviderFactory.create(
|
|
669
|
+
mailer_config.provider,
|
|
670
|
+
mailer_config.config
|
|
671
|
+
);
|
|
672
|
+
const rc = new import_neko_mailer2.Mailer(provider);
|
|
673
|
+
return rc;
|
|
674
|
+
})
|
|
675
|
+
);
|
|
676
|
+
var queue = wrapSingletonWithAccessors(
|
|
677
|
+
(0, import_neko_helper2.createSingleton)((label) => {
|
|
678
|
+
const queue_config = import_neko_config.config.get(["queues", label].join("."));
|
|
679
|
+
if (!queue_config) {
|
|
680
|
+
throw new Error(`Queue configuration for '${label}' not found`);
|
|
681
|
+
}
|
|
682
|
+
const provider = import_neko_queue2.QueueTransportFactory.create(
|
|
683
|
+
queue_config.provider,
|
|
684
|
+
queue_config.config
|
|
685
|
+
);
|
|
686
|
+
return new import_neko_queue2.QueueConnection(provider);
|
|
687
|
+
})
|
|
688
|
+
);
|
|
689
|
+
var cache = wrapSingletonWithAccessors(
|
|
690
|
+
(0, import_neko_helper2.createSingleton)((label) => {
|
|
691
|
+
const cache_config = import_neko_config.config.get(["caches", label].join("."));
|
|
692
|
+
if (!cache_config) {
|
|
693
|
+
throw new Error(`Cache configuration for '${label}' not found`);
|
|
694
|
+
}
|
|
695
|
+
const provider = CacheProviderFactory.create(
|
|
696
|
+
cache_config.provider,
|
|
697
|
+
cache_config.config
|
|
698
|
+
);
|
|
699
|
+
return new import_neko_cache2.Cache(provider);
|
|
700
|
+
})
|
|
701
|
+
);
|
|
663
702
|
|
|
664
703
|
// src/queue.mts
|
|
665
704
|
var import_neko_helper3 = require("@devbro/neko-helper");
|
package/dist/facades.d.mts
CHANGED
|
@@ -12,14 +12,14 @@ import { Logger } from '@devbro/neko-logger';
|
|
|
12
12
|
import { Cache } from '@devbro/neko-cache';
|
|
13
13
|
|
|
14
14
|
declare const router: (label?: string, ...args: any[]) => Router;
|
|
15
|
-
declare const scheduler: (label?: string, ...args: any[]) => Scheduler
|
|
15
|
+
declare const scheduler: ((label?: string, ...args: any[]) => Scheduler) & Omit<Scheduler, keyof Function>;
|
|
16
16
|
declare const db: (label?: string) => Connection;
|
|
17
|
-
declare const storage: (label?: string, ...args: any[]) => Storage
|
|
17
|
+
declare const storage: ((label?: string, ...args: any[]) => Storage) & Omit<Storage, keyof Function>;
|
|
18
18
|
declare const cli: (label?: string, ...args: any[]) => Cli<clipanion.BaseContext>;
|
|
19
19
|
declare const httpServer: (label?: string, ...args: any[]) => HttpServer;
|
|
20
|
-
declare const logger: (label?: string, ...args: any[]) => Logger
|
|
21
|
-
declare const mailer: (label?: string, ...args: any[]) => Mailer
|
|
22
|
-
declare const queue: (label?: string, ...args: any[]) => QueueConnection<Record<string, _devbro_neko_queue.QueueMessageInterface
|
|
23
|
-
declare const cache: (label?: string, ...args: any[]) => Cache
|
|
20
|
+
declare const logger: ((label?: string, ...args: any[]) => Logger) & Omit<Logger, keyof Function>;
|
|
21
|
+
declare const mailer: ((label?: string, ...args: any[]) => Mailer) & Omit<Mailer, keyof Function>;
|
|
22
|
+
declare const queue: ((label?: string, ...args: any[]) => QueueConnection<Record<string, _devbro_neko_queue.QueueMessageInterface>>) & Omit<QueueConnection<Record<string, _devbro_neko_queue.QueueMessageInterface>>, keyof Function>;
|
|
23
|
+
declare const cache: ((label?: string, ...args: any[]) => Cache) & Omit<Cache, keyof Function>;
|
|
24
24
|
|
|
25
25
|
export { cache, cli, db, httpServer, logger, mailer, queue, router, scheduler, storage };
|
package/dist/facades.mjs
CHANGED
|
@@ -16,27 +16,58 @@ import { Logger } from "@devbro/neko-logger";
|
|
|
16
16
|
import { CacheProviderFactory } from "./factories.mjs";
|
|
17
17
|
import { Cache } from "@devbro/neko-cache";
|
|
18
18
|
import { QueueConnection, QueueTransportFactory } from "@devbro/neko-queue";
|
|
19
|
+
function wrapSingletonWithAccessors(singletonFn) {
|
|
20
|
+
let methodsInitialized = false;
|
|
21
|
+
const initializeMethods = /* @__PURE__ */ __name(() => {
|
|
22
|
+
if (methodsInitialized) return;
|
|
23
|
+
const defaultInstance = singletonFn();
|
|
24
|
+
const prototype = Object.getPrototypeOf(defaultInstance);
|
|
25
|
+
const methodNames = Object.getOwnPropertyNames(prototype).filter(
|
|
26
|
+
(name) => name !== "constructor" && typeof prototype[name] === "function"
|
|
27
|
+
);
|
|
28
|
+
for (const methodName of methodNames) {
|
|
29
|
+
singletonFn[methodName] = (...args) => {
|
|
30
|
+
const instance = singletonFn();
|
|
31
|
+
return instance[methodName](...args);
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
methodsInitialized = true;
|
|
35
|
+
}, "initializeMethods");
|
|
36
|
+
return new Proxy(singletonFn, {
|
|
37
|
+
get(target, prop, receiver) {
|
|
38
|
+
if (typeof prop === "string" && !Reflect.has(target, prop)) {
|
|
39
|
+
initializeMethods();
|
|
40
|
+
}
|
|
41
|
+
return Reflect.get(target, prop, receiver);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
__name(wrapSingletonWithAccessors, "wrapSingletonWithAccessors");
|
|
19
46
|
const router = createSingleton(() => new Router());
|
|
20
|
-
const scheduler =
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
47
|
+
const scheduler = wrapSingletonWithAccessors(
|
|
48
|
+
createSingleton(() => {
|
|
49
|
+
const rc = new Scheduler();
|
|
50
|
+
rc.setErrorHandler((err, job) => {
|
|
51
|
+
logger().error({
|
|
52
|
+
msg: "Scheduled job error",
|
|
53
|
+
err,
|
|
54
|
+
job_name: job.getName()
|
|
55
|
+
});
|
|
27
56
|
});
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
57
|
+
return rc;
|
|
58
|
+
})
|
|
59
|
+
);
|
|
31
60
|
const db = /* @__PURE__ */ __name((label = "default") => ctx().getOrThrow(["database", label]), "db");
|
|
32
|
-
const storage =
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
61
|
+
const storage = wrapSingletonWithAccessors(
|
|
62
|
+
createSingleton((label = "default") => {
|
|
63
|
+
let storage_config = config.get(["storages", label].join("."));
|
|
64
|
+
const provider = StorageProviderFactory.create(
|
|
65
|
+
storage_config.provider,
|
|
66
|
+
storage_config.config
|
|
67
|
+
);
|
|
68
|
+
return new Storage(provider);
|
|
69
|
+
})
|
|
70
|
+
);
|
|
40
71
|
const cli = createSingleton(() => {
|
|
41
72
|
const [node, app, ...args] = process.argv;
|
|
42
73
|
return new Cli({
|
|
@@ -51,46 +82,54 @@ const httpServer = createSingleton(() => {
|
|
|
51
82
|
server.setRouter(router());
|
|
52
83
|
return server;
|
|
53
84
|
});
|
|
54
|
-
const logger =
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
mailer_config.
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
queue_config.
|
|
79
|
-
queue_config
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
});
|
|
85
|
+
const logger = wrapSingletonWithAccessors(
|
|
86
|
+
createSingleton((label) => {
|
|
87
|
+
const logger_config = config.get(["loggers", label].join("."));
|
|
88
|
+
const rc = new Logger(logger_config);
|
|
89
|
+
rc.setExtrasFunction((message) => {
|
|
90
|
+
message.requestId = ctxSafe()?.get("requestId") || "N/A";
|
|
91
|
+
return message;
|
|
92
|
+
});
|
|
93
|
+
return rc;
|
|
94
|
+
})
|
|
95
|
+
);
|
|
96
|
+
const mailer = wrapSingletonWithAccessors(
|
|
97
|
+
createSingleton((label) => {
|
|
98
|
+
const mailer_config = config.get(["mailer", label].join("."));
|
|
99
|
+
const provider = MailerProviderFactory.create(
|
|
100
|
+
mailer_config.provider,
|
|
101
|
+
mailer_config.config
|
|
102
|
+
);
|
|
103
|
+
const rc = new Mailer(provider);
|
|
104
|
+
return rc;
|
|
105
|
+
})
|
|
106
|
+
);
|
|
107
|
+
const queue = wrapSingletonWithAccessors(
|
|
108
|
+
createSingleton((label) => {
|
|
109
|
+
const queue_config = config.get(["queues", label].join("."));
|
|
110
|
+
if (!queue_config) {
|
|
111
|
+
throw new Error(`Queue configuration for '${label}' not found`);
|
|
112
|
+
}
|
|
113
|
+
const provider = QueueTransportFactory.create(
|
|
114
|
+
queue_config.provider,
|
|
115
|
+
queue_config.config
|
|
116
|
+
);
|
|
117
|
+
return new QueueConnection(provider);
|
|
118
|
+
})
|
|
119
|
+
);
|
|
120
|
+
const cache = wrapSingletonWithAccessors(
|
|
121
|
+
createSingleton((label) => {
|
|
122
|
+
const cache_config = config.get(["caches", label].join("."));
|
|
123
|
+
if (!cache_config) {
|
|
124
|
+
throw new Error(`Cache configuration for '${label}' not found`);
|
|
125
|
+
}
|
|
126
|
+
const provider = CacheProviderFactory.create(
|
|
127
|
+
cache_config.provider,
|
|
128
|
+
cache_config.config
|
|
129
|
+
);
|
|
130
|
+
return new Cache(provider);
|
|
131
|
+
})
|
|
132
|
+
);
|
|
94
133
|
export {
|
|
95
134
|
cache,
|
|
96
135
|
cli,
|
package/dist/facades.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/facades.mts"],"sourcesContent":["import { Router } from \"./router.mjs\";\nimport { Schedule, Scheduler } from \"@devbro/neko-scheduler\";\nimport { createSingleton } from \"@devbro/neko-helper\";\nimport { ctx, ctxSafe } from \"@devbro/neko-context\";\nimport { Connection } from \"@devbro/neko-sql\";\nimport { Storage, StorageProviderFactory } from \"@devbro/neko-storage\";\nimport {\n Mailer,\n MailerProvider,\n MailerProviderFactory,\n} from \"@devbro/neko-mailer\";\nimport { config } from \"@devbro/neko-config\";\nimport { Cli } from \"clipanion\";\nimport { HttpServer,
|
|
1
|
+
{"version":3,"sources":["../src/facades.mts"],"sourcesContent":["import { Router } from \"./router.mjs\";\nimport { Schedule, Scheduler } from \"@devbro/neko-scheduler\";\nimport { createSingleton } from \"@devbro/neko-helper\";\nimport { ctx, ctxSafe } from \"@devbro/neko-context\";\nimport { Connection } from \"@devbro/neko-sql\";\nimport { Storage, StorageProviderFactory } from \"@devbro/neko-storage\";\nimport {\n Mailer,\n MailerProvider,\n MailerProviderFactory,\n} from \"@devbro/neko-mailer\";\nimport { config } from \"@devbro/neko-config\";\nimport { Cli } from \"clipanion\";\nimport { HttpServer, handleHttpErrors } from \"./http.mjs\";\nimport * as yup from \"yup\";\nimport { Logger } from \"@devbro/neko-logger\";\nimport { CacheProviderFactory } from \"./factories.mjs\";\nimport { Cache } from \"@devbro/neko-cache\";\nimport { QueueConnection, QueueTransportFactory } from \"@devbro/neko-queue\";\n\n/**\n * Wraps a singleton function with property accessors that delegate to the default instance.\n * This allows both `facade()` and `facade.method()` calling patterns.\n * @param singletonFn - The singleton function to wrap\n * @returns The wrapped singleton with property accessors\n */\nfunction wrapSingletonWithAccessors<T>(\n singletonFn: (label?: string, ...args: any[]) => T,\n): typeof singletonFn & Omit<T, keyof Function> {\n // Create a proxy that lazily adds method accessors on first access\n let methodsInitialized = false;\n\n const initializeMethods = () => {\n if (methodsInitialized) return;\n\n const defaultInstance = singletonFn();\n const prototype = Object.getPrototypeOf(defaultInstance);\n\n // Get all method names from the instance's prototype\n const methodNames = Object.getOwnPropertyNames(prototype).filter(\n (name) =>\n name !== \"constructor\" &&\n typeof (prototype as any)[name] === \"function\",\n );\n\n // Attach each method as a property on the singleton function\n for (const methodName of methodNames) {\n (singletonFn as any)[methodName] = (...args: any[]) => {\n const instance = singletonFn();\n return (instance as any)[methodName](...args);\n };\n }\n\n methodsInitialized = true;\n };\n\n // Use a proxy to intercept property access and lazily initialize methods\n return new Proxy(singletonFn, {\n get(target, prop, receiver) {\n // If accessing a method that doesn't exist yet, initialize methods\n if (typeof prop === \"string\" && !Reflect.has(target, prop)) {\n initializeMethods();\n }\n return Reflect.get(target, prop, receiver);\n },\n }) as typeof singletonFn & Omit<T, keyof Function>;\n}\n\nexport const router = createSingleton<Router>(() => new Router());\nexport const scheduler = wrapSingletonWithAccessors(\n createSingleton<Scheduler>(() => {\n const rc = new Scheduler();\n rc.setErrorHandler((err: any, job: Schedule) => {\n logger().error({\n msg: \"Scheduled job error\",\n err,\n job_name: job.getName(),\n });\n });\n return rc;\n }),\n);\n\nexport const db = (label = \"default\") =>\n ctx().getOrThrow<Connection>([\"database\", label]);\n\nexport const storage = wrapSingletonWithAccessors(\n createSingleton<Storage>((label: string = \"default\") => {\n let storage_config: any = config.get([\"storages\", label].join(\".\"));\n\n const provider = StorageProviderFactory.create(\n storage_config.provider,\n storage_config.config,\n );\n\n return new Storage(provider);\n }),\n);\n\nexport const cli = createSingleton<Cli>(() => {\n const [node, app, ...args] = process.argv;\n return new Cli({\n binaryLabel: `My Application`,\n binaryName: `${node} ${app}`,\n binaryVersion: `1.0.0`,\n });\n});\n\nexport const httpServer = createSingleton<HttpServer>(() => {\n const server = new HttpServer();\n\n server.setErrorHandler(handleHttpErrors);\n server.setRouter(router());\n\n return server;\n});\n\nexport const logger = wrapSingletonWithAccessors(\n createSingleton<Logger>((label) => {\n const logger_config: any = config.get([\"loggers\", label].join(\".\"));\n const rc = new Logger(logger_config);\n rc.setExtrasFunction((message: any) => {\n message.requestId = ctxSafe()?.get(\"requestId\") || \"N/A\";\n return message;\n });\n\n return rc;\n }),\n);\n\nexport const mailer = wrapSingletonWithAccessors(\n createSingleton((label) => {\n const mailer_config: any = config.get([\"mailer\", label].join(\".\"));\n\n const provider: MailerProvider = MailerProviderFactory.create(\n mailer_config.provider,\n mailer_config.config,\n );\n\n const rc = new Mailer(provider);\n return rc;\n }),\n);\n\nexport const queue = wrapSingletonWithAccessors(\n createSingleton((label) => {\n const queue_config: any = config.get([\"queues\", label].join(\".\"));\n if (!queue_config) {\n throw new Error(`Queue configuration for '${label}' not found`);\n }\n const provider = QueueTransportFactory.create(\n queue_config.provider,\n queue_config.config,\n );\n return new QueueConnection(provider);\n }),\n);\n\nexport const cache = wrapSingletonWithAccessors(\n createSingleton((label) => {\n const cache_config: any = config.get([\"caches\", label].join(\".\"));\n if (!cache_config) {\n throw new Error(`Cache configuration for '${label}' not found`);\n }\n const provider = CacheProviderFactory.create(\n cache_config.provider,\n cache_config.config,\n );\n\n return new Cache(provider);\n }),\n);\n"],"mappings":";;AAAA,SAAS,cAAc;AACvB,SAAmB,iBAAiB;AACpC,SAAS,uBAAuB;AAChC,SAAS,KAAK,eAAe;AAE7B,SAAS,SAAS,8BAA8B;AAChD;AAAA,EACE;AAAA,EAEA;AAAA,OACK;AACP,SAAS,cAAc;AACvB,SAAS,WAAW;AACpB,SAAS,YAAY,wBAAwB;AAE7C,SAAS,cAAc;AACvB,SAAS,4BAA4B;AACrC,SAAS,aAAa;AACtB,SAAS,iBAAiB,6BAA6B;AAQvD,SAAS,2BACP,aAC8C;AAE9C,MAAI,qBAAqB;AAEzB,QAAM,oBAAoB,6BAAM;AAC9B,QAAI,mBAAoB;AAExB,UAAM,kBAAkB,YAAY;AACpC,UAAM,YAAY,OAAO,eAAe,eAAe;AAGvD,UAAM,cAAc,OAAO,oBAAoB,SAAS,EAAE;AAAA,MACxD,CAAC,SACC,SAAS,iBACT,OAAQ,UAAkB,IAAI,MAAM;AAAA,IACxC;AAGA,eAAW,cAAc,aAAa;AACpC,MAAC,YAAoB,UAAU,IAAI,IAAI,SAAgB;AACrD,cAAM,WAAW,YAAY;AAC7B,eAAQ,SAAiB,UAAU,EAAE,GAAG,IAAI;AAAA,MAC9C;AAAA,IACF;AAEA,yBAAqB;AAAA,EACvB,GAtB0B;AAyB1B,SAAO,IAAI,MAAM,aAAa;AAAA,IAC5B,IAAI,QAAQ,MAAM,UAAU;AAE1B,UAAI,OAAO,SAAS,YAAY,CAAC,QAAQ,IAAI,QAAQ,IAAI,GAAG;AAC1D,0BAAkB;AAAA,MACpB;AACA,aAAO,QAAQ,IAAI,QAAQ,MAAM,QAAQ;AAAA,IAC3C;AAAA,EACF,CAAC;AACH;AAxCS;AA0CF,MAAM,SAAS,gBAAwB,MAAM,IAAI,OAAO,CAAC;AACzD,MAAM,YAAY;AAAA,EACvB,gBAA2B,MAAM;AAC/B,UAAM,KAAK,IAAI,UAAU;AACzB,OAAG,gBAAgB,CAAC,KAAU,QAAkB;AAC9C,aAAO,EAAE,MAAM;AAAA,QACb,KAAK;AAAA,QACL;AAAA,QACA,UAAU,IAAI,QAAQ;AAAA,MACxB,CAAC;AAAA,IACH,CAAC;AACD,WAAO;AAAA,EACT,CAAC;AACH;AAEO,MAAM,KAAK,wBAAC,QAAQ,cACzB,IAAI,EAAE,WAAuB,CAAC,YAAY,KAAK,CAAC,GADhC;AAGX,MAAM,UAAU;AAAA,EACrB,gBAAyB,CAAC,QAAgB,cAAc;AACtD,QAAI,iBAAsB,OAAO,IAAI,CAAC,YAAY,KAAK,EAAE,KAAK,GAAG,CAAC;AAElE,UAAM,WAAW,uBAAuB;AAAA,MACtC,eAAe;AAAA,MACf,eAAe;AAAA,IACjB;AAEA,WAAO,IAAI,QAAQ,QAAQ;AAAA,EAC7B,CAAC;AACH;AAEO,MAAM,MAAM,gBAAqB,MAAM;AAC5C,QAAM,CAAC,MAAM,KAAK,GAAG,IAAI,IAAI,QAAQ;AACrC,SAAO,IAAI,IAAI;AAAA,IACb,aAAa;AAAA,IACb,YAAY,GAAG,IAAI,IAAI,GAAG;AAAA,IAC1B,eAAe;AAAA,EACjB,CAAC;AACH,CAAC;AAEM,MAAM,aAAa,gBAA4B,MAAM;AAC1D,QAAM,SAAS,IAAI,WAAW;AAE9B,SAAO,gBAAgB,gBAAgB;AACvC,SAAO,UAAU,OAAO,CAAC;AAEzB,SAAO;AACT,CAAC;AAEM,MAAM,SAAS;AAAA,EACpB,gBAAwB,CAAC,UAAU;AACjC,UAAM,gBAAqB,OAAO,IAAI,CAAC,WAAW,KAAK,EAAE,KAAK,GAAG,CAAC;AAClE,UAAM,KAAK,IAAI,OAAO,aAAa;AACnC,OAAG,kBAAkB,CAAC,YAAiB;AACrC,cAAQ,YAAY,QAAQ,GAAG,IAAI,WAAW,KAAK;AACnD,aAAO;AAAA,IACT,CAAC;AAED,WAAO;AAAA,EACT,CAAC;AACH;AAEO,MAAM,SAAS;AAAA,EACpB,gBAAgB,CAAC,UAAU;AACzB,UAAM,gBAAqB,OAAO,IAAI,CAAC,UAAU,KAAK,EAAE,KAAK,GAAG,CAAC;AAEjE,UAAM,WAA2B,sBAAsB;AAAA,MACrD,cAAc;AAAA,MACd,cAAc;AAAA,IAChB;AAEA,UAAM,KAAK,IAAI,OAAO,QAAQ;AAC9B,WAAO;AAAA,EACT,CAAC;AACH;AAEO,MAAM,QAAQ;AAAA,EACnB,gBAAgB,CAAC,UAAU;AACzB,UAAM,eAAoB,OAAO,IAAI,CAAC,UAAU,KAAK,EAAE,KAAK,GAAG,CAAC;AAChE,QAAI,CAAC,cAAc;AACjB,YAAM,IAAI,MAAM,4BAA4B,KAAK,aAAa;AAAA,IAChE;AACA,UAAM,WAAW,sBAAsB;AAAA,MACrC,aAAa;AAAA,MACb,aAAa;AAAA,IACf;AACA,WAAO,IAAI,gBAAgB,QAAQ;AAAA,EACrC,CAAC;AACH;AAEO,MAAM,QAAQ;AAAA,EACnB,gBAAgB,CAAC,UAAU;AACzB,UAAM,eAAoB,OAAO,IAAI,CAAC,UAAU,KAAK,EAAE,KAAK,GAAG,CAAC;AAChE,QAAI,CAAC,cAAc;AACjB,YAAM,IAAI,MAAM,4BAA4B,KAAK,aAAa;AAAA,IAChE;AACA,UAAM,WAAW,qBAAqB;AAAA,MACpC,aAAa;AAAA,MACb,aAAa;AAAA,IACf;AAEA,WAAO,IAAI,MAAM,QAAQ;AAAA,EAC3B,CAAC;AACH;","names":[]}
|