@eecho/express 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/README.md +21 -0
  2. package/dist/api/api.d.ts +13 -0
  3. package/dist/api/api.d.ts.map +1 -0
  4. package/dist/api/api.js +25 -0
  5. package/dist/api/api.js.map +1 -0
  6. package/dist/api/api.middleware.d.ts +5 -0
  7. package/dist/api/api.middleware.d.ts.map +1 -0
  8. package/dist/api/api.middleware.js +14 -0
  9. package/dist/api/api.middleware.js.map +1 -0
  10. package/dist/api/api.type.d.ts +17 -0
  11. package/dist/api/api.type.d.ts.map +1 -0
  12. package/dist/api/api.type.js +2 -0
  13. package/dist/api/api.type.js.map +1 -0
  14. package/dist/api/api.util.d.ts +10 -0
  15. package/dist/api/api.util.d.ts.map +1 -0
  16. package/dist/api/api.util.js +33 -0
  17. package/dist/api/api.util.js.map +1 -0
  18. package/dist/generator/mongo/mongo.api.generator.d.ts +86 -0
  19. package/dist/generator/mongo/mongo.api.generator.d.ts.map +1 -0
  20. package/dist/generator/mongo/mongo.api.generator.js +123 -0
  21. package/dist/generator/mongo/mongo.api.generator.js.map +1 -0
  22. package/dist/generator/mongo/mongo.generator.d.ts +47 -0
  23. package/dist/generator/mongo/mongo.generator.d.ts.map +1 -0
  24. package/dist/generator/mongo/mongo.generator.js +165 -0
  25. package/dist/generator/mongo/mongo.generator.js.map +1 -0
  26. package/dist/generator/mongo/mongo.util.d.ts +4 -0
  27. package/dist/generator/mongo/mongo.util.d.ts.map +1 -0
  28. package/dist/generator/mongo/mongo.util.js +6 -0
  29. package/dist/generator/mongo/mongo.util.js.map +1 -0
  30. package/dist/index.d.ts +10 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +10 -0
  33. package/dist/index.js.map +1 -0
  34. package/package.json +33 -0
package/README.md ADDED
@@ -0,0 +1,21 @@
1
+ # @eecho/express
2
+
3
+ Express server framework library for the EEcho framework with MongoDB integration.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @eecho/express @eecho/definition express mongodb
9
+ ```
10
+
11
+ ## Features
12
+
13
+ - Express-based server framework
14
+ - MongoDB integration with automatic repository generation
15
+ - Auto-generated API endpoints from definitions
16
+ - Type-safe middleware support
17
+ - Repository pattern implementation
18
+ - Built-in CRUD operations
19
+ - Custom field validation and transformation
20
+
21
+ ## Usage
@@ -0,0 +1,13 @@
1
+ import { Router, Request as ExpressRequest, Response as ExpressResponse, NextFunction } from "express";
2
+ import { ServerAPISpecification } from "@eecho/definition";
3
+ import type { APIHandler, ExpressMiddleware } from "./api.type";
4
+ export declare const setMiddleware: <TResult>(fn: ExpressMiddleware<TResult>) => (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => Promise<void | Awaited<TResult>>;
5
+ export declare const setAPIEndpoint: <TSpec extends ServerAPISpecification>(input: {
6
+ router: Router;
7
+ apiEndpoint: TSpec["APIEndpoint"];
8
+ method: TSpec["Method"];
9
+ middlewares?: ExpressMiddleware[];
10
+ apiSpec: TSpec;
11
+ handler: APIHandler<TSpec>;
12
+ }) => void;
13
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,cAAc,EAAE,QAAQ,IAAI,eAAe,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvG,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAyC,MAAM,YAAY,CAAC;AAGvG,eAAO,MAAM,aAAa,GAAI,OAAO,EAAE,IAAI,iBAAiB,CAAC,OAAO,CAAC,MAC3D,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,qCAGtE,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,KAAK,SAAS,sBAAsB,EACjE,OAAO;IACL,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IAClC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxB,WAAW,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAClC,OAAO,EAAE,KAAK,CAAC;IACf,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;CAC5B,SAqBF,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { parseRequestParams, registerRoute } from "./api.util";
2
+ export const setMiddleware = (fn) => {
3
+ return (req, res, next) => {
4
+ return Promise.resolve(fn(req, res, next)).catch(next);
5
+ };
6
+ };
7
+ export const setAPIEndpoint = (input) => {
8
+ const { router, middlewares = [], apiSpec, handler } = input;
9
+ const { APIEndpoint, Method, Request } = apiSpec;
10
+ const apiMiddleware = setMiddleware((req, res, next) => {
11
+ const { queryParams, bodyParams } = parseRequestParams(req, Request);
12
+ return handler({
13
+ req,
14
+ res,
15
+ next,
16
+ params: {
17
+ query: queryParams,
18
+ body: bodyParams
19
+ }
20
+ });
21
+ });
22
+ const allMiddlewares = [...middlewares, apiMiddleware];
23
+ registerRoute(router, Method, APIEndpoint, allMiddlewares);
24
+ };
25
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/api/api.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE/D,MAAM,CAAC,MAAM,aAAa,GAAG,CAAU,EAA8B,EAAE,EAAE;IACvE,OAAO,CAAC,GAAmB,EAAE,GAAoB,EAAE,IAAkB,EAAE,EAAE;QACvE,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,KAOC,EACD,EAAE;IACF,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAC7D,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAEjD,MAAM,aAAa,GAAG,aAAa,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACrD,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAErE,OAAO,OAAO,CAAC;YACb,GAAG;YACH,GAAG;YACH,IAAI;YACJ,MAAM,EAAE;gBACN,KAAK,EAAE,WAAwC;gBAC/C,IAAI,EAAE,UAAsC;aAC7C;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,CAAC,GAAG,WAAW,EAAE,aAAa,CAAC,CAAC;IACvD,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;AAC7D,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { NextFunction, Request as ExpressRequest, Response as ExpressResponse } from "express";
2
+ type ExpressExceptionMiddleware = (err: Error, req: ExpressRequest, res: ExpressResponse, next: NextFunction) => void;
3
+ export declare const ExceptionMiddleware: ExpressExceptionMiddleware;
4
+ export {};
5
+ //# sourceMappingURL=api.middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.middleware.d.ts","sourceRoot":"","sources":["../../src/api/api.middleware.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,OAAO,IAAI,cAAc,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/F,KAAK,0BAA0B,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;AAEtH,eAAO,MAAM,mBAAmB,EAAE,0BAajC,CAAC"}
@@ -0,0 +1,14 @@
1
+ export const ExceptionMiddleware = (err, req, res, next) => {
2
+ console.error('API Exception occurred', {
3
+ method: req.method,
4
+ url: req.originalUrl,
5
+ userAgent: req.get('User-Agent'),
6
+ ip: req.ip,
7
+ error: err
8
+ });
9
+ return res.status(500).json({
10
+ success: false,
11
+ message: "EXCEPTION_MIDDLEWARE_UNKNOWN_ERROR"
12
+ });
13
+ };
14
+ //# sourceMappingURL=api.middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.middleware.js","sourceRoot":"","sources":["../../src/api/api.middleware.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,mBAAmB,GAA+B,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;IACrF,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE;QACtC,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,GAAG,EAAE,GAAG,CAAC,WAAW;QACpB,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC;QAChC,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,KAAK,EAAE,GAAG;KACX,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QAC1B,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,oCAAoC;KAC9C,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { Request as ExpressRequest, Response as ExpressResponse, NextFunction } from 'express';
2
+ import { z } from 'zod';
3
+ import { ServerAPISpecification } from '@eecho/definition';
4
+ export type ExtractQueryParams<TSpec extends ServerAPISpecification> = TSpec['Request']['queryParams'] extends z.ZodTypeAny ? z.infer<TSpec['Request']['queryParams']> : {};
5
+ export type ExtractBodyParams<TSpec extends ServerAPISpecification> = TSpec['Request']['body'] extends z.ZodTypeAny ? z.infer<TSpec['Request']['body']> : {};
6
+ export type ExtractResponseType<TSpec extends ServerAPISpecification> = TSpec['Response']['body'] extends z.ZodTypeAny ? z.infer<TSpec['Response']['body']> : any;
7
+ export type APIHandler<TSpec extends ServerAPISpecification> = (opts: {
8
+ req: ExpressRequest;
9
+ res: ExpressResponse;
10
+ params: {
11
+ query: ExtractQueryParams<TSpec>;
12
+ body: ExtractBodyParams<TSpec>;
13
+ };
14
+ next?: NextFunction;
15
+ }) => ExtractResponseType<TSpec> | Promise<ExtractResponseType<TSpec>>;
16
+ export type ExpressMiddleware<TReturn = any> = (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => TReturn | Promise<TReturn>;
17
+ //# sourceMappingURL=api.type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.type.d.ts","sourceRoot":"","sources":["../../src/api/api.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,IAAI,cAAc,EAAE,QAAQ,IAAI,eAAe,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACpG,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,MAAM,MAAM,kBAAkB,CAAC,KAAK,SAAS,sBAAsB,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,UAAU,GACvH,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,CAAC,GACxC,EAAE,CAAC;AAEP,MAAM,MAAM,iBAAiB,CAAC,KAAK,SAAS,sBAAsB,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,UAAU,GAC/G,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,GACjC,EAAE,CAAC;AAEP,MAAM,MAAM,mBAAmB,CAAC,KAAK,SAAS,sBAAsB,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,UAAU,GAClH,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,GAClC,GAAG,CAAC;AAER,MAAM,MAAM,UAAU,CAAC,KAAK,SAAS,sBAAsB,IAAI,CAAC,IAAI,EAAE;IACpE,GAAG,EAAE,cAAc,CAAC;IACpB,GAAG,EAAE,eAAe,CAAC;IACrB,MAAM,EAAE;QACN,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC;KAChC,CAAC;IACF,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB,KAAK,mBAAmB,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;AAEvE,MAAM,MAAM,iBAAiB,CAAC,OAAO,GAAG,GAAG,IAAI,CAC7C,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,eAAe,EACpB,IAAI,EAAE,YAAY,KACf,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=api.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.type.js","sourceRoot":"","sources":["../../src/api/api.type.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ import type { Request as ExpressRequest, Router } from "express";
2
+ import { z } from "zod";
3
+ import { ExpressMiddleware } from "./api.type";
4
+ import { ServerAPISpecification } from "@eecho/definition";
5
+ export declare const parseRequestParams: <TSpec extends ServerAPISpecification>(req: ExpressRequest, requestSpec: TSpec["Request"]) => {
6
+ queryParams: TSpec["Request"]["queryParams"] extends z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>> ? z.core.output<TSpec["Request"]["queryParams"]> : Record<string, any>;
7
+ bodyParams: TSpec["Request"]["body"] extends z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>> ? z.core.output<TSpec["Request"]["body"]> : Record<string, any>;
8
+ };
9
+ export declare const registerRoute: (router: Router, method: ServerAPISpecification["Method"], endpoint: string, middlewares: ExpressMiddleware[]) => void;
10
+ //# sourceMappingURL=api.util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.util.d.ts","sourceRoot":"","sources":["../../src/api/api.util.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,IAAI,cAAc,EAA6C,MAAM,EAAE,MAAM,SAAS,CAAC;AAC5G,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,eAAO,MAAM,kBAAkB,GAAI,KAAK,SAAS,sBAAsB,EACrE,KAAK,cAAc,EACnB,aAAa,KAAK,CAAC,SAAS,CAAC;;;CAsB9B,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,QAAQ,MAAM,EACd,QAAQ,sBAAsB,CAAC,QAAQ,CAAC,EACxC,UAAU,MAAM,EAChB,aAAa,iBAAiB,EAAE,SAqBjC,CAAC"}
@@ -0,0 +1,33 @@
1
+ export const parseRequestParams = (req, requestSpec) => {
2
+ let queryParams = {};
3
+ let bodyParams = {};
4
+ if (requestSpec.queryParams) {
5
+ queryParams = requestSpec.queryParams.parse(req.query);
6
+ }
7
+ if (requestSpec.body) {
8
+ bodyParams = requestSpec.body.parse(req.body);
9
+ }
10
+ return { queryParams, bodyParams };
11
+ };
12
+ export const registerRoute = (router, method, endpoint, middlewares) => {
13
+ switch (method) {
14
+ case 'GET':
15
+ router.get(endpoint, ...middlewares);
16
+ break;
17
+ case 'POST':
18
+ router.post(endpoint, ...middlewares);
19
+ break;
20
+ case 'PUT':
21
+ router.put(endpoint, ...middlewares);
22
+ break;
23
+ case 'PATCH':
24
+ router.patch(endpoint, ...middlewares);
25
+ break;
26
+ case 'DELETE':
27
+ router.delete(endpoint, ...middlewares);
28
+ break;
29
+ default:
30
+ throw new Error(`Unsupported HTTP method: ${method}`);
31
+ }
32
+ };
33
+ //# sourceMappingURL=api.util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.util.js","sourceRoot":"","sources":["../../src/api/api.util.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,GAAmB,EACnB,WAA6B,EAC7B,EAAE;IASF,IAAI,WAAW,GAAoB,EAAqB,CAAC;IACzD,IAAI,UAAU,GAAmB,EAAoB,CAAC;IAEtD,IAAI,WAAW,CAAC,WAAW,EAAE,CAAC;QAC5B,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAoB,CAAC;IAC5E,CAAC;IAED,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;QACrB,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAmB,CAAC;IAClE,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;AACrC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,MAAc,EACd,MAAwC,EACxC,QAAgB,EAChB,WAAgC,EAChC,EAAE;IACF,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,KAAK;YACR,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,WAAW,CAAC,CAAC;YACrC,MAAM;QACR,KAAK,MAAM;YACT,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,WAAW,CAAC,CAAC;YACtC,MAAM;QACR,KAAK,KAAK;YACR,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,WAAW,CAAC,CAAC;YACrC,MAAM;QACR,KAAK,OAAO;YACV,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,WAAW,CAAC,CAAC;YACvC,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,WAAW,CAAC,CAAC;YACxC,MAAM;QACR;YACE,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,EAAE,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,86 @@
1
+ import { ObjectId } from 'bson';
2
+ import { z } from 'zod';
3
+ import { Definition } from '@eecho/definition';
4
+ export declare function genAPISpec<TDefinition extends Definition, const TPrefix extends string>(params: {
5
+ definition: TDefinition;
6
+ endpointPrefix: TPrefix;
7
+ }): {
8
+ CreateAPISpecification: {
9
+ readonly APIEndpoint: `${TPrefix}/createItems`;
10
+ readonly Method: "POST";
11
+ readonly Request: {
12
+ readonly body: z.ZodObject<{
13
+ data: z.ZodObject<({ [K_1 in keyof TDefinition]: TDefinition[K_1] extends import("@eecho/definition/dist/model/model.define.type").PrimitiveDefinition<any, any, infer TApi extends import("@eecho/definition/dist/model/model.define.type").APIIndex, string> ? TApi["create"] extends readonly unknown[] ? Extract<"Optional", TApi["create"][number]> | Extract<"System", TApi["create"][number]> extends never ? K_1 : never : K_1 : never; }[keyof TDefinition] extends infer T_1 extends keyof TDefinition ? { [K in T_1 as TDefinition[K] extends import("@eecho/definition/dist/model/model.define.type").PrimitiveDefinition<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>, readonly import("@eecho/definition/dist/model/model.define.type").PrimitiveIndex[], import("@eecho/definition/dist/model/model.define.type").APIIndex, string> ? K : never]: TDefinition[K] extends import("@eecho/definition/dist/model/model.define.type").PrimitiveDefinition<infer TSchema extends z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>, readonly import("@eecho/definition/dist/model/model.define.type").PrimitiveIndex[], import("@eecho/definition/dist/model/model.define.type").APIIndex, string> ? TSchema : never; } : never) extends infer T ? { -readonly [P in keyof T]: T[P]; } : never, z.core.$strip>;
14
+ }, z.core.$strip>;
15
+ };
16
+ readonly Response: {
17
+ readonly body: z.ZodObject<{
18
+ success: z.ZodLiteral<true>;
19
+ data: z.ZodObject<{
20
+ id: z.ZodUnion<readonly [z.ZodString, z.ZodCustom<ObjectId, ObjectId>]>;
21
+ }, z.core.$strip>;
22
+ }, z.core.$strip>;
23
+ };
24
+ };
25
+ ReadAPISpecification: {
26
+ readonly APIEndpoint: `${TPrefix}/getItems`;
27
+ readonly Method: "GET";
28
+ readonly Request: {
29
+ readonly queryParams: z.ZodObject<{
30
+ page: z.ZodOptional<z.ZodDefault<z.ZodCoercedNumber<unknown>>>;
31
+ limit: z.ZodOptional<z.ZodDefault<z.ZodCoercedNumber<unknown>>>;
32
+ filter: z.ZodUnion<readonly [z.ZodOptional<z.ZodObject<(({ [K_4 in keyof TDefinition]: TDefinition[K_4] extends import("@eecho/definition/dist/model/model.define.type").PrimitiveDefinition<any, any, infer TApi extends import("@eecho/definition/dist/model/model.define.type").APIIndex, string> ? TApi["read"] extends readonly unknown[] ? "Searchable" extends infer T_5 ? T_5 extends "Searchable" ? T_5 extends TApi["read"][number] ? K_4 : never : never : never : never : never; }[keyof TDefinition] extends infer T_4 extends keyof TDefinition ? { [K_3 in T_4 as TDefinition[K_3] extends import("@eecho/definition/dist/model/model.define.type").PrimitiveDefinition<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>, readonly import("@eecho/definition/dist/model/model.define.type").PrimitiveIndex[], import("@eecho/definition/dist/model/model.define.type").APIIndex, string> ? K_3 : never]: TDefinition[K_3] extends import("@eecho/definition/dist/model/model.define.type").PrimitiveDefinition<infer TSchema extends z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>, readonly import("@eecho/definition/dist/model/model.define.type").PrimitiveIndex[], import("@eecho/definition/dist/model/model.define.type").APIIndex, string> ? TSchema : never; } : never) extends infer T_3 extends Record<string, z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>> ? { [K_2 in keyof T_3]: z.ZodOptional<T_3[K_2]>; } : never) extends infer T_2 ? { -readonly [P_1 in keyof T_2]: T_2[P_1]; } : never, z.core.$strip>>, z.ZodOptional<z.ZodObject<(({ [K_7 in keyof TDefinition]: TDefinition[K_7] extends import("@eecho/definition/dist/model/model.define.type").PrimitiveDefinition<any, any, infer TApi extends import("@eecho/definition/dist/model/model.define.type").APIIndex, string> ? TApi["read"] extends readonly unknown[] ? "SearchableArray" extends infer T_8 ? T_8 extends "SearchableArray" ? T_8 extends TApi["read"][number] ? K_7 : never : never : never : never : never; }[keyof TDefinition] extends infer T_7 extends keyof TDefinition ? { [K_6 in T_7 as TDefinition[K_6] extends import("@eecho/definition/dist/model/model.define.type").PrimitiveDefinition<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>, readonly import("@eecho/definition/dist/model/model.define.type").PrimitiveIndex[], import("@eecho/definition/dist/model/model.define.type").APIIndex, string> ? K_6 : never]: TDefinition[K_6] extends import("@eecho/definition/dist/model/model.define.type").PrimitiveDefinition<infer TSchema extends z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>, readonly import("@eecho/definition/dist/model/model.define.type").PrimitiveIndex[], import("@eecho/definition/dist/model/model.define.type").APIIndex, string> ? TSchema : never; } : never) extends infer T_6 extends Record<string, z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>> ? { [K_5 in keyof T_6]: z.ZodOptional<z.ZodArray<z.ZodOptional<T_6[K_5]>>>; } : never) extends infer T_5 ? { -readonly [P_2 in keyof T_5]: T_5[P_2]; } : never, z.core.$strip>>]>;
33
+ sort: z.ZodOptional<z.ZodObject<(({ [K_10 in keyof TDefinition]: TDefinition[K_10] extends import("@eecho/definition/dist/model/model.define.type").PrimitiveDefinition<any, any, infer TApi extends import("@eecho/definition/dist/model/model.define.type").APIIndex, string> ? TApi["read"] extends readonly unknown[] ? "Sortable" extends infer T_11 ? T_11 extends "Sortable" ? T_11 extends TApi["read"][number] ? K_10 : never : never : never : never : never; }[keyof TDefinition] extends infer T_10 extends keyof TDefinition ? { [K_9 in T_10 as TDefinition[K_9] extends import("@eecho/definition/dist/model/model.define.type").PrimitiveDefinition<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>, readonly import("@eecho/definition/dist/model/model.define.type").PrimitiveIndex[], import("@eecho/definition/dist/model/model.define.type").APIIndex, string> ? K_9 : never]: TDefinition[K_9] extends import("@eecho/definition/dist/model/model.define.type").PrimitiveDefinition<infer TSchema extends z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>, readonly import("@eecho/definition/dist/model/model.define.type").PrimitiveIndex[], import("@eecho/definition/dist/model/model.define.type").APIIndex, string> ? TSchema : never; } : never) extends infer T_9 extends Record<string, z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>> ? { [K_8 in keyof T_9]: z.ZodOptional<T_9[K_8]>; } : never) extends infer T_8 ? { -readonly [P_3 in keyof T_8]: T_8[P_3]; } : never, z.core.$strip>>;
34
+ }, z.core.$strip>;
35
+ };
36
+ readonly Response: {
37
+ readonly body: z.ZodObject<{
38
+ success: z.ZodLiteral<true>;
39
+ data: z.ZodArray<z.ZodObject<({ [K_12 in keyof TDefinition]: TDefinition[K_12] extends import("@eecho/definition/dist/model/model.define.type").PrimitiveDefinition<any, any, infer TApi extends import("@eecho/definition/dist/model/model.define.type").APIIndex, string> ? TApi["read"] extends readonly unknown[] ? Extract<"Hidden", TApi["read"][number]> | Extract<"Detail", TApi["read"][number]> extends never ? K_12 : never : K_12 : never; }[keyof TDefinition] extends infer T_12 extends keyof TDefinition ? { [K_11 in T_12 as TDefinition[K_11] extends import("@eecho/definition/dist/model/model.define.type").PrimitiveDefinition<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>, readonly import("@eecho/definition/dist/model/model.define.type").PrimitiveIndex[], import("@eecho/definition/dist/model/model.define.type").APIIndex, string> ? K_11 : never]: TDefinition[K_11] extends import("@eecho/definition/dist/model/model.define.type").PrimitiveDefinition<infer TSchema extends z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>, readonly import("@eecho/definition/dist/model/model.define.type").PrimitiveIndex[], import("@eecho/definition/dist/model/model.define.type").APIIndex, string> ? TSchema : never; } : never) extends infer T_11 ? { -readonly [P_4 in keyof T_11]: T_11[P_4]; } : never, z.core.$strip>>;
40
+ }, z.core.$strip>;
41
+ };
42
+ };
43
+ UpdateAPISpecification: {
44
+ readonly APIEndpoint: `${TPrefix}/updateItem`;
45
+ readonly Method: "POST";
46
+ readonly Request: {
47
+ readonly body: z.ZodObject<{
48
+ id: z.ZodPipe<z.ZodUnion<readonly [z.ZodString, z.ZodCustom<ObjectId, ObjectId>]>, z.ZodTransform<ObjectId, string | ObjectId>>;
49
+ data: z.ZodObject<(({ [K_15 in keyof TDefinition]: TDefinition[K_15] extends import("@eecho/definition/dist/model/model.define.type").PrimitiveDefinition<any, any, infer TApi extends import("@eecho/definition/dist/model/model.define.type").APIIndex, string> ? TApi["update"] extends readonly unknown[] ? "Updatable" extends infer T_16 ? T_16 extends "Updatable" ? T_16 extends TApi["update"][number] ? K_15 : never : never : never : never : never; }[keyof TDefinition] extends infer T_15 extends keyof TDefinition ? { [K_14 in T_15 as TDefinition[K_14] extends import("@eecho/definition/dist/model/model.define.type").PrimitiveDefinition<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>, readonly import("@eecho/definition/dist/model/model.define.type").PrimitiveIndex[], import("@eecho/definition/dist/model/model.define.type").APIIndex, string> ? K_14 : never]: TDefinition[K_14] extends import("@eecho/definition/dist/model/model.define.type").PrimitiveDefinition<infer TSchema extends z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>, readonly import("@eecho/definition/dist/model/model.define.type").PrimitiveIndex[], import("@eecho/definition/dist/model/model.define.type").APIIndex, string> ? TSchema : never; } : never) extends infer T_14 extends Record<string, z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>> ? { [K_13 in keyof T_14]: z.ZodOptional<T_14[K_13]>; } : never) extends infer T_13 ? { -readonly [P_5 in keyof T_13]: T_13[P_5]; } : never, z.core.$strip>;
50
+ }, z.core.$strip>;
51
+ };
52
+ readonly Response: {
53
+ readonly body: z.ZodObject<{}, z.core.$strip>;
54
+ };
55
+ };
56
+ DeleteAPISpecification: {
57
+ readonly APIEndpoint: `${TPrefix}/deleteItems`;
58
+ readonly Method: "POST";
59
+ readonly Request: {
60
+ readonly body: z.ZodObject<{
61
+ ids: z.ZodArray<z.ZodObject<{}, z.core.$strip>>;
62
+ }, z.core.$strip>;
63
+ };
64
+ readonly Response: {
65
+ readonly body: z.ZodObject<{}, z.core.$strip>;
66
+ };
67
+ };
68
+ PutAPISpecification: {
69
+ readonly APIEndpoint: `${TPrefix}/putItem`;
70
+ readonly Method: "PUT";
71
+ readonly Request: {
72
+ readonly body: z.ZodObject<{
73
+ data: z.ZodObject<({ [K_1 in keyof TDefinition]: TDefinition[K_1] extends import("@eecho/definition/dist/model/model.define.type").PrimitiveDefinition<any, any, infer TApi extends import("@eecho/definition/dist/model/model.define.type").APIIndex, string> ? TApi["create"] extends readonly unknown[] ? Extract<"Optional", TApi["create"][number]> | Extract<"System", TApi["create"][number]> extends never ? K_1 : never : K_1 : never; }[keyof TDefinition] extends infer T_17 extends keyof TDefinition ? { [K in T_17 as TDefinition[K] extends import("@eecho/definition/dist/model/model.define.type").PrimitiveDefinition<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>, readonly import("@eecho/definition/dist/model/model.define.type").PrimitiveIndex[], import("@eecho/definition/dist/model/model.define.type").APIIndex, string> ? K : never]: TDefinition[K] extends import("@eecho/definition/dist/model/model.define.type").PrimitiveDefinition<infer TSchema extends z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>, readonly import("@eecho/definition/dist/model/model.define.type").PrimitiveIndex[], import("@eecho/definition/dist/model/model.define.type").APIIndex, string> ? TSchema : never; } : never) extends infer T_16 ? { -readonly [P in keyof T_16]: T_16[P]; } : never, z.core.$strip>;
74
+ }, z.core.$strip>;
75
+ };
76
+ readonly Response: {
77
+ readonly body: z.ZodObject<{
78
+ success: z.ZodLiteral<true>;
79
+ data: z.ZodObject<{
80
+ id: z.ZodUnion<readonly [z.ZodString, z.ZodCustom<ObjectId, ObjectId>]>;
81
+ }, z.core.$strip>;
82
+ }, z.core.$strip>;
83
+ };
84
+ };
85
+ };
86
+ //# sourceMappingURL=mongo.api.generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongo.api.generator.d.ts","sourceRoot":"","sources":["../../../src/generator/mongo/mongo.api.generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EASL,UAAU,EACV,MAAM,mBAAmB,CAAC;AAuC5B,wBAAgB,UAAU,CAAC,WAAW,SAAS,UAAU,EAAE,KAAK,CAAC,OAAO,SAAS,MAAM,EAAE,MAAM,EAAE;IAC/F,UAAU,EAAE,WAAW,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;CACzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyGA"}
@@ -0,0 +1,123 @@
1
+ import { ObjectId } from 'bson';
2
+ import { z } from 'zod';
3
+ import { extractCreateRequiredField, extractReadbleField, extractSearchArrayOption, extractSearchOption, extractSortableOption, extractUpdateOption, extractObjectIdFields } from '@eecho/definition';
4
+ import { ObjectIdCompatible } from './mongo.util';
5
+ const convertToObjectId = (value) => {
6
+ if (value === undefined || value === null) {
7
+ return value;
8
+ }
9
+ if (value instanceof ObjectId) {
10
+ return value;
11
+ }
12
+ if (Array.isArray(value)) {
13
+ return value.map((item) => convertToObjectId(item));
14
+ }
15
+ return new ObjectId(value);
16
+ };
17
+ const applyObjectIdTransforms = (shape, objectIdFields) => {
18
+ if (objectIdFields.size === 0) {
19
+ return shape;
20
+ }
21
+ return Object.fromEntries(Object.entries(shape).map(([key, schema]) => {
22
+ if (!objectIdFields.has(key)) {
23
+ return [key, schema];
24
+ }
25
+ return [key, schema.transform((val) => convertToObjectId(val))];
26
+ }));
27
+ };
28
+ export function genAPISpec(params) {
29
+ const { definition, endpointPrefix } = params;
30
+ const createRequiredField = extractCreateRequiredField({ definition });
31
+ const readableField = extractReadbleField({ definition });
32
+ const searchableOption = extractSearchOption({ definition });
33
+ const searchableArrayOption = extractSearchArrayOption({ definition });
34
+ const sortableOption = extractSortableOption({ definition });
35
+ const updatableOption = extractUpdateOption({ definition });
36
+ const objectIdFields = new Set(extractObjectIdFields({ definition }).map((key) => String(key)));
37
+ const createBodyShape = applyObjectIdTransforms(createRequiredField, objectIdFields);
38
+ const updateBodyShape = applyObjectIdTransforms(updatableOption, objectIdFields);
39
+ const searchableShape = applyObjectIdTransforms(searchableOption, objectIdFields);
40
+ const searchableArrayShape = applyObjectIdTransforms(searchableArrayOption, objectIdFields);
41
+ const sortableShape = applyObjectIdTransforms(sortableOption, objectIdFields);
42
+ const CreateAPISpecification = {
43
+ APIEndpoint: `${endpointPrefix}/createItems`,
44
+ Method: 'POST',
45
+ Request: {
46
+ body: z.object({ data: z.object(createBodyShape) }),
47
+ },
48
+ Response: {
49
+ body: z.object({
50
+ success: z.literal(true),
51
+ data: z.object({
52
+ id: ObjectIdCompatible,
53
+ }),
54
+ }),
55
+ },
56
+ };
57
+ const ReadAPISpecification = {
58
+ APIEndpoint: `${endpointPrefix}/getItems`,
59
+ Method: 'GET',
60
+ Request: {
61
+ queryParams: z.object({
62
+ page: z.coerce.number().default(1).optional(),
63
+ limit: z.coerce.number().default(15).optional(),
64
+ filter: z.union([z.object(searchableShape).optional(), z.object(searchableArrayShape).optional()]),
65
+ sort: z.object(sortableShape).optional(),
66
+ }),
67
+ },
68
+ Response: {
69
+ body: z.object({
70
+ success: z.literal(true),
71
+ data: z.array(z.object(readableField)),
72
+ }),
73
+ },
74
+ };
75
+ const UpdateAPISpecification = {
76
+ APIEndpoint: `${endpointPrefix}/updateItem`,
77
+ Method: 'POST',
78
+ Request: {
79
+ body: z.object({
80
+ id: ObjectIdCompatible.transform((val) => new ObjectId(val ?? 'Undefined ObjectId')),
81
+ data: z.object(updateBodyShape),
82
+ })
83
+ },
84
+ Response: {
85
+ body: z.object({})
86
+ },
87
+ };
88
+ const DeleteAPISpecification = {
89
+ APIEndpoint: `${endpointPrefix}/deleteItems`,
90
+ Method: 'POST',
91
+ Request: {
92
+ body: z.object({
93
+ ids: z.array(z.object({})),
94
+ }),
95
+ },
96
+ Response: {
97
+ body: z.object({})
98
+ },
99
+ };
100
+ const PutAPISpecification = {
101
+ APIEndpoint: `${endpointPrefix}/putItem`,
102
+ Method: 'PUT',
103
+ Request: {
104
+ body: z.object({ data: z.object(createBodyShape) }),
105
+ },
106
+ Response: {
107
+ body: z.object({
108
+ success: z.literal(true),
109
+ data: z.object({
110
+ id: ObjectIdCompatible,
111
+ }),
112
+ }),
113
+ },
114
+ };
115
+ return {
116
+ CreateAPISpecification,
117
+ ReadAPISpecification,
118
+ UpdateAPISpecification,
119
+ DeleteAPISpecification,
120
+ PutAPISpecification
121
+ };
122
+ }
123
+ //# sourceMappingURL=mongo.api.generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongo.api.generator.js","sourceRoot":"","sources":["../../../src/generator/mongo/mongo.api.generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import { ClientSession, Filter, FindOneAndUpdateOptions, MongoClient, ObjectId, UpdateFilter } from "mongodb";
2
+ import { z } from 'zod';
3
+ import { DefinitionDocument, ViewDefinition, Definition } from "@eecho/definition";
4
+ import { extractCreateFieldWithSystem } from "@eecho/definition";
5
+ type CreateDocument<T extends Definition> = {
6
+ [K in keyof ReturnType<typeof extractCreateFieldWithSystem<T>>]: z.infer<ReturnType<typeof extractCreateFieldWithSystem<T>>[K]>;
7
+ };
8
+ export declare function genRepository<TDefinition extends Definition>(params: {
9
+ definition: TDefinition;
10
+ dbClient: Promise<MongoClient>;
11
+ dbName?: string;
12
+ collectionName: string;
13
+ }): {
14
+ getItems(params: {
15
+ page?: number;
16
+ limit?: number;
17
+ search?: any;
18
+ }): Promise<import("mongodb").WithId<DefinitionDocument<TDefinition>>[]>;
19
+ putItem(params: {
20
+ idFilter: Filter<DefinitionDocument<TDefinition>>;
21
+ updateFilter: UpdateFilter<DefinitionDocument<TDefinition>>;
22
+ putOption?: FindOneAndUpdateOptions;
23
+ }): Promise<import("mongodb").WithId<DefinitionDocument<TDefinition>>>;
24
+ updateItemById(params: {
25
+ _id: ObjectId;
26
+ data: any;
27
+ }, option?: {
28
+ session?: ClientSession;
29
+ }): Promise<import("mongodb").UpdateResult<DefinitionDocument<TDefinition>>>;
30
+ createItems(params: {
31
+ items: CreateDocument<TDefinition>[];
32
+ }, option?: {
33
+ session?: ClientSession;
34
+ }): Promise<import("mongodb").InsertManyResult<DefinitionDocument<TDefinition>>>;
35
+ };
36
+ export declare function genViewRepository<TDefinition extends ViewDefinition>(params: {
37
+ definition: TDefinition;
38
+ dbClient: Promise<MongoClient>;
39
+ }): {
40
+ getItems(params: {
41
+ page?: number;
42
+ limit?: number;
43
+ search?: any;
44
+ }): Promise<DefinitionDocument<TDefinition["viewDefinition"]>[]>;
45
+ };
46
+ export {};
47
+ //# sourceMappingURL=mongo.generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongo.generator.d.ts","sourceRoot":"","sources":["../../../src/generator/mongo/mongo.generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,uBAAuB,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC9G,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,UAAU,EAAyB,MAAM,mBAAmB,CAAC;AAC1G,OAAO,EAAsE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AAGrI,KAAK,cAAc,CAAC,CAAC,SAAS,UAAU,IAAI;KACzC,CAAC,IAAI,MAAM,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAChI,CAAC;AAkCF,wBAAgB,aAAa,CAAC,WAAW,SAAS,UAAU,EAAE,MAAM,EAAE;IACpE,UAAU,EAAE,WAAW,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;CACxB;qBAa0B;QACrB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,GAAG,CAAC;KACd;oBAYqB;QACpB,QAAQ,EAAE,MAAM,iCAAQ,CAAC;QACzB,YAAY,EAAE,YAAY,iCAAQ,CAAC;QACnC,SAAS,CAAC,EAAE,uBAAuB,CAAC;KACrC;2BAeS;QACN,GAAG,EAAE,QAAQ,CAAC;QACd,IAAI,EAAE,GAAG,CAAC;KACX,WACQ;QACP,OAAO,CAAC,EAAE,aAAa,CAAC;KACzB;wBAWO;QACN,KAAK,EAAE,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC;KACtC,WACQ;QACP,OAAO,CAAC,EAAE,aAAa,CAAC;KACzB;EAoBN;AAyCD,wBAAgB,iBAAiB,CAAC,WAAW,SAAS,cAAc,EAAE,MAAM,EAAE;IAC5E,UAAU,EAAE,WAAW,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;CAChC;qBAqC0B;QACrB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,GAAG,CAAC;KACd;EAoCJ"}
@@ -0,0 +1,165 @@
1
+ import { ObjectId } from "mongodb";
2
+ import { z } from 'zod';
3
+ import { findRepositoryContext } from "@eecho/definition";
4
+ import { extractSearchOption, extractSearchArrayOption, extractCreateFieldWithSystem } from "@eecho/definition";
5
+ // 검색 가능한 필드들을 추출하는 헬퍼 함수 (기존 helper 활용)
6
+ function getSearchableFields(definition) {
7
+ const searchableFields = Object.keys(extractSearchOption({ definition }));
8
+ const searchableArrayFields = Object.keys(extractSearchArrayOption({ definition }));
9
+ return [...searchableFields, ...searchableArrayFields];
10
+ }
11
+ // 검색 쿼리를 빌드하는 헬퍼 함수
12
+ function buildSearchQuery(search, searchableFields) {
13
+ if (!search)
14
+ return {};
15
+ return Object.fromEntries(Object.entries(search)
16
+ .filter(([_, value]) => value)
17
+ .map(([key, value]) => {
18
+ if (!searchableFields.includes(key)) {
19
+ throw new Error(`Invalid search field: ${key}`);
20
+ }
21
+ if (Array.isArray(value)) {
22
+ return [key, { $in: value }];
23
+ }
24
+ else if (typeof value === 'string') {
25
+ return [key, { $regex: value, $options: 'i' }];
26
+ }
27
+ else if (value instanceof ObjectId) {
28
+ return [key, value];
29
+ }
30
+ else {
31
+ throw new Error(`Unsupported search field type for key: ${key}`);
32
+ }
33
+ }));
34
+ }
35
+ export function genRepository(params) {
36
+ const { definition, dbClient, dbName, collectionName } = params;
37
+ // 컬렉션 가져오기
38
+ const getCollection = async () => {
39
+ return (await dbClient).db(dbName).collection(collectionName);
40
+ };
41
+ const searchableFields = getSearchableFields(definition);
42
+ const repository = {
43
+ async getItems(params) {
44
+ const collection = await getCollection();
45
+ const { page = 1, limit = 15, search } = params;
46
+ const query = buildSearchQuery(search, searchableFields);
47
+ return collection
48
+ .find(query)
49
+ .limit(limit)
50
+ .skip((page - 1) * limit)
51
+ .toArray();
52
+ },
53
+ async putItem(params) {
54
+ const collection = await getCollection();
55
+ const doc = await collection.findOneAndUpdate(params.idFilter, params.updateFilter, params.putOption ?? {});
56
+ if (!doc) {
57
+ throw new Error('Failed to upsert document.');
58
+ }
59
+ return doc;
60
+ },
61
+ async updateItemById(params, option) {
62
+ const collection = await getCollection();
63
+ return collection.updateOne({ _id: { $eq: params._id } }, { $set: params.data }, { session: option?.session });
64
+ },
65
+ async createItems(params, option) {
66
+ const collection = await getCollection();
67
+ // extractCreateFieldWithSystem을 사용하여 스키마 생성 (Optional만 제외)
68
+ const createFields = extractCreateFieldWithSystem({ definition });
69
+ const createSchema = z.object(createFields);
70
+ // 각 아이템에 대해 스키마 검증
71
+ const validatedItems = params.items.map(item => createSchema.parse(item));
72
+ return collection.insertMany(validatedItems, { session: option?.session });
73
+ },
74
+ };
75
+ return repository;
76
+ }
77
+ // Projection을 빌드하는 헬퍼 함수
78
+ function buildProjection(viewDefinition, baseModelKeys, relationInfos) {
79
+ const projectionEntries = [['_id', 1]];
80
+ for (const [key, fieldDef] of Object.entries(viewDefinition)) {
81
+ if (baseModelKeys.has(key)) {
82
+ projectionEntries.push([key, 1]);
83
+ continue;
84
+ }
85
+ let mapped = false;
86
+ for (const { rel, alias } of relationInfos) {
87
+ const relationField = Object.values(rel.relationModel).find((relationDef) => relationDef.key === fieldDef.key);
88
+ if (relationField) {
89
+ projectionEntries.push([
90
+ key,
91
+ { $first: `$${alias}.${relationField.key}` }
92
+ ]);
93
+ mapped = true;
94
+ break;
95
+ }
96
+ }
97
+ if (!mapped) {
98
+ projectionEntries.push([key, 1]);
99
+ }
100
+ }
101
+ return { $project: Object.fromEntries(projectionEntries) };
102
+ }
103
+ // View Repository 생성 함수 (인터셉터 미지원)
104
+ export function genViewRepository(params) {
105
+ const { definition, dbClient } = params;
106
+ // Base Model 컨텍스트 찾기
107
+ const baseModelContext = findRepositoryContext(definition.baseModel);
108
+ if (!baseModelContext) {
109
+ throw new Error('BaseModel Not Registered');
110
+ }
111
+ // 컬렉션 가져오기
112
+ const getCollection = async () => {
113
+ const client = await dbClient;
114
+ return client
115
+ .db(baseModelContext.dbName)
116
+ .collection(baseModelContext.collectionName);
117
+ };
118
+ // 검색 가능한 필드들 추출 (기존 helper 활용)
119
+ const searchableFields = getSearchableFields(definition.viewDefinition);
120
+ const baseModelKeys = new Set(Object.keys(definition.baseModel));
121
+ // Relation 정보들을 미리 계산
122
+ const relationInfos = definition.relations.map((rel) => {
123
+ const relModelContext = findRepositoryContext(rel.relationModel);
124
+ if (!relModelContext) {
125
+ throw new Error('Relation Model Not Registered');
126
+ }
127
+ return {
128
+ rel,
129
+ relModelContext,
130
+ alias: `${relModelContext.collectionName}_${rel.relationKey}_info`,
131
+ };
132
+ });
133
+ const repository = {
134
+ async getItems(params) {
135
+ const collection = await getCollection();
136
+ const { page = 1, limit = 15, search } = params;
137
+ // 검색 조건 빌드
138
+ const query = buildSearchQuery(search, searchableFields);
139
+ // $lookup 단계 빌드
140
+ const lookups = relationInfos.map(({ rel, relModelContext, alias }) => ({
141
+ $lookup: {
142
+ from: relModelContext.collectionName,
143
+ localField: rel.baseKey,
144
+ foreignField: rel.relationKey,
145
+ as: alias,
146
+ },
147
+ }));
148
+ // Projection 단계 빌드
149
+ const projection = buildProjection(definition.viewDefinition, baseModelKeys, relationInfos);
150
+ // Aggregate 실행
151
+ const docs = await collection
152
+ .aggregate([
153
+ { $match: query },
154
+ ...lookups,
155
+ { $skip: (page - 1) * limit },
156
+ { $limit: limit },
157
+ projection,
158
+ ])
159
+ .toArray();
160
+ return docs;
161
+ },
162
+ };
163
+ return repository;
164
+ }
165
+ //# sourceMappingURL=mongo.generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongo.generator.js","sourceRoot":"","sources":["../../../src/generator/mongo/mongo.generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { z } from 'zod';
2
+ import type { ObjectId } from 'bson';
3
+ export declare const ObjectIdCompatible: z.ZodUnion<readonly [z.ZodString, z.ZodCustom<ObjectId, ObjectId>]>;
4
+ //# sourceMappingURL=mongo.util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongo.util.d.ts","sourceRoot":"","sources":["../../../src/generator/mongo/mongo.util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAErC,eAAO,MAAM,kBAAkB,qEAG7B,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { z } from 'zod';
2
+ export const ObjectIdCompatible = z.union([
3
+ z.string().regex(/^[a-fA-F0-9]{24}$/),
4
+ z.custom()
5
+ ]);
6
+ //# sourceMappingURL=mongo.util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongo.util.js","sourceRoot":"","sources":["../../../src/generator/mongo/mongo.util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC;IACxC,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC;IACrC,CAAC,CAAC,MAAM,EAAY;CACrB,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { genAPISpec } from "./generator/mongo/mongo.api.generator";
2
+ import { genRepository, genViewRepository } from "./generator/mongo/mongo.generator";
3
+ export { setAPIEndpoint, setMiddleware } from "./api/api";
4
+ export { ExceptionMiddleware } from "./api/api.middleware";
5
+ export declare const MongoGenerator: {
6
+ genAPISpec: typeof genAPISpec;
7
+ genRepository: typeof genRepository;
8
+ genViewRepository: typeof genViewRepository;
9
+ };
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAErF,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,eAAO,MAAM,cAAc;;;;CAI1B,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ import { genAPISpec } from "./generator/mongo/mongo.api.generator";
2
+ import { genRepository, genViewRepository } from "./generator/mongo/mongo.generator";
3
+ export { setAPIEndpoint, setMiddleware } from "./api/api";
4
+ export { ExceptionMiddleware } from "./api/api.middleware";
5
+ export const MongoGenerator = {
6
+ genAPISpec,
7
+ genRepository,
8
+ genViewRepository
9
+ };
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAErF,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,UAAU;IACV,aAAa;IACb,iBAAiB;CAClB,CAAA"}
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "@eecho/express",
3
+ "version": "0.0.2",
4
+ "description": "EEcho express framework with Express and MongoDB support",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "type": "module",
8
+ "files": [
9
+ "dist/**/*"
10
+ ],
11
+ "scripts": {
12
+ "build": "tsc -p tsconfig.build.json",
13
+ "clean": "node -e \"require('fs').rmSync('dist', { recursive: true, force: true })\"",
14
+ "prepublishOnly": "npm run clean && npm run build",
15
+ "test": "echo \"Error: no test specified\" && exit 1"
16
+ },
17
+ "author": "",
18
+ "license": "ISC",
19
+ "dependencies": {
20
+ "@eecho/definition": "^0.0.2",
21
+ "express": "^5.1.0",
22
+ "mongodb": "^6.20.0",
23
+ "zod": "^4.1.12"
24
+ },
25
+ "devDependencies": {
26
+ "@types/express": "^5.0.5",
27
+ "typescript": "^5.0.0"
28
+ },
29
+ "publishConfig": {
30
+ "access": "public",
31
+ "registry": "https://registry.npmjs.org/"
32
+ }
33
+ }