@promind/honey 1.46.3 → 1.47.0

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @promind/honey
2
2
 
3
+ ## 1.47.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 00ed488: add optional shouldErrorOnNotFound flag for GET operations
8
+
3
9
  ## 1.46.3
4
10
 
5
11
  ### Patch Changes
package/dist/index.d.ts CHANGED
@@ -196,6 +196,8 @@ type IGet = CrudParams & {
196
196
  joins?: Join[];
197
197
  /** A function that is called to transform your response data */
198
198
  processResponseData?: (data: any, req: Request) => any;
199
+ /** Whether to error on not found (default: true) */
200
+ shouldErrorOnNotFound?: boolean;
199
201
  };
200
202
  type IGetById = CrudParams & {
201
203
  /** Fields to return in the response object */
@@ -208,6 +210,8 @@ type IGetById = CrudParams & {
208
210
  joins?: Join[];
209
211
  /** A function that is called to transform your response data */
210
212
  processResponseData?: (data: any, req: Request) => any;
213
+ /** Whether to error on not found (default: true) */
214
+ shouldErrorOnNotFound?: boolean;
211
215
  };
212
216
  type IDeleteById = CrudParams & {
213
217
  /** Response message */
@@ -237,8 +241,8 @@ export class Honey {
237
241
  addMiddleware(middleware: Middleware[]): void;
238
242
  startServer(): void;
239
243
  create({ resource, params, message, middleware, pathOverride, exitMiddleware, processResponseData, processErrorResponse, table, methodOverride }: ICreate): void;
240
- get({ resource, fields, filter, format, middleware, pathOverride, exitMiddleware, methodOverride, processResponseData, processErrorResponse, table, joins }: IGet): void;
241
- getById({ resource, fields, idField, middleware, pathOverride, exitMiddleware, methodOverride, processResponseData, processErrorResponse, table, filter, joins }: IGetById): void;
244
+ get({ resource, fields, filter, format, middleware, pathOverride, exitMiddleware, methodOverride, processResponseData, processErrorResponse, table, joins, shouldErrorOnNotFound }: IGet): void;
245
+ getById({ resource, fields, idField, middleware, pathOverride, exitMiddleware, methodOverride, processResponseData, processErrorResponse, table, filter, joins, shouldErrorOnNotFound }: IGetById): void;
242
246
  updateById({ resource, params, idField, message, middleware, pathOverride, exitMiddleware, methodOverride, table, filter, processErrorResponse, processResponseData }: IUpdateById): void;
243
247
  update({ resource, params, filter, message, middleware, pathOverride, exitMiddleware, methodOverride, table, processErrorResponse, processResponseData }: IUpdate): void;
244
248
  upsertById({ resource, params, idField, message, middleware, pathOverride, exitMiddleware, methodOverride, table, processErrorResponse, processResponseData, doNothingOnConflict }: IUpsertById): void;
@@ -1 +1 @@
1
- {"mappings":"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","sources":["src/src/config/database.ts","src/src/config/index.ts","src/src/utils/error.ts","src/src/interfaces/express.ts","src/src/services/express.ts","src/src/controllers/interfaces.ts","src/src/shared/interface.ts","src/src/utils/helpers.ts","src/src/utils/db.ts","src/src/utils/postgres.ts","src/src/services/postgres.ts","src/src/interfaces/crud.ts","src/src/utils/formatter.ts","src/src/controllers/create.ts","src/src/controllers/read.ts","src/src/controllers/update.ts","src/src/controllers/upsert.ts","src/src/controllers/delete.ts","src/src/controllers/query.ts","src/src/controllers/index.ts","src/src/services/honey.ts","src/src/utils/port.ts","src/src/utils/validation.ts","src/src/utils/transit.ts","src/src/index.ts","src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"import { QueryTypes as QTypes } from 'sequelize';\n\nimport Config from './config';\nimport { DBOptions } from './config/database';\nimport ExpressApp from './services/express';\nimport Honey from './services/honey';\nimport Postgres from './services/postgres';\nimport { normalizePort } from './utils/port';\nimport { Metadata } from './interfaces/express';\n\nprocess.on('SIGINT', () => {\n // process reload ongoing\n // close connections, clear cache, etc\n // by default, you have 1600ms\n process.exit(0);\n});\n\nexport function createHoney(\n port: string,\n dbOptions: string | DBOptions,\n metadata?: Metadata\n) {\n new Config(dbOptions);\n\n const portVal = normalizePort(port || process.env.PORT || '3000');\n const express = new ExpressApp(portVal, metadata);\n const postgres = new Postgres();\n const honey = new Honey(express, postgres);\n\n return honey;\n}\n\nexport const defineModel = Config.defineModel.bind(Config);\n\nfunction getQueryTypes() {\n const { SELECT, INSERT, UPDATE, DELETE, RAW, UPSERT } = QTypes;\n\n const exposedTypes = { SELECT, INSERT, UPDATE, DELETE, RAW, UPSERT };\n return exposedTypes;\n}\n\nconst QueryTypes = getQueryTypes();\n\nexport { QueryTypes };\nexport { default as runDbQuery, createModel } from './utils/db';\nexport { default as HttpError, handleHttpError } from './utils/error';\nexport { default as Honey } from './services/honey';\nexport type {\n Middleware,\n ExitMiddleware,\n Request,\n Response\n} from './interfaces/express';\nexport * from 'sequelize';\nexport { Knex } from 'knex';\nexport { validateRequestData } from './utils/validation';\nexport { createReqTransit } from './utils/transit';\n"],"names":[],"version":3,"file":"index.d.ts.map","sourceRoot":"../"}
1
+ {"mappings":"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","sources":["src/src/config/database.ts","src/src/config/index.ts","src/src/utils/error.ts","src/src/interfaces/express.ts","src/src/services/express.ts","src/src/controllers/interfaces.ts","src/src/shared/interface.ts","src/src/utils/helpers.ts","src/src/utils/db.ts","src/src/utils/postgres.ts","src/src/services/postgres.ts","src/src/interfaces/crud.ts","src/src/utils/formatter.ts","src/src/controllers/create.ts","src/src/controllers/read.ts","src/src/controllers/update.ts","src/src/controllers/upsert.ts","src/src/controllers/delete.ts","src/src/controllers/query.ts","src/src/controllers/index.ts","src/src/services/honey.ts","src/src/utils/port.ts","src/src/utils/validation.ts","src/src/utils/transit.ts","src/src/index.ts","src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"import { QueryTypes as QTypes } from 'sequelize';\n\nimport Config from './config';\nimport { DBOptions } from './config/database';\nimport ExpressApp from './services/express';\nimport Honey from './services/honey';\nimport Postgres from './services/postgres';\nimport { normalizePort } from './utils/port';\nimport { Metadata } from './interfaces/express';\n\nprocess.on('SIGINT', () => {\n // process reload ongoing\n // close connections, clear cache, etc\n // by default, you have 1600ms\n process.exit(0);\n});\n\nexport function createHoney(\n port: string,\n dbOptions: string | DBOptions,\n metadata?: Metadata\n) {\n new Config(dbOptions);\n\n const portVal = normalizePort(port || process.env.PORT || '3000');\n const express = new ExpressApp(portVal, metadata);\n const postgres = new Postgres();\n const honey = new Honey(express, postgres);\n\n return honey;\n}\n\nexport const defineModel = Config.defineModel.bind(Config);\n\nfunction getQueryTypes() {\n const { SELECT, INSERT, UPDATE, DELETE, RAW, UPSERT } = QTypes;\n\n const exposedTypes = { SELECT, INSERT, UPDATE, DELETE, RAW, UPSERT };\n return exposedTypes;\n}\n\nconst QueryTypes = getQueryTypes();\n\nexport { QueryTypes };\nexport { default as runDbQuery, createModel } from './utils/db';\nexport { default as HttpError, handleHttpError } from './utils/error';\nexport { default as Honey } from './services/honey';\nexport type {\n Middleware,\n ExitMiddleware,\n Request,\n Response\n} from './interfaces/express';\nexport * from 'sequelize';\nexport { Knex } from 'knex';\nexport { validateRequestData } from './utils/validation';\nexport { createReqTransit } from './utils/transit';\n"],"names":[],"version":3,"file":"index.d.ts.map","sourceRoot":"../"}
package/dist/index.js CHANGED
@@ -310,7 +310,7 @@ function $e6033bad46ade8f8$export$2e2bcd8739ae039({ db: db, resource: resource,
310
310
 
311
311
 
312
312
 
313
- function $b1328f4a111bb650$export$7b6dde2038c44e91({ db: db, resource: resource, fields: fields, idField: idField = 'id', processResponseData: processResponseData, processErrorResponse: processErrorResponse, filterQuery: filterQuery = {}, joins: joins }) {
313
+ function $b1328f4a111bb650$export$7b6dde2038c44e91({ db: db, resource: resource, fields: fields, idField: idField = 'id', processResponseData: processResponseData, processErrorResponse: processErrorResponse, filterQuery: filterQuery = {}, joins: joins, shouldErrorOnNotFound: shouldErrorOnNotFound }) {
314
314
  return async function(req, res, next) {
315
315
  try {
316
316
  const id = req.params.id;
@@ -322,7 +322,7 @@ function $b1328f4a111bb650$export$7b6dde2038c44e91({ db: db, resource: resource,
322
322
  },
323
323
  ...filter
324
324
  }, undefined, undefined, joins);
325
- if (!data?.length) throw new (0, $2a1659c6c3bea4d7$export$2e2bcd8739ae039)('Record does not exist', 404);
325
+ if (!data?.length && shouldErrorOnNotFound) throw new (0, $2a1659c6c3bea4d7$export$2e2bcd8739ae039)('Record does not exist', 404);
326
326
  data = processResponseData ? await processResponseData(data[0], req) : data[0];
327
327
  res.send({
328
328
  data: data
@@ -340,7 +340,7 @@ function $b1328f4a111bb650$export$7b6dde2038c44e91({ db: db, resource: resource,
340
340
  }
341
341
  };
342
342
  }
343
- function $b1328f4a111bb650$export$7b48d281d65870ad({ db: db, resource: resource, fields: fields, filterQuery: filterQuery, format: format, processResponseData: processResponseData, processErrorResponse: processErrorResponse, joins: joins }) {
343
+ function $b1328f4a111bb650$export$7b48d281d65870ad({ db: db, resource: resource, fields: fields, filterQuery: filterQuery, format: format, processResponseData: processResponseData, processErrorResponse: processErrorResponse, joins: joins, shouldErrorOnNotFound: shouldErrorOnNotFound }) {
344
344
  return async function(req, res, next) {
345
345
  try {
346
346
  const page = Number(req.query.page);
@@ -360,7 +360,7 @@ function $b1328f4a111bb650$export$7b48d281d65870ad({ db: db, resource: resource,
360
360
  });
361
361
  }
362
362
  if (processResponseData) data = await processResponseData(data, req);
363
- else if (!data?.length) throw new (0, $2a1659c6c3bea4d7$export$2e2bcd8739ae039)('No records found', 404);
363
+ else if (!data?.length && shouldErrorOnNotFound) throw new (0, $2a1659c6c3bea4d7$export$2e2bcd8739ae039)('No records found', 404);
364
364
  const response = {
365
365
  data: data,
366
366
  meta: {
@@ -695,7 +695,7 @@ class $e551a6691d3acd09$export$2e2bcd8739ae039 {
695
695
  exitMiddleware: exitMiddleware
696
696
  });
697
697
  }
698
- get({ resource: resource, fields: fields, filter: filter, format: format, middleware: middleware, pathOverride: pathOverride, exitMiddleware: exitMiddleware, methodOverride: methodOverride, processResponseData: processResponseData, processErrorResponse: processErrorResponse, table: table, joins: joins }) {
698
+ get({ resource: resource, fields: fields, filter: filter, format: format, middleware: middleware, pathOverride: pathOverride, exitMiddleware: exitMiddleware, methodOverride: methodOverride, processResponseData: processResponseData, processErrorResponse: processErrorResponse, table: table, joins: joins, shouldErrorOnNotFound: shouldErrorOnNotFound = true }) {
699
699
  const path = pathOverride || `/${resource}`;
700
700
  resource = table || resource;
701
701
  const controller = (0, $b1328f4a111bb650$export$7b48d281d65870ad)({
@@ -706,7 +706,8 @@ class $e551a6691d3acd09$export$2e2bcd8739ae039 {
706
706
  format: format,
707
707
  processResponseData: processResponseData,
708
708
  processErrorResponse: processErrorResponse,
709
- joins: joins
709
+ joins: joins,
710
+ shouldErrorOnNotFound: shouldErrorOnNotFound
710
711
  });
711
712
  this.crud({
712
713
  method: methodOverride || 'get',
@@ -716,7 +717,7 @@ class $e551a6691d3acd09$export$2e2bcd8739ae039 {
716
717
  exitMiddleware: exitMiddleware
717
718
  });
718
719
  }
719
- getById({ resource: resource, fields: fields, idField: idField, middleware: middleware, pathOverride: pathOverride, exitMiddleware: exitMiddleware, methodOverride: methodOverride, processResponseData: processResponseData, processErrorResponse: processErrorResponse, table: table, filter: filter, joins: joins }) {
720
+ getById({ resource: resource, fields: fields, idField: idField, middleware: middleware, pathOverride: pathOverride, exitMiddleware: exitMiddleware, methodOverride: methodOverride, processResponseData: processResponseData, processErrorResponse: processErrorResponse, table: table, filter: filter, joins: joins, shouldErrorOnNotFound: shouldErrorOnNotFound = true }) {
720
721
  const path = pathOverride || `/${resource}/:id`;
721
722
  resource = table || resource;
722
723
  const controller = (0, $b1328f4a111bb650$export$7b6dde2038c44e91)({
@@ -727,7 +728,8 @@ class $e551a6691d3acd09$export$2e2bcd8739ae039 {
727
728
  processResponseData: processResponseData,
728
729
  processErrorResponse: processErrorResponse,
729
730
  filterQuery: filter,
730
- joins: joins
731
+ joins: joins,
732
+ shouldErrorOnNotFound: shouldErrorOnNotFound
731
733
  });
732
734
  this.crud({
733
735
  method: methodOverride || 'get',
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"mappings":"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","sources":["src/index.ts","src/config/index.ts","src/config/database.ts","src/services/express.ts","src/utils/error.ts","src/services/honey.ts","src/controllers/index.ts","src/controllers/interfaces.ts","src/controllers/create.ts","src/utils/formatter.ts","src/controllers/read.ts","src/controllers/update.ts","src/controllers/upsert.ts","src/controllers/delete.ts","src/controllers/query.ts","src/utils/db.ts","src/utils/helpers.ts","src/services/postgres.ts","src/utils/postgres.ts","src/utils/port.ts","src/utils/validation.ts","src/utils/transit.ts"],"sourcesContent":["import { QueryTypes as QTypes } from 'sequelize';\n\nimport Config from './config';\nimport { DBOptions } from './config/database';\nimport ExpressApp from './services/express';\nimport Honey from './services/honey';\nimport Postgres from './services/postgres';\nimport { normalizePort } from './utils/port';\nimport { Metadata } from './interfaces/express';\n\nprocess.on('SIGINT', () => {\n // process reload ongoing\n // close connections, clear cache, etc\n // by default, you have 1600ms\n process.exit(0);\n});\n\nexport function createHoney(\n port: string,\n dbOptions: string | DBOptions,\n metadata?: Metadata\n) {\n new Config(dbOptions);\n\n const portVal = normalizePort(port || process.env.PORT || '3000');\n const express = new ExpressApp(portVal, metadata);\n const postgres = new Postgres();\n const honey = new Honey(express, postgres);\n\n return honey;\n}\n\nexport const defineModel = Config.defineModel.bind(Config);\n\nfunction getQueryTypes() {\n const { SELECT, INSERT, UPDATE, DELETE, RAW, UPSERT } = QTypes;\n\n const exposedTypes = { SELECT, INSERT, UPDATE, DELETE, RAW, UPSERT };\n return exposedTypes;\n}\n\nconst QueryTypes = getQueryTypes();\n\nexport { QueryTypes };\nexport { default as runDbQuery, createModel } from './utils/db';\nexport { default as HttpError, handleHttpError } from './utils/error';\nexport { default as Honey } from './services/honey';\nexport type {\n Middleware,\n ExitMiddleware,\n Request,\n Response\n} from './interfaces/express';\nexport * from 'sequelize';\nexport { Knex } from 'knex';\nexport { validateRequestData } from './utils/validation';\nexport { createReqTransit } from './utils/transit';\n","import path from 'path';\nimport dotenv from 'dotenv';\n\nimport initDB, { DBOptions } from './database';\nimport {\n Model,\n ModelAttributes,\n ModelOptions,\n Sequelize\n} from 'sequelize/types';\ndotenv.config();\ndotenv.config({ path: path.join(__dirname, '.env') });\n\nexport default class Config {\n public static db: Sequelize;\n\n public static getEnv = (key: string) => {\n return process.env[key];\n };\n\n constructor(options: DBOptions | string) {\n Config.db = initDB(options);\n }\n\n static get isLive() {\n return process.env.NODE_ENV === 'production';\n }\n\n public static defineModel(\n modelName: string,\n attributes: ModelAttributes<Model<any, any>, any>,\n options?: ModelOptions<Model<any, any>> | undefined\n ) {\n return this.db.define(modelName, attributes, options);\n }\n}\n","import { Sequelize } from 'sequelize';\n\nexport interface DBOptions {\n host: string;\n port: number | string;\n user: string;\n password: string;\n database: string;\n}\n\nexport default function initDB(options: string | DBOptions) {\n let uri = '';\n if (typeof options === 'string') {\n uri = options;\n } else {\n uri = `postgres://${options.user}:${options.password}@${options.host}:${options.port}/${options.database}`;\n }\n const sequelize = new Sequelize(uri, {\n logging: false\n });\n\n sequelize\n .authenticate()\n .then(() => {\n console.log('DB Connection established successfully');\n })\n .catch((err) => {\n console.log('DB Connection failed');\n console.error(err);\n });\n\n return sequelize;\n}\n","import cookieParser from 'cookie-parser';\nimport express from 'express';\nimport logger from 'morgan';\nimport cors from 'cors';\nimport http from 'http';\nimport expressOasGenerator from 'express-oas-generator';\nimport '../config';\nimport HttpError from '../utils/error';\nimport { AddressInfo } from 'net';\nimport { Metadata } from '../interfaces/express';\n\n/**\n * Event listener for HTTP server \"error\" event.\n */\nconst onError = (port: string | number) => {\n return (error: any) => {\n if (error.syscall !== 'listen') {\n throw error;\n }\n\n const bind = typeof port === 'string' ? `Pipe ${port}` : `Port ${port}`;\n\n // handle specific listen errors with friendly messages\n switch (error.code) {\n case 'EACCES':\n console.error(`${bind} requires elevated privileges`);\n process.exit(1);\n case 'EADDRINUSE':\n console.error(`${bind} is already in use`);\n process.exit(1);\n default:\n throw error;\n }\n };\n};\n\n/**\n * Event listener for HTTP server \"listening\" event.\n */\nconst onListening = (server: http.Server) => {\n return () => {\n const addr = server.address();\n const bind =\n typeof addr === 'string'\n ? `pipe ${addr}`\n : `port ${(addr as AddressInfo).port}`;\n console.log(\n `%c Honey Server started on ${bind} `,\n 'background: #222; color: #bada55; font-size: 32px'\n );\n };\n};\n\nclass ExpressApp {\n public app = express();\n public appRoutes = express.Router();\n private fallbackErrMessage = 'Endpoint does not exist';\n private routePrefix = '/api';\n\n constructor(\n port: string | number,\n private metadata?: Metadata\n ) {\n this.fallbackErrMessage =\n this.metadata?.fallbackErrorMessage || this.fallbackErrMessage;\n this.routePrefix = this.metadata?.routePrefix || this.routePrefix;\n this.initMiddlewares();\n this.setupErrorFallback();\n this.app.set('port', port);\n }\n\n public listen() {\n expressOasGenerator.handleRequests();\n const port = Number(this.app.get('port'));\n const server = this.app.listen(port);\n server.on('error', onError(port));\n server.on('listening', onListening(server));\n }\n\n private initMiddlewares() {\n const corsOptions: cors.CorsOptions = {\n origin: '*',\n methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',\n allowedHeaders: '*',\n exposedHeaders: '*',\n credentials: true,\n optionsSuccessStatus: 204\n };\n\n expressOasGenerator.handleResponses(this.app, {} as any);\n this.app.use(logger('dev'));\n this.app.use(cors(corsOptions));\n this.app.use(\n express.json({\n limit: '50mb',\n verify(req: any, _res, buf) {\n req.rawBody = buf;\n }\n })\n );\n this.app.use(express.urlencoded({ limit: '50mb', extended: false }));\n this.app.use(cookieParser());\n this.app.use(this.routePrefix, this.appRoutes);\n }\n\n private setupErrorFallback() {\n this.app.use((_, res) => {\n const err = new HttpError(this.fallbackErrMessage, 404);\n\n return res.status(err.status).json({ message: err.message });\n });\n // error handler\n this.app.use((err: any, _, res: any) => {\n return res\n .status(err.status || 500)\n .send({ message: 'Something went wrong' });\n });\n }\n}\n\nexport default ExpressApp;\n","import { Response } from 'express';\n\nexport default class HttpError extends Error {\n constructor(\n message: string,\n public status: number\n ) {\n super(message || 'Something went wrong');\n }\n}\n\nexport const handleHttpError = (err: HttpError, res: Response) => {\n return res\n .status(err.status || 500)\n .send({ message: err.message || 'Something went wrong' });\n};\n","import Config from '../config';\nimport {\n createController,\n deleteByIdController,\n getByIdController,\n getByQueryController,\n updateByIdController,\n upsertByIdController,\n upsertController,\n updateController,\n deleteController,\n queryController\n} from '../controllers';\nimport {\n ICreate,\n ICrud,\n IDelete,\n IDeleteById,\n IGet,\n IGetById,\n IUpdate,\n IUpdateById,\n IUpsert,\n IUpsertById,\n IQuery\n} from '../interfaces/crud';\nimport { ExitMiddleware, Middleware } from '../interfaces/express';\nimport { NextFunction, Request, Response } from 'express';\nimport ExpressApp from './express';\nimport Postgres from './postgres';\n\n// eslint-disable-next-line\nconst defaultExitMiddleware: ExitMiddleware = (data, req, res, next) => {\n if (process.env.NODE_ENV !== 'production') console.log('Response:', data);\n};\n\nexport default class Honey {\n constructor(\n public express: ExpressApp,\n private postgres: Postgres\n ) {}\n\n get routes() {\n return this.express.appRoutes;\n }\n\n get db() {\n return Config.db;\n }\n\n private crud({\n method,\n path,\n controller,\n middleware = [],\n exitMiddleware = [defaultExitMiddleware]\n }: ICrud) {\n const dbCheck = async (req: Request, res: Response, next: NextFunction) => {\n if (!Config.db) {\n return res.status(503).send({\n message: 'DB Initialization in progress'\n });\n } else {\n next();\n }\n };\n this.express.appRoutes[method](\n path,\n dbCheck,\n ...middleware,\n controller,\n ...exitMiddleware\n );\n }\n\n public addMiddleware(middleware: Middleware[]) {\n this.express.appRoutes.use(...middleware);\n }\n\n public startServer() {\n this.express.listen();\n }\n\n public create({\n resource,\n params,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n processResponseData,\n processErrorResponse,\n table,\n methodOverride\n }: ICreate) {\n const path = pathOverride || `/${resource}`;\n resource = table || resource;\n\n const controller = createController({\n db: this.postgres,\n resource,\n params,\n message,\n processResponseData,\n processErrorResponse\n });\n\n this.crud({\n method: methodOverride || 'post',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public get({\n resource,\n fields,\n filter,\n format,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n processResponseData,\n processErrorResponse,\n table,\n joins\n }: IGet) {\n const path = pathOverride || `/${resource}`;\n resource = table || resource;\n\n const controller = getByQueryController({\n db: this.postgres,\n resource,\n fields,\n filterQuery: filter,\n format,\n processResponseData,\n processErrorResponse,\n joins\n });\n this.crud({\n method: methodOverride || 'get',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public getById({\n resource,\n fields,\n idField,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n processResponseData,\n processErrorResponse,\n table,\n filter,\n joins\n }: IGetById) {\n const path = pathOverride || `/${resource}/:id`;\n resource = table || resource;\n\n const controller = getByIdController({\n db: this.postgres,\n resource,\n fields,\n idField: idField || 'id',\n processResponseData,\n processErrorResponse,\n filterQuery: filter,\n joins\n });\n\n this.crud({\n method: methodOverride || 'get',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public updateById({\n resource,\n params,\n idField,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n table,\n filter,\n processErrorResponse,\n processResponseData\n }: IUpdateById) {\n const path = pathOverride || `/${resource}/:id`;\n resource = table || resource;\n\n const controller = updateByIdController({\n db: this.postgres,\n resource,\n params,\n message,\n idField,\n filterQuery: filter,\n processErrorResponse,\n processResponseData\n });\n this.crud({\n method: methodOverride || 'put',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public update({\n resource,\n params,\n filter,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n table,\n processErrorResponse,\n processResponseData\n }: IUpdate) {\n const path = pathOverride || `/${resource}`;\n resource = table || resource;\n\n const controller = updateController({\n db: this.postgres,\n resource,\n params,\n message,\n filterQuery: filter,\n processErrorResponse,\n processResponseData\n });\n this.crud({\n method: methodOverride || 'put',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public upsertById({\n resource,\n params,\n idField,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n table,\n processErrorResponse,\n processResponseData,\n doNothingOnConflict\n }: IUpsertById) {\n const path = pathOverride || `/${resource}/:id`;\n resource = table || resource;\n\n const controller = upsertByIdController({\n db: this.postgres,\n resource,\n params,\n message,\n idField,\n processErrorResponse,\n processResponseData,\n doNothingOnConflict\n });\n this.crud({\n method: methodOverride || 'put',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public upsert({\n resource,\n params,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n conflictTarget,\n table,\n processErrorResponse,\n processResponseData,\n doNothingOnConflict\n }: IUpsert) {\n const path = pathOverride || `/${resource}`;\n resource = table || resource;\n\n const controller = upsertController({\n db: this.postgres,\n resource,\n params,\n message,\n conflictTarget,\n processErrorResponse,\n processResponseData,\n doNothingOnConflict\n });\n this.crud({\n method: methodOverride || 'put',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public deleteById({\n resource,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n idField,\n filter,\n table,\n processErrorResponse\n }: IDeleteById) {\n const path = pathOverride || `/${resource}/:id`;\n resource = table || resource;\n\n const controller = deleteByIdController({\n db: this.postgres,\n resource,\n message,\n idField,\n filterQuery: filter,\n processErrorResponse\n });\n this.crud({\n method: methodOverride || 'delete',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public delete({\n resource,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n filter,\n table,\n processErrorResponse\n }: IDelete) {\n const path = pathOverride || `/${resource}/:id`;\n resource = table || resource;\n\n const controller = deleteController({\n db: this.postgres,\n resource,\n message,\n filterQuery: filter,\n processErrorResponse\n });\n this.crud({\n method: methodOverride || 'delete',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public query({\n resource,\n query,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n processErrorResponse,\n processResponseData\n }: IQuery) {\n const path = pathOverride || `/${resource}`;\n\n const controller = queryController({\n db: this.postgres,\n query,\n processErrorResponse,\n processResponseData\n });\n this.crud({\n method: methodOverride || 'get',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n}\n","export { Controller } from './interfaces';\nexport { default as createController } from './create';\nexport { getByIdController, getByQueryController } from './read';\nexport { updateByIdController, updateController } from './update';\nexport { upsertByIdController, upsertController } from './upsert';\nexport { deleteByIdController, deleteController } from './delete';\nexport * from './query';\n","import { NextFunction, Request, Response } from 'express';\n\nexport type Controller = (\n req: Request,\n res: Response,\n next: NextFunction\n) => void;\n","import { CreateControllerParams } from '../interfaces/crud';\nimport HttpError, { handleHttpError } from '../utils/error';\nimport { extractInsertData } from '../utils/formatter';\nimport { NextFunction, Request, Response } from 'express';\nimport { Controller } from './interfaces';\n\nexport default function createController({\n db,\n resource,\n params,\n message,\n processResponseData,\n processErrorResponse\n}: CreateControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const body = extractInsertData(req.body, params);\n\n let data = await db.create(resource, body);\n const id = data[0].id;\n\n data =\n req.body.dataOverride ||\n (processResponseData ? await processResponseData({ id }, req) : { id });\n\n res.send({\n message,\n data\n });\n next({ message, data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n","import { Request } from 'express';\nimport { ICreate, IUpdateById } from '../interfaces/crud';\nimport {\n Filter,\n FilterLocation,\n FilterOps,\n FilterParam,\n GetFilterParam,\n GetQueryFilter,\n UpdateOpParam\n} from '../shared/interface';\n\nconst formatters: Record<string, Function> = {\n string: String,\n number: Number,\n boolean: Boolean,\n json: JSON.stringify,\n // Required for updating JSON fields\n object: JSON.stringify,\n csv: (value: string) => value.split(','),\n 'as-is': (value: any) => value\n};\n\nexport const extractInsertData = (\n body: Record<string, any>,\n params: ICreate['params']\n) => {\n const result: Record<string, string | number | boolean | Date | Object> = {};\n\n Object.entries(params).forEach(([key, value]) => {\n if (value === '@updatedAt') {\n result[key] = new Date();\n return;\n }\n\n if (!Object.keys(body).includes(key)) return;\n\n const formatter = formatters[value];\n result[key] =\n formatter && ![null, undefined].includes(body[key])\n ? formatter(body[key])\n : body[key];\n });\n\n return result;\n};\n\nexport const generateUpdateData = (\n body: Record<string, any>,\n params: IUpdateById['params']\n) => {\n const result = Object.entries(params).reduce((acc, [key, value]) => {\n if (!Object.keys(body).includes(key) && value !== '@updatedAt')\n return { ...acc };\n\n let formattedValue: any;\n if (value === '@updatedAt') {\n formattedValue = new Date();\n } else {\n formattedValue = ![null, undefined].includes(body[key])\n ? formatters[typeof body[key]](body[key])\n : body[key];\n }\n\n return {\n ...acc,\n [key]: {\n value: formattedValue,\n operator: value === '@updatedAt' ? 'replace' : value\n }\n };\n }, {} as UpdateOpParam);\n\n return result;\n};\n\nconst retrieveParamFromLocation = (\n req: Request,\n location: FilterLocation,\n key: string\n) => {\n if (location === 'request') return (req as any)[key];\n\n return req[location][key];\n};\n\nexport const formatReadFilter = (\n filterParams: Record<string, any>,\n filter: GetQueryFilter,\n req: Request\n) => {\n const result: Filter = {};\n\n for (const [key, param] of Object.entries(filter)) {\n if (key === '$or') {\n const val = formatReadFilter(\n filterParams,\n param as Record<string, GetFilterParam>,\n req\n ) as Record<string, FilterParam>;\n\n result[key] = val;\n } else {\n let valueToUse: any;\n if (param.overrideValue) {\n if (typeof param.overrideValue === 'function') {\n valueToUse = param.overrideValue(req);\n } else {\n valueToUse = param.overrideValue;\n }\n } else if (!!param.location) {\n valueToUse = retrieveParamFromLocation(\n req,\n param.location as FilterLocation,\n key\n );\n } else {\n valueToUse = filterParams[key];\n }\n\n if (typeof valueToUse === 'undefined') {\n continue;\n }\n\n const valueFormatter = formatters[(param as GetFilterParam).value];\n result[key] = {\n operator: param.operator as FilterOps,\n value: valueFormatter(valueToUse)\n };\n }\n }\n\n return result;\n};\n","import {\n GetByIdControllerParams,\n GetByQueryControllerParams\n} from '../interfaces/crud';\nimport HttpError, { handleHttpError } from '../utils/error';\nimport { formatReadFilter } from '../utils/formatter';\nimport { NextFunction, Request, Response } from 'express';\nimport { Controller } from './interfaces';\n\nexport function getByIdController({\n db,\n resource,\n fields,\n idField = 'id',\n processResponseData,\n processErrorResponse,\n filterQuery = {},\n joins\n}: GetByIdControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const id = req.params.id;\n\n const filter = formatReadFilter(req.query, filterQuery, req);\n\n let data = await db.read(\n resource,\n fields,\n {\n [idField]: {\n value: id,\n operator: '='\n },\n ...filter\n },\n undefined,\n undefined,\n joins\n );\n\n if (!data?.length) {\n throw new HttpError('Record does not exist', 404);\n }\n\n data = processResponseData\n ? await processResponseData(data[0], req)\n : data[0];\n\n res.send({\n data\n });\n next({ data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n\nexport function getByQueryController({\n db,\n resource,\n fields,\n filterQuery,\n format,\n processResponseData,\n processErrorResponse,\n joins\n}: GetByQueryControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const page = Number(req.query.page);\n const limit = Number(req.query.limit);\n const paginate =\n limit || page ? { page: page || 1, limit: limit || 10 } : undefined;\n\n const filter =\n filterQuery && formatReadFilter(req.query, filterQuery, req);\n\n let data: Record<string, any>[] = await db.read(\n resource,\n fields,\n filter,\n paginate,\n format,\n joins\n );\n let total = 0;\n if (paginate) {\n total = Number(data[0]?.['honey_total_count'] || 0);\n data = data.map((item: Record<string, any>) => {\n delete item['honey_total_count'];\n return item;\n });\n }\n\n if (processResponseData) {\n data = await processResponseData(data, req);\n } else if (!data?.length) {\n throw new HttpError('No records found', 404);\n }\n const response = {\n data,\n meta: {\n ...(!!paginate && {\n pagination: {\n total,\n pageSize: limit,\n page,\n pageCount: Math.ceil(total / limit)\n }\n })\n }\n };\n res.send(response);\n next(response);\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n","import {\n UpdateByIdControllerParams,\n UpdateControllerParams\n} from '../interfaces/crud';\nimport { Filter } from '../shared/interface';\nimport HttpError, { handleHttpError } from '../utils/error';\nimport { formatReadFilter, generateUpdateData } from '../utils/formatter';\nimport { NextFunction, Request, Response } from 'express';\nimport { Controller } from './interfaces';\n\nexport function updateByIdController({\n db,\n resource,\n params,\n message,\n idField = 'id',\n processErrorResponse,\n processResponseData,\n filterQuery = {}\n}: UpdateByIdControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const body = generateUpdateData(req.body, params);\n const additionalFilter =\n filterQuery && formatReadFilter(req.body, filterQuery, req);\n const filter: Filter = {\n [idField]: {\n operator: '=',\n value: req.params.id\n },\n ...additionalFilter\n };\n\n const result = await db.update(resource, body, filter);\n\n const data = processResponseData\n ? await processResponseData(result, req)\n : undefined;\n\n res.send({ message, data });\n next({ message, data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n\nexport function updateController({\n db,\n resource,\n params,\n message,\n filterQuery,\n processErrorResponse,\n processResponseData\n}: UpdateControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const body = generateUpdateData(req.body, params);\n const filter =\n filterQuery && formatReadFilter(req.body, filterQuery, req);\n\n const result = await db.update(resource, body, filter);\n\n const data = processResponseData\n ? await processResponseData(result, req)\n : undefined;\n\n res.send({ message, data });\n\n next({ message, data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n","import {\n UpsertByIdControllerParams,\n UpsertControllerParams\n} from '../interfaces/crud';\nimport HttpError, { handleHttpError } from '../utils/error';\nimport { generateUpdateData } from '../utils/formatter';\nimport { NextFunction, Response } from 'express';\nimport { Request } from '../interfaces/express';\nimport { Controller } from './interfaces';\n\nexport function upsertByIdController({\n db,\n resource,\n params,\n message,\n idField = 'id',\n processErrorResponse,\n processResponseData,\n doNothingOnConflict\n}: UpsertByIdControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n req.body[idField] = req.params.id;\n params = { ...params, [idField]: 'replace' };\n const body = generateUpdateData(req.body, params);\n\n const result = await db.upsert(\n resource,\n body,\n [idField],\n doNothingOnConflict\n );\n\n if (result?.[0]) {\n req.isInsert = (result[0] as any).is_insert;\n }\n\n const data = processResponseData\n ? await processResponseData(result?.[0], req)\n : undefined;\n\n res.send({ message, data });\n\n next({ message, data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n\nexport function upsertController({\n db,\n resource,\n params,\n message,\n conflictTarget,\n processErrorResponse,\n processResponseData,\n doNothingOnConflict\n}: UpsertControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const body = generateUpdateData(req.body, params);\n\n const result = await db.upsert(\n resource,\n body,\n conflictTarget,\n doNothingOnConflict\n );\n\n if (result?.[0]) {\n req.isInsert = (result[0] as any).is_insert;\n }\n\n const data = processResponseData\n ? await processResponseData(result?.[0], req)\n : undefined;\n\n res.send({ message, data });\n\n next({ message, data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n","import {\n DeleteByIdControllerParams,\n DeleteControllerParams\n} from '../interfaces/crud';\nimport HttpError, { handleHttpError } from '../utils/error';\nimport { NextFunction, Request, Response } from 'express';\nimport { Controller } from './interfaces';\nimport { formatReadFilter } from '../utils/formatter';\n\nexport function deleteByIdController({\n db,\n resource,\n message,\n idField = 'id',\n processErrorResponse,\n filterQuery = {}\n}: DeleteByIdControllerParams): Controller {\n return async (req: Request, res: Response, next: NextFunction) => {\n try {\n const id = req.params[idField || 'id'];\n const filter =\n filterQuery && formatReadFilter(req.body, filterQuery, req);\n\n await db.delete(resource, {\n [idField]: {\n value: id,\n operator: '='\n },\n ...filter\n });\n\n res.send({ message });\n next({ message });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n\nexport function deleteController({\n db,\n resource,\n message,\n processErrorResponse,\n filterQuery\n}: DeleteControllerParams): Controller {\n return async (req: Request, res: Response, next: NextFunction) => {\n try {\n const filter =\n filterQuery && formatReadFilter(req.body, filterQuery, req);\n\n await db.delete(resource, filter);\n\n res.send({ message });\n next({ message });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n","import { NextFunction, Request, Response } from 'express';\nimport { getKnex } from '../utils/db';\nimport { QueryControllerParams } from '../interfaces/crud';\n\nexport function queryController({\n db,\n query,\n processErrorResponse,\n processResponseData\n}: QueryControllerParams) {\n return async (req: Request, res: Response, next: NextFunction) => {\n try {\n const page = Number(req.query.page);\n const limit = Number(req.query.limit);\n const paginate =\n limit || page ? { page: page || 1, limit: limit || 10 } : undefined;\n\n const knex = getKnex();\n let queryBuilder = query(knex, req);\n if (paginate) {\n queryBuilder = queryBuilder\n .limit(paginate.limit)\n .offset(paginate.limit * (paginate.page - 1));\n }\n const { sql, bindings } = queryBuilder.toSQL();\n\n const result = await db.query(sql, [...bindings]);\n\n const data = processResponseData\n ? await processResponseData(result, req)\n : result;\n\n res.send({ data });\n next({ data });\n } catch (e) {\n if (processErrorResponse) {\n return next(processErrorResponse(e as Error));\n }\n return next(e);\n }\n };\n}\n","import {\n Model,\n ModelAttributes,\n ModelOptions,\n ModelStatic,\n QueryOptions\n} from 'sequelize';\nimport Knex from 'knex';\n\nimport Config from '../config';\nimport createSingleton from './helpers';\n\nexport default function runDbQuery(query: string, params?: QueryOptions) {\n params = params || {};\n\n return Config.db.query(query, {\n ...params,\n raw: true\n });\n}\n\nclass ModelCreator {\n private static model: Record<string, ModelStatic<Model>> = {};\n\n public static createModel<\n TModelAttributes extends {} = any,\n TCreationAttributes extends {} = TModelAttributes\n >(\n modelName: string,\n attributes: ModelAttributes<Model<TModelAttributes, TCreationAttributes>>,\n options?:\n | ModelOptions<Model<TModelAttributes, TCreationAttributes>>\n | undefined\n ): ModelStatic<Model<TModelAttributes, TCreationAttributes>> {\n if (!this.model[modelName]) {\n this.model[modelName] = Config.db.define(modelName, attributes, options);\n }\n\n return this.model[modelName];\n }\n}\n\nexport function createModel<\n TModelAttributes extends {} = any,\n TCreationAttributes extends {} = TModelAttributes\n>(\n modelName: string,\n attributes: ModelAttributes<Model<TModelAttributes, TCreationAttributes>>,\n options?:\n | ModelOptions<Model<TModelAttributes, TCreationAttributes>>\n | undefined\n) {\n return ModelCreator.createModel.bind(ModelCreator)(\n modelName,\n attributes,\n options\n );\n}\n\nexport const getKnex = () =>\n createSingleton('knex', () => {\n return Knex({\n client: 'pg', // or 'mysql2', 'sqlite3', etc.\n // Do not provide connection. Also disable pool to be explicit.\n connection: undefined as any,\n pool: { min: 0, max: 0 }\n });\n });\n","export class Singleton {\n private static instances: Map<string, any> = new Map();\n\n public static getInstance<T>(identifier: string, initFn?: () => T): T {\n if (!this.instances.has(identifier) && initFn) {\n this.instances.set(identifier, initFn());\n }\n\n return this.instances.get(identifier) as T;\n }\n}\n\nexport default function createSingleton<T>(\n identifier: string,\n initFn?: () => T\n): T {\n return Singleton.getInstance(identifier, initFn);\n}\n","import config from '../config';\nimport {\n generateCreateQuery,\n generateDeleteQuery,\n generateReadQuery,\n generateUpdateQuery,\n generateUpsertQuery,\n nestResults\n} from '../utils/postgres';\nimport { QueryTypes } from 'sequelize';\nimport { Filter, UpdateOpParam, Join } from '../shared/interface';\n\nexport default class Postgres {\n public async read(\n table: string,\n fields: string[],\n filter?: Filter,\n paginate?: { page: number; limit: number },\n format?: { sort: 'ASC' | 'DESC'; sortField: string },\n joins?: Join[]\n ) {\n const { query, replacements } = generateReadQuery(\n table,\n fields,\n filter,\n paginate,\n format,\n joins\n );\n\n const result: any[] = await config.db.query(query, {\n type: QueryTypes.SELECT,\n raw: true,\n replacements: [...replacements]\n });\n\n if (joins?.length) {\n return nestResults(result, joins);\n }\n\n return result;\n }\n\n public async query(query: string, replacements: any[]) {\n const result = await config.db.query(query, {\n type: QueryTypes.SELECT,\n raw: true,\n replacements: [...replacements]\n });\n return result;\n }\n\n public async create(\n table: string,\n data: Record<string, string | number | boolean | Date | Object>\n ) {\n const { query, replacements } = generateCreateQuery(table, data);\n\n const res: any = await config.db.query(query, {\n type: QueryTypes.INSERT,\n raw: true,\n replacements: [...replacements]\n });\n\n // inserted ids\n return res[0] as { id: string | number }[];\n }\n\n public async update(table: string, data: UpdateOpParam, filter?: Filter) {\n const { query, replacements } = generateUpdateQuery(table, data, filter);\n\n const result = await config.db.query(query, {\n type: QueryTypes.SELECT,\n raw: true,\n replacements: [...replacements]\n });\n return result;\n }\n\n public async delete(table: string, filter?: Filter) {\n const { query, replacements } = generateDeleteQuery(table, filter);\n\n await config.db.query(query, {\n type: QueryTypes.DELETE,\n raw: true,\n replacements: [...replacements]\n });\n }\n\n public async upsert(\n table: string,\n data: UpdateOpParam,\n conflictTarget: string[],\n doNothingOnConflict = false\n ) {\n const { query, replacements } = generateUpsertQuery(\n table,\n data,\n conflictTarget,\n doNothingOnConflict\n );\n\n const result = await config.db.query(query, {\n type: QueryTypes.SELECT,\n raw: true,\n replacements: [...replacements]\n });\n\n return result;\n }\n}\n","import { Knex } from 'knex';\nimport { Filter, FilterParam, UpdateOpParam, Join } from '../shared/interface';\nimport { getKnex } from './db';\n\nexport const NESTED_DELIMITER = '__hj__';\n\nexport const nestResults = (\n results: Record<string, any>[],\n joins: Join[] = []\n) => {\n if (!joins.length || !results.length) return results;\n\n const nestedResults: any[] = [];\n const mainTableFields = Object.keys(results[0]).filter(\n (key) => !key.includes(NESTED_DELIMITER)\n );\n\n const groups = new Map<string, any>();\n\n results.forEach((row) => {\n // Generate a unique key for the main record based on non-nested fields\n const key = mainTableFields.map((f) => row[f]).join('|');\n\n if (!groups.has(key)) {\n const mainRecord: any = {};\n mainTableFields.forEach((f) => {\n mainRecord[f] = row[f];\n });\n\n // Initialize nested arrays for each join\n joins.forEach((join) => {\n const joinKey = join.alias || join.table;\n mainRecord[joinKey] = [];\n });\n\n groups.set(key, mainRecord);\n nestedResults.push(mainRecord);\n }\n\n const mainRecord = groups.get(key);\n\n joins.forEach((join) => {\n const joinKey = join.alias || join.table;\n const nestedObject: any = {};\n let hasValue = false;\n\n Object.keys(row).forEach((k) => {\n if (k.startsWith(`${joinKey}${NESTED_DELIMITER}`)) {\n const fieldName = k.split(NESTED_DELIMITER)[1];\n nestedObject[fieldName] = row[k];\n if (row[k] !== null) hasValue = true;\n }\n });\n\n if (hasValue) {\n // Check if this specific nested object already exists in the array\n const alreadyExists = mainRecord[joinKey].some((item: any) => {\n return Object.keys(nestedObject).every(\n (k) => item[k] === nestedObject[k]\n );\n });\n\n if (!alreadyExists) {\n mainRecord[joinKey].push(nestedObject);\n }\n }\n });\n });\n\n return nestedResults;\n};\n\nexport const applyFilter = (query: Knex.QueryBuilder, filter: Filter = {}) => {\n Object.entries(filter).forEach(([field, data]) => {\n if (field === '$or') {\n query.where((builder) => {\n Object.entries(data).forEach(([orField, orData], index) => {\n const method = index === 0 ? 'where' : 'orWhere';\n const orParam = orData as FilterParam;\n\n if (['like', 'not like'].includes(orParam.operator)) {\n builder[method](orField, 'ilike', `%${orParam.value}%`);\n } else {\n builder[method](orField, orParam.operator, orParam.value);\n }\n });\n });\n } else {\n const param = data as FilterParam;\n\n if (['like', 'not like'].includes(param.operator)) {\n query.where(\n field,\n param.operator === 'like' ? 'ilike' : 'not ilike',\n `%${param.value}%`\n );\n } else {\n query.where(field, param.operator, param.value);\n }\n }\n });\n\n return query;\n};\n\nexport const generateCreateQuery = (\n table: string,\n data: Record<string, string | number | boolean | Date | Object>\n) => {\n const knex = getKnex();\n const { sql: query, bindings: replacements } = knex(table)\n .insert(data)\n .returning('id')\n .toSQL();\n\n return { query, replacements };\n};\n\nexport const generateReadQuery = (\n table: string,\n fields: string[],\n filter?: Filter,\n paginate?: { page: number; limit: number },\n format?: { sort: 'ASC' | 'DESC'; sortField: string },\n joins?: Join[]\n) => {\n const knex = getKnex();\n\n // Handle field aliasing for joins\n const formattedFields = fields.map((field) => {\n if (field.includes('.')) {\n const [tableName, fieldName] = field.split('.');\n // Check if the table is part of a join\n const join = joins?.find(\n (j) => j.table === tableName || j.alias === tableName\n );\n if (join) {\n return `${field} as ${tableName}${NESTED_DELIMITER}${fieldName}`;\n }\n }\n return field;\n });\n\n let q = knex(table).select(formattedFields);\n\n // Add total count if pagination is needed\n if (paginate) {\n // Using knex.raw to create the count column with the same name as in original code\n q = knex(table).select([\n ...formattedFields.map((field) => {\n const [actualField, alias] = field.split(' as ');\n return alias\n ? knex.raw(`?? as ??`, [actualField, alias])\n : knex.raw(`?? as ??`, [field, field]);\n }),\n knex.raw('count(??) OVER() AS honey_total_count', [formattedFields[0]])\n ]);\n }\n\n // Apply joins\n if (joins && joins.length > 0) {\n joins.forEach((join) => {\n const joinTable = join.alias\n ? `${join.table} as ${join.alias}`\n : join.table;\n const joinType = join.type || 'inner';\n const operator = join.on.operator || '=';\n\n switch (joinType) {\n case 'left':\n q.leftJoin(joinTable, join.on.left, operator, join.on.right);\n break;\n case 'right':\n q.rightJoin(joinTable, join.on.left, operator, join.on.right);\n break;\n case 'full':\n q.fullOuterJoin(joinTable, join.on.left, operator, join.on.right);\n break;\n case 'cross':\n q.crossJoin(\n join.alias\n ? knex.raw('?? as ??', [join.table, join.alias])\n : knex.raw('??', [join.table])\n );\n break;\n case 'inner':\n default:\n q.innerJoin(joinTable, join.on.left, operator, join.on.right);\n break;\n }\n });\n }\n\n // Apply filters\n if (filter) {\n q = applyFilter(q, filter);\n }\n\n // Apply sorting\n if (format?.sort && format.sortField) {\n q.orderBy(format.sortField, format.sort);\n }\n\n // Apply pagination\n if (paginate) {\n q.limit(paginate.limit).offset(paginate.limit * (paginate.page - 1));\n }\n\n const { sql: query, bindings: replacements } = q.toSQL();\n\n return { query, replacements };\n};\nexport const generateUpdateQuery = (\n table: string,\n data: UpdateOpParam,\n filter?: Filter\n) => {\n const knex = getKnex();\n let q = knex(table);\n\n // Build the update object\n const updateData: Record<string, Knex.Raw> = {};\n\n Object.entries(data).forEach(([field, fieldData]) => {\n const param = fieldData as any;\n\n if (param.operator === 'inc') {\n updateData[field] = knex.raw('?? + ?', [field, param.value]);\n } else if (param.operator === 'dec') {\n updateData[field] = knex.raw('?? - ?', [field, param.value]);\n } else {\n updateData[field] = param.value;\n }\n });\n\n // Apply filter conditions\n if (filter) {\n q = applyFilter(q, filter);\n }\n\n const { sql: query, bindings: replacements } = q\n .update(updateData)\n .returning('*')\n .toSQL();\n console.log(query, replacements);\n return { query, replacements };\n};\nexport const generateDeleteQuery = (table: string, filter?: Filter) => {\n const knex = getKnex();\n let q = knex(table);\n\n if (filter) {\n q = applyFilter(q, filter);\n }\n\n const { sql: query, bindings: replacements } = q.delete().toSQL();\n return { query, replacements };\n};\n\nexport const generateUpsertQuery = (\n table: string,\n data: UpdateOpParam,\n conflictTarget: string[],\n doNothingOnConflict = false\n) => {\n const knex = getKnex();\n\n // Prepare insert data\n const insertData: Record<string, UpdateOpParam[string]['value']> = {};\n Object.entries(data).forEach(([field, fieldData]) => {\n insertData[field] = fieldData.value;\n });\n\n // Prepare update data for conflict resolution\n const updateData: Record<string, Knex.Raw | UpdateOpParam[string]['value']> =\n {};\n\n if (doNothingOnConflict) {\n // Dummy update to force returning the row\n // We update the first conflict target column to itself\n const conflictField = conflictTarget[0];\n updateData[conflictField] = knex.raw('??', [`${table}.${conflictField}`]);\n } else {\n Object.entries(data).forEach(([field, fieldData]) => {\n const param = fieldData;\n\n if (param.operator === 'inc') {\n updateData[field] = knex.raw('?? + ?', [\n `${table}.${field}`,\n param.value\n ]);\n } else if (param.operator === 'dec') {\n updateData[field] = knex.raw('?? - ?', [\n `${table}.${field}`,\n param.value\n ]);\n } else {\n updateData[field] = param.value;\n }\n });\n }\n\n const { sql: query, bindings: replacements } = knex(table)\n .insert(insertData)\n .onConflict(conflictTarget)\n .merge(updateData)\n .returning(['*', knex.raw('(xmax = 0) as is_insert')])\n .toSQL();\n\n return { query, replacements };\n};\n","export function normalizePort(val: string) {\n const port = parseInt(val, 10);\n\n if (isNaN(port)) {\n // named pipe\n return val;\n }\n\n if (port >= 0) {\n // port number\n return port;\n }\n\n throw new Error('Invalid port number');\n}\n","import { ObjectSchema, ValidationOptions } from 'joi';\nimport { Middleware } from 'src/interfaces/express';\nimport HttpError, { handleHttpError } from './error';\n\nexport const validateRequestData =\n (\n schema: ObjectSchema,\n location: 'body' | 'params' | 'query' | 'headers' | 'cookies' = 'body',\n options: ValidationOptions = { allowUnknown: true }\n ): Middleware =>\n async (req, res, next) => {\n try {\n const validationResult = schema.validate(req[location], options);\n const validationError = validationResult.error?.message;\n if (validationError) {\n throw new HttpError(validationError, 422);\n }\n\n return next();\n } catch (error: any) {\n handleHttpError(error, res);\n }\n };\n\nexport default validateRequestData;\n","import { Request } from 'express';\n\nexport const createReqTransit = <T>(key: string) => {\n const inject = (req: Request, value: T) => {\n req._honeyTransit = { ...req._honeyTransit, [key]: value };\n };\n\n const extract = (req: Request, defaultValue?: T): T => {\n return req._honeyTransit?.[key] ?? defaultValue!;\n };\n\n return { inject, extract };\n};\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../"}
1
+ {"mappings":"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","sources":["src/index.ts","src/config/index.ts","src/config/database.ts","src/services/express.ts","src/utils/error.ts","src/services/honey.ts","src/controllers/index.ts","src/controllers/interfaces.ts","src/controllers/create.ts","src/utils/formatter.ts","src/controllers/read.ts","src/controllers/update.ts","src/controllers/upsert.ts","src/controllers/delete.ts","src/controllers/query.ts","src/utils/db.ts","src/utils/helpers.ts","src/services/postgres.ts","src/utils/postgres.ts","src/utils/port.ts","src/utils/validation.ts","src/utils/transit.ts"],"sourcesContent":["import { QueryTypes as QTypes } from 'sequelize';\n\nimport Config from './config';\nimport { DBOptions } from './config/database';\nimport ExpressApp from './services/express';\nimport Honey from './services/honey';\nimport Postgres from './services/postgres';\nimport { normalizePort } from './utils/port';\nimport { Metadata } from './interfaces/express';\n\nprocess.on('SIGINT', () => {\n // process reload ongoing\n // close connections, clear cache, etc\n // by default, you have 1600ms\n process.exit(0);\n});\n\nexport function createHoney(\n port: string,\n dbOptions: string | DBOptions,\n metadata?: Metadata\n) {\n new Config(dbOptions);\n\n const portVal = normalizePort(port || process.env.PORT || '3000');\n const express = new ExpressApp(portVal, metadata);\n const postgres = new Postgres();\n const honey = new Honey(express, postgres);\n\n return honey;\n}\n\nexport const defineModel = Config.defineModel.bind(Config);\n\nfunction getQueryTypes() {\n const { SELECT, INSERT, UPDATE, DELETE, RAW, UPSERT } = QTypes;\n\n const exposedTypes = { SELECT, INSERT, UPDATE, DELETE, RAW, UPSERT };\n return exposedTypes;\n}\n\nconst QueryTypes = getQueryTypes();\n\nexport { QueryTypes };\nexport { default as runDbQuery, createModel } from './utils/db';\nexport { default as HttpError, handleHttpError } from './utils/error';\nexport { default as Honey } from './services/honey';\nexport type {\n Middleware,\n ExitMiddleware,\n Request,\n Response\n} from './interfaces/express';\nexport * from 'sequelize';\nexport { Knex } from 'knex';\nexport { validateRequestData } from './utils/validation';\nexport { createReqTransit } from './utils/transit';\n","import path from 'path';\nimport dotenv from 'dotenv';\n\nimport initDB, { DBOptions } from './database';\nimport {\n Model,\n ModelAttributes,\n ModelOptions,\n Sequelize\n} from 'sequelize/types';\ndotenv.config();\ndotenv.config({ path: path.join(__dirname, '.env') });\n\nexport default class Config {\n public static db: Sequelize;\n\n public static getEnv = (key: string) => {\n return process.env[key];\n };\n\n constructor(options: DBOptions | string) {\n Config.db = initDB(options);\n }\n\n static get isLive() {\n return process.env.NODE_ENV === 'production';\n }\n\n public static defineModel(\n modelName: string,\n attributes: ModelAttributes<Model<any, any>, any>,\n options?: ModelOptions<Model<any, any>> | undefined\n ) {\n return this.db.define(modelName, attributes, options);\n }\n}\n","import { Sequelize } from 'sequelize';\n\nexport interface DBOptions {\n host: string;\n port: number | string;\n user: string;\n password: string;\n database: string;\n}\n\nexport default function initDB(options: string | DBOptions) {\n let uri = '';\n if (typeof options === 'string') {\n uri = options;\n } else {\n uri = `postgres://${options.user}:${options.password}@${options.host}:${options.port}/${options.database}`;\n }\n const sequelize = new Sequelize(uri, {\n logging: false\n });\n\n sequelize\n .authenticate()\n .then(() => {\n console.log('DB Connection established successfully');\n })\n .catch((err) => {\n console.log('DB Connection failed');\n console.error(err);\n });\n\n return sequelize;\n}\n","import cookieParser from 'cookie-parser';\nimport express from 'express';\nimport logger from 'morgan';\nimport cors from 'cors';\nimport http from 'http';\nimport expressOasGenerator from 'express-oas-generator';\nimport '../config';\nimport HttpError from '../utils/error';\nimport { AddressInfo } from 'net';\nimport { Metadata } from '../interfaces/express';\n\n/**\n * Event listener for HTTP server \"error\" event.\n */\nconst onError = (port: string | number) => {\n return (error: any) => {\n if (error.syscall !== 'listen') {\n throw error;\n }\n\n const bind = typeof port === 'string' ? `Pipe ${port}` : `Port ${port}`;\n\n // handle specific listen errors with friendly messages\n switch (error.code) {\n case 'EACCES':\n console.error(`${bind} requires elevated privileges`);\n process.exit(1);\n case 'EADDRINUSE':\n console.error(`${bind} is already in use`);\n process.exit(1);\n default:\n throw error;\n }\n };\n};\n\n/**\n * Event listener for HTTP server \"listening\" event.\n */\nconst onListening = (server: http.Server) => {\n return () => {\n const addr = server.address();\n const bind =\n typeof addr === 'string'\n ? `pipe ${addr}`\n : `port ${(addr as AddressInfo).port}`;\n console.log(\n `%c Honey Server started on ${bind} `,\n 'background: #222; color: #bada55; font-size: 32px'\n );\n };\n};\n\nclass ExpressApp {\n public app = express();\n public appRoutes = express.Router();\n private fallbackErrMessage = 'Endpoint does not exist';\n private routePrefix = '/api';\n\n constructor(\n port: string | number,\n private metadata?: Metadata\n ) {\n this.fallbackErrMessage =\n this.metadata?.fallbackErrorMessage || this.fallbackErrMessage;\n this.routePrefix = this.metadata?.routePrefix || this.routePrefix;\n this.initMiddlewares();\n this.setupErrorFallback();\n this.app.set('port', port);\n }\n\n public listen() {\n expressOasGenerator.handleRequests();\n const port = Number(this.app.get('port'));\n const server = this.app.listen(port);\n server.on('error', onError(port));\n server.on('listening', onListening(server));\n }\n\n private initMiddlewares() {\n const corsOptions: cors.CorsOptions = {\n origin: '*',\n methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',\n allowedHeaders: '*',\n exposedHeaders: '*',\n credentials: true,\n optionsSuccessStatus: 204\n };\n\n expressOasGenerator.handleResponses(this.app, {} as any);\n this.app.use(logger('dev'));\n this.app.use(cors(corsOptions));\n this.app.use(\n express.json({\n limit: '50mb',\n verify(req: any, _res, buf) {\n req.rawBody = buf;\n }\n })\n );\n this.app.use(express.urlencoded({ limit: '50mb', extended: false }));\n this.app.use(cookieParser());\n this.app.use(this.routePrefix, this.appRoutes);\n }\n\n private setupErrorFallback() {\n this.app.use((_, res) => {\n const err = new HttpError(this.fallbackErrMessage, 404);\n\n return res.status(err.status).json({ message: err.message });\n });\n // error handler\n this.app.use((err: any, _, res: any) => {\n return res\n .status(err.status || 500)\n .send({ message: 'Something went wrong' });\n });\n }\n}\n\nexport default ExpressApp;\n","import { Response } from 'express';\n\nexport default class HttpError extends Error {\n constructor(\n message: string,\n public status: number\n ) {\n super(message || 'Something went wrong');\n }\n}\n\nexport const handleHttpError = (err: HttpError, res: Response) => {\n return res\n .status(err.status || 500)\n .send({ message: err.message || 'Something went wrong' });\n};\n","import Config from '../config';\nimport {\n createController,\n deleteByIdController,\n getByIdController,\n getByQueryController,\n updateByIdController,\n upsertByIdController,\n upsertController,\n updateController,\n deleteController,\n queryController\n} from '../controllers';\nimport {\n ICreate,\n ICrud,\n IDelete,\n IDeleteById,\n IGet,\n IGetById,\n IUpdate,\n IUpdateById,\n IUpsert,\n IUpsertById,\n IQuery\n} from '../interfaces/crud';\nimport { ExitMiddleware, Middleware } from '../interfaces/express';\nimport { NextFunction, Request, Response } from 'express';\nimport ExpressApp from './express';\nimport Postgres from './postgres';\n\n// eslint-disable-next-line\nconst defaultExitMiddleware: ExitMiddleware = (data, req, res, next) => {\n if (process.env.NODE_ENV !== 'production') console.log('Response:', data);\n};\n\nexport default class Honey {\n constructor(\n public express: ExpressApp,\n private postgres: Postgres\n ) {}\n\n get routes() {\n return this.express.appRoutes;\n }\n\n get db() {\n return Config.db;\n }\n\n private crud({\n method,\n path,\n controller,\n middleware = [],\n exitMiddleware = [defaultExitMiddleware]\n }: ICrud) {\n const dbCheck = async (req: Request, res: Response, next: NextFunction) => {\n if (!Config.db) {\n return res.status(503).send({\n message: 'DB Initialization in progress'\n });\n } else {\n next();\n }\n };\n this.express.appRoutes[method](\n path,\n dbCheck,\n ...middleware,\n controller,\n ...exitMiddleware\n );\n }\n\n public addMiddleware(middleware: Middleware[]) {\n this.express.appRoutes.use(...middleware);\n }\n\n public startServer() {\n this.express.listen();\n }\n\n public create({\n resource,\n params,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n processResponseData,\n processErrorResponse,\n table,\n methodOverride\n }: ICreate) {\n const path = pathOverride || `/${resource}`;\n resource = table || resource;\n\n const controller = createController({\n db: this.postgres,\n resource,\n params,\n message,\n processResponseData,\n processErrorResponse\n });\n\n this.crud({\n method: methodOverride || 'post',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public get({\n resource,\n fields,\n filter,\n format,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n processResponseData,\n processErrorResponse,\n table,\n joins,\n shouldErrorOnNotFound = true\n }: IGet) {\n const path = pathOverride || `/${resource}`;\n resource = table || resource;\n\n const controller = getByQueryController({\n db: this.postgres,\n resource,\n fields,\n filterQuery: filter,\n format,\n processResponseData,\n processErrorResponse,\n joins,\n shouldErrorOnNotFound\n });\n this.crud({\n method: methodOverride || 'get',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public getById({\n resource,\n fields,\n idField,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n processResponseData,\n processErrorResponse,\n table,\n filter,\n joins,\n shouldErrorOnNotFound = true\n }: IGetById) {\n const path = pathOverride || `/${resource}/:id`;\n resource = table || resource;\n\n const controller = getByIdController({\n db: this.postgres,\n resource,\n fields,\n idField: idField || 'id',\n processResponseData,\n processErrorResponse,\n filterQuery: filter,\n joins,\n shouldErrorOnNotFound\n });\n\n this.crud({\n method: methodOverride || 'get',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public updateById({\n resource,\n params,\n idField,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n table,\n filter,\n processErrorResponse,\n processResponseData\n }: IUpdateById) {\n const path = pathOverride || `/${resource}/:id`;\n resource = table || resource;\n\n const controller = updateByIdController({\n db: this.postgres,\n resource,\n params,\n message,\n idField,\n filterQuery: filter,\n processErrorResponse,\n processResponseData\n });\n this.crud({\n method: methodOverride || 'put',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public update({\n resource,\n params,\n filter,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n table,\n processErrorResponse,\n processResponseData\n }: IUpdate) {\n const path = pathOverride || `/${resource}`;\n resource = table || resource;\n\n const controller = updateController({\n db: this.postgres,\n resource,\n params,\n message,\n filterQuery: filter,\n processErrorResponse,\n processResponseData\n });\n this.crud({\n method: methodOverride || 'put',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public upsertById({\n resource,\n params,\n idField,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n table,\n processErrorResponse,\n processResponseData,\n doNothingOnConflict\n }: IUpsertById) {\n const path = pathOverride || `/${resource}/:id`;\n resource = table || resource;\n\n const controller = upsertByIdController({\n db: this.postgres,\n resource,\n params,\n message,\n idField,\n processErrorResponse,\n processResponseData,\n doNothingOnConflict\n });\n this.crud({\n method: methodOverride || 'put',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public upsert({\n resource,\n params,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n conflictTarget,\n table,\n processErrorResponse,\n processResponseData,\n doNothingOnConflict\n }: IUpsert) {\n const path = pathOverride || `/${resource}`;\n resource = table || resource;\n\n const controller = upsertController({\n db: this.postgres,\n resource,\n params,\n message,\n conflictTarget,\n processErrorResponse,\n processResponseData,\n doNothingOnConflict\n });\n this.crud({\n method: methodOverride || 'put',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public deleteById({\n resource,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n idField,\n filter,\n table,\n processErrorResponse\n }: IDeleteById) {\n const path = pathOverride || `/${resource}/:id`;\n resource = table || resource;\n\n const controller = deleteByIdController({\n db: this.postgres,\n resource,\n message,\n idField,\n filterQuery: filter,\n processErrorResponse\n });\n this.crud({\n method: methodOverride || 'delete',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public delete({\n resource,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n filter,\n table,\n processErrorResponse\n }: IDelete) {\n const path = pathOverride || `/${resource}/:id`;\n resource = table || resource;\n\n const controller = deleteController({\n db: this.postgres,\n resource,\n message,\n filterQuery: filter,\n processErrorResponse\n });\n this.crud({\n method: methodOverride || 'delete',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public query({\n resource,\n query,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n processErrorResponse,\n processResponseData\n }: IQuery) {\n const path = pathOverride || `/${resource}`;\n\n const controller = queryController({\n db: this.postgres,\n query,\n processErrorResponse,\n processResponseData\n });\n this.crud({\n method: methodOverride || 'get',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n}\n","export { Controller } from './interfaces';\nexport { default as createController } from './create';\nexport { getByIdController, getByQueryController } from './read';\nexport { updateByIdController, updateController } from './update';\nexport { upsertByIdController, upsertController } from './upsert';\nexport { deleteByIdController, deleteController } from './delete';\nexport * from './query';\n","import { NextFunction, Request, Response } from 'express';\n\nexport type Controller = (\n req: Request,\n res: Response,\n next: NextFunction\n) => void;\n","import { CreateControllerParams } from '../interfaces/crud';\nimport HttpError, { handleHttpError } from '../utils/error';\nimport { extractInsertData } from '../utils/formatter';\nimport { NextFunction, Request, Response } from 'express';\nimport { Controller } from './interfaces';\n\nexport default function createController({\n db,\n resource,\n params,\n message,\n processResponseData,\n processErrorResponse\n}: CreateControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const body = extractInsertData(req.body, params);\n\n let data = await db.create(resource, body);\n const id = data[0].id;\n\n data =\n req.body.dataOverride ||\n (processResponseData ? await processResponseData({ id }, req) : { id });\n\n res.send({\n message,\n data\n });\n next({ message, data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n","import { Request } from 'express';\nimport { ICreate, IUpdateById } from '../interfaces/crud';\nimport {\n Filter,\n FilterLocation,\n FilterOps,\n FilterParam,\n GetFilterParam,\n GetQueryFilter,\n UpdateOpParam\n} from '../shared/interface';\n\nconst formatters: Record<string, Function> = {\n string: String,\n number: Number,\n boolean: Boolean,\n json: JSON.stringify,\n // Required for updating JSON fields\n object: JSON.stringify,\n csv: (value: string) => value.split(','),\n 'as-is': (value: any) => value\n};\n\nexport const extractInsertData = (\n body: Record<string, any>,\n params: ICreate['params']\n) => {\n const result: Record<string, string | number | boolean | Date | Object> = {};\n\n Object.entries(params).forEach(([key, value]) => {\n if (value === '@updatedAt') {\n result[key] = new Date();\n return;\n }\n\n if (!Object.keys(body).includes(key)) return;\n\n const formatter = formatters[value];\n result[key] =\n formatter && ![null, undefined].includes(body[key])\n ? formatter(body[key])\n : body[key];\n });\n\n return result;\n};\n\nexport const generateUpdateData = (\n body: Record<string, any>,\n params: IUpdateById['params']\n) => {\n const result = Object.entries(params).reduce((acc, [key, value]) => {\n if (!Object.keys(body).includes(key) && value !== '@updatedAt')\n return { ...acc };\n\n let formattedValue: any;\n if (value === '@updatedAt') {\n formattedValue = new Date();\n } else {\n formattedValue = ![null, undefined].includes(body[key])\n ? formatters[typeof body[key]](body[key])\n : body[key];\n }\n\n return {\n ...acc,\n [key]: {\n value: formattedValue,\n operator: value === '@updatedAt' ? 'replace' : value\n }\n };\n }, {} as UpdateOpParam);\n\n return result;\n};\n\nconst retrieveParamFromLocation = (\n req: Request,\n location: FilterLocation,\n key: string\n) => {\n if (location === 'request') return (req as any)[key];\n\n return req[location][key];\n};\n\nexport const formatReadFilter = (\n filterParams: Record<string, any>,\n filter: GetQueryFilter,\n req: Request\n) => {\n const result: Filter = {};\n\n for (const [key, param] of Object.entries(filter)) {\n if (key === '$or') {\n const val = formatReadFilter(\n filterParams,\n param as Record<string, GetFilterParam>,\n req\n ) as Record<string, FilterParam>;\n\n result[key] = val;\n } else {\n let valueToUse: any;\n if (param.overrideValue) {\n if (typeof param.overrideValue === 'function') {\n valueToUse = param.overrideValue(req);\n } else {\n valueToUse = param.overrideValue;\n }\n } else if (!!param.location) {\n valueToUse = retrieveParamFromLocation(\n req,\n param.location as FilterLocation,\n key\n );\n } else {\n valueToUse = filterParams[key];\n }\n\n if (typeof valueToUse === 'undefined') {\n continue;\n }\n\n const valueFormatter = formatters[(param as GetFilterParam).value];\n result[key] = {\n operator: param.operator as FilterOps,\n value: valueFormatter(valueToUse)\n };\n }\n }\n\n return result;\n};\n","import {\n GetByIdControllerParams,\n GetByQueryControllerParams\n} from '../interfaces/crud';\nimport HttpError, { handleHttpError } from '../utils/error';\nimport { formatReadFilter } from '../utils/formatter';\nimport { NextFunction, Request, Response } from 'express';\nimport { Controller } from './interfaces';\n\nexport function getByIdController({\n db,\n resource,\n fields,\n idField = 'id',\n processResponseData,\n processErrorResponse,\n filterQuery = {},\n joins,\n shouldErrorOnNotFound\n}: GetByIdControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const id = req.params.id;\n\n const filter = formatReadFilter(req.query, filterQuery, req);\n\n let data = await db.read(\n resource,\n fields,\n {\n [idField]: {\n value: id,\n operator: '='\n },\n ...filter\n },\n undefined,\n undefined,\n joins\n );\n\n if (!data?.length && shouldErrorOnNotFound) {\n throw new HttpError('Record does not exist', 404);\n }\n\n data = processResponseData\n ? await processResponseData(data[0], req)\n : data[0];\n\n res.send({\n data\n });\n next({ data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n\nexport function getByQueryController({\n db,\n resource,\n fields,\n filterQuery,\n format,\n processResponseData,\n processErrorResponse,\n joins,\n shouldErrorOnNotFound\n}: GetByQueryControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const page = Number(req.query.page);\n const limit = Number(req.query.limit);\n const paginate =\n limit || page ? { page: page || 1, limit: limit || 10 } : undefined;\n\n const filter =\n filterQuery && formatReadFilter(req.query, filterQuery, req);\n\n let data: Record<string, any>[] = await db.read(\n resource,\n fields,\n filter,\n paginate,\n format,\n joins\n );\n let total = 0;\n if (paginate) {\n total = Number(data[0]?.['honey_total_count'] || 0);\n data = data.map((item: Record<string, any>) => {\n delete item['honey_total_count'];\n return item;\n });\n }\n\n if (processResponseData) {\n data = await processResponseData(data, req);\n } else if (!data?.length && shouldErrorOnNotFound) {\n throw new HttpError('No records found', 404);\n }\n const response = {\n data,\n meta: {\n ...(!!paginate && {\n pagination: {\n total,\n pageSize: limit,\n page,\n pageCount: Math.ceil(total / limit)\n }\n })\n }\n };\n res.send(response);\n next(response);\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n","import {\n UpdateByIdControllerParams,\n UpdateControllerParams\n} from '../interfaces/crud';\nimport { Filter } from '../shared/interface';\nimport HttpError, { handleHttpError } from '../utils/error';\nimport { formatReadFilter, generateUpdateData } from '../utils/formatter';\nimport { NextFunction, Request, Response } from 'express';\nimport { Controller } from './interfaces';\n\nexport function updateByIdController({\n db,\n resource,\n params,\n message,\n idField = 'id',\n processErrorResponse,\n processResponseData,\n filterQuery = {}\n}: UpdateByIdControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const body = generateUpdateData(req.body, params);\n const additionalFilter =\n filterQuery && formatReadFilter(req.body, filterQuery, req);\n const filter: Filter = {\n [idField]: {\n operator: '=',\n value: req.params.id\n },\n ...additionalFilter\n };\n\n const result = await db.update(resource, body, filter);\n\n const data = processResponseData\n ? await processResponseData(result, req)\n : undefined;\n\n res.send({ message, data });\n next({ message, data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n\nexport function updateController({\n db,\n resource,\n params,\n message,\n filterQuery,\n processErrorResponse,\n processResponseData\n}: UpdateControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const body = generateUpdateData(req.body, params);\n const filter =\n filterQuery && formatReadFilter(req.body, filterQuery, req);\n\n const result = await db.update(resource, body, filter);\n\n const data = processResponseData\n ? await processResponseData(result, req)\n : undefined;\n\n res.send({ message, data });\n\n next({ message, data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n","import {\n UpsertByIdControllerParams,\n UpsertControllerParams\n} from '../interfaces/crud';\nimport HttpError, { handleHttpError } from '../utils/error';\nimport { generateUpdateData } from '../utils/formatter';\nimport { NextFunction, Response } from 'express';\nimport { Request } from '../interfaces/express';\nimport { Controller } from './interfaces';\n\nexport function upsertByIdController({\n db,\n resource,\n params,\n message,\n idField = 'id',\n processErrorResponse,\n processResponseData,\n doNothingOnConflict\n}: UpsertByIdControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n req.body[idField] = req.params.id;\n params = { ...params, [idField]: 'replace' };\n const body = generateUpdateData(req.body, params);\n\n const result = await db.upsert(\n resource,\n body,\n [idField],\n doNothingOnConflict\n );\n\n if (result?.[0]) {\n req.isInsert = (result[0] as any).is_insert;\n }\n\n const data = processResponseData\n ? await processResponseData(result?.[0], req)\n : undefined;\n\n res.send({ message, data });\n\n next({ message, data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n\nexport function upsertController({\n db,\n resource,\n params,\n message,\n conflictTarget,\n processErrorResponse,\n processResponseData,\n doNothingOnConflict\n}: UpsertControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const body = generateUpdateData(req.body, params);\n\n const result = await db.upsert(\n resource,\n body,\n conflictTarget,\n doNothingOnConflict\n );\n\n if (result?.[0]) {\n req.isInsert = (result[0] as any).is_insert;\n }\n\n const data = processResponseData\n ? await processResponseData(result?.[0], req)\n : undefined;\n\n res.send({ message, data });\n\n next({ message, data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n","import {\n DeleteByIdControllerParams,\n DeleteControllerParams\n} from '../interfaces/crud';\nimport HttpError, { handleHttpError } from '../utils/error';\nimport { NextFunction, Request, Response } from 'express';\nimport { Controller } from './interfaces';\nimport { formatReadFilter } from '../utils/formatter';\n\nexport function deleteByIdController({\n db,\n resource,\n message,\n idField = 'id',\n processErrorResponse,\n filterQuery = {}\n}: DeleteByIdControllerParams): Controller {\n return async (req: Request, res: Response, next: NextFunction) => {\n try {\n const id = req.params[idField || 'id'];\n const filter =\n filterQuery && formatReadFilter(req.body, filterQuery, req);\n\n await db.delete(resource, {\n [idField]: {\n value: id,\n operator: '='\n },\n ...filter\n });\n\n res.send({ message });\n next({ message });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n\nexport function deleteController({\n db,\n resource,\n message,\n processErrorResponse,\n filterQuery\n}: DeleteControllerParams): Controller {\n return async (req: Request, res: Response, next: NextFunction) => {\n try {\n const filter =\n filterQuery && formatReadFilter(req.body, filterQuery, req);\n\n await db.delete(resource, filter);\n\n res.send({ message });\n next({ message });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n","import { NextFunction, Request, Response } from 'express';\nimport { getKnex } from '../utils/db';\nimport { QueryControllerParams } from '../interfaces/crud';\n\nexport function queryController({\n db,\n query,\n processErrorResponse,\n processResponseData\n}: QueryControllerParams) {\n return async (req: Request, res: Response, next: NextFunction) => {\n try {\n const page = Number(req.query.page);\n const limit = Number(req.query.limit);\n const paginate =\n limit || page ? { page: page || 1, limit: limit || 10 } : undefined;\n\n const knex = getKnex();\n let queryBuilder = query(knex, req);\n if (paginate) {\n queryBuilder = queryBuilder\n .limit(paginate.limit)\n .offset(paginate.limit * (paginate.page - 1));\n }\n const { sql, bindings } = queryBuilder.toSQL();\n\n const result = await db.query(sql, [...bindings]);\n\n const data = processResponseData\n ? await processResponseData(result, req)\n : result;\n\n res.send({ data });\n next({ data });\n } catch (e) {\n if (processErrorResponse) {\n return next(processErrorResponse(e as Error));\n }\n return next(e);\n }\n };\n}\n","import {\n Model,\n ModelAttributes,\n ModelOptions,\n ModelStatic,\n QueryOptions\n} from 'sequelize';\nimport Knex from 'knex';\n\nimport Config from '../config';\nimport createSingleton from './helpers';\n\nexport default function runDbQuery(query: string, params?: QueryOptions) {\n params = params || {};\n\n return Config.db.query(query, {\n ...params,\n raw: true\n });\n}\n\nclass ModelCreator {\n private static model: Record<string, ModelStatic<Model>> = {};\n\n public static createModel<\n TModelAttributes extends {} = any,\n TCreationAttributes extends {} = TModelAttributes\n >(\n modelName: string,\n attributes: ModelAttributes<Model<TModelAttributes, TCreationAttributes>>,\n options?:\n | ModelOptions<Model<TModelAttributes, TCreationAttributes>>\n | undefined\n ): ModelStatic<Model<TModelAttributes, TCreationAttributes>> {\n if (!this.model[modelName]) {\n this.model[modelName] = Config.db.define(modelName, attributes, options);\n }\n\n return this.model[modelName];\n }\n}\n\nexport function createModel<\n TModelAttributes extends {} = any,\n TCreationAttributes extends {} = TModelAttributes\n>(\n modelName: string,\n attributes: ModelAttributes<Model<TModelAttributes, TCreationAttributes>>,\n options?:\n | ModelOptions<Model<TModelAttributes, TCreationAttributes>>\n | undefined\n) {\n return ModelCreator.createModel.bind(ModelCreator)(\n modelName,\n attributes,\n options\n );\n}\n\nexport const getKnex = () =>\n createSingleton('knex', () => {\n return Knex({\n client: 'pg', // or 'mysql2', 'sqlite3', etc.\n // Do not provide connection. Also disable pool to be explicit.\n connection: undefined as any,\n pool: { min: 0, max: 0 }\n });\n });\n","export class Singleton {\n private static instances: Map<string, any> = new Map();\n\n public static getInstance<T>(identifier: string, initFn?: () => T): T {\n if (!this.instances.has(identifier) && initFn) {\n this.instances.set(identifier, initFn());\n }\n\n return this.instances.get(identifier) as T;\n }\n}\n\nexport default function createSingleton<T>(\n identifier: string,\n initFn?: () => T\n): T {\n return Singleton.getInstance(identifier, initFn);\n}\n","import config from '../config';\nimport {\n generateCreateQuery,\n generateDeleteQuery,\n generateReadQuery,\n generateUpdateQuery,\n generateUpsertQuery,\n nestResults\n} from '../utils/postgres';\nimport { QueryTypes } from 'sequelize';\nimport { Filter, UpdateOpParam, Join } from '../shared/interface';\n\nexport default class Postgres {\n public async read(\n table: string,\n fields: string[],\n filter?: Filter,\n paginate?: { page: number; limit: number },\n format?: { sort: 'ASC' | 'DESC'; sortField: string },\n joins?: Join[]\n ) {\n const { query, replacements } = generateReadQuery(\n table,\n fields,\n filter,\n paginate,\n format,\n joins\n );\n\n const result: any[] = await config.db.query(query, {\n type: QueryTypes.SELECT,\n raw: true,\n replacements: [...replacements]\n });\n\n if (joins?.length) {\n return nestResults(result, joins);\n }\n\n return result;\n }\n\n public async query(query: string, replacements: any[]) {\n const result = await config.db.query(query, {\n type: QueryTypes.SELECT,\n raw: true,\n replacements: [...replacements]\n });\n return result;\n }\n\n public async create(\n table: string,\n data: Record<string, string | number | boolean | Date | Object>\n ) {\n const { query, replacements } = generateCreateQuery(table, data);\n\n const res: any = await config.db.query(query, {\n type: QueryTypes.INSERT,\n raw: true,\n replacements: [...replacements]\n });\n\n // inserted ids\n return res[0] as { id: string | number }[];\n }\n\n public async update(table: string, data: UpdateOpParam, filter?: Filter) {\n const { query, replacements } = generateUpdateQuery(table, data, filter);\n\n const result = await config.db.query(query, {\n type: QueryTypes.SELECT,\n raw: true,\n replacements: [...replacements]\n });\n return result;\n }\n\n public async delete(table: string, filter?: Filter) {\n const { query, replacements } = generateDeleteQuery(table, filter);\n\n await config.db.query(query, {\n type: QueryTypes.DELETE,\n raw: true,\n replacements: [...replacements]\n });\n }\n\n public async upsert(\n table: string,\n data: UpdateOpParam,\n conflictTarget: string[],\n doNothingOnConflict = false\n ) {\n const { query, replacements } = generateUpsertQuery(\n table,\n data,\n conflictTarget,\n doNothingOnConflict\n );\n\n const result = await config.db.query(query, {\n type: QueryTypes.SELECT,\n raw: true,\n replacements: [...replacements]\n });\n\n return result;\n }\n}\n","import { Knex } from 'knex';\nimport { Filter, FilterParam, UpdateOpParam, Join } from '../shared/interface';\nimport { getKnex } from './db';\n\nexport const NESTED_DELIMITER = '__hj__';\n\nexport const nestResults = (\n results: Record<string, any>[],\n joins: Join[] = []\n) => {\n if (!joins.length || !results.length) return results;\n\n const nestedResults: any[] = [];\n const mainTableFields = Object.keys(results[0]).filter(\n (key) => !key.includes(NESTED_DELIMITER)\n );\n\n const groups = new Map<string, any>();\n\n results.forEach((row) => {\n // Generate a unique key for the main record based on non-nested fields\n const key = mainTableFields.map((f) => row[f]).join('|');\n\n if (!groups.has(key)) {\n const mainRecord: any = {};\n mainTableFields.forEach((f) => {\n mainRecord[f] = row[f];\n });\n\n // Initialize nested arrays for each join\n joins.forEach((join) => {\n const joinKey = join.alias || join.table;\n mainRecord[joinKey] = [];\n });\n\n groups.set(key, mainRecord);\n nestedResults.push(mainRecord);\n }\n\n const mainRecord = groups.get(key);\n\n joins.forEach((join) => {\n const joinKey = join.alias || join.table;\n const nestedObject: any = {};\n let hasValue = false;\n\n Object.keys(row).forEach((k) => {\n if (k.startsWith(`${joinKey}${NESTED_DELIMITER}`)) {\n const fieldName = k.split(NESTED_DELIMITER)[1];\n nestedObject[fieldName] = row[k];\n if (row[k] !== null) hasValue = true;\n }\n });\n\n if (hasValue) {\n // Check if this specific nested object already exists in the array\n const alreadyExists = mainRecord[joinKey].some((item: any) => {\n return Object.keys(nestedObject).every(\n (k) => item[k] === nestedObject[k]\n );\n });\n\n if (!alreadyExists) {\n mainRecord[joinKey].push(nestedObject);\n }\n }\n });\n });\n\n return nestedResults;\n};\n\nexport const applyFilter = (query: Knex.QueryBuilder, filter: Filter = {}) => {\n Object.entries(filter).forEach(([field, data]) => {\n if (field === '$or') {\n query.where((builder) => {\n Object.entries(data).forEach(([orField, orData], index) => {\n const method = index === 0 ? 'where' : 'orWhere';\n const orParam = orData as FilterParam;\n\n if (['like', 'not like'].includes(orParam.operator)) {\n builder[method](orField, 'ilike', `%${orParam.value}%`);\n } else {\n builder[method](orField, orParam.operator, orParam.value);\n }\n });\n });\n } else {\n const param = data as FilterParam;\n\n if (['like', 'not like'].includes(param.operator)) {\n query.where(\n field,\n param.operator === 'like' ? 'ilike' : 'not ilike',\n `%${param.value}%`\n );\n } else {\n query.where(field, param.operator, param.value);\n }\n }\n });\n\n return query;\n};\n\nexport const generateCreateQuery = (\n table: string,\n data: Record<string, string | number | boolean | Date | Object>\n) => {\n const knex = getKnex();\n const { sql: query, bindings: replacements } = knex(table)\n .insert(data)\n .returning('id')\n .toSQL();\n\n return { query, replacements };\n};\n\nexport const generateReadQuery = (\n table: string,\n fields: string[],\n filter?: Filter,\n paginate?: { page: number; limit: number },\n format?: { sort: 'ASC' | 'DESC'; sortField: string },\n joins?: Join[]\n) => {\n const knex = getKnex();\n\n // Handle field aliasing for joins\n const formattedFields = fields.map((field) => {\n if (field.includes('.')) {\n const [tableName, fieldName] = field.split('.');\n // Check if the table is part of a join\n const join = joins?.find(\n (j) => j.table === tableName || j.alias === tableName\n );\n if (join) {\n return `${field} as ${tableName}${NESTED_DELIMITER}${fieldName}`;\n }\n }\n return field;\n });\n\n let q = knex(table).select(formattedFields);\n\n // Add total count if pagination is needed\n if (paginate) {\n // Using knex.raw to create the count column with the same name as in original code\n q = knex(table).select([\n ...formattedFields.map((field) => {\n const [actualField, alias] = field.split(' as ');\n return alias\n ? knex.raw(`?? as ??`, [actualField, alias])\n : knex.raw(`?? as ??`, [field, field]);\n }),\n knex.raw('count(??) OVER() AS honey_total_count', [formattedFields[0]])\n ]);\n }\n\n // Apply joins\n if (joins && joins.length > 0) {\n joins.forEach((join) => {\n const joinTable = join.alias\n ? `${join.table} as ${join.alias}`\n : join.table;\n const joinType = join.type || 'inner';\n const operator = join.on.operator || '=';\n\n switch (joinType) {\n case 'left':\n q.leftJoin(joinTable, join.on.left, operator, join.on.right);\n break;\n case 'right':\n q.rightJoin(joinTable, join.on.left, operator, join.on.right);\n break;\n case 'full':\n q.fullOuterJoin(joinTable, join.on.left, operator, join.on.right);\n break;\n case 'cross':\n q.crossJoin(\n join.alias\n ? knex.raw('?? as ??', [join.table, join.alias])\n : knex.raw('??', [join.table])\n );\n break;\n case 'inner':\n default:\n q.innerJoin(joinTable, join.on.left, operator, join.on.right);\n break;\n }\n });\n }\n\n // Apply filters\n if (filter) {\n q = applyFilter(q, filter);\n }\n\n // Apply sorting\n if (format?.sort && format.sortField) {\n q.orderBy(format.sortField, format.sort);\n }\n\n // Apply pagination\n if (paginate) {\n q.limit(paginate.limit).offset(paginate.limit * (paginate.page - 1));\n }\n\n const { sql: query, bindings: replacements } = q.toSQL();\n\n return { query, replacements };\n};\nexport const generateUpdateQuery = (\n table: string,\n data: UpdateOpParam,\n filter?: Filter\n) => {\n const knex = getKnex();\n let q = knex(table);\n\n // Build the update object\n const updateData: Record<string, Knex.Raw> = {};\n\n Object.entries(data).forEach(([field, fieldData]) => {\n const param = fieldData as any;\n\n if (param.operator === 'inc') {\n updateData[field] = knex.raw('?? + ?', [field, param.value]);\n } else if (param.operator === 'dec') {\n updateData[field] = knex.raw('?? - ?', [field, param.value]);\n } else {\n updateData[field] = param.value;\n }\n });\n\n // Apply filter conditions\n if (filter) {\n q = applyFilter(q, filter);\n }\n\n const { sql: query, bindings: replacements } = q\n .update(updateData)\n .returning('*')\n .toSQL();\n console.log(query, replacements);\n return { query, replacements };\n};\nexport const generateDeleteQuery = (table: string, filter?: Filter) => {\n const knex = getKnex();\n let q = knex(table);\n\n if (filter) {\n q = applyFilter(q, filter);\n }\n\n const { sql: query, bindings: replacements } = q.delete().toSQL();\n return { query, replacements };\n};\n\nexport const generateUpsertQuery = (\n table: string,\n data: UpdateOpParam,\n conflictTarget: string[],\n doNothingOnConflict = false\n) => {\n const knex = getKnex();\n\n // Prepare insert data\n const insertData: Record<string, UpdateOpParam[string]['value']> = {};\n Object.entries(data).forEach(([field, fieldData]) => {\n insertData[field] = fieldData.value;\n });\n\n // Prepare update data for conflict resolution\n const updateData: Record<string, Knex.Raw | UpdateOpParam[string]['value']> =\n {};\n\n if (doNothingOnConflict) {\n // Dummy update to force returning the row\n // We update the first conflict target column to itself\n const conflictField = conflictTarget[0];\n updateData[conflictField] = knex.raw('??', [`${table}.${conflictField}`]);\n } else {\n Object.entries(data).forEach(([field, fieldData]) => {\n const param = fieldData;\n\n if (param.operator === 'inc') {\n updateData[field] = knex.raw('?? + ?', [\n `${table}.${field}`,\n param.value\n ]);\n } else if (param.operator === 'dec') {\n updateData[field] = knex.raw('?? - ?', [\n `${table}.${field}`,\n param.value\n ]);\n } else {\n updateData[field] = param.value;\n }\n });\n }\n\n const { sql: query, bindings: replacements } = knex(table)\n .insert(insertData)\n .onConflict(conflictTarget)\n .merge(updateData)\n .returning(['*', knex.raw('(xmax = 0) as is_insert')])\n .toSQL();\n\n return { query, replacements };\n};\n","export function normalizePort(val: string) {\n const port = parseInt(val, 10);\n\n if (isNaN(port)) {\n // named pipe\n return val;\n }\n\n if (port >= 0) {\n // port number\n return port;\n }\n\n throw new Error('Invalid port number');\n}\n","import { ObjectSchema, ValidationOptions } from 'joi';\nimport { Middleware } from 'src/interfaces/express';\nimport HttpError, { handleHttpError } from './error';\n\nexport const validateRequestData =\n (\n schema: ObjectSchema,\n location: 'body' | 'params' | 'query' | 'headers' | 'cookies' = 'body',\n options: ValidationOptions = { allowUnknown: true }\n ): Middleware =>\n async (req, res, next) => {\n try {\n const validationResult = schema.validate(req[location], options);\n const validationError = validationResult.error?.message;\n if (validationError) {\n throw new HttpError(validationError, 422);\n }\n\n return next();\n } catch (error: any) {\n handleHttpError(error, res);\n }\n };\n\nexport default validateRequestData;\n","import { Request } from 'express';\n\nexport const createReqTransit = <T>(key: string) => {\n const inject = (req: Request, value: T) => {\n req._honeyTransit = { ...req._honeyTransit, [key]: value };\n };\n\n const extract = (req: Request, defaultValue?: T): T => {\n return req._honeyTransit?.[key] ?? defaultValue!;\n };\n\n return { inject, extract };\n};\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../"}
package/dist/module.js CHANGED
@@ -273,7 +273,7 @@ function $e54b5bd1ebc8718c$export$2e2bcd8739ae039({ db: db, resource: resource,
273
273
 
274
274
 
275
275
 
276
- function $68f7d8a50ef9b68c$export$7b6dde2038c44e91({ db: db, resource: resource, fields: fields, idField: idField = 'id', processResponseData: processResponseData, processErrorResponse: processErrorResponse, filterQuery: filterQuery = {}, joins: joins }) {
276
+ function $68f7d8a50ef9b68c$export$7b6dde2038c44e91({ db: db, resource: resource, fields: fields, idField: idField = 'id', processResponseData: processResponseData, processErrorResponse: processErrorResponse, filterQuery: filterQuery = {}, joins: joins, shouldErrorOnNotFound: shouldErrorOnNotFound }) {
277
277
  return async function(req, res, next) {
278
278
  try {
279
279
  const id = req.params.id;
@@ -285,7 +285,7 @@ function $68f7d8a50ef9b68c$export$7b6dde2038c44e91({ db: db, resource: resource,
285
285
  },
286
286
  ...filter
287
287
  }, undefined, undefined, joins);
288
- if (!data?.length) throw new (0, $eb799189062d1297$export$2e2bcd8739ae039)('Record does not exist', 404);
288
+ if (!data?.length && shouldErrorOnNotFound) throw new (0, $eb799189062d1297$export$2e2bcd8739ae039)('Record does not exist', 404);
289
289
  data = processResponseData ? await processResponseData(data[0], req) : data[0];
290
290
  res.send({
291
291
  data: data
@@ -303,7 +303,7 @@ function $68f7d8a50ef9b68c$export$7b6dde2038c44e91({ db: db, resource: resource,
303
303
  }
304
304
  };
305
305
  }
306
- function $68f7d8a50ef9b68c$export$7b48d281d65870ad({ db: db, resource: resource, fields: fields, filterQuery: filterQuery, format: format, processResponseData: processResponseData, processErrorResponse: processErrorResponse, joins: joins }) {
306
+ function $68f7d8a50ef9b68c$export$7b48d281d65870ad({ db: db, resource: resource, fields: fields, filterQuery: filterQuery, format: format, processResponseData: processResponseData, processErrorResponse: processErrorResponse, joins: joins, shouldErrorOnNotFound: shouldErrorOnNotFound }) {
307
307
  return async function(req, res, next) {
308
308
  try {
309
309
  const page = Number(req.query.page);
@@ -323,7 +323,7 @@ function $68f7d8a50ef9b68c$export$7b48d281d65870ad({ db: db, resource: resource,
323
323
  });
324
324
  }
325
325
  if (processResponseData) data = await processResponseData(data, req);
326
- else if (!data?.length) throw new (0, $eb799189062d1297$export$2e2bcd8739ae039)('No records found', 404);
326
+ else if (!data?.length && shouldErrorOnNotFound) throw new (0, $eb799189062d1297$export$2e2bcd8739ae039)('No records found', 404);
327
327
  const response = {
328
328
  data: data,
329
329
  meta: {
@@ -658,7 +658,7 @@ class $c492fd1e48c9c1cf$export$2e2bcd8739ae039 {
658
658
  exitMiddleware: exitMiddleware
659
659
  });
660
660
  }
661
- get({ resource: resource, fields: fields, filter: filter, format: format, middleware: middleware, pathOverride: pathOverride, exitMiddleware: exitMiddleware, methodOverride: methodOverride, processResponseData: processResponseData, processErrorResponse: processErrorResponse, table: table, joins: joins }) {
661
+ get({ resource: resource, fields: fields, filter: filter, format: format, middleware: middleware, pathOverride: pathOverride, exitMiddleware: exitMiddleware, methodOverride: methodOverride, processResponseData: processResponseData, processErrorResponse: processErrorResponse, table: table, joins: joins, shouldErrorOnNotFound: shouldErrorOnNotFound = true }) {
662
662
  const path = pathOverride || `/${resource}`;
663
663
  resource = table || resource;
664
664
  const controller = (0, $68f7d8a50ef9b68c$export$7b48d281d65870ad)({
@@ -669,7 +669,8 @@ class $c492fd1e48c9c1cf$export$2e2bcd8739ae039 {
669
669
  format: format,
670
670
  processResponseData: processResponseData,
671
671
  processErrorResponse: processErrorResponse,
672
- joins: joins
672
+ joins: joins,
673
+ shouldErrorOnNotFound: shouldErrorOnNotFound
673
674
  });
674
675
  this.crud({
675
676
  method: methodOverride || 'get',
@@ -679,7 +680,7 @@ class $c492fd1e48c9c1cf$export$2e2bcd8739ae039 {
679
680
  exitMiddleware: exitMiddleware
680
681
  });
681
682
  }
682
- getById({ resource: resource, fields: fields, idField: idField, middleware: middleware, pathOverride: pathOverride, exitMiddleware: exitMiddleware, methodOverride: methodOverride, processResponseData: processResponseData, processErrorResponse: processErrorResponse, table: table, filter: filter, joins: joins }) {
683
+ getById({ resource: resource, fields: fields, idField: idField, middleware: middleware, pathOverride: pathOverride, exitMiddleware: exitMiddleware, methodOverride: methodOverride, processResponseData: processResponseData, processErrorResponse: processErrorResponse, table: table, filter: filter, joins: joins, shouldErrorOnNotFound: shouldErrorOnNotFound = true }) {
683
684
  const path = pathOverride || `/${resource}/:id`;
684
685
  resource = table || resource;
685
686
  const controller = (0, $68f7d8a50ef9b68c$export$7b6dde2038c44e91)({
@@ -690,7 +691,8 @@ class $c492fd1e48c9c1cf$export$2e2bcd8739ae039 {
690
691
  processResponseData: processResponseData,
691
692
  processErrorResponse: processErrorResponse,
692
693
  filterQuery: filter,
693
- joins: joins
694
+ joins: joins,
695
+ shouldErrorOnNotFound: shouldErrorOnNotFound
694
696
  });
695
697
  this.crud({
696
698
  method: methodOverride || 'get',
@@ -1 +1 @@
1
- {"mappings":"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","sources":["src/index.ts","src/config/index.ts","src/config/database.ts","src/services/express.ts","src/utils/error.ts","src/services/honey.ts","src/controllers/index.ts","src/controllers/interfaces.ts","src/controllers/create.ts","src/utils/formatter.ts","src/controllers/read.ts","src/controllers/update.ts","src/controllers/upsert.ts","src/controllers/delete.ts","src/controllers/query.ts","src/utils/db.ts","src/utils/helpers.ts","src/services/postgres.ts","src/utils/postgres.ts","src/utils/port.ts","src/utils/validation.ts","src/utils/transit.ts"],"sourcesContent":["import { QueryTypes as QTypes } from 'sequelize';\n\nimport Config from './config';\nimport { DBOptions } from './config/database';\nimport ExpressApp from './services/express';\nimport Honey from './services/honey';\nimport Postgres from './services/postgres';\nimport { normalizePort } from './utils/port';\nimport { Metadata } from './interfaces/express';\n\nprocess.on('SIGINT', () => {\n // process reload ongoing\n // close connections, clear cache, etc\n // by default, you have 1600ms\n process.exit(0);\n});\n\nexport function createHoney(\n port: string,\n dbOptions: string | DBOptions,\n metadata?: Metadata\n) {\n new Config(dbOptions);\n\n const portVal = normalizePort(port || process.env.PORT || '3000');\n const express = new ExpressApp(portVal, metadata);\n const postgres = new Postgres();\n const honey = new Honey(express, postgres);\n\n return honey;\n}\n\nexport const defineModel = Config.defineModel.bind(Config);\n\nfunction getQueryTypes() {\n const { SELECT, INSERT, UPDATE, DELETE, RAW, UPSERT } = QTypes;\n\n const exposedTypes = { SELECT, INSERT, UPDATE, DELETE, RAW, UPSERT };\n return exposedTypes;\n}\n\nconst QueryTypes = getQueryTypes();\n\nexport { QueryTypes };\nexport { default as runDbQuery, createModel } from './utils/db';\nexport { default as HttpError, handleHttpError } from './utils/error';\nexport { default as Honey } from './services/honey';\nexport type {\n Middleware,\n ExitMiddleware,\n Request,\n Response\n} from './interfaces/express';\nexport * from 'sequelize';\nexport { Knex } from 'knex';\nexport { validateRequestData } from './utils/validation';\nexport { createReqTransit } from './utils/transit';\n","import path from 'path';\nimport dotenv from 'dotenv';\n\nimport initDB, { DBOptions } from './database';\nimport {\n Model,\n ModelAttributes,\n ModelOptions,\n Sequelize\n} from 'sequelize/types';\ndotenv.config();\ndotenv.config({ path: path.join(__dirname, '.env') });\n\nexport default class Config {\n public static db: Sequelize;\n\n public static getEnv = (key: string) => {\n return process.env[key];\n };\n\n constructor(options: DBOptions | string) {\n Config.db = initDB(options);\n }\n\n static get isLive() {\n return process.env.NODE_ENV === 'production';\n }\n\n public static defineModel(\n modelName: string,\n attributes: ModelAttributes<Model<any, any>, any>,\n options?: ModelOptions<Model<any, any>> | undefined\n ) {\n return this.db.define(modelName, attributes, options);\n }\n}\n","import { Sequelize } from 'sequelize';\n\nexport interface DBOptions {\n host: string;\n port: number | string;\n user: string;\n password: string;\n database: string;\n}\n\nexport default function initDB(options: string | DBOptions) {\n let uri = '';\n if (typeof options === 'string') {\n uri = options;\n } else {\n uri = `postgres://${options.user}:${options.password}@${options.host}:${options.port}/${options.database}`;\n }\n const sequelize = new Sequelize(uri, {\n logging: false\n });\n\n sequelize\n .authenticate()\n .then(() => {\n console.log('DB Connection established successfully');\n })\n .catch((err) => {\n console.log('DB Connection failed');\n console.error(err);\n });\n\n return sequelize;\n}\n","import cookieParser from 'cookie-parser';\nimport express from 'express';\nimport logger from 'morgan';\nimport cors from 'cors';\nimport http from 'http';\nimport expressOasGenerator from 'express-oas-generator';\nimport '../config';\nimport HttpError from '../utils/error';\nimport { AddressInfo } from 'net';\nimport { Metadata } from '../interfaces/express';\n\n/**\n * Event listener for HTTP server \"error\" event.\n */\nconst onError = (port: string | number) => {\n return (error: any) => {\n if (error.syscall !== 'listen') {\n throw error;\n }\n\n const bind = typeof port === 'string' ? `Pipe ${port}` : `Port ${port}`;\n\n // handle specific listen errors with friendly messages\n switch (error.code) {\n case 'EACCES':\n console.error(`${bind} requires elevated privileges`);\n process.exit(1);\n case 'EADDRINUSE':\n console.error(`${bind} is already in use`);\n process.exit(1);\n default:\n throw error;\n }\n };\n};\n\n/**\n * Event listener for HTTP server \"listening\" event.\n */\nconst onListening = (server: http.Server) => {\n return () => {\n const addr = server.address();\n const bind =\n typeof addr === 'string'\n ? `pipe ${addr}`\n : `port ${(addr as AddressInfo).port}`;\n console.log(\n `%c Honey Server started on ${bind} `,\n 'background: #222; color: #bada55; font-size: 32px'\n );\n };\n};\n\nclass ExpressApp {\n public app = express();\n public appRoutes = express.Router();\n private fallbackErrMessage = 'Endpoint does not exist';\n private routePrefix = '/api';\n\n constructor(\n port: string | number,\n private metadata?: Metadata\n ) {\n this.fallbackErrMessage =\n this.metadata?.fallbackErrorMessage || this.fallbackErrMessage;\n this.routePrefix = this.metadata?.routePrefix || this.routePrefix;\n this.initMiddlewares();\n this.setupErrorFallback();\n this.app.set('port', port);\n }\n\n public listen() {\n expressOasGenerator.handleRequests();\n const port = Number(this.app.get('port'));\n const server = this.app.listen(port);\n server.on('error', onError(port));\n server.on('listening', onListening(server));\n }\n\n private initMiddlewares() {\n const corsOptions: cors.CorsOptions = {\n origin: '*',\n methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',\n allowedHeaders: '*',\n exposedHeaders: '*',\n credentials: true,\n optionsSuccessStatus: 204\n };\n\n expressOasGenerator.handleResponses(this.app, {} as any);\n this.app.use(logger('dev'));\n this.app.use(cors(corsOptions));\n this.app.use(\n express.json({\n limit: '50mb',\n verify(req: any, _res, buf) {\n req.rawBody = buf;\n }\n })\n );\n this.app.use(express.urlencoded({ limit: '50mb', extended: false }));\n this.app.use(cookieParser());\n this.app.use(this.routePrefix, this.appRoutes);\n }\n\n private setupErrorFallback() {\n this.app.use((_, res) => {\n const err = new HttpError(this.fallbackErrMessage, 404);\n\n return res.status(err.status).json({ message: err.message });\n });\n // error handler\n this.app.use((err: any, _, res: any) => {\n return res\n .status(err.status || 500)\n .send({ message: 'Something went wrong' });\n });\n }\n}\n\nexport default ExpressApp;\n","import { Response } from 'express';\n\nexport default class HttpError extends Error {\n constructor(\n message: string,\n public status: number\n ) {\n super(message || 'Something went wrong');\n }\n}\n\nexport const handleHttpError = (err: HttpError, res: Response) => {\n return res\n .status(err.status || 500)\n .send({ message: err.message || 'Something went wrong' });\n};\n","import Config from '../config';\nimport {\n createController,\n deleteByIdController,\n getByIdController,\n getByQueryController,\n updateByIdController,\n upsertByIdController,\n upsertController,\n updateController,\n deleteController,\n queryController\n} from '../controllers';\nimport {\n ICreate,\n ICrud,\n IDelete,\n IDeleteById,\n IGet,\n IGetById,\n IUpdate,\n IUpdateById,\n IUpsert,\n IUpsertById,\n IQuery\n} from '../interfaces/crud';\nimport { ExitMiddleware, Middleware } from '../interfaces/express';\nimport { NextFunction, Request, Response } from 'express';\nimport ExpressApp from './express';\nimport Postgres from './postgres';\n\n// eslint-disable-next-line\nconst defaultExitMiddleware: ExitMiddleware = (data, req, res, next) => {\n if (process.env.NODE_ENV !== 'production') console.log('Response:', data);\n};\n\nexport default class Honey {\n constructor(\n public express: ExpressApp,\n private postgres: Postgres\n ) {}\n\n get routes() {\n return this.express.appRoutes;\n }\n\n get db() {\n return Config.db;\n }\n\n private crud({\n method,\n path,\n controller,\n middleware = [],\n exitMiddleware = [defaultExitMiddleware]\n }: ICrud) {\n const dbCheck = async (req: Request, res: Response, next: NextFunction) => {\n if (!Config.db) {\n return res.status(503).send({\n message: 'DB Initialization in progress'\n });\n } else {\n next();\n }\n };\n this.express.appRoutes[method](\n path,\n dbCheck,\n ...middleware,\n controller,\n ...exitMiddleware\n );\n }\n\n public addMiddleware(middleware: Middleware[]) {\n this.express.appRoutes.use(...middleware);\n }\n\n public startServer() {\n this.express.listen();\n }\n\n public create({\n resource,\n params,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n processResponseData,\n processErrorResponse,\n table,\n methodOverride\n }: ICreate) {\n const path = pathOverride || `/${resource}`;\n resource = table || resource;\n\n const controller = createController({\n db: this.postgres,\n resource,\n params,\n message,\n processResponseData,\n processErrorResponse\n });\n\n this.crud({\n method: methodOverride || 'post',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public get({\n resource,\n fields,\n filter,\n format,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n processResponseData,\n processErrorResponse,\n table,\n joins\n }: IGet) {\n const path = pathOverride || `/${resource}`;\n resource = table || resource;\n\n const controller = getByQueryController({\n db: this.postgres,\n resource,\n fields,\n filterQuery: filter,\n format,\n processResponseData,\n processErrorResponse,\n joins\n });\n this.crud({\n method: methodOverride || 'get',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public getById({\n resource,\n fields,\n idField,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n processResponseData,\n processErrorResponse,\n table,\n filter,\n joins\n }: IGetById) {\n const path = pathOverride || `/${resource}/:id`;\n resource = table || resource;\n\n const controller = getByIdController({\n db: this.postgres,\n resource,\n fields,\n idField: idField || 'id',\n processResponseData,\n processErrorResponse,\n filterQuery: filter,\n joins\n });\n\n this.crud({\n method: methodOverride || 'get',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public updateById({\n resource,\n params,\n idField,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n table,\n filter,\n processErrorResponse,\n processResponseData\n }: IUpdateById) {\n const path = pathOverride || `/${resource}/:id`;\n resource = table || resource;\n\n const controller = updateByIdController({\n db: this.postgres,\n resource,\n params,\n message,\n idField,\n filterQuery: filter,\n processErrorResponse,\n processResponseData\n });\n this.crud({\n method: methodOverride || 'put',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public update({\n resource,\n params,\n filter,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n table,\n processErrorResponse,\n processResponseData\n }: IUpdate) {\n const path = pathOverride || `/${resource}`;\n resource = table || resource;\n\n const controller = updateController({\n db: this.postgres,\n resource,\n params,\n message,\n filterQuery: filter,\n processErrorResponse,\n processResponseData\n });\n this.crud({\n method: methodOverride || 'put',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public upsertById({\n resource,\n params,\n idField,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n table,\n processErrorResponse,\n processResponseData,\n doNothingOnConflict\n }: IUpsertById) {\n const path = pathOverride || `/${resource}/:id`;\n resource = table || resource;\n\n const controller = upsertByIdController({\n db: this.postgres,\n resource,\n params,\n message,\n idField,\n processErrorResponse,\n processResponseData,\n doNothingOnConflict\n });\n this.crud({\n method: methodOverride || 'put',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public upsert({\n resource,\n params,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n conflictTarget,\n table,\n processErrorResponse,\n processResponseData,\n doNothingOnConflict\n }: IUpsert) {\n const path = pathOverride || `/${resource}`;\n resource = table || resource;\n\n const controller = upsertController({\n db: this.postgres,\n resource,\n params,\n message,\n conflictTarget,\n processErrorResponse,\n processResponseData,\n doNothingOnConflict\n });\n this.crud({\n method: methodOverride || 'put',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public deleteById({\n resource,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n idField,\n filter,\n table,\n processErrorResponse\n }: IDeleteById) {\n const path = pathOverride || `/${resource}/:id`;\n resource = table || resource;\n\n const controller = deleteByIdController({\n db: this.postgres,\n resource,\n message,\n idField,\n filterQuery: filter,\n processErrorResponse\n });\n this.crud({\n method: methodOverride || 'delete',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public delete({\n resource,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n filter,\n table,\n processErrorResponse\n }: IDelete) {\n const path = pathOverride || `/${resource}/:id`;\n resource = table || resource;\n\n const controller = deleteController({\n db: this.postgres,\n resource,\n message,\n filterQuery: filter,\n processErrorResponse\n });\n this.crud({\n method: methodOverride || 'delete',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public query({\n resource,\n query,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n processErrorResponse,\n processResponseData\n }: IQuery) {\n const path = pathOverride || `/${resource}`;\n\n const controller = queryController({\n db: this.postgres,\n query,\n processErrorResponse,\n processResponseData\n });\n this.crud({\n method: methodOverride || 'get',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n}\n","export { Controller } from './interfaces';\nexport { default as createController } from './create';\nexport { getByIdController, getByQueryController } from './read';\nexport { updateByIdController, updateController } from './update';\nexport { upsertByIdController, upsertController } from './upsert';\nexport { deleteByIdController, deleteController } from './delete';\nexport * from './query';\n","import { NextFunction, Request, Response } from 'express';\n\nexport type Controller = (\n req: Request,\n res: Response,\n next: NextFunction\n) => void;\n","import { CreateControllerParams } from '../interfaces/crud';\nimport HttpError, { handleHttpError } from '../utils/error';\nimport { extractInsertData } from '../utils/formatter';\nimport { NextFunction, Request, Response } from 'express';\nimport { Controller } from './interfaces';\n\nexport default function createController({\n db,\n resource,\n params,\n message,\n processResponseData,\n processErrorResponse\n}: CreateControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const body = extractInsertData(req.body, params);\n\n let data = await db.create(resource, body);\n const id = data[0].id;\n\n data =\n req.body.dataOverride ||\n (processResponseData ? await processResponseData({ id }, req) : { id });\n\n res.send({\n message,\n data\n });\n next({ message, data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n","import { Request } from 'express';\nimport { ICreate, IUpdateById } from '../interfaces/crud';\nimport {\n Filter,\n FilterLocation,\n FilterOps,\n FilterParam,\n GetFilterParam,\n GetQueryFilter,\n UpdateOpParam\n} from '../shared/interface';\n\nconst formatters: Record<string, Function> = {\n string: String,\n number: Number,\n boolean: Boolean,\n json: JSON.stringify,\n // Required for updating JSON fields\n object: JSON.stringify,\n csv: (value: string) => value.split(','),\n 'as-is': (value: any) => value\n};\n\nexport const extractInsertData = (\n body: Record<string, any>,\n params: ICreate['params']\n) => {\n const result: Record<string, string | number | boolean | Date | Object> = {};\n\n Object.entries(params).forEach(([key, value]) => {\n if (value === '@updatedAt') {\n result[key] = new Date();\n return;\n }\n\n if (!Object.keys(body).includes(key)) return;\n\n const formatter = formatters[value];\n result[key] =\n formatter && ![null, undefined].includes(body[key])\n ? formatter(body[key])\n : body[key];\n });\n\n return result;\n};\n\nexport const generateUpdateData = (\n body: Record<string, any>,\n params: IUpdateById['params']\n) => {\n const result = Object.entries(params).reduce((acc, [key, value]) => {\n if (!Object.keys(body).includes(key) && value !== '@updatedAt')\n return { ...acc };\n\n let formattedValue: any;\n if (value === '@updatedAt') {\n formattedValue = new Date();\n } else {\n formattedValue = ![null, undefined].includes(body[key])\n ? formatters[typeof body[key]](body[key])\n : body[key];\n }\n\n return {\n ...acc,\n [key]: {\n value: formattedValue,\n operator: value === '@updatedAt' ? 'replace' : value\n }\n };\n }, {} as UpdateOpParam);\n\n return result;\n};\n\nconst retrieveParamFromLocation = (\n req: Request,\n location: FilterLocation,\n key: string\n) => {\n if (location === 'request') return (req as any)[key];\n\n return req[location][key];\n};\n\nexport const formatReadFilter = (\n filterParams: Record<string, any>,\n filter: GetQueryFilter,\n req: Request\n) => {\n const result: Filter = {};\n\n for (const [key, param] of Object.entries(filter)) {\n if (key === '$or') {\n const val = formatReadFilter(\n filterParams,\n param as Record<string, GetFilterParam>,\n req\n ) as Record<string, FilterParam>;\n\n result[key] = val;\n } else {\n let valueToUse: any;\n if (param.overrideValue) {\n if (typeof param.overrideValue === 'function') {\n valueToUse = param.overrideValue(req);\n } else {\n valueToUse = param.overrideValue;\n }\n } else if (!!param.location) {\n valueToUse = retrieveParamFromLocation(\n req,\n param.location as FilterLocation,\n key\n );\n } else {\n valueToUse = filterParams[key];\n }\n\n if (typeof valueToUse === 'undefined') {\n continue;\n }\n\n const valueFormatter = formatters[(param as GetFilterParam).value];\n result[key] = {\n operator: param.operator as FilterOps,\n value: valueFormatter(valueToUse)\n };\n }\n }\n\n return result;\n};\n","import {\n GetByIdControllerParams,\n GetByQueryControllerParams\n} from '../interfaces/crud';\nimport HttpError, { handleHttpError } from '../utils/error';\nimport { formatReadFilter } from '../utils/formatter';\nimport { NextFunction, Request, Response } from 'express';\nimport { Controller } from './interfaces';\n\nexport function getByIdController({\n db,\n resource,\n fields,\n idField = 'id',\n processResponseData,\n processErrorResponse,\n filterQuery = {},\n joins\n}: GetByIdControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const id = req.params.id;\n\n const filter = formatReadFilter(req.query, filterQuery, req);\n\n let data = await db.read(\n resource,\n fields,\n {\n [idField]: {\n value: id,\n operator: '='\n },\n ...filter\n },\n undefined,\n undefined,\n joins\n );\n\n if (!data?.length) {\n throw new HttpError('Record does not exist', 404);\n }\n\n data = processResponseData\n ? await processResponseData(data[0], req)\n : data[0];\n\n res.send({\n data\n });\n next({ data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n\nexport function getByQueryController({\n db,\n resource,\n fields,\n filterQuery,\n format,\n processResponseData,\n processErrorResponse,\n joins\n}: GetByQueryControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const page = Number(req.query.page);\n const limit = Number(req.query.limit);\n const paginate =\n limit || page ? { page: page || 1, limit: limit || 10 } : undefined;\n\n const filter =\n filterQuery && formatReadFilter(req.query, filterQuery, req);\n\n let data: Record<string, any>[] = await db.read(\n resource,\n fields,\n filter,\n paginate,\n format,\n joins\n );\n let total = 0;\n if (paginate) {\n total = Number(data[0]?.['honey_total_count'] || 0);\n data = data.map((item: Record<string, any>) => {\n delete item['honey_total_count'];\n return item;\n });\n }\n\n if (processResponseData) {\n data = await processResponseData(data, req);\n } else if (!data?.length) {\n throw new HttpError('No records found', 404);\n }\n const response = {\n data,\n meta: {\n ...(!!paginate && {\n pagination: {\n total,\n pageSize: limit,\n page,\n pageCount: Math.ceil(total / limit)\n }\n })\n }\n };\n res.send(response);\n next(response);\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n","import {\n UpdateByIdControllerParams,\n UpdateControllerParams\n} from '../interfaces/crud';\nimport { Filter } from '../shared/interface';\nimport HttpError, { handleHttpError } from '../utils/error';\nimport { formatReadFilter, generateUpdateData } from '../utils/formatter';\nimport { NextFunction, Request, Response } from 'express';\nimport { Controller } from './interfaces';\n\nexport function updateByIdController({\n db,\n resource,\n params,\n message,\n idField = 'id',\n processErrorResponse,\n processResponseData,\n filterQuery = {}\n}: UpdateByIdControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const body = generateUpdateData(req.body, params);\n const additionalFilter =\n filterQuery && formatReadFilter(req.body, filterQuery, req);\n const filter: Filter = {\n [idField]: {\n operator: '=',\n value: req.params.id\n },\n ...additionalFilter\n };\n\n const result = await db.update(resource, body, filter);\n\n const data = processResponseData\n ? await processResponseData(result, req)\n : undefined;\n\n res.send({ message, data });\n next({ message, data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n\nexport function updateController({\n db,\n resource,\n params,\n message,\n filterQuery,\n processErrorResponse,\n processResponseData\n}: UpdateControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const body = generateUpdateData(req.body, params);\n const filter =\n filterQuery && formatReadFilter(req.body, filterQuery, req);\n\n const result = await db.update(resource, body, filter);\n\n const data = processResponseData\n ? await processResponseData(result, req)\n : undefined;\n\n res.send({ message, data });\n\n next({ message, data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n","import {\n UpsertByIdControllerParams,\n UpsertControllerParams\n} from '../interfaces/crud';\nimport HttpError, { handleHttpError } from '../utils/error';\nimport { generateUpdateData } from '../utils/formatter';\nimport { NextFunction, Response } from 'express';\nimport { Request } from '../interfaces/express';\nimport { Controller } from './interfaces';\n\nexport function upsertByIdController({\n db,\n resource,\n params,\n message,\n idField = 'id',\n processErrorResponse,\n processResponseData,\n doNothingOnConflict\n}: UpsertByIdControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n req.body[idField] = req.params.id;\n params = { ...params, [idField]: 'replace' };\n const body = generateUpdateData(req.body, params);\n\n const result = await db.upsert(\n resource,\n body,\n [idField],\n doNothingOnConflict\n );\n\n if (result?.[0]) {\n req.isInsert = (result[0] as any).is_insert;\n }\n\n const data = processResponseData\n ? await processResponseData(result?.[0], req)\n : undefined;\n\n res.send({ message, data });\n\n next({ message, data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n\nexport function upsertController({\n db,\n resource,\n params,\n message,\n conflictTarget,\n processErrorResponse,\n processResponseData,\n doNothingOnConflict\n}: UpsertControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const body = generateUpdateData(req.body, params);\n\n const result = await db.upsert(\n resource,\n body,\n conflictTarget,\n doNothingOnConflict\n );\n\n if (result?.[0]) {\n req.isInsert = (result[0] as any).is_insert;\n }\n\n const data = processResponseData\n ? await processResponseData(result?.[0], req)\n : undefined;\n\n res.send({ message, data });\n\n next({ message, data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n","import {\n DeleteByIdControllerParams,\n DeleteControllerParams\n} from '../interfaces/crud';\nimport HttpError, { handleHttpError } from '../utils/error';\nimport { NextFunction, Request, Response } from 'express';\nimport { Controller } from './interfaces';\nimport { formatReadFilter } from '../utils/formatter';\n\nexport function deleteByIdController({\n db,\n resource,\n message,\n idField = 'id',\n processErrorResponse,\n filterQuery = {}\n}: DeleteByIdControllerParams): Controller {\n return async (req: Request, res: Response, next: NextFunction) => {\n try {\n const id = req.params[idField || 'id'];\n const filter =\n filterQuery && formatReadFilter(req.body, filterQuery, req);\n\n await db.delete(resource, {\n [idField]: {\n value: id,\n operator: '='\n },\n ...filter\n });\n\n res.send({ message });\n next({ message });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n\nexport function deleteController({\n db,\n resource,\n message,\n processErrorResponse,\n filterQuery\n}: DeleteControllerParams): Controller {\n return async (req: Request, res: Response, next: NextFunction) => {\n try {\n const filter =\n filterQuery && formatReadFilter(req.body, filterQuery, req);\n\n await db.delete(resource, filter);\n\n res.send({ message });\n next({ message });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n","import { NextFunction, Request, Response } from 'express';\nimport { getKnex } from '../utils/db';\nimport { QueryControllerParams } from '../interfaces/crud';\n\nexport function queryController({\n db,\n query,\n processErrorResponse,\n processResponseData\n}: QueryControllerParams) {\n return async (req: Request, res: Response, next: NextFunction) => {\n try {\n const page = Number(req.query.page);\n const limit = Number(req.query.limit);\n const paginate =\n limit || page ? { page: page || 1, limit: limit || 10 } : undefined;\n\n const knex = getKnex();\n let queryBuilder = query(knex, req);\n if (paginate) {\n queryBuilder = queryBuilder\n .limit(paginate.limit)\n .offset(paginate.limit * (paginate.page - 1));\n }\n const { sql, bindings } = queryBuilder.toSQL();\n\n const result = await db.query(sql, [...bindings]);\n\n const data = processResponseData\n ? await processResponseData(result, req)\n : result;\n\n res.send({ data });\n next({ data });\n } catch (e) {\n if (processErrorResponse) {\n return next(processErrorResponse(e as Error));\n }\n return next(e);\n }\n };\n}\n","import {\n Model,\n ModelAttributes,\n ModelOptions,\n ModelStatic,\n QueryOptions\n} from 'sequelize';\nimport Knex from 'knex';\n\nimport Config from '../config';\nimport createSingleton from './helpers';\n\nexport default function runDbQuery(query: string, params?: QueryOptions) {\n params = params || {};\n\n return Config.db.query(query, {\n ...params,\n raw: true\n });\n}\n\nclass ModelCreator {\n private static model: Record<string, ModelStatic<Model>> = {};\n\n public static createModel<\n TModelAttributes extends {} = any,\n TCreationAttributes extends {} = TModelAttributes\n >(\n modelName: string,\n attributes: ModelAttributes<Model<TModelAttributes, TCreationAttributes>>,\n options?:\n | ModelOptions<Model<TModelAttributes, TCreationAttributes>>\n | undefined\n ): ModelStatic<Model<TModelAttributes, TCreationAttributes>> {\n if (!this.model[modelName]) {\n this.model[modelName] = Config.db.define(modelName, attributes, options);\n }\n\n return this.model[modelName];\n }\n}\n\nexport function createModel<\n TModelAttributes extends {} = any,\n TCreationAttributes extends {} = TModelAttributes\n>(\n modelName: string,\n attributes: ModelAttributes<Model<TModelAttributes, TCreationAttributes>>,\n options?:\n | ModelOptions<Model<TModelAttributes, TCreationAttributes>>\n | undefined\n) {\n return ModelCreator.createModel.bind(ModelCreator)(\n modelName,\n attributes,\n options\n );\n}\n\nexport const getKnex = () =>\n createSingleton('knex', () => {\n return Knex({\n client: 'pg', // or 'mysql2', 'sqlite3', etc.\n // Do not provide connection. Also disable pool to be explicit.\n connection: undefined as any,\n pool: { min: 0, max: 0 }\n });\n });\n","export class Singleton {\n private static instances: Map<string, any> = new Map();\n\n public static getInstance<T>(identifier: string, initFn?: () => T): T {\n if (!this.instances.has(identifier) && initFn) {\n this.instances.set(identifier, initFn());\n }\n\n return this.instances.get(identifier) as T;\n }\n}\n\nexport default function createSingleton<T>(\n identifier: string,\n initFn?: () => T\n): T {\n return Singleton.getInstance(identifier, initFn);\n}\n","import config from '../config';\nimport {\n generateCreateQuery,\n generateDeleteQuery,\n generateReadQuery,\n generateUpdateQuery,\n generateUpsertQuery,\n nestResults\n} from '../utils/postgres';\nimport { QueryTypes } from 'sequelize';\nimport { Filter, UpdateOpParam, Join } from '../shared/interface';\n\nexport default class Postgres {\n public async read(\n table: string,\n fields: string[],\n filter?: Filter,\n paginate?: { page: number; limit: number },\n format?: { sort: 'ASC' | 'DESC'; sortField: string },\n joins?: Join[]\n ) {\n const { query, replacements } = generateReadQuery(\n table,\n fields,\n filter,\n paginate,\n format,\n joins\n );\n\n const result: any[] = await config.db.query(query, {\n type: QueryTypes.SELECT,\n raw: true,\n replacements: [...replacements]\n });\n\n if (joins?.length) {\n return nestResults(result, joins);\n }\n\n return result;\n }\n\n public async query(query: string, replacements: any[]) {\n const result = await config.db.query(query, {\n type: QueryTypes.SELECT,\n raw: true,\n replacements: [...replacements]\n });\n return result;\n }\n\n public async create(\n table: string,\n data: Record<string, string | number | boolean | Date | Object>\n ) {\n const { query, replacements } = generateCreateQuery(table, data);\n\n const res: any = await config.db.query(query, {\n type: QueryTypes.INSERT,\n raw: true,\n replacements: [...replacements]\n });\n\n // inserted ids\n return res[0] as { id: string | number }[];\n }\n\n public async update(table: string, data: UpdateOpParam, filter?: Filter) {\n const { query, replacements } = generateUpdateQuery(table, data, filter);\n\n const result = await config.db.query(query, {\n type: QueryTypes.SELECT,\n raw: true,\n replacements: [...replacements]\n });\n return result;\n }\n\n public async delete(table: string, filter?: Filter) {\n const { query, replacements } = generateDeleteQuery(table, filter);\n\n await config.db.query(query, {\n type: QueryTypes.DELETE,\n raw: true,\n replacements: [...replacements]\n });\n }\n\n public async upsert(\n table: string,\n data: UpdateOpParam,\n conflictTarget: string[],\n doNothingOnConflict = false\n ) {\n const { query, replacements } = generateUpsertQuery(\n table,\n data,\n conflictTarget,\n doNothingOnConflict\n );\n\n const result = await config.db.query(query, {\n type: QueryTypes.SELECT,\n raw: true,\n replacements: [...replacements]\n });\n\n return result;\n }\n}\n","import { Knex } from 'knex';\nimport { Filter, FilterParam, UpdateOpParam, Join } from '../shared/interface';\nimport { getKnex } from './db';\n\nexport const NESTED_DELIMITER = '__hj__';\n\nexport const nestResults = (\n results: Record<string, any>[],\n joins: Join[] = []\n) => {\n if (!joins.length || !results.length) return results;\n\n const nestedResults: any[] = [];\n const mainTableFields = Object.keys(results[0]).filter(\n (key) => !key.includes(NESTED_DELIMITER)\n );\n\n const groups = new Map<string, any>();\n\n results.forEach((row) => {\n // Generate a unique key for the main record based on non-nested fields\n const key = mainTableFields.map((f) => row[f]).join('|');\n\n if (!groups.has(key)) {\n const mainRecord: any = {};\n mainTableFields.forEach((f) => {\n mainRecord[f] = row[f];\n });\n\n // Initialize nested arrays for each join\n joins.forEach((join) => {\n const joinKey = join.alias || join.table;\n mainRecord[joinKey] = [];\n });\n\n groups.set(key, mainRecord);\n nestedResults.push(mainRecord);\n }\n\n const mainRecord = groups.get(key);\n\n joins.forEach((join) => {\n const joinKey = join.alias || join.table;\n const nestedObject: any = {};\n let hasValue = false;\n\n Object.keys(row).forEach((k) => {\n if (k.startsWith(`${joinKey}${NESTED_DELIMITER}`)) {\n const fieldName = k.split(NESTED_DELIMITER)[1];\n nestedObject[fieldName] = row[k];\n if (row[k] !== null) hasValue = true;\n }\n });\n\n if (hasValue) {\n // Check if this specific nested object already exists in the array\n const alreadyExists = mainRecord[joinKey].some((item: any) => {\n return Object.keys(nestedObject).every(\n (k) => item[k] === nestedObject[k]\n );\n });\n\n if (!alreadyExists) {\n mainRecord[joinKey].push(nestedObject);\n }\n }\n });\n });\n\n return nestedResults;\n};\n\nexport const applyFilter = (query: Knex.QueryBuilder, filter: Filter = {}) => {\n Object.entries(filter).forEach(([field, data]) => {\n if (field === '$or') {\n query.where((builder) => {\n Object.entries(data).forEach(([orField, orData], index) => {\n const method = index === 0 ? 'where' : 'orWhere';\n const orParam = orData as FilterParam;\n\n if (['like', 'not like'].includes(orParam.operator)) {\n builder[method](orField, 'ilike', `%${orParam.value}%`);\n } else {\n builder[method](orField, orParam.operator, orParam.value);\n }\n });\n });\n } else {\n const param = data as FilterParam;\n\n if (['like', 'not like'].includes(param.operator)) {\n query.where(\n field,\n param.operator === 'like' ? 'ilike' : 'not ilike',\n `%${param.value}%`\n );\n } else {\n query.where(field, param.operator, param.value);\n }\n }\n });\n\n return query;\n};\n\nexport const generateCreateQuery = (\n table: string,\n data: Record<string, string | number | boolean | Date | Object>\n) => {\n const knex = getKnex();\n const { sql: query, bindings: replacements } = knex(table)\n .insert(data)\n .returning('id')\n .toSQL();\n\n return { query, replacements };\n};\n\nexport const generateReadQuery = (\n table: string,\n fields: string[],\n filter?: Filter,\n paginate?: { page: number; limit: number },\n format?: { sort: 'ASC' | 'DESC'; sortField: string },\n joins?: Join[]\n) => {\n const knex = getKnex();\n\n // Handle field aliasing for joins\n const formattedFields = fields.map((field) => {\n if (field.includes('.')) {\n const [tableName, fieldName] = field.split('.');\n // Check if the table is part of a join\n const join = joins?.find(\n (j) => j.table === tableName || j.alias === tableName\n );\n if (join) {\n return `${field} as ${tableName}${NESTED_DELIMITER}${fieldName}`;\n }\n }\n return field;\n });\n\n let q = knex(table).select(formattedFields);\n\n // Add total count if pagination is needed\n if (paginate) {\n // Using knex.raw to create the count column with the same name as in original code\n q = knex(table).select([\n ...formattedFields.map((field) => {\n const [actualField, alias] = field.split(' as ');\n return alias\n ? knex.raw(`?? as ??`, [actualField, alias])\n : knex.raw(`?? as ??`, [field, field]);\n }),\n knex.raw('count(??) OVER() AS honey_total_count', [formattedFields[0]])\n ]);\n }\n\n // Apply joins\n if (joins && joins.length > 0) {\n joins.forEach((join) => {\n const joinTable = join.alias\n ? `${join.table} as ${join.alias}`\n : join.table;\n const joinType = join.type || 'inner';\n const operator = join.on.operator || '=';\n\n switch (joinType) {\n case 'left':\n q.leftJoin(joinTable, join.on.left, operator, join.on.right);\n break;\n case 'right':\n q.rightJoin(joinTable, join.on.left, operator, join.on.right);\n break;\n case 'full':\n q.fullOuterJoin(joinTable, join.on.left, operator, join.on.right);\n break;\n case 'cross':\n q.crossJoin(\n join.alias\n ? knex.raw('?? as ??', [join.table, join.alias])\n : knex.raw('??', [join.table])\n );\n break;\n case 'inner':\n default:\n q.innerJoin(joinTable, join.on.left, operator, join.on.right);\n break;\n }\n });\n }\n\n // Apply filters\n if (filter) {\n q = applyFilter(q, filter);\n }\n\n // Apply sorting\n if (format?.sort && format.sortField) {\n q.orderBy(format.sortField, format.sort);\n }\n\n // Apply pagination\n if (paginate) {\n q.limit(paginate.limit).offset(paginate.limit * (paginate.page - 1));\n }\n\n const { sql: query, bindings: replacements } = q.toSQL();\n\n return { query, replacements };\n};\nexport const generateUpdateQuery = (\n table: string,\n data: UpdateOpParam,\n filter?: Filter\n) => {\n const knex = getKnex();\n let q = knex(table);\n\n // Build the update object\n const updateData: Record<string, Knex.Raw> = {};\n\n Object.entries(data).forEach(([field, fieldData]) => {\n const param = fieldData as any;\n\n if (param.operator === 'inc') {\n updateData[field] = knex.raw('?? + ?', [field, param.value]);\n } else if (param.operator === 'dec') {\n updateData[field] = knex.raw('?? - ?', [field, param.value]);\n } else {\n updateData[field] = param.value;\n }\n });\n\n // Apply filter conditions\n if (filter) {\n q = applyFilter(q, filter);\n }\n\n const { sql: query, bindings: replacements } = q\n .update(updateData)\n .returning('*')\n .toSQL();\n console.log(query, replacements);\n return { query, replacements };\n};\nexport const generateDeleteQuery = (table: string, filter?: Filter) => {\n const knex = getKnex();\n let q = knex(table);\n\n if (filter) {\n q = applyFilter(q, filter);\n }\n\n const { sql: query, bindings: replacements } = q.delete().toSQL();\n return { query, replacements };\n};\n\nexport const generateUpsertQuery = (\n table: string,\n data: UpdateOpParam,\n conflictTarget: string[],\n doNothingOnConflict = false\n) => {\n const knex = getKnex();\n\n // Prepare insert data\n const insertData: Record<string, UpdateOpParam[string]['value']> = {};\n Object.entries(data).forEach(([field, fieldData]) => {\n insertData[field] = fieldData.value;\n });\n\n // Prepare update data for conflict resolution\n const updateData: Record<string, Knex.Raw | UpdateOpParam[string]['value']> =\n {};\n\n if (doNothingOnConflict) {\n // Dummy update to force returning the row\n // We update the first conflict target column to itself\n const conflictField = conflictTarget[0];\n updateData[conflictField] = knex.raw('??', [`${table}.${conflictField}`]);\n } else {\n Object.entries(data).forEach(([field, fieldData]) => {\n const param = fieldData;\n\n if (param.operator === 'inc') {\n updateData[field] = knex.raw('?? + ?', [\n `${table}.${field}`,\n param.value\n ]);\n } else if (param.operator === 'dec') {\n updateData[field] = knex.raw('?? - ?', [\n `${table}.${field}`,\n param.value\n ]);\n } else {\n updateData[field] = param.value;\n }\n });\n }\n\n const { sql: query, bindings: replacements } = knex(table)\n .insert(insertData)\n .onConflict(conflictTarget)\n .merge(updateData)\n .returning(['*', knex.raw('(xmax = 0) as is_insert')])\n .toSQL();\n\n return { query, replacements };\n};\n","export function normalizePort(val: string) {\n const port = parseInt(val, 10);\n\n if (isNaN(port)) {\n // named pipe\n return val;\n }\n\n if (port >= 0) {\n // port number\n return port;\n }\n\n throw new Error('Invalid port number');\n}\n","import { ObjectSchema, ValidationOptions } from 'joi';\nimport { Middleware } from 'src/interfaces/express';\nimport HttpError, { handleHttpError } from './error';\n\nexport const validateRequestData =\n (\n schema: ObjectSchema,\n location: 'body' | 'params' | 'query' | 'headers' | 'cookies' = 'body',\n options: ValidationOptions = { allowUnknown: true }\n ): Middleware =>\n async (req, res, next) => {\n try {\n const validationResult = schema.validate(req[location], options);\n const validationError = validationResult.error?.message;\n if (validationError) {\n throw new HttpError(validationError, 422);\n }\n\n return next();\n } catch (error: any) {\n handleHttpError(error, res);\n }\n };\n\nexport default validateRequestData;\n","import { Request } from 'express';\n\nexport const createReqTransit = <T>(key: string) => {\n const inject = (req: Request, value: T) => {\n req._honeyTransit = { ...req._honeyTransit, [key]: value };\n };\n\n const extract = (req: Request, defaultValue?: T): T => {\n return req._honeyTransit?.[key] ?? defaultValue!;\n };\n\n return { inject, extract };\n};\n"],"names":[],"version":3,"file":"module.js.map","sourceRoot":"../"}
1
+ {"mappings":"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","sources":["src/index.ts","src/config/index.ts","src/config/database.ts","src/services/express.ts","src/utils/error.ts","src/services/honey.ts","src/controllers/index.ts","src/controllers/interfaces.ts","src/controllers/create.ts","src/utils/formatter.ts","src/controllers/read.ts","src/controllers/update.ts","src/controllers/upsert.ts","src/controllers/delete.ts","src/controllers/query.ts","src/utils/db.ts","src/utils/helpers.ts","src/services/postgres.ts","src/utils/postgres.ts","src/utils/port.ts","src/utils/validation.ts","src/utils/transit.ts"],"sourcesContent":["import { QueryTypes as QTypes } from 'sequelize';\n\nimport Config from './config';\nimport { DBOptions } from './config/database';\nimport ExpressApp from './services/express';\nimport Honey from './services/honey';\nimport Postgres from './services/postgres';\nimport { normalizePort } from './utils/port';\nimport { Metadata } from './interfaces/express';\n\nprocess.on('SIGINT', () => {\n // process reload ongoing\n // close connections, clear cache, etc\n // by default, you have 1600ms\n process.exit(0);\n});\n\nexport function createHoney(\n port: string,\n dbOptions: string | DBOptions,\n metadata?: Metadata\n) {\n new Config(dbOptions);\n\n const portVal = normalizePort(port || process.env.PORT || '3000');\n const express = new ExpressApp(portVal, metadata);\n const postgres = new Postgres();\n const honey = new Honey(express, postgres);\n\n return honey;\n}\n\nexport const defineModel = Config.defineModel.bind(Config);\n\nfunction getQueryTypes() {\n const { SELECT, INSERT, UPDATE, DELETE, RAW, UPSERT } = QTypes;\n\n const exposedTypes = { SELECT, INSERT, UPDATE, DELETE, RAW, UPSERT };\n return exposedTypes;\n}\n\nconst QueryTypes = getQueryTypes();\n\nexport { QueryTypes };\nexport { default as runDbQuery, createModel } from './utils/db';\nexport { default as HttpError, handleHttpError } from './utils/error';\nexport { default as Honey } from './services/honey';\nexport type {\n Middleware,\n ExitMiddleware,\n Request,\n Response\n} from './interfaces/express';\nexport * from 'sequelize';\nexport { Knex } from 'knex';\nexport { validateRequestData } from './utils/validation';\nexport { createReqTransit } from './utils/transit';\n","import path from 'path';\nimport dotenv from 'dotenv';\n\nimport initDB, { DBOptions } from './database';\nimport {\n Model,\n ModelAttributes,\n ModelOptions,\n Sequelize\n} from 'sequelize/types';\ndotenv.config();\ndotenv.config({ path: path.join(__dirname, '.env') });\n\nexport default class Config {\n public static db: Sequelize;\n\n public static getEnv = (key: string) => {\n return process.env[key];\n };\n\n constructor(options: DBOptions | string) {\n Config.db = initDB(options);\n }\n\n static get isLive() {\n return process.env.NODE_ENV === 'production';\n }\n\n public static defineModel(\n modelName: string,\n attributes: ModelAttributes<Model<any, any>, any>,\n options?: ModelOptions<Model<any, any>> | undefined\n ) {\n return this.db.define(modelName, attributes, options);\n }\n}\n","import { Sequelize } from 'sequelize';\n\nexport interface DBOptions {\n host: string;\n port: number | string;\n user: string;\n password: string;\n database: string;\n}\n\nexport default function initDB(options: string | DBOptions) {\n let uri = '';\n if (typeof options === 'string') {\n uri = options;\n } else {\n uri = `postgres://${options.user}:${options.password}@${options.host}:${options.port}/${options.database}`;\n }\n const sequelize = new Sequelize(uri, {\n logging: false\n });\n\n sequelize\n .authenticate()\n .then(() => {\n console.log('DB Connection established successfully');\n })\n .catch((err) => {\n console.log('DB Connection failed');\n console.error(err);\n });\n\n return sequelize;\n}\n","import cookieParser from 'cookie-parser';\nimport express from 'express';\nimport logger from 'morgan';\nimport cors from 'cors';\nimport http from 'http';\nimport expressOasGenerator from 'express-oas-generator';\nimport '../config';\nimport HttpError from '../utils/error';\nimport { AddressInfo } from 'net';\nimport { Metadata } from '../interfaces/express';\n\n/**\n * Event listener for HTTP server \"error\" event.\n */\nconst onError = (port: string | number) => {\n return (error: any) => {\n if (error.syscall !== 'listen') {\n throw error;\n }\n\n const bind = typeof port === 'string' ? `Pipe ${port}` : `Port ${port}`;\n\n // handle specific listen errors with friendly messages\n switch (error.code) {\n case 'EACCES':\n console.error(`${bind} requires elevated privileges`);\n process.exit(1);\n case 'EADDRINUSE':\n console.error(`${bind} is already in use`);\n process.exit(1);\n default:\n throw error;\n }\n };\n};\n\n/**\n * Event listener for HTTP server \"listening\" event.\n */\nconst onListening = (server: http.Server) => {\n return () => {\n const addr = server.address();\n const bind =\n typeof addr === 'string'\n ? `pipe ${addr}`\n : `port ${(addr as AddressInfo).port}`;\n console.log(\n `%c Honey Server started on ${bind} `,\n 'background: #222; color: #bada55; font-size: 32px'\n );\n };\n};\n\nclass ExpressApp {\n public app = express();\n public appRoutes = express.Router();\n private fallbackErrMessage = 'Endpoint does not exist';\n private routePrefix = '/api';\n\n constructor(\n port: string | number,\n private metadata?: Metadata\n ) {\n this.fallbackErrMessage =\n this.metadata?.fallbackErrorMessage || this.fallbackErrMessage;\n this.routePrefix = this.metadata?.routePrefix || this.routePrefix;\n this.initMiddlewares();\n this.setupErrorFallback();\n this.app.set('port', port);\n }\n\n public listen() {\n expressOasGenerator.handleRequests();\n const port = Number(this.app.get('port'));\n const server = this.app.listen(port);\n server.on('error', onError(port));\n server.on('listening', onListening(server));\n }\n\n private initMiddlewares() {\n const corsOptions: cors.CorsOptions = {\n origin: '*',\n methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',\n allowedHeaders: '*',\n exposedHeaders: '*',\n credentials: true,\n optionsSuccessStatus: 204\n };\n\n expressOasGenerator.handleResponses(this.app, {} as any);\n this.app.use(logger('dev'));\n this.app.use(cors(corsOptions));\n this.app.use(\n express.json({\n limit: '50mb',\n verify(req: any, _res, buf) {\n req.rawBody = buf;\n }\n })\n );\n this.app.use(express.urlencoded({ limit: '50mb', extended: false }));\n this.app.use(cookieParser());\n this.app.use(this.routePrefix, this.appRoutes);\n }\n\n private setupErrorFallback() {\n this.app.use((_, res) => {\n const err = new HttpError(this.fallbackErrMessage, 404);\n\n return res.status(err.status).json({ message: err.message });\n });\n // error handler\n this.app.use((err: any, _, res: any) => {\n return res\n .status(err.status || 500)\n .send({ message: 'Something went wrong' });\n });\n }\n}\n\nexport default ExpressApp;\n","import { Response } from 'express';\n\nexport default class HttpError extends Error {\n constructor(\n message: string,\n public status: number\n ) {\n super(message || 'Something went wrong');\n }\n}\n\nexport const handleHttpError = (err: HttpError, res: Response) => {\n return res\n .status(err.status || 500)\n .send({ message: err.message || 'Something went wrong' });\n};\n","import Config from '../config';\nimport {\n createController,\n deleteByIdController,\n getByIdController,\n getByQueryController,\n updateByIdController,\n upsertByIdController,\n upsertController,\n updateController,\n deleteController,\n queryController\n} from '../controllers';\nimport {\n ICreate,\n ICrud,\n IDelete,\n IDeleteById,\n IGet,\n IGetById,\n IUpdate,\n IUpdateById,\n IUpsert,\n IUpsertById,\n IQuery\n} from '../interfaces/crud';\nimport { ExitMiddleware, Middleware } from '../interfaces/express';\nimport { NextFunction, Request, Response } from 'express';\nimport ExpressApp from './express';\nimport Postgres from './postgres';\n\n// eslint-disable-next-line\nconst defaultExitMiddleware: ExitMiddleware = (data, req, res, next) => {\n if (process.env.NODE_ENV !== 'production') console.log('Response:', data);\n};\n\nexport default class Honey {\n constructor(\n public express: ExpressApp,\n private postgres: Postgres\n ) {}\n\n get routes() {\n return this.express.appRoutes;\n }\n\n get db() {\n return Config.db;\n }\n\n private crud({\n method,\n path,\n controller,\n middleware = [],\n exitMiddleware = [defaultExitMiddleware]\n }: ICrud) {\n const dbCheck = async (req: Request, res: Response, next: NextFunction) => {\n if (!Config.db) {\n return res.status(503).send({\n message: 'DB Initialization in progress'\n });\n } else {\n next();\n }\n };\n this.express.appRoutes[method](\n path,\n dbCheck,\n ...middleware,\n controller,\n ...exitMiddleware\n );\n }\n\n public addMiddleware(middleware: Middleware[]) {\n this.express.appRoutes.use(...middleware);\n }\n\n public startServer() {\n this.express.listen();\n }\n\n public create({\n resource,\n params,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n processResponseData,\n processErrorResponse,\n table,\n methodOverride\n }: ICreate) {\n const path = pathOverride || `/${resource}`;\n resource = table || resource;\n\n const controller = createController({\n db: this.postgres,\n resource,\n params,\n message,\n processResponseData,\n processErrorResponse\n });\n\n this.crud({\n method: methodOverride || 'post',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public get({\n resource,\n fields,\n filter,\n format,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n processResponseData,\n processErrorResponse,\n table,\n joins,\n shouldErrorOnNotFound = true\n }: IGet) {\n const path = pathOverride || `/${resource}`;\n resource = table || resource;\n\n const controller = getByQueryController({\n db: this.postgres,\n resource,\n fields,\n filterQuery: filter,\n format,\n processResponseData,\n processErrorResponse,\n joins,\n shouldErrorOnNotFound\n });\n this.crud({\n method: methodOverride || 'get',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public getById({\n resource,\n fields,\n idField,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n processResponseData,\n processErrorResponse,\n table,\n filter,\n joins,\n shouldErrorOnNotFound = true\n }: IGetById) {\n const path = pathOverride || `/${resource}/:id`;\n resource = table || resource;\n\n const controller = getByIdController({\n db: this.postgres,\n resource,\n fields,\n idField: idField || 'id',\n processResponseData,\n processErrorResponse,\n filterQuery: filter,\n joins,\n shouldErrorOnNotFound\n });\n\n this.crud({\n method: methodOverride || 'get',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public updateById({\n resource,\n params,\n idField,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n table,\n filter,\n processErrorResponse,\n processResponseData\n }: IUpdateById) {\n const path = pathOverride || `/${resource}/:id`;\n resource = table || resource;\n\n const controller = updateByIdController({\n db: this.postgres,\n resource,\n params,\n message,\n idField,\n filterQuery: filter,\n processErrorResponse,\n processResponseData\n });\n this.crud({\n method: methodOverride || 'put',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public update({\n resource,\n params,\n filter,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n table,\n processErrorResponse,\n processResponseData\n }: IUpdate) {\n const path = pathOverride || `/${resource}`;\n resource = table || resource;\n\n const controller = updateController({\n db: this.postgres,\n resource,\n params,\n message,\n filterQuery: filter,\n processErrorResponse,\n processResponseData\n });\n this.crud({\n method: methodOverride || 'put',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public upsertById({\n resource,\n params,\n idField,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n table,\n processErrorResponse,\n processResponseData,\n doNothingOnConflict\n }: IUpsertById) {\n const path = pathOverride || `/${resource}/:id`;\n resource = table || resource;\n\n const controller = upsertByIdController({\n db: this.postgres,\n resource,\n params,\n message,\n idField,\n processErrorResponse,\n processResponseData,\n doNothingOnConflict\n });\n this.crud({\n method: methodOverride || 'put',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public upsert({\n resource,\n params,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n conflictTarget,\n table,\n processErrorResponse,\n processResponseData,\n doNothingOnConflict\n }: IUpsert) {\n const path = pathOverride || `/${resource}`;\n resource = table || resource;\n\n const controller = upsertController({\n db: this.postgres,\n resource,\n params,\n message,\n conflictTarget,\n processErrorResponse,\n processResponseData,\n doNothingOnConflict\n });\n this.crud({\n method: methodOverride || 'put',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public deleteById({\n resource,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n idField,\n filter,\n table,\n processErrorResponse\n }: IDeleteById) {\n const path = pathOverride || `/${resource}/:id`;\n resource = table || resource;\n\n const controller = deleteByIdController({\n db: this.postgres,\n resource,\n message,\n idField,\n filterQuery: filter,\n processErrorResponse\n });\n this.crud({\n method: methodOverride || 'delete',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public delete({\n resource,\n message,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n filter,\n table,\n processErrorResponse\n }: IDelete) {\n const path = pathOverride || `/${resource}/:id`;\n resource = table || resource;\n\n const controller = deleteController({\n db: this.postgres,\n resource,\n message,\n filterQuery: filter,\n processErrorResponse\n });\n this.crud({\n method: methodOverride || 'delete',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n\n public query({\n resource,\n query,\n middleware,\n pathOverride,\n exitMiddleware,\n methodOverride,\n processErrorResponse,\n processResponseData\n }: IQuery) {\n const path = pathOverride || `/${resource}`;\n\n const controller = queryController({\n db: this.postgres,\n query,\n processErrorResponse,\n processResponseData\n });\n this.crud({\n method: methodOverride || 'get',\n path,\n controller,\n middleware,\n exitMiddleware\n });\n }\n}\n","export { Controller } from './interfaces';\nexport { default as createController } from './create';\nexport { getByIdController, getByQueryController } from './read';\nexport { updateByIdController, updateController } from './update';\nexport { upsertByIdController, upsertController } from './upsert';\nexport { deleteByIdController, deleteController } from './delete';\nexport * from './query';\n","import { NextFunction, Request, Response } from 'express';\n\nexport type Controller = (\n req: Request,\n res: Response,\n next: NextFunction\n) => void;\n","import { CreateControllerParams } from '../interfaces/crud';\nimport HttpError, { handleHttpError } from '../utils/error';\nimport { extractInsertData } from '../utils/formatter';\nimport { NextFunction, Request, Response } from 'express';\nimport { Controller } from './interfaces';\n\nexport default function createController({\n db,\n resource,\n params,\n message,\n processResponseData,\n processErrorResponse\n}: CreateControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const body = extractInsertData(req.body, params);\n\n let data = await db.create(resource, body);\n const id = data[0].id;\n\n data =\n req.body.dataOverride ||\n (processResponseData ? await processResponseData({ id }, req) : { id });\n\n res.send({\n message,\n data\n });\n next({ message, data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n","import { Request } from 'express';\nimport { ICreate, IUpdateById } from '../interfaces/crud';\nimport {\n Filter,\n FilterLocation,\n FilterOps,\n FilterParam,\n GetFilterParam,\n GetQueryFilter,\n UpdateOpParam\n} from '../shared/interface';\n\nconst formatters: Record<string, Function> = {\n string: String,\n number: Number,\n boolean: Boolean,\n json: JSON.stringify,\n // Required for updating JSON fields\n object: JSON.stringify,\n csv: (value: string) => value.split(','),\n 'as-is': (value: any) => value\n};\n\nexport const extractInsertData = (\n body: Record<string, any>,\n params: ICreate['params']\n) => {\n const result: Record<string, string | number | boolean | Date | Object> = {};\n\n Object.entries(params).forEach(([key, value]) => {\n if (value === '@updatedAt') {\n result[key] = new Date();\n return;\n }\n\n if (!Object.keys(body).includes(key)) return;\n\n const formatter = formatters[value];\n result[key] =\n formatter && ![null, undefined].includes(body[key])\n ? formatter(body[key])\n : body[key];\n });\n\n return result;\n};\n\nexport const generateUpdateData = (\n body: Record<string, any>,\n params: IUpdateById['params']\n) => {\n const result = Object.entries(params).reduce((acc, [key, value]) => {\n if (!Object.keys(body).includes(key) && value !== '@updatedAt')\n return { ...acc };\n\n let formattedValue: any;\n if (value === '@updatedAt') {\n formattedValue = new Date();\n } else {\n formattedValue = ![null, undefined].includes(body[key])\n ? formatters[typeof body[key]](body[key])\n : body[key];\n }\n\n return {\n ...acc,\n [key]: {\n value: formattedValue,\n operator: value === '@updatedAt' ? 'replace' : value\n }\n };\n }, {} as UpdateOpParam);\n\n return result;\n};\n\nconst retrieveParamFromLocation = (\n req: Request,\n location: FilterLocation,\n key: string\n) => {\n if (location === 'request') return (req as any)[key];\n\n return req[location][key];\n};\n\nexport const formatReadFilter = (\n filterParams: Record<string, any>,\n filter: GetQueryFilter,\n req: Request\n) => {\n const result: Filter = {};\n\n for (const [key, param] of Object.entries(filter)) {\n if (key === '$or') {\n const val = formatReadFilter(\n filterParams,\n param as Record<string, GetFilterParam>,\n req\n ) as Record<string, FilterParam>;\n\n result[key] = val;\n } else {\n let valueToUse: any;\n if (param.overrideValue) {\n if (typeof param.overrideValue === 'function') {\n valueToUse = param.overrideValue(req);\n } else {\n valueToUse = param.overrideValue;\n }\n } else if (!!param.location) {\n valueToUse = retrieveParamFromLocation(\n req,\n param.location as FilterLocation,\n key\n );\n } else {\n valueToUse = filterParams[key];\n }\n\n if (typeof valueToUse === 'undefined') {\n continue;\n }\n\n const valueFormatter = formatters[(param as GetFilterParam).value];\n result[key] = {\n operator: param.operator as FilterOps,\n value: valueFormatter(valueToUse)\n };\n }\n }\n\n return result;\n};\n","import {\n GetByIdControllerParams,\n GetByQueryControllerParams\n} from '../interfaces/crud';\nimport HttpError, { handleHttpError } from '../utils/error';\nimport { formatReadFilter } from '../utils/formatter';\nimport { NextFunction, Request, Response } from 'express';\nimport { Controller } from './interfaces';\n\nexport function getByIdController({\n db,\n resource,\n fields,\n idField = 'id',\n processResponseData,\n processErrorResponse,\n filterQuery = {},\n joins,\n shouldErrorOnNotFound\n}: GetByIdControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const id = req.params.id;\n\n const filter = formatReadFilter(req.query, filterQuery, req);\n\n let data = await db.read(\n resource,\n fields,\n {\n [idField]: {\n value: id,\n operator: '='\n },\n ...filter\n },\n undefined,\n undefined,\n joins\n );\n\n if (!data?.length && shouldErrorOnNotFound) {\n throw new HttpError('Record does not exist', 404);\n }\n\n data = processResponseData\n ? await processResponseData(data[0], req)\n : data[0];\n\n res.send({\n data\n });\n next({ data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n\nexport function getByQueryController({\n db,\n resource,\n fields,\n filterQuery,\n format,\n processResponseData,\n processErrorResponse,\n joins,\n shouldErrorOnNotFound\n}: GetByQueryControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const page = Number(req.query.page);\n const limit = Number(req.query.limit);\n const paginate =\n limit || page ? { page: page || 1, limit: limit || 10 } : undefined;\n\n const filter =\n filterQuery && formatReadFilter(req.query, filterQuery, req);\n\n let data: Record<string, any>[] = await db.read(\n resource,\n fields,\n filter,\n paginate,\n format,\n joins\n );\n let total = 0;\n if (paginate) {\n total = Number(data[0]?.['honey_total_count'] || 0);\n data = data.map((item: Record<string, any>) => {\n delete item['honey_total_count'];\n return item;\n });\n }\n\n if (processResponseData) {\n data = await processResponseData(data, req);\n } else if (!data?.length && shouldErrorOnNotFound) {\n throw new HttpError('No records found', 404);\n }\n const response = {\n data,\n meta: {\n ...(!!paginate && {\n pagination: {\n total,\n pageSize: limit,\n page,\n pageCount: Math.ceil(total / limit)\n }\n })\n }\n };\n res.send(response);\n next(response);\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n","import {\n UpdateByIdControllerParams,\n UpdateControllerParams\n} from '../interfaces/crud';\nimport { Filter } from '../shared/interface';\nimport HttpError, { handleHttpError } from '../utils/error';\nimport { formatReadFilter, generateUpdateData } from '../utils/formatter';\nimport { NextFunction, Request, Response } from 'express';\nimport { Controller } from './interfaces';\n\nexport function updateByIdController({\n db,\n resource,\n params,\n message,\n idField = 'id',\n processErrorResponse,\n processResponseData,\n filterQuery = {}\n}: UpdateByIdControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const body = generateUpdateData(req.body, params);\n const additionalFilter =\n filterQuery && formatReadFilter(req.body, filterQuery, req);\n const filter: Filter = {\n [idField]: {\n operator: '=',\n value: req.params.id\n },\n ...additionalFilter\n };\n\n const result = await db.update(resource, body, filter);\n\n const data = processResponseData\n ? await processResponseData(result, req)\n : undefined;\n\n res.send({ message, data });\n next({ message, data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n\nexport function updateController({\n db,\n resource,\n params,\n message,\n filterQuery,\n processErrorResponse,\n processResponseData\n}: UpdateControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const body = generateUpdateData(req.body, params);\n const filter =\n filterQuery && formatReadFilter(req.body, filterQuery, req);\n\n const result = await db.update(resource, body, filter);\n\n const data = processResponseData\n ? await processResponseData(result, req)\n : undefined;\n\n res.send({ message, data });\n\n next({ message, data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n","import {\n UpsertByIdControllerParams,\n UpsertControllerParams\n} from '../interfaces/crud';\nimport HttpError, { handleHttpError } from '../utils/error';\nimport { generateUpdateData } from '../utils/formatter';\nimport { NextFunction, Response } from 'express';\nimport { Request } from '../interfaces/express';\nimport { Controller } from './interfaces';\n\nexport function upsertByIdController({\n db,\n resource,\n params,\n message,\n idField = 'id',\n processErrorResponse,\n processResponseData,\n doNothingOnConflict\n}: UpsertByIdControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n req.body[idField] = req.params.id;\n params = { ...params, [idField]: 'replace' };\n const body = generateUpdateData(req.body, params);\n\n const result = await db.upsert(\n resource,\n body,\n [idField],\n doNothingOnConflict\n );\n\n if (result?.[0]) {\n req.isInsert = (result[0] as any).is_insert;\n }\n\n const data = processResponseData\n ? await processResponseData(result?.[0], req)\n : undefined;\n\n res.send({ message, data });\n\n next({ message, data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n\nexport function upsertController({\n db,\n resource,\n params,\n message,\n conflictTarget,\n processErrorResponse,\n processResponseData,\n doNothingOnConflict\n}: UpsertControllerParams): Controller {\n return async function (req: Request, res: Response, next: NextFunction) {\n try {\n const body = generateUpdateData(req.body, params);\n\n const result = await db.upsert(\n resource,\n body,\n conflictTarget,\n doNothingOnConflict\n );\n\n if (result?.[0]) {\n req.isInsert = (result[0] as any).is_insert;\n }\n\n const data = processResponseData\n ? await processResponseData(result?.[0], req)\n : undefined;\n\n res.send({ message, data });\n\n next({ message, data });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n","import {\n DeleteByIdControllerParams,\n DeleteControllerParams\n} from '../interfaces/crud';\nimport HttpError, { handleHttpError } from '../utils/error';\nimport { NextFunction, Request, Response } from 'express';\nimport { Controller } from './interfaces';\nimport { formatReadFilter } from '../utils/formatter';\n\nexport function deleteByIdController({\n db,\n resource,\n message,\n idField = 'id',\n processErrorResponse,\n filterQuery = {}\n}: DeleteByIdControllerParams): Controller {\n return async (req: Request, res: Response, next: NextFunction) => {\n try {\n const id = req.params[idField || 'id'];\n const filter =\n filterQuery && formatReadFilter(req.body, filterQuery, req);\n\n await db.delete(resource, {\n [idField]: {\n value: id,\n operator: '='\n },\n ...filter\n });\n\n res.send({ message });\n next({ message });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n\nexport function deleteController({\n db,\n resource,\n message,\n processErrorResponse,\n filterQuery\n}: DeleteControllerParams): Controller {\n return async (req: Request, res: Response, next: NextFunction) => {\n try {\n const filter =\n filterQuery && formatReadFilter(req.body, filterQuery, req);\n\n await db.delete(resource, filter);\n\n res.send({ message });\n next({ message });\n } catch (error: any) {\n if (processErrorResponse) {\n error = processErrorResponse(error);\n }\n handleHttpError(error as HttpError, res);\n next({ ...error, isError: true });\n }\n };\n}\n","import { NextFunction, Request, Response } from 'express';\nimport { getKnex } from '../utils/db';\nimport { QueryControllerParams } from '../interfaces/crud';\n\nexport function queryController({\n db,\n query,\n processErrorResponse,\n processResponseData\n}: QueryControllerParams) {\n return async (req: Request, res: Response, next: NextFunction) => {\n try {\n const page = Number(req.query.page);\n const limit = Number(req.query.limit);\n const paginate =\n limit || page ? { page: page || 1, limit: limit || 10 } : undefined;\n\n const knex = getKnex();\n let queryBuilder = query(knex, req);\n if (paginate) {\n queryBuilder = queryBuilder\n .limit(paginate.limit)\n .offset(paginate.limit * (paginate.page - 1));\n }\n const { sql, bindings } = queryBuilder.toSQL();\n\n const result = await db.query(sql, [...bindings]);\n\n const data = processResponseData\n ? await processResponseData(result, req)\n : result;\n\n res.send({ data });\n next({ data });\n } catch (e) {\n if (processErrorResponse) {\n return next(processErrorResponse(e as Error));\n }\n return next(e);\n }\n };\n}\n","import {\n Model,\n ModelAttributes,\n ModelOptions,\n ModelStatic,\n QueryOptions\n} from 'sequelize';\nimport Knex from 'knex';\n\nimport Config from '../config';\nimport createSingleton from './helpers';\n\nexport default function runDbQuery(query: string, params?: QueryOptions) {\n params = params || {};\n\n return Config.db.query(query, {\n ...params,\n raw: true\n });\n}\n\nclass ModelCreator {\n private static model: Record<string, ModelStatic<Model>> = {};\n\n public static createModel<\n TModelAttributes extends {} = any,\n TCreationAttributes extends {} = TModelAttributes\n >(\n modelName: string,\n attributes: ModelAttributes<Model<TModelAttributes, TCreationAttributes>>,\n options?:\n | ModelOptions<Model<TModelAttributes, TCreationAttributes>>\n | undefined\n ): ModelStatic<Model<TModelAttributes, TCreationAttributes>> {\n if (!this.model[modelName]) {\n this.model[modelName] = Config.db.define(modelName, attributes, options);\n }\n\n return this.model[modelName];\n }\n}\n\nexport function createModel<\n TModelAttributes extends {} = any,\n TCreationAttributes extends {} = TModelAttributes\n>(\n modelName: string,\n attributes: ModelAttributes<Model<TModelAttributes, TCreationAttributes>>,\n options?:\n | ModelOptions<Model<TModelAttributes, TCreationAttributes>>\n | undefined\n) {\n return ModelCreator.createModel.bind(ModelCreator)(\n modelName,\n attributes,\n options\n );\n}\n\nexport const getKnex = () =>\n createSingleton('knex', () => {\n return Knex({\n client: 'pg', // or 'mysql2', 'sqlite3', etc.\n // Do not provide connection. Also disable pool to be explicit.\n connection: undefined as any,\n pool: { min: 0, max: 0 }\n });\n });\n","export class Singleton {\n private static instances: Map<string, any> = new Map();\n\n public static getInstance<T>(identifier: string, initFn?: () => T): T {\n if (!this.instances.has(identifier) && initFn) {\n this.instances.set(identifier, initFn());\n }\n\n return this.instances.get(identifier) as T;\n }\n}\n\nexport default function createSingleton<T>(\n identifier: string,\n initFn?: () => T\n): T {\n return Singleton.getInstance(identifier, initFn);\n}\n","import config from '../config';\nimport {\n generateCreateQuery,\n generateDeleteQuery,\n generateReadQuery,\n generateUpdateQuery,\n generateUpsertQuery,\n nestResults\n} from '../utils/postgres';\nimport { QueryTypes } from 'sequelize';\nimport { Filter, UpdateOpParam, Join } from '../shared/interface';\n\nexport default class Postgres {\n public async read(\n table: string,\n fields: string[],\n filter?: Filter,\n paginate?: { page: number; limit: number },\n format?: { sort: 'ASC' | 'DESC'; sortField: string },\n joins?: Join[]\n ) {\n const { query, replacements } = generateReadQuery(\n table,\n fields,\n filter,\n paginate,\n format,\n joins\n );\n\n const result: any[] = await config.db.query(query, {\n type: QueryTypes.SELECT,\n raw: true,\n replacements: [...replacements]\n });\n\n if (joins?.length) {\n return nestResults(result, joins);\n }\n\n return result;\n }\n\n public async query(query: string, replacements: any[]) {\n const result = await config.db.query(query, {\n type: QueryTypes.SELECT,\n raw: true,\n replacements: [...replacements]\n });\n return result;\n }\n\n public async create(\n table: string,\n data: Record<string, string | number | boolean | Date | Object>\n ) {\n const { query, replacements } = generateCreateQuery(table, data);\n\n const res: any = await config.db.query(query, {\n type: QueryTypes.INSERT,\n raw: true,\n replacements: [...replacements]\n });\n\n // inserted ids\n return res[0] as { id: string | number }[];\n }\n\n public async update(table: string, data: UpdateOpParam, filter?: Filter) {\n const { query, replacements } = generateUpdateQuery(table, data, filter);\n\n const result = await config.db.query(query, {\n type: QueryTypes.SELECT,\n raw: true,\n replacements: [...replacements]\n });\n return result;\n }\n\n public async delete(table: string, filter?: Filter) {\n const { query, replacements } = generateDeleteQuery(table, filter);\n\n await config.db.query(query, {\n type: QueryTypes.DELETE,\n raw: true,\n replacements: [...replacements]\n });\n }\n\n public async upsert(\n table: string,\n data: UpdateOpParam,\n conflictTarget: string[],\n doNothingOnConflict = false\n ) {\n const { query, replacements } = generateUpsertQuery(\n table,\n data,\n conflictTarget,\n doNothingOnConflict\n );\n\n const result = await config.db.query(query, {\n type: QueryTypes.SELECT,\n raw: true,\n replacements: [...replacements]\n });\n\n return result;\n }\n}\n","import { Knex } from 'knex';\nimport { Filter, FilterParam, UpdateOpParam, Join } from '../shared/interface';\nimport { getKnex } from './db';\n\nexport const NESTED_DELIMITER = '__hj__';\n\nexport const nestResults = (\n results: Record<string, any>[],\n joins: Join[] = []\n) => {\n if (!joins.length || !results.length) return results;\n\n const nestedResults: any[] = [];\n const mainTableFields = Object.keys(results[0]).filter(\n (key) => !key.includes(NESTED_DELIMITER)\n );\n\n const groups = new Map<string, any>();\n\n results.forEach((row) => {\n // Generate a unique key for the main record based on non-nested fields\n const key = mainTableFields.map((f) => row[f]).join('|');\n\n if (!groups.has(key)) {\n const mainRecord: any = {};\n mainTableFields.forEach((f) => {\n mainRecord[f] = row[f];\n });\n\n // Initialize nested arrays for each join\n joins.forEach((join) => {\n const joinKey = join.alias || join.table;\n mainRecord[joinKey] = [];\n });\n\n groups.set(key, mainRecord);\n nestedResults.push(mainRecord);\n }\n\n const mainRecord = groups.get(key);\n\n joins.forEach((join) => {\n const joinKey = join.alias || join.table;\n const nestedObject: any = {};\n let hasValue = false;\n\n Object.keys(row).forEach((k) => {\n if (k.startsWith(`${joinKey}${NESTED_DELIMITER}`)) {\n const fieldName = k.split(NESTED_DELIMITER)[1];\n nestedObject[fieldName] = row[k];\n if (row[k] !== null) hasValue = true;\n }\n });\n\n if (hasValue) {\n // Check if this specific nested object already exists in the array\n const alreadyExists = mainRecord[joinKey].some((item: any) => {\n return Object.keys(nestedObject).every(\n (k) => item[k] === nestedObject[k]\n );\n });\n\n if (!alreadyExists) {\n mainRecord[joinKey].push(nestedObject);\n }\n }\n });\n });\n\n return nestedResults;\n};\n\nexport const applyFilter = (query: Knex.QueryBuilder, filter: Filter = {}) => {\n Object.entries(filter).forEach(([field, data]) => {\n if (field === '$or') {\n query.where((builder) => {\n Object.entries(data).forEach(([orField, orData], index) => {\n const method = index === 0 ? 'where' : 'orWhere';\n const orParam = orData as FilterParam;\n\n if (['like', 'not like'].includes(orParam.operator)) {\n builder[method](orField, 'ilike', `%${orParam.value}%`);\n } else {\n builder[method](orField, orParam.operator, orParam.value);\n }\n });\n });\n } else {\n const param = data as FilterParam;\n\n if (['like', 'not like'].includes(param.operator)) {\n query.where(\n field,\n param.operator === 'like' ? 'ilike' : 'not ilike',\n `%${param.value}%`\n );\n } else {\n query.where(field, param.operator, param.value);\n }\n }\n });\n\n return query;\n};\n\nexport const generateCreateQuery = (\n table: string,\n data: Record<string, string | number | boolean | Date | Object>\n) => {\n const knex = getKnex();\n const { sql: query, bindings: replacements } = knex(table)\n .insert(data)\n .returning('id')\n .toSQL();\n\n return { query, replacements };\n};\n\nexport const generateReadQuery = (\n table: string,\n fields: string[],\n filter?: Filter,\n paginate?: { page: number; limit: number },\n format?: { sort: 'ASC' | 'DESC'; sortField: string },\n joins?: Join[]\n) => {\n const knex = getKnex();\n\n // Handle field aliasing for joins\n const formattedFields = fields.map((field) => {\n if (field.includes('.')) {\n const [tableName, fieldName] = field.split('.');\n // Check if the table is part of a join\n const join = joins?.find(\n (j) => j.table === tableName || j.alias === tableName\n );\n if (join) {\n return `${field} as ${tableName}${NESTED_DELIMITER}${fieldName}`;\n }\n }\n return field;\n });\n\n let q = knex(table).select(formattedFields);\n\n // Add total count if pagination is needed\n if (paginate) {\n // Using knex.raw to create the count column with the same name as in original code\n q = knex(table).select([\n ...formattedFields.map((field) => {\n const [actualField, alias] = field.split(' as ');\n return alias\n ? knex.raw(`?? as ??`, [actualField, alias])\n : knex.raw(`?? as ??`, [field, field]);\n }),\n knex.raw('count(??) OVER() AS honey_total_count', [formattedFields[0]])\n ]);\n }\n\n // Apply joins\n if (joins && joins.length > 0) {\n joins.forEach((join) => {\n const joinTable = join.alias\n ? `${join.table} as ${join.alias}`\n : join.table;\n const joinType = join.type || 'inner';\n const operator = join.on.operator || '=';\n\n switch (joinType) {\n case 'left':\n q.leftJoin(joinTable, join.on.left, operator, join.on.right);\n break;\n case 'right':\n q.rightJoin(joinTable, join.on.left, operator, join.on.right);\n break;\n case 'full':\n q.fullOuterJoin(joinTable, join.on.left, operator, join.on.right);\n break;\n case 'cross':\n q.crossJoin(\n join.alias\n ? knex.raw('?? as ??', [join.table, join.alias])\n : knex.raw('??', [join.table])\n );\n break;\n case 'inner':\n default:\n q.innerJoin(joinTable, join.on.left, operator, join.on.right);\n break;\n }\n });\n }\n\n // Apply filters\n if (filter) {\n q = applyFilter(q, filter);\n }\n\n // Apply sorting\n if (format?.sort && format.sortField) {\n q.orderBy(format.sortField, format.sort);\n }\n\n // Apply pagination\n if (paginate) {\n q.limit(paginate.limit).offset(paginate.limit * (paginate.page - 1));\n }\n\n const { sql: query, bindings: replacements } = q.toSQL();\n\n return { query, replacements };\n};\nexport const generateUpdateQuery = (\n table: string,\n data: UpdateOpParam,\n filter?: Filter\n) => {\n const knex = getKnex();\n let q = knex(table);\n\n // Build the update object\n const updateData: Record<string, Knex.Raw> = {};\n\n Object.entries(data).forEach(([field, fieldData]) => {\n const param = fieldData as any;\n\n if (param.operator === 'inc') {\n updateData[field] = knex.raw('?? + ?', [field, param.value]);\n } else if (param.operator === 'dec') {\n updateData[field] = knex.raw('?? - ?', [field, param.value]);\n } else {\n updateData[field] = param.value;\n }\n });\n\n // Apply filter conditions\n if (filter) {\n q = applyFilter(q, filter);\n }\n\n const { sql: query, bindings: replacements } = q\n .update(updateData)\n .returning('*')\n .toSQL();\n console.log(query, replacements);\n return { query, replacements };\n};\nexport const generateDeleteQuery = (table: string, filter?: Filter) => {\n const knex = getKnex();\n let q = knex(table);\n\n if (filter) {\n q = applyFilter(q, filter);\n }\n\n const { sql: query, bindings: replacements } = q.delete().toSQL();\n return { query, replacements };\n};\n\nexport const generateUpsertQuery = (\n table: string,\n data: UpdateOpParam,\n conflictTarget: string[],\n doNothingOnConflict = false\n) => {\n const knex = getKnex();\n\n // Prepare insert data\n const insertData: Record<string, UpdateOpParam[string]['value']> = {};\n Object.entries(data).forEach(([field, fieldData]) => {\n insertData[field] = fieldData.value;\n });\n\n // Prepare update data for conflict resolution\n const updateData: Record<string, Knex.Raw | UpdateOpParam[string]['value']> =\n {};\n\n if (doNothingOnConflict) {\n // Dummy update to force returning the row\n // We update the first conflict target column to itself\n const conflictField = conflictTarget[0];\n updateData[conflictField] = knex.raw('??', [`${table}.${conflictField}`]);\n } else {\n Object.entries(data).forEach(([field, fieldData]) => {\n const param = fieldData;\n\n if (param.operator === 'inc') {\n updateData[field] = knex.raw('?? + ?', [\n `${table}.${field}`,\n param.value\n ]);\n } else if (param.operator === 'dec') {\n updateData[field] = knex.raw('?? - ?', [\n `${table}.${field}`,\n param.value\n ]);\n } else {\n updateData[field] = param.value;\n }\n });\n }\n\n const { sql: query, bindings: replacements } = knex(table)\n .insert(insertData)\n .onConflict(conflictTarget)\n .merge(updateData)\n .returning(['*', knex.raw('(xmax = 0) as is_insert')])\n .toSQL();\n\n return { query, replacements };\n};\n","export function normalizePort(val: string) {\n const port = parseInt(val, 10);\n\n if (isNaN(port)) {\n // named pipe\n return val;\n }\n\n if (port >= 0) {\n // port number\n return port;\n }\n\n throw new Error('Invalid port number');\n}\n","import { ObjectSchema, ValidationOptions } from 'joi';\nimport { Middleware } from 'src/interfaces/express';\nimport HttpError, { handleHttpError } from './error';\n\nexport const validateRequestData =\n (\n schema: ObjectSchema,\n location: 'body' | 'params' | 'query' | 'headers' | 'cookies' = 'body',\n options: ValidationOptions = { allowUnknown: true }\n ): Middleware =>\n async (req, res, next) => {\n try {\n const validationResult = schema.validate(req[location], options);\n const validationError = validationResult.error?.message;\n if (validationError) {\n throw new HttpError(validationError, 422);\n }\n\n return next();\n } catch (error: any) {\n handleHttpError(error, res);\n }\n };\n\nexport default validateRequestData;\n","import { Request } from 'express';\n\nexport const createReqTransit = <T>(key: string) => {\n const inject = (req: Request, value: T) => {\n req._honeyTransit = { ...req._honeyTransit, [key]: value };\n };\n\n const extract = (req: Request, defaultValue?: T): T => {\n return req._honeyTransit?.[key] ?? defaultValue!;\n };\n\n return { inject, extract };\n};\n"],"names":[],"version":3,"file":"module.js.map","sourceRoot":"../"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@promind/honey",
3
- "version": "1.46.3",
3
+ "version": "1.47.0",
4
4
  "description": "An expressJS based library for simplifying the development of CRUD APIs using Postgres",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",