@lyxa.ai/core 1.0.3 → 1.0.4
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/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/libraries/auth/index.d.ts +13 -0
- package/dist/libraries/auth/index.js +44 -0
- package/dist/libraries/auth/index.js.map +1 -0
- package/dist/libraries/trpc/context.d.ts +13 -0
- package/dist/libraries/trpc/context.js +12 -0
- package/dist/libraries/trpc/context.js.map +1 -0
- package/dist/libraries/trpc/index.d.ts +88 -0
- package/dist/libraries/trpc/index.js +9 -0
- package/dist/libraries/trpc/index.js.map +1 -0
- package/dist/libraries/trpc/middlewares/auth.d.ts +20 -0
- package/dist/libraries/trpc/middlewares/auth.js +25 -0
- package/dist/libraries/trpc/middlewares/auth.js.map +1 -0
- package/dist/utilities/pagination.d.ts +65 -0
- package/dist/utilities/pagination.js +63 -0
- package/dist/utilities/pagination.js.map +1 -0
- package/package.json +2 -1
package/dist/index.js
CHANGED
|
@@ -27,6 +27,7 @@ Object.defineProperty(exports, "createGlobalDiscriminatorModel", { enumerable: t
|
|
|
27
27
|
async function bootstrapCore(options) {
|
|
28
28
|
try {
|
|
29
29
|
await registerLibraries(options);
|
|
30
|
+
getLibraries().getLogger().logger.info("Successfully bootstrapped lyxa-core.");
|
|
30
31
|
const gracefulShutdown = async () => {
|
|
31
32
|
getLibraries().getLogger().logger.info('Received shutdown signal, shutting down gracefully...');
|
|
32
33
|
};
|
|
@@ -36,6 +37,7 @@ async function bootstrapCore(options) {
|
|
|
36
37
|
getLibraries().getLogger().logger.error('Uncaught exception, shutting down...', err);
|
|
37
38
|
gracefulShutdown();
|
|
38
39
|
});
|
|
40
|
+
console.log("Created hooks.");
|
|
39
41
|
}
|
|
40
42
|
catch (e) {
|
|
41
43
|
console.error(e);
|
|
@@ -59,8 +61,14 @@ async function registerLibraries(options) {
|
|
|
59
61
|
typedi_1.Container.set(dispatcher_1.MicroServiceDispatcher, microserviceDispatcherInstance);
|
|
60
62
|
const twilioServiceInstance = new twilio_1.TwilioService();
|
|
61
63
|
typedi_1.Container.set(twilio_1.TwilioService, twilioServiceInstance);
|
|
64
|
+
console.log("Initialized everything");
|
|
62
65
|
}
|
|
63
66
|
function getLibraries() {
|
|
64
67
|
return typedi_1.Container.get(libraries_1.LibraryManager);
|
|
65
68
|
}
|
|
69
|
+
bootstrapCore({
|
|
70
|
+
environment: EnvironmentConfigurationType_1.EnvironmentConfigurationType.DEV,
|
|
71
|
+
instanceType: "catalogue",
|
|
72
|
+
tenet: "lb"
|
|
73
|
+
});
|
|
66
74
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"/","sources":["index.ts"],"names":[],"mappings":";;;;;;AAoBA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"/","sources":["index.ts"],"names":[],"mappings":"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","sourcesContent":["import {LibraryManager} from \"./libraries\";\r\nimport {Container} from \"typedi\";\r\nimport mongoose from \"mongoose\";\r\nimport {ConfigurationOptions, ConfigurationService} from \"./libraries/configuration\";\r\nimport {EnvironmentConfigurationType} from \"./libraries/configuration/types/EnvironmentConfigurationType\";\r\nimport {LyxaLogger} from \"./libraries/logger\";\r\nimport {RedisService} from \"./libraries/redis\";\r\nimport {initGlobalConnection} from \"./libraries/mongo\";\r\nimport {SecretManagerService} from \"./libraries/secrets\";\r\nimport {MicroServiceDispatcher} from \"./libraries/dispatcher\";\r\nimport {TwilioService} from \"./libraries/twilio\";\r\n\r\nexport { ConfigurationOptions } from \"./libraries/configuration\";\r\nexport { EnvironmentConfigurationType } from \"./libraries/configuration/types/EnvironmentConfigurationType\";\r\nexport {\r\n initGlobalConnection,\r\n createGlobalModel,\r\n createGlobalDiscriminatorModel\r\n} from './libraries/mongo';\r\n\r\nexport async function bootstrapCore(options?: ConfigurationOptions) {\r\n try {\r\n await registerLibraries(options);\r\n\r\n getLibraries().getLogger().logger.info(\"Successfully bootstrapped lyxa-core.\");\r\n\r\n const gracefulShutdown = async () => {\r\n getLibraries().getLogger().logger.info('Received shutdown signal, shutting down gracefully...');\r\n };\r\n\r\n process.on('SIGTERM', gracefulShutdown);\r\n process.on('SIGINT', gracefulShutdown);\r\n process.on('uncaughtException', (err) => {\r\n getLibraries().getLogger().logger.error('Uncaught exception, shutting down...', err);\r\n gracefulShutdown();\r\n });\r\n\r\n console.log(\"Created hooks.\");\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n}\r\n\r\nexport async function registerLibraries(options?: ConfigurationOptions) {\r\n // Setup configuration.\r\n const configurationInstance = new ConfigurationService(options);\r\n Container.set(ConfigurationService, configurationInstance);\r\n\r\n // Setup redis.\r\n const redisInstance = new RedisService(configurationInstance.options.redisURL!);\r\n Container.set(RedisService, redisInstance);\r\n\r\n const secretInstance = new SecretManagerService(configurationInstance, redisInstance);\r\n Container.set(SecretManagerService, secretInstance);\r\n\r\n const mongoUrl = await getLibraries().getSecretsService()\r\n .getKey(\"MONGO_URL\");\r\n\r\n await mongoose.connect(mongoUrl!, { dbName: `lyxa-${options!.environment}-${options!.tenet}` });\r\n mongoose.set('debug', getLibraries().getConfigurationService().options.environment == EnvironmentConfigurationType.DEV);\r\n\r\n await initGlobalConnection(mongoUrl!, options!.environment);\r\n\r\n const loggerInstance = new LyxaLogger(options!.instanceType!, mongoUrl!);\r\n Container.set(LyxaLogger, loggerInstance);\r\n\r\n const microserviceDispatcherInstance = new MicroServiceDispatcher(secretInstance);\r\n Container.set(MicroServiceDispatcher, microserviceDispatcherInstance);\r\n\r\n const twilioServiceInstance = new TwilioService();\r\n Container.set(TwilioService, twilioServiceInstance);\r\n\r\n console.log(\"Initialized everything\");\r\n\r\n /*\r\n await initEventBus(\"amqp://localhost\");\r\n const allSubscriptions = SubscriptionRegistry.getAllSubscriptions();\r\n\r\n const instantiatedServices = new Map<Function, any>();\r\n\r\n for (const { eventId, targetConstructor, methodName } of allSubscriptions) {\r\n let instance = instantiatedServices.get(targetConstructor);\r\n if (!instance) {\r\n instance = Container.get(targetConstructor as any);\r\n instantiatedServices.set(targetConstructor, instance);\r\n }\r\n\r\n await subscribeToEvent(eventId, async (payload) => {\r\n return instance[methodName](payload);\r\n });\r\n }\r\n */\r\n}\r\n\r\nexport function getLibraries(): LibraryManager {\r\n return Container.get(LibraryManager)\r\n}\r\n\r\nbootstrapCore({\r\n environment: EnvironmentConfigurationType.DEV,\r\n instanceType: \"catalogue\",\r\n tenet: \"lb\"\r\n})\r\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { SignOptions } from "jsonwebtoken";
|
|
2
|
+
import { EntityContext } from "../trpc/context";
|
|
3
|
+
export declare enum AuthEntityType {
|
|
4
|
+
USER = "USER",
|
|
5
|
+
SHOP = "SHOP",
|
|
6
|
+
DELIVERY_BOY = "DELIVERY_BOY",
|
|
7
|
+
CRM = "CRM"
|
|
8
|
+
}
|
|
9
|
+
export declare function signToken(entity: {
|
|
10
|
+
id: string;
|
|
11
|
+
type: AuthEntityType;
|
|
12
|
+
}, options?: SignOptions): Promise<string>;
|
|
13
|
+
export declare function verifyToken(entityTypes: AuthEntityType[], token: string): Promise<EntityContext | undefined>;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.AuthEntityType = void 0;
|
|
7
|
+
exports.signToken = signToken;
|
|
8
|
+
exports.verifyToken = verifyToken;
|
|
9
|
+
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
10
|
+
const index_1 = require("../../index");
|
|
11
|
+
var AuthEntityType;
|
|
12
|
+
(function (AuthEntityType) {
|
|
13
|
+
AuthEntityType["USER"] = "USER";
|
|
14
|
+
AuthEntityType["SHOP"] = "SHOP";
|
|
15
|
+
AuthEntityType["DELIVERY_BOY"] = "DELIVERY_BOY";
|
|
16
|
+
AuthEntityType["CRM"] = "CRM";
|
|
17
|
+
})(AuthEntityType || (exports.AuthEntityType = AuthEntityType = {}));
|
|
18
|
+
async function signToken(entity, options) {
|
|
19
|
+
if (!entity?.type) {
|
|
20
|
+
throw new Error('Entity type is required to sign token');
|
|
21
|
+
}
|
|
22
|
+
const secret = await (0, index_1.getLibraries)()
|
|
23
|
+
.getSecretsService()
|
|
24
|
+
.getKey(`${entity.type.toUpperCase()}_JWT_TOKEN`);
|
|
25
|
+
if (!secret) {
|
|
26
|
+
throw new Error(`No secret found for entity type: ${entity.type}`);
|
|
27
|
+
}
|
|
28
|
+
const payload = {
|
|
29
|
+
id: entity.id,
|
|
30
|
+
type: entity.type,
|
|
31
|
+
};
|
|
32
|
+
return jsonwebtoken_1.default.sign(payload, secret, options);
|
|
33
|
+
}
|
|
34
|
+
async function verifyToken(entityTypes, token) {
|
|
35
|
+
for (const entityType of entityTypes) {
|
|
36
|
+
const secret = await (0, index_1.getLibraries)().getSecretsService().getKey(entityType.toUpperCase() + "_JWT_TOKEN");
|
|
37
|
+
try {
|
|
38
|
+
return jsonwebtoken_1.default.verify(token, secret);
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/auth/index.ts"],"names":[],"mappings":";;;;;;AAeA,8BAsBC;AAED,kCASC;AAhDD,gEAA8C;AAC9C,uCAAyC;AAGzC,IAAY,cAKX;AALD,WAAY,cAAc;IACtB,+BAAa,CAAA;IACb,+BAAa,CAAA;IACb,+CAA6B,CAAA;IAC7B,6BAAW,CAAA;AACf,CAAC,EALW,cAAc,8BAAd,cAAc,QAKzB;AAMM,KAAK,UAAU,SAAS,CAC3B,MAA4C,EAC5C,OAAqB;IAErB,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,IAAA,oBAAY,GAAE;SAC9B,iBAAiB,EAAE;SACnB,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAEtD,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,oCAAoC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,OAAO,GAAG;QACZ,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,IAAI,EAAE,MAAM,CAAC,IAAI;KACpB,CAAC;IAEF,OAAO,sBAAG,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC;AAEM,KAAK,UAAU,WAAW,CAAC,WAA6B,EAAE,KAAa;IAC1E,KAAI,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,IAAA,oBAAY,GAAE,CAAC,iBAAiB,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,GAAG,YAAY,CAAC,CAAC;QAExG,IAAI,CAAC;YACD,OAAO,sBAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAO,CAAkB,CAAC;QACvD,CAAC;QAAC,OAAM,GAAG,EAAE,CAAC;QACd,CAAC;IACL,CAAC;AACL,CAAC","sourcesContent":["import jwt, {SignOptions} from \"jsonwebtoken\";\r\nimport {getLibraries} from \"../../index\";\r\nimport {EntityContext} from \"../trpc/context\";\r\n\r\nexport enum AuthEntityType {\r\n USER = \"USER\",\r\n SHOP = \"SHOP\",\r\n DELIVERY_BOY = \"DELIVERY_BOY\",\r\n CRM = \"CRM\"\r\n}\r\n\r\n/**\r\n * Sign a JWT for the given entity (id + type).\r\n * It will fetch the secret for that entity type and create a token.\r\n */\r\nexport async function signToken(\r\n entity: { id: string; type: AuthEntityType },\r\n options?: SignOptions\r\n): Promise<string> {\r\n if (!entity?.type) {\r\n throw new Error('Entity type is required to sign token');\r\n }\r\n\r\n const secret = await getLibraries()\r\n .getSecretsService()\r\n .getKey(`${entity.type.toUpperCase()}_JWT_TOKEN`);\r\n\r\n if (!secret) {\r\n throw new Error(`No secret found for entity type: ${entity.type}`);\r\n }\r\n\r\n const payload = {\r\n id: entity.id,\r\n type: entity.type,\r\n };\r\n\r\n return jwt.sign(payload, secret, options);\r\n}\r\n\r\nexport async function verifyToken(entityTypes: AuthEntityType[], token: string): Promise<EntityContext | undefined> {\r\n for(const entityType of entityTypes) {\r\n const secret = await getLibraries().getSecretsService().getKey(entityType.toUpperCase() + \"_JWT_TOKEN\");\r\n\r\n try {\r\n return jwt.verify(token, secret!) as EntityContext;\r\n } catch(err) {\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { CreateHTTPContextOptions } from "@trpc/server/dist/adapters/standalone";
|
|
2
|
+
import { AuthEntityType } from "../auth";
|
|
3
|
+
import jwt from "jsonwebtoken";
|
|
4
|
+
export interface EntityContext extends jwt.JwtPayload {
|
|
5
|
+
id: string;
|
|
6
|
+
type: AuthEntityType;
|
|
7
|
+
}
|
|
8
|
+
export interface LyxaContextParams {
|
|
9
|
+
entity?: EntityContext;
|
|
10
|
+
requestId?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare const createLyxaContext: (opts: CreateHTTPContextOptions) => Promise<CreateHTTPContextOptions & LyxaContextParams>;
|
|
13
|
+
export type LyxaContext = Awaited<ReturnType<typeof createLyxaContext>>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createLyxaContext = void 0;
|
|
4
|
+
const createLyxaContext = async (opts) => {
|
|
5
|
+
return {
|
|
6
|
+
...opts,
|
|
7
|
+
entity: undefined,
|
|
8
|
+
requestId: undefined
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
exports.createLyxaContext = createLyxaContext;
|
|
12
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"/","sources":["libraries/trpc/context.ts"],"names":[],"mappings":";;;AAcO,MAAM,iBAAiB,GAAG,KAAK,EAAE,IAA8B,EAAyD,EAAE;IAC7H,OAAO;QACH,GAAG,IAAI;QACP,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,SAAS;KACvB,CAAC;AACN,CAAC,CAAA;AANY,QAAA,iBAAiB,qBAM7B","sourcesContent":["import {CreateHTTPContextOptions} from \"@trpc/server/dist/adapters/standalone\";\r\nimport {AuthEntityType} from \"../auth\";\r\nimport jwt from \"jsonwebtoken\";\r\n\r\nexport interface EntityContext extends jwt.JwtPayload {\r\n id: string,\r\n type: AuthEntityType,\r\n}\r\n\r\nexport interface LyxaContextParams {\r\n entity?: EntityContext,\r\n requestId?: string,\r\n}\r\n\r\nexport const createLyxaContext = async (opts: CreateHTTPContextOptions): Promise<CreateHTTPContextOptions & LyxaContextParams> => {\r\n return {\r\n ...opts,\r\n entity: undefined,\r\n requestId: undefined\r\n };\r\n}\r\n\r\nexport type LyxaContext = Awaited<ReturnType<typeof createLyxaContext>>;\r\n"]}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
export declare const t: {
|
|
2
|
+
_config: import("@trpc/server").RootConfig<{
|
|
3
|
+
ctx: import("@trpc/server/dist/adapters/standalone").CreateHTTPContextOptions & import("./context").LyxaContextParams;
|
|
4
|
+
meta: object;
|
|
5
|
+
errorShape: import("@trpc/server").DefaultErrorShape;
|
|
6
|
+
transformer: import("@trpc/server").DefaultDataTransformer;
|
|
7
|
+
}>;
|
|
8
|
+
procedure: import("@trpc/server").ProcedureBuilder<{
|
|
9
|
+
_config: import("@trpc/server").RootConfig<{
|
|
10
|
+
ctx: import("@trpc/server/dist/adapters/standalone").CreateHTTPContextOptions & import("./context").LyxaContextParams;
|
|
11
|
+
meta: object;
|
|
12
|
+
errorShape: import("@trpc/server").DefaultErrorShape;
|
|
13
|
+
transformer: import("@trpc/server").DefaultDataTransformer;
|
|
14
|
+
}>;
|
|
15
|
+
_ctx_out: import("@trpc/server/dist/adapters/standalone").CreateHTTPContextOptions & import("./context").LyxaContextParams;
|
|
16
|
+
_input_in: typeof import("@trpc/server").unsetMarker;
|
|
17
|
+
_input_out: typeof import("@trpc/server").unsetMarker;
|
|
18
|
+
_output_in: typeof import("@trpc/server").unsetMarker;
|
|
19
|
+
_output_out: typeof import("@trpc/server").unsetMarker;
|
|
20
|
+
_meta: object;
|
|
21
|
+
}>;
|
|
22
|
+
middleware: <TNewParams extends import("@trpc/server").ProcedureParams<import("@trpc/server").AnyRootConfig, unknown, unknown, unknown, unknown, unknown, unknown>>(fn: import("@trpc/server").MiddlewareFunction<{
|
|
23
|
+
_config: import("@trpc/server").RootConfig<{
|
|
24
|
+
ctx: import("@trpc/server/dist/adapters/standalone").CreateHTTPContextOptions & import("./context").LyxaContextParams;
|
|
25
|
+
meta: object;
|
|
26
|
+
errorShape: import("@trpc/server").DefaultErrorShape;
|
|
27
|
+
transformer: import("@trpc/server").DefaultDataTransformer;
|
|
28
|
+
}>;
|
|
29
|
+
_ctx_out: {};
|
|
30
|
+
_input_out: typeof import("@trpc/server").unsetMarker;
|
|
31
|
+
_input_in: unknown;
|
|
32
|
+
_output_in: unknown;
|
|
33
|
+
_output_out: unknown;
|
|
34
|
+
_meta: object;
|
|
35
|
+
}, TNewParams>) => import("@trpc/server").MiddlewareBuilder<{
|
|
36
|
+
_config: import("@trpc/server").RootConfig<{
|
|
37
|
+
ctx: import("@trpc/server/dist/adapters/standalone").CreateHTTPContextOptions & import("./context").LyxaContextParams;
|
|
38
|
+
meta: object;
|
|
39
|
+
errorShape: import("@trpc/server").DefaultErrorShape;
|
|
40
|
+
transformer: import("@trpc/server").DefaultDataTransformer;
|
|
41
|
+
}>;
|
|
42
|
+
_ctx_out: {};
|
|
43
|
+
_input_out: typeof import("@trpc/server").unsetMarker;
|
|
44
|
+
_input_in: unknown;
|
|
45
|
+
_output_in: unknown;
|
|
46
|
+
_output_out: unknown;
|
|
47
|
+
_meta: object;
|
|
48
|
+
}, TNewParams>;
|
|
49
|
+
router: <TProcRouterRecord extends import("@trpc/server").ProcedureRouterRecord>(procedures: TProcRouterRecord) => import("@trpc/server").CreateRouterInner<import("@trpc/server").RootConfig<{
|
|
50
|
+
ctx: import("@trpc/server/dist/adapters/standalone").CreateHTTPContextOptions & import("./context").LyxaContextParams;
|
|
51
|
+
meta: object;
|
|
52
|
+
errorShape: import("@trpc/server").DefaultErrorShape;
|
|
53
|
+
transformer: import("@trpc/server").DefaultDataTransformer;
|
|
54
|
+
}>, TProcRouterRecord>;
|
|
55
|
+
mergeRouters: typeof import("@trpc/server").mergeRouters;
|
|
56
|
+
createCallerFactory: <TRouter extends import("@trpc/server").Router<import("@trpc/server").AnyRouterDef<import("@trpc/server").RootConfig<{
|
|
57
|
+
ctx: import("@trpc/server/dist/adapters/standalone").CreateHTTPContextOptions & import("./context").LyxaContextParams;
|
|
58
|
+
meta: object;
|
|
59
|
+
errorShape: import("@trpc/server").DefaultErrorShape;
|
|
60
|
+
transformer: import("@trpc/server").DefaultDataTransformer;
|
|
61
|
+
}>, any>>>(router: TRouter) => import("@trpc/server").RouterCaller<TRouter["_def"]>;
|
|
62
|
+
};
|
|
63
|
+
export declare const publicProcedure: import("@trpc/server").ProcedureBuilder<{
|
|
64
|
+
_config: import("@trpc/server").RootConfig<{
|
|
65
|
+
ctx: import("@trpc/server/dist/adapters/standalone").CreateHTTPContextOptions & import("./context").LyxaContextParams;
|
|
66
|
+
meta: object;
|
|
67
|
+
errorShape: import("@trpc/server").DefaultErrorShape;
|
|
68
|
+
transformer: import("@trpc/server").DefaultDataTransformer;
|
|
69
|
+
}>;
|
|
70
|
+
_ctx_out: import("@trpc/server/dist/adapters/standalone").CreateHTTPContextOptions & import("./context").LyxaContextParams;
|
|
71
|
+
_input_in: typeof import("@trpc/server").unsetMarker;
|
|
72
|
+
_input_out: typeof import("@trpc/server").unsetMarker;
|
|
73
|
+
_output_in: typeof import("@trpc/server").unsetMarker;
|
|
74
|
+
_output_out: typeof import("@trpc/server").unsetMarker;
|
|
75
|
+
_meta: object;
|
|
76
|
+
}>;
|
|
77
|
+
export declare const createTRPCRouter: <TProcRouterRecord extends import("@trpc/server").ProcedureRouterRecord>(procedures: TProcRouterRecord) => import("@trpc/server").CreateRouterInner<import("@trpc/server").RootConfig<{
|
|
78
|
+
ctx: import("@trpc/server/dist/adapters/standalone").CreateHTTPContextOptions & import("./context").LyxaContextParams;
|
|
79
|
+
meta: object;
|
|
80
|
+
errorShape: import("@trpc/server").DefaultErrorShape;
|
|
81
|
+
transformer: import("@trpc/server").DefaultDataTransformer;
|
|
82
|
+
}>, TProcRouterRecord>;
|
|
83
|
+
export declare const createCallerFactory: <TRouter extends import("@trpc/server").Router<import("@trpc/server").AnyRouterDef<import("@trpc/server").RootConfig<{
|
|
84
|
+
ctx: import("@trpc/server/dist/adapters/standalone").CreateHTTPContextOptions & import("./context").LyxaContextParams;
|
|
85
|
+
meta: object;
|
|
86
|
+
errorShape: import("@trpc/server").DefaultErrorShape;
|
|
87
|
+
transformer: import("@trpc/server").DefaultDataTransformer;
|
|
88
|
+
}>, any>>>(router: TRouter) => import("@trpc/server").RouterCaller<TRouter["_def"]>;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createCallerFactory = exports.createTRPCRouter = exports.publicProcedure = exports.t = void 0;
|
|
4
|
+
const server_1 = require("@trpc/server");
|
|
5
|
+
exports.t = server_1.initTRPC.context().create();
|
|
6
|
+
exports.publicProcedure = exports.t.procedure;
|
|
7
|
+
exports.createTRPCRouter = exports.t.router;
|
|
8
|
+
exports.createCallerFactory = exports.t.createCallerFactory;
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/trpc/index.ts"],"names":[],"mappings":";;;AAAA,yCAAwC;AAI3B,QAAA,CAAC,GAAG,iBAAQ,CAAC,OAAO,EAAe,CAAC,MAAM,EAAE,CAAC;AAE7C,QAAA,eAAe,GAAG,SAAC,CAAC,SAAS,CAAC;AAC9B,QAAA,gBAAgB,GAAG,SAAC,CAAC,MAAM,CAAC;AAC5B,QAAA,mBAAmB,GAAG,SAAC,CAAC,mBAAmB,CAAA","sourcesContent":["import { initTRPC } from '@trpc/server';\r\nimport { TRPCError } from '@trpc/server';\r\nimport {LyxaContext} from \"./context\";\r\n\r\nexport const t = initTRPC.context<LyxaContext>().create();\r\n\r\nexport const publicProcedure = t.procedure;\r\nexport const createTRPCRouter = t.router;\r\nexport const createCallerFactory = t.createCallerFactory\r\n\r\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { AuthEntityType } from "../../auth";
|
|
2
|
+
export declare function createAuthenticatedProcedure<T>(entityTypes: AuthEntityType[]): import("@trpc/server").ProcedureBuilder<{
|
|
3
|
+
_config: import("@trpc/server").RootConfig<{
|
|
4
|
+
ctx: import("@trpc/server/dist/adapters/standalone").CreateHTTPContextOptions & import("../context").LyxaContextParams;
|
|
5
|
+
meta: object;
|
|
6
|
+
errorShape: import("@trpc/server").DefaultErrorShape;
|
|
7
|
+
transformer: import("@trpc/server").DefaultDataTransformer;
|
|
8
|
+
}>;
|
|
9
|
+
_meta: object;
|
|
10
|
+
_ctx_out: {
|
|
11
|
+
requestId: string | undefined;
|
|
12
|
+
res: import("http").ServerResponse<import("http").IncomingMessage>;
|
|
13
|
+
entity: import("../context").EntityContext | undefined;
|
|
14
|
+
req: import("http").IncomingMessage;
|
|
15
|
+
};
|
|
16
|
+
_input_in: typeof import("@trpc/server").unsetMarker;
|
|
17
|
+
_input_out: typeof import("@trpc/server").unsetMarker;
|
|
18
|
+
_output_in: typeof import("@trpc/server").unsetMarker;
|
|
19
|
+
_output_out: typeof import("@trpc/server").unsetMarker;
|
|
20
|
+
}>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createAuthenticatedProcedure = createAuthenticatedProcedure;
|
|
4
|
+
const server_1 = require("@trpc/server");
|
|
5
|
+
const index_1 = require("../index");
|
|
6
|
+
const auth_1 = require("../../auth");
|
|
7
|
+
function createAuthenticatedProcedure(entityTypes) {
|
|
8
|
+
return index_1.publicProcedure.use(async ({ ctx, next }) => {
|
|
9
|
+
const authHeader = ctx.req.headers["authorization"];
|
|
10
|
+
if (!authHeader) {
|
|
11
|
+
throw new server_1.TRPCError({ code: "UNAUTHORIZED", message: "No header" });
|
|
12
|
+
}
|
|
13
|
+
const token = authHeader.replace(/^Bearer\s+/, '');
|
|
14
|
+
if (!token) {
|
|
15
|
+
throw new server_1.TRPCError({ code: 'UNAUTHORIZED', message: 'Missing token' });
|
|
16
|
+
}
|
|
17
|
+
const jwtToken = await (0, auth_1.verifyToken)(entityTypes, token);
|
|
18
|
+
if (!jwtToken) {
|
|
19
|
+
throw new server_1.TRPCError({ code: 'UNAUTHORIZED', message: 'Could not decode token based on given types' });
|
|
20
|
+
}
|
|
21
|
+
ctx.entity = jwtToken;
|
|
22
|
+
return next({ ctx });
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"/","sources":["libraries/trpc/middlewares/auth.ts"],"names":[],"mappings":";;AAQA,oEAwBC;AAhCD,yCAAuC;AACvC,oCAAyC;AACzC,qCAAuD;AAMvD,SAAgB,4BAA4B,CAAI,WAA6B;IACzE,OAAO,uBAAe,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE;QAC/C,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAEpD,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,MAAM,IAAI,kBAAS,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAEnD,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,MAAM,IAAI,kBAAS,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAA,kBAAW,EAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAEvD,IAAG,CAAC,QAAQ,EAAE,CAAC;YACX,MAAM,IAAI,kBAAS,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,6CAA6C,EAAE,CAAC,CAAC;QAC1G,CAAC;QAED,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC;QAEtB,OAAO,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACP,CAAC","sourcesContent":["import {TRPCError} from '@trpc/server';\r\nimport {publicProcedure} from \"../index\";\r\nimport {AuthEntityType, verifyToken} from \"../../auth\";\r\n\r\n/**\r\n * A factory that creates an authenticated procedure, optionally restricting\r\n * the entity to a list of specific types (e.g. AuthEntityType.USER).\r\n */\r\nexport function createAuthenticatedProcedure<T>(entityTypes: AuthEntityType[]) {\r\n return publicProcedure.use(async ({ ctx, next }) => {\r\n const authHeader = ctx.req.headers[\"authorization\"];\r\n\r\n if (!authHeader) {\r\n throw new TRPCError({ code: \"UNAUTHORIZED\", message: \"No header\" });\r\n }\r\n\r\n const token = authHeader.replace(/^Bearer\\s+/, '');\r\n\r\n if (!token) {\r\n throw new TRPCError({ code: 'UNAUTHORIZED', message: 'Missing token' });\r\n }\r\n\r\n const jwtToken = await verifyToken(entityTypes, token);\r\n\r\n if(!jwtToken) {\r\n throw new TRPCError({ code: 'UNAUTHORIZED', message: 'Could not decode token based on given types' });\r\n }\r\n\r\n ctx.entity = jwtToken;\r\n\r\n return next({ ctx });\r\n });\r\n}\r\n"]}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { DocumentType, ReturnModelType } from "@typegoose/typegoose";
|
|
2
|
+
import { FilterQuery, PopulateOptions } from "mongoose";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { AnyParamConstructor } from "@typegoose/typegoose/lib/types";
|
|
5
|
+
export declare function createPaginatedSchema<ItemType extends z.ZodTypeAny>(itemSchema: ItemType): z.ZodObject<{
|
|
6
|
+
metadata: z.ZodObject<{
|
|
7
|
+
page: z.ZodNumber;
|
|
8
|
+
size: z.ZodNumber;
|
|
9
|
+
totalElements: z.ZodNumber;
|
|
10
|
+
totalPages: z.ZodNumber;
|
|
11
|
+
}, "strip", z.ZodTypeAny, {
|
|
12
|
+
page: number;
|
|
13
|
+
size: number;
|
|
14
|
+
totalElements: number;
|
|
15
|
+
totalPages: number;
|
|
16
|
+
}, {
|
|
17
|
+
page: number;
|
|
18
|
+
size: number;
|
|
19
|
+
totalElements: number;
|
|
20
|
+
totalPages: number;
|
|
21
|
+
}>;
|
|
22
|
+
items: z.ZodArray<ItemType, "many">;
|
|
23
|
+
}, "strip", z.ZodTypeAny, {
|
|
24
|
+
metadata: {
|
|
25
|
+
page: number;
|
|
26
|
+
size: number;
|
|
27
|
+
totalElements: number;
|
|
28
|
+
totalPages: number;
|
|
29
|
+
};
|
|
30
|
+
items: ItemType["_output"][];
|
|
31
|
+
}, {
|
|
32
|
+
metadata: {
|
|
33
|
+
page: number;
|
|
34
|
+
size: number;
|
|
35
|
+
totalElements: number;
|
|
36
|
+
totalPages: number;
|
|
37
|
+
};
|
|
38
|
+
items: ItemType["_input"][];
|
|
39
|
+
}>;
|
|
40
|
+
export interface RawPaginatedResult<T extends AnyParamConstructor<any>> {
|
|
41
|
+
metadata: {
|
|
42
|
+
page: number;
|
|
43
|
+
size: number;
|
|
44
|
+
totalElements: number;
|
|
45
|
+
totalPages: number;
|
|
46
|
+
};
|
|
47
|
+
documents: DocumentType<T>[];
|
|
48
|
+
}
|
|
49
|
+
export interface PaginatorOptions<TClass extends AnyParamConstructor<any>> {
|
|
50
|
+
filter?: FilterQuery<DocumentType<TClass>>;
|
|
51
|
+
page?: number;
|
|
52
|
+
size?: number;
|
|
53
|
+
sort?: Record<string, 1 | -1>;
|
|
54
|
+
populate?: PopulateOptions | (PopulateOptions | string)[];
|
|
55
|
+
}
|
|
56
|
+
export declare function createRawDocumentPaginatorObject<T extends AnyParamConstructor<any>>(model: ReturnModelType<T>): (options: PaginatorOptions<T>) => Promise<RawPaginatedResult<T>>;
|
|
57
|
+
export declare function createPaginatorObject<T extends AnyParamConstructor<any>>(model: ReturnModelType<T>, itemSchema: z.ZodTypeAny, transformFn?: (doc: DocumentType<T>) => z.infer<typeof itemSchema>): (options: PaginatorOptions<T>) => Promise<{
|
|
58
|
+
metadata: {
|
|
59
|
+
page: number;
|
|
60
|
+
size: number;
|
|
61
|
+
totalElements: number;
|
|
62
|
+
totalPages: number;
|
|
63
|
+
};
|
|
64
|
+
items: any[];
|
|
65
|
+
}>;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createPaginatedSchema = createPaginatedSchema;
|
|
4
|
+
exports.createRawDocumentPaginatorObject = createRawDocumentPaginatorObject;
|
|
5
|
+
exports.createPaginatorObject = createPaginatorObject;
|
|
6
|
+
const zod_1 = require("zod");
|
|
7
|
+
function createPaginatedSchema(itemSchema) {
|
|
8
|
+
return zod_1.z.object({
|
|
9
|
+
metadata: zod_1.z.object({
|
|
10
|
+
page: zod_1.z.number(),
|
|
11
|
+
size: zod_1.z.number(),
|
|
12
|
+
totalElements: zod_1.z.number(),
|
|
13
|
+
totalPages: zod_1.z.number(),
|
|
14
|
+
}),
|
|
15
|
+
items: zod_1.z.array(itemSchema),
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
async function _basePaginate(model, options) {
|
|
19
|
+
const { filter = {}, page = 1, size = 10, sort = {}, populate, } = options;
|
|
20
|
+
const skip = (page - 1) * size;
|
|
21
|
+
let query = model.find(filter).sort(sort).skip(skip).limit(size);
|
|
22
|
+
if (populate) {
|
|
23
|
+
query = query.populate(populate);
|
|
24
|
+
}
|
|
25
|
+
const [documents, totalElements] = await Promise.all([
|
|
26
|
+
query.exec(),
|
|
27
|
+
model.countDocuments(filter),
|
|
28
|
+
]);
|
|
29
|
+
const totalPages = Math.ceil(totalElements / size);
|
|
30
|
+
return {
|
|
31
|
+
metadata: {
|
|
32
|
+
page,
|
|
33
|
+
size,
|
|
34
|
+
totalElements,
|
|
35
|
+
totalPages,
|
|
36
|
+
},
|
|
37
|
+
documents: documents,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function createRawDocumentPaginatorObject(model) {
|
|
41
|
+
return async function paginate(options) {
|
|
42
|
+
const { metadata, documents } = await _basePaginate(model, options);
|
|
43
|
+
return {
|
|
44
|
+
metadata,
|
|
45
|
+
documents,
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function createPaginatorObject(model, itemSchema, transformFn) {
|
|
50
|
+
const PaginatedSchema = createPaginatedSchema(itemSchema);
|
|
51
|
+
return async function paginate(options) {
|
|
52
|
+
const { metadata, documents } = await _basePaginate(model, options);
|
|
53
|
+
const items = transformFn
|
|
54
|
+
? documents.map(transformFn)
|
|
55
|
+
: documents;
|
|
56
|
+
const paginatedResult = {
|
|
57
|
+
metadata,
|
|
58
|
+
items,
|
|
59
|
+
};
|
|
60
|
+
return PaginatedSchema.parse(paginatedResult);
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=pagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.js","sourceRoot":"/","sources":["utilities/pagination.ts"],"names":[],"mappings":";;AAQA,sDAYC;AA0ED,4EAaC;AASD,sDAqBC;AAvID,6BAAwB;AAMxB,SAAgB,qBAAqB,CACjC,UAAoB;IAEpB,OAAO,OAAC,CAAC,MAAM,CAAC;QACZ,QAAQ,EAAE,OAAC,CAAC,MAAM,CAAC;YACf,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;YAChB,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;YAChB,aAAa,EAAE,OAAC,CAAC,MAAM,EAAE;YACzB,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE;SACzB,CAAC;QACF,KAAK,EAAE,OAAC,CAAC,KAAK,CAAC,UAAU,CAAC;KAC7B,CAAC,CAAC;AACP,CAAC;AA8BD,KAAK,UAAU,aAAa,CACxB,KAAyB,EACzB,OAA4B;IAE5B,MAAM,EACF,MAAM,GAAG,EAAE,EACX,IAAI,GAAG,CAAC,EACR,IAAI,GAAG,EAAE,EACT,IAAI,GAAG,EAAE,EACT,QAAQ,GACX,GAAG,OAAO,CAAC;IAEZ,MAAM,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;IAE/B,IAAI,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEjE,IAAI,QAAQ,EAAE,CAAC;QACX,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACjD,KAAK,CAAC,IAAI,EAAE;QACZ,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC;KAC/B,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAEnD,OAAO;QACH,QAAQ,EAAE;YACN,IAAI;YACJ,IAAI;YACJ,aAAa;YACb,UAAU;SACb;QACD,SAAS,EAAE,SAAyC;KACvD,CAAC;AACN,CAAC;AAQD,SAAgB,gCAAgC,CAE9C,KAAyB;IACvB,OAAO,KAAK,UAAU,QAAQ,CAC1B,OAA4B;QAE5B,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAEpE,OAAO;YACH,QAAQ;YACR,SAAS;SACZ,CAAC;IACN,CAAC,CAAC;AACN,CAAC;AASD,SAAgB,qBAAqB,CACjC,KAAyB,EACzB,UAAwB,EACxB,WAAkE;IAElE,MAAM,eAAe,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;IAE1D,OAAO,KAAK,UAAU,QAAQ,CAAC,OAA4B;QACvD,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAEpE,MAAM,KAAK,GAAG,WAAW;YACrB,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC;YAC5B,CAAC,CAAC,SAAS,CAAC;QAEhB,MAAM,eAAe,GAAG;YACpB,QAAQ;YACR,KAAK;SACR,CAAC;QAEF,OAAO,eAAe,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAClD,CAAC,CAAC;AACN,CAAC","sourcesContent":["import { DocumentType, ReturnModelType } from \"@typegoose/typegoose\";\r\nimport { FilterQuery, PopulateOptions } from \"mongoose\";\r\nimport { z } from \"zod\";\r\nimport { AnyParamConstructor } from \"@typegoose/typegoose/lib/types\";\r\n\r\n/**\r\n * A helper to create a paginated Zod schema for an item type.\r\n */\r\nexport function createPaginatedSchema<ItemType extends z.ZodTypeAny>(\r\n itemSchema: ItemType\r\n) {\r\n return z.object({\r\n metadata: z.object({\r\n page: z.number(),\r\n size: z.number(),\r\n totalElements: z.number(),\r\n totalPages: z.number(),\r\n }),\r\n items: z.array(itemSchema),\r\n });\r\n}\r\n\r\nexport interface RawPaginatedResult<T extends AnyParamConstructor<any>> {\r\n metadata: {\r\n page: number;\r\n size: number;\r\n totalElements: number;\r\n totalPages: number;\r\n };\r\n documents: DocumentType<T>[];\r\n}\r\n\r\n/**\r\n * The common pagination options.\r\n */\r\nexport interface PaginatorOptions<TClass extends AnyParamConstructor<any>> {\r\n filter?: FilterQuery<DocumentType<TClass>>;\r\n page?: number;\r\n size?: number;\r\n sort?: Record<string, 1 | -1>;\r\n populate?: PopulateOptions | (PopulateOptions | string)[];\r\n}\r\n\r\n/**\r\n * This internal function wraps the common query logic:\r\n * - filter, page, size, sort, populate\r\n * - fetch documents, count documents\r\n * - compute totalPages\r\n * Returns a standard object with `metadata` & `documents`.\r\n */\r\nasync function _basePaginate<T extends AnyParamConstructor<any>>(\r\n model: ReturnModelType<T>,\r\n options: PaginatorOptions<T>\r\n): Promise<RawPaginatedResult<T>> {\r\n const {\r\n filter = {},\r\n page = 1,\r\n size = 10,\r\n sort = {},\r\n populate,\r\n } = options;\r\n\r\n const skip = (page - 1) * size;\r\n\r\n let query = model.find(filter).sort(sort).skip(skip).limit(size);\r\n\r\n if (populate) {\r\n query = query.populate(populate);\r\n }\r\n\r\n const [documents, totalElements] = await Promise.all([\r\n query.exec(),\r\n model.countDocuments(filter),\r\n ]);\r\n\r\n const totalPages = Math.ceil(totalElements / size);\r\n\r\n return {\r\n metadata: {\r\n page,\r\n size,\r\n totalElements,\r\n totalPages,\r\n },\r\n documents: documents as unknown as DocumentType<T>[],\r\n };\r\n}\r\n\r\n/**\r\n * Creates a paginator returning raw documents.\r\n *\r\n * @param model The Typegoose model\r\n * @returns A function that, when passed `PaginatorOptions`, returns raw docs + metadata.\r\n */\r\nexport function createRawDocumentPaginatorObject<\r\n T extends AnyParamConstructor<any>\r\n>(model: ReturnModelType<T>) {\r\n return async function paginate(\r\n options: PaginatorOptions<T>\r\n ): Promise<RawPaginatedResult<T>> {\r\n const { metadata, documents } = await _basePaginate(model, options);\r\n\r\n return {\r\n metadata,\r\n documents,\r\n };\r\n };\r\n}\r\n\r\n/**\r\n * Creates a paginator that returns Zod-validated items.\r\n *\r\n * @param model The Typegoose model\r\n * @param itemSchema A Zod schema describing the shape of each item\r\n * @param transformFn Optional transform function to convert raw doc -> item\r\n */\r\nexport function createPaginatorObject<T extends AnyParamConstructor<any>>(\r\n model: ReturnModelType<T>,\r\n itemSchema: z.ZodTypeAny,\r\n transformFn?: (doc: DocumentType<T>) => z.infer<typeof itemSchema>\r\n) {\r\n const PaginatedSchema = createPaginatedSchema(itemSchema);\r\n\r\n return async function paginate(options: PaginatorOptions<T>) {\r\n const { metadata, documents } = await _basePaginate(model, options);\r\n\r\n const items = transformFn\r\n ? documents.map(transformFn)\r\n : documents;\r\n\r\n const paginatedResult = {\r\n metadata,\r\n items,\r\n };\r\n\r\n return PaginatedSchema.parse(paginatedResult);\r\n };\r\n}\r\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lyxa.ai/core",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.4",
|
|
4
4
|
"description": "The Core system of the Lyxa services.",
|
|
5
5
|
"author": "elie <42282499+Internalizable@users.noreply.github.com>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
"firebase": "^11.1.0",
|
|
28
28
|
"firebase-admin": "^13.0.1",
|
|
29
29
|
"ioredis": "^5.4.1",
|
|
30
|
+
"jsonwebtoken": "^9.0.2",
|
|
30
31
|
"mongoose": "^8.9.1",
|
|
31
32
|
"pino": "^9.5.0",
|
|
32
33
|
"pino-mongodb": "^4.3.0",
|