@fjell/express-router 4.4.1 → 4.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -47,14 +47,6 @@ class ItemRouter {
47
47
  getIk(res) {
48
48
  throw new Error('Method not implemented in an abstract router');
49
49
  }
50
- /* istanbul ignore next */ configureItemActions() {
51
- this.logger.debug('ARouter - No Item Actions Configured');
52
- return {};
53
- }
54
- /* istanbul ignore next */ configureAllActions() {
55
- this.logger.debug('ARouter - No All Actions Configured');
56
- return {};
57
- }
58
50
  /* istanbul ignore next */ getRouter() {
59
51
  const router = express.Router();
60
52
  this.configure(router);
@@ -66,7 +58,6 @@ class ItemRouter {
66
58
  _define_property$2(this, "options", void 0);
67
59
  _define_property$2(this, "childRouters", {});
68
60
  _define_property$2(this, "logger", void 0);
69
- _define_property$2(this, "itemActions", void 0);
70
61
  _define_property$2(this, "getPkType", ()=>{
71
62
  return this.keyType;
72
63
  });
@@ -81,21 +72,66 @@ class ItemRouter {
81
72
  });
82
73
  const ik = this.getIk(res);
83
74
  const actionKey = req.path.substring(req.path.lastIndexOf('/') + 1);
84
- if (!this.itemActions) {
75
+ if (!this.lib.actions) {
85
76
  this.logger.error('Item Actions are not configured');
86
- return res.status(500).json({
77
+ res.status(500).json({
87
78
  error: 'Item Actions are not configured'
88
79
  });
80
+ return;
81
+ }
82
+ const action = this.lib.actions[actionKey];
83
+ if (!action) {
84
+ this.logger.error('Item Action is not configured', {
85
+ actionKey
86
+ });
87
+ res.status(500).json({
88
+ error: 'Item Action is not configured'
89
+ });
90
+ return;
89
91
  }
90
92
  try {
91
- const item = core.validatePK(await this.lib.get(ik), this.getPkType());
92
- return res.json(await this.itemActions[actionKey](req, res, item, req.params, req.body));
93
+ res.json(await this.lib.action(ik, actionKey, req.body));
93
94
  } catch (err) {
94
95
  this.logger.error('Error in Item Action', {
95
96
  message: err === null || err === void 0 ? void 0 : err.message,
96
97
  stack: err === null || err === void 0 ? void 0 : err.stack
97
98
  });
98
- return res.status(500).json(err);
99
+ res.status(500).json(err);
100
+ }
101
+ });
102
+ _define_property$2(this, "getItemFacet", async (req, res)=>{
103
+ this.logger.default('Getting Item', {
104
+ query: req === null || req === void 0 ? void 0 : req.query,
105
+ params: req === null || req === void 0 ? void 0 : req.params,
106
+ locals: res === null || res === void 0 ? void 0 : res.locals
107
+ });
108
+ const ik = this.getIk(res);
109
+ const facetKey = req.path.substring(req.path.lastIndexOf('/') + 1);
110
+ if (!this.lib.facets) {
111
+ this.logger.error('Item Facets are not configured');
112
+ res.status(500).json({
113
+ error: 'Item Facets are not configured'
114
+ });
115
+ return;
116
+ }
117
+ const facet = this.lib.facets[facetKey];
118
+ if (!facet) {
119
+ this.logger.error('Item Facet is not configured', {
120
+ facetKey
121
+ });
122
+ res.status(500).json({
123
+ error: 'Item Facet is not configured'
124
+ });
125
+ return;
126
+ }
127
+ try {
128
+ res.json(await this.lib.facet(ik, facetKey, req.params));
129
+ } catch (err) {
130
+ this.logger.error('Error in Item Facet', {
131
+ message: err === null || err === void 0 ? void 0 : err.message,
132
+ stack: err === null || err === void 0 ? void 0 : err.stack
133
+ });
134
+ res.status(500).json(err);
99
135
  }
100
136
  });
101
137
  _define_property$2(this, "configure", (router)=>{
@@ -104,29 +140,24 @@ class ItemRouter {
104
140
  });
105
141
  router.get('/', this.findItems);
106
142
  router.post('/', this.createItem);
107
- const allActions = this.configureAllActions();
108
- this.logger.debug('All Actions supplied to Router', {
109
- allActions
110
- });
111
- if (allActions) {
112
- Object.keys(allActions).forEach((actionKey)=>{
113
- this.logger.default('Configuring All Action', {
114
- actionKey
115
- });
116
- // TODO: Ok, this is a bit of a hack, but we need to customize the types of the request handlers
117
- router.post(`/${actionKey}`, ...allActions[actionKey]);
118
- });
119
- }
143
+ // const allActions = this.configureAllActions();
144
+ // this.logger.debug('All Actions supplied to Router', { allActions });
145
+ // if (allActions) {
146
+ // Object.keys(allActions).forEach((actionKey) => {
147
+ // this.logger.default('Configuring All Action', { actionKey });
148
+ // // TODO: Ok, this is a bit of a hack, but we need to customize the types of the request handlers
149
+ // router.post(`/${actionKey}`, ...allActions[actionKey]);
150
+ // });
151
+ // }
120
152
  const itemRouter = express.Router();
121
153
  itemRouter.get('/', this.getItem);
122
154
  itemRouter.put('/', this.updateItem);
123
155
  itemRouter.delete('/', this.deleteItem);
124
- this.itemActions = this.configureItemActions();
125
156
  this.logger.debug('Item Actions supplied to Router', {
126
- itemActions: this.itemActions
157
+ itemActions: this.lib.actions
127
158
  });
128
- if (this.itemActions) {
129
- Object.keys(this.itemActions).forEach((actionKey)=>{
159
+ if (this.lib.actions) {
160
+ Object.keys(this.lib.actions).forEach((actionKey)=>{
130
161
  this.logger.default('Configuring Item Action', {
131
162
  actionKey
132
163
  });
@@ -134,6 +165,18 @@ class ItemRouter {
134
165
  itemRouter.post(`/${actionKey}`, this.postItemAction);
135
166
  });
136
167
  }
168
+ this.logger.debug('Item Facets supplied to Router', {
169
+ itemFacets: this.lib.facets
170
+ });
171
+ if (this.lib.facets) {
172
+ Object.keys(this.lib.facets).forEach((facetKey)=>{
173
+ this.logger.default('Configuring Item Facet', {
174
+ facetKey
175
+ });
176
+ // TODO: Ok, this is a bit of a hack, but we need to customize the types of the request handlers
177
+ itemRouter.get(`/${facetKey}`, this.getItemFacet);
178
+ });
179
+ }
137
180
  this.logger.default('Configuring Item Operations under PK Param', {
138
181
  pkParam: this.getPkParam()
139
182
  });
@@ -191,7 +234,7 @@ class ItemRouter {
191
234
  const ik = this.getIk(res);
192
235
  const removedItem = await this.lib.remove(ik);
193
236
  const item = core.validatePK(removedItem, this.getPkType());
194
- return res.json(item);
237
+ res.json(item);
195
238
  });
196
239
  /* eslint-disable */ /* istanbul ignore next */ _define_property$2(this, "findItems", async (req, res)=>{
197
240
  throw new Error('Method not implemented in an abstract router');
@@ -206,7 +249,7 @@ class ItemRouter {
206
249
  try {
207
250
  // TODO: What error does validate PK throw, when can that fail?
208
251
  const item = core.validatePK(await this.lib.get(ik), this.getPkType());
209
- return res.json(item);
252
+ res.json(item);
210
253
  } catch (err) {
211
254
  if (err instanceof lib.NotFoundError) {
212
255
  this.logger.error('Item Not Found', {
@@ -214,7 +257,7 @@ class ItemRouter {
214
257
  message: err === null || err === void 0 ? void 0 : err.message,
215
258
  stack: err === null || err === void 0 ? void 0 : err.stack
216
259
  });
217
- return res.status(404).json({
260
+ res.status(404).json({
218
261
  ik,
219
262
  message: "Item Not Found"
220
263
  });
@@ -224,7 +267,7 @@ class ItemRouter {
224
267
  message: err === null || err === void 0 ? void 0 : err.message,
225
268
  stack: err === null || err === void 0 ? void 0 : err.stack
226
269
  });
227
- return res.status(500).json({
270
+ res.status(500).json({
228
271
  ik,
229
272
  message: "General Error"
230
273
  });
@@ -241,7 +284,7 @@ class ItemRouter {
241
284
  const ik = this.getIk(res);
242
285
  const itemToUpdate = this.convertDates(req.body);
243
286
  const retItem = core.validatePK(await this.lib.update(ik, itemToUpdate), this.getPkType());
244
- return res.json(retItem);
287
+ res.json(retItem);
245
288
  });
246
289
  _define_property$2(this, "convertDates", (item)=>{
247
290
  const events = item.events;
@@ -345,8 +388,8 @@ class CItemRouter extends ItemRouter {
345
388
  locations: this.getLocations(res)
346
389
  }), this.getPkType());
347
390
  item = await this.postCreateItem(item);
348
- return res.json(item);
349
- }), /* eslint-disable */ _define_property$1(this, "findItems", async (req, res)=>{
391
+ res.json(item);
392
+ }), _define_property$1(this, "findItems", async (req, res)=>{
350
393
  logger$1.trace('Finding Items', {
351
394
  query: req.query,
352
395
  params: req.params,
@@ -355,16 +398,32 @@ class CItemRouter extends ItemRouter {
355
398
  const query = req.query;
356
399
  const finder = query['finder'];
357
400
  const finderParams = query['finderParams'];
401
+ const one = query['one'];
358
402
  let items = [];
359
403
  if (finder) {
360
404
  // If finder is defined? Call a finder.
361
- items = await this.lib.find(finder, JSON.parse(finderParams), this.getLocations(res));
405
+ logger$1.trace('Finding Items with a finder', {
406
+ finder,
407
+ finderParams,
408
+ one
409
+ });
410
+ if (one === 'true') {
411
+ const item = await this.lib.findOne(finder, JSON.parse(finderParams), this.getLocations(res));
412
+ items = item ? [
413
+ item
414
+ ] : [];
415
+ } else {
416
+ items = await this.lib.find(finder, JSON.parse(finderParams), this.getLocations(res));
417
+ }
362
418
  } else {
419
+ logger$1.trace('Finding Items with a query', {
420
+ query: req.query
421
+ });
363
422
  // TODO: This is once of the more important places to perform some validaation and feedback
364
423
  const itemQuery = core.paramsToQuery(req.query);
365
424
  items = await this.lib.all(itemQuery, this.getLocations(res));
366
425
  }
367
- return res.json(items.map((item)=>core.validatePK(item, this.getPkType())));
426
+ res.json(items.map((item)=>core.validatePK(item, this.getPkType())));
368
427
  });
369
428
  this.parentRoute = parentRoute;
370
429
  }
@@ -400,8 +459,8 @@ class PItemRouter extends ItemRouter {
400
459
  const itemToCreate = this.convertDates(req.body);
401
460
  let item = core.validatePK(await this.lib.create(itemToCreate), this.getPkType());
402
461
  item = await this.postCreateItem(item);
403
- return res.json(item);
404
- }), /* eslint-disable */ _define_property(this, "findItems", async (req, res)=>{
462
+ res.json(item);
463
+ }), _define_property(this, "findItems", async (req, res)=>{
405
464
  logger.default('Finding Items', {
406
465
  query: req.query,
407
466
  params: req.params,
@@ -411,13 +470,22 @@ class PItemRouter extends ItemRouter {
411
470
  const query = req.query;
412
471
  const finder = query['finder'];
413
472
  const finderParams = query['finderParams'];
473
+ const one = query['one'];
414
474
  if (finder) {
415
475
  // If finder is defined? Call a finder.
416
476
  logger.default('Finding Items with a finder', {
417
477
  finder,
418
- finderParams
478
+ finderParams,
479
+ one
419
480
  });
420
- items = await this.lib.find(finder, JSON.parse(finderParams));
481
+ if (one === 'true') {
482
+ const item = await this.lib.findOne(finder, JSON.parse(finderParams));
483
+ items = item ? [
484
+ item
485
+ ] : [];
486
+ } else {
487
+ items = await this.lib.find(finder, JSON.parse(finderParams));
488
+ }
421
489
  } else {
422
490
  logger.default('Finding Items with a query', {
423
491
  query: req.query
@@ -426,7 +494,7 @@ class PItemRouter extends ItemRouter {
426
494
  const itemQuery = core.paramsToQuery(req.query);
427
495
  items = await this.lib.all(itemQuery);
428
496
  }
429
- return res.json(items.map((item)=>core.validatePK(item, this.getPkType())));
497
+ res.json(items.map((item)=>core.validatePK(item, this.getPkType())));
430
498
  });
431
499
  }
432
500
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/logger.ts","../src/ItemRouter.ts","../src/CItemRouter.ts","../src/PItemRouter.ts"],"sourcesContent":["import Logging from '@fjell/logging';\n\nconst LibLogger = Logging.getLogger('@fjell/express-router');\n\nexport default LibLogger;\n","import {\n ComKey,\n cPK,\n Item,\n ItemEvent,\n ItemProperties,\n LocKey,\n LocKeyArray,\n PriKey,\n validatePK\n} from \"@fjell/core\";\nimport { NotFoundError, Operations } from \"@fjell/lib\";\nimport deepmerge from \"deepmerge\";\nimport { Request, RequestHandler, Response, Router } from \"express\";\nimport LibLogger from \"./logger\";\n\nexport type ItemRouterOptions = Record<string, never>;\n\n// TODO: body is in the request, it's not needed in the parameters\nexport type ActionMethod = <\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n>(req: Request, res: Response, item: Item<S, L1, L2, L3, L4, L5>, params: any, body: any) =>\n Promise<Item<S, L1, L2, L3, L4, L5>>;\n\n// TODO: body is in the request, it's not needed in the parameters\nexport type AllActionMethods = Array<RequestHandler>;\n\nexport class ItemRouter<\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n> {\n\n protected lib: Operations<Item<S, L1, L2, L3, L4, L5>, S, L1, L2, L3, L4, L5>;\n private keyType: S;\n protected options: ItemRouterOptions;\n private childRouters: Record<string, Router> = {};\n private logger;\n private itemActions: Record<string, ActionMethod> | undefined;\n\n constructor(\n lib: Operations<Item<S, L1, L2, L3, L4, L5>, S, L1, L2, L3, L4, L5>,\n keyType: S,\n options: ItemRouterOptions = {}\n ) {\n this.lib = lib;\n this.keyType = keyType;\n this.options = options;\n this.logger = LibLogger.get(\"ItemRouter\", keyType);\n }\n\n public getPkType = (): S => {\n return this.keyType;\n }\n\n protected getPkParam = (): string => {\n return `${this.getPkType()}Pk`;\n }\n\n protected getLk(res: Response): LocKey<S> {\n return { kt: this.keyType, lk: res.locals[this.getPkParam()] };\n }\n\n // this is meant to be consumed by children routers\n public getLKA(res: Response): LocKeyArray<S, L1, L2, L3, L4> {\n return [this.getLk(res)] as LocKeyArray<S, L1, L2, L3, L4>;\n }\n\n public getPk(res: Response): PriKey<S> {\n return cPK<S>(res.locals[this.getPkParam()], this.getPkType());\n }\n\n // Unless this is a contained router, the locations will always be an empty array.\n /* eslint-disable */\n protected getLocations(res: Response): LocKeyArray<L1, L2, L3, L4, L5> | [] {\n throw new Error('Method not implemented in an abstract router');\n }\n /* eslint-enable */\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected getIk(res: Response): PriKey<S> | ComKey<S, L1, L2, L3, L4, L5> {\n throw new Error('Method not implemented in an abstract router');\n }\n\n protected postItemAction = async (req: Request, res: Response) => {\n this.logger.default('Getting Item', { query: req?.query, params: req?.params, locals: res?.locals });\n const ik = this.getIk(res);\n const actionKey = req.path.substring(req.path.lastIndexOf('/') + 1);\n if (!this.itemActions) {\n this.logger.error('Item Actions are not configured');\n return res.status(500).json({ error: 'Item Actions are not configured' });\n }\n try {\n const item =\n validatePK(await this.lib.get(ik), this.getPkType()) as Item<S, L1, L2, L3, L4, L5>;\n return res.json(await this.itemActions[actionKey](req, res, item, req.params, req.body));\n } catch (err: any) {\n this.logger.error('Error in Item Action', { message: err?.message, stack: err?.stack });\n return res.status(500).json(err);\n }\n }\n\n private configure = (router: Router) => {\n this.logger.default('Configuring Router', { pkType: this.getPkType() });\n router.get('/', this.findItems);\n router.post('/', this.createItem);\n\n const allActions = this.configureAllActions();\n this.logger.debug('All Actions supplied to Router', { allActions });\n if (allActions) {\n Object.keys(allActions).forEach((actionKey) => {\n this.logger.default('Configuring All Action', { actionKey });\n // TODO: Ok, this is a bit of a hack, but we need to customize the types of the request handlers\n router.post(`/${actionKey}`, ...allActions[actionKey]);\n });\n }\n\n const itemRouter = Router();\n itemRouter.get('/', this.getItem);\n itemRouter.put('/', this.updateItem);\n itemRouter.delete('/', this.deleteItem);\n\n this.itemActions = this.configureItemActions();\n this.logger.debug('Item Actions supplied to Router', { itemActions: this.itemActions });\n if (this.itemActions) {\n Object.keys(this.itemActions).forEach((actionKey) => {\n this.logger.default('Configuring Item Action', { actionKey });\n // TODO: Ok, this is a bit of a hack, but we need to customize the types of the request handlers\n itemRouter.post(`/${actionKey}`, this.postItemAction)\n });\n }\n\n this.logger.default('Configuring Item Operations under PK Param', { pkParam: this.getPkParam() });\n router.use(`/:${this.getPkParam()}`, this.validatePrimaryKeyValue, itemRouter);\n\n if (this.childRouters) {\n this.configureChildRouters(itemRouter, this.childRouters);\n }\n return router;\n }\n\n private validatePrimaryKeyValue = (req: Request, res: Response, next: any) => {\n const pkParamValue = req.params[this.getPkParam()];\n if (this.validatePKParam(pkParamValue)) {\n res.locals[this.getPkParam()] = pkParamValue;\n next();\n } else {\n this.logger.error('Invalid Primary Key', { pkParamValue, path: req?.path });\n res.status(500).json({ error: 'Invalid Primary Key', path: req?.path });\n }\n }\n\n private configureChildRouters = (router: Router, childRouters: Record<string, Router>) => {\n for (const path in childRouters) {\n this.logger.default('Configuring Child Router at Path', { path });\n\n router.use(`/${path}`, childRouters[path]);\n }\n return router;\n }\n\n public addChildRouter = (path: string, router: Router) => {\n this.childRouters[path] = router;\n }\n\n /* istanbul ignore next */\n protected configureItemActions(): Record<string, ActionMethod> {\n this.logger.debug('ARouter - No Item Actions Configured');\n return {};\n }\n\n /* istanbul ignore next */\n protected configureAllActions(): Record<string, AllActionMethods> {\n this.logger.debug('ARouter - No All Actions Configured');\n return {};\n }\n\n /* istanbul ignore next */\n public getRouter(): Router {\n const router = Router();\n this.configure(router);\n return router;\n }\n\n /* istanbul ignore next */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected createItem = async (req: Request, res: Response): Promise<Response<any, Record<string, any>>> => {\n throw new Error('Method not implemented in an abstract router');\n };\n\n // TODO: Probably a better way to do this, but this postCreate hook only needs the item.\n /* istanbul ignore next */\n public postCreateItem = async (item: Item<S, L1, L2, L3, L4, L5>): Promise<Item<S, L1, L2, L3, L4, L5>> => {\n this.logger.default('Post Create Item', { item });\n return item;\n };\n\n protected deleteItem = async (req: Request, res: Response): Promise<Response<any, Record<string, any>>> => {\n this.logger.default('Deleting Item', { query: req.query, params: req.params, locals: res.locals });\n const ik = this.getIk(res);\n const removedItem = await this.lib.remove(ik);\n const item = validatePK(removedItem, this.getPkType());\n return res.json(item);\n };\n\n /* eslint-disable */\n /* istanbul ignore next */\n protected findItems = async (req: Request, res: Response): Promise<Response<any, Record<string, any>>> => {\n throw new Error('Method not implemented in an abstract router');\n };\n /* eslint-enable */\n\n protected getItem = async (req: Request, res: Response) => {\n this.logger.default('Getting Item', { query: req.query, params: req.params, locals: res.locals });\n const ik = this.getIk(res);\n try {\n // TODO: What error does validate PK throw, when can that fail?\n const item = validatePK(await this.lib.get(ik), this.getPkType());\n return res.json(item);\n } catch (err: any) {\n if (err instanceof NotFoundError) {\n this.logger.error('Item Not Found', { ik, message: err?.message, stack: err?.stack });\n return res.status(404).json({\n ik,\n message: \"Item Not Found\",\n });\n } else {\n this.logger.error('General Error', { ik, message: err?.message, stack: err?.stack });\n return res.status(500).json({\n ik,\n message: \"General Error\",\n });\n }\n }\n }\n\n protected updateItem = async (req: Request, res: Response) => {\n this.logger.default('Updating Item',\n { body: req?.body, query: req?.query, params: req?.params, locals: res?.locals });\n const ik = this.getIk(res);\n const itemToUpdate = this.convertDates(req.body as ItemProperties<S, L1, L2, L3, L4, L5>);\n const retItem = validatePK(await this.lib.update(ik, itemToUpdate), this.getPkType());\n return res.json(retItem);\n };\n\n public convertDates = (item: Item<S, L1, L2, L3, L4, L5> | ItemProperties<S, L1, L2, L3, L4, L5>):\n Item<S, L1, L2, L3, L4, L5> | ItemProperties<S, L1, L2, L3, L4, L5> => {\n const events = item.events as Record<string, ItemEvent>;\n this.logger.default('Converting Dates', { item });\n if (events) {\n Object.keys(events).forEach((key: string) => {\n Object.assign(events, {\n [key]: deepmerge(events[key], { at: events[key].at ? new Date(events[key].at) : null })\n });\n });\n }\n Object.assign(item, { events });\n return item;\n };\n\n // TODO: Maybe just simplify this and require that everything is a UUID?\n /**\n * This method might be an annoyance, but we need to capture a few cases where someone passes\n * a PK parameter that has an odd string in it.\n *\n * @param pkParamValue The value of the primary key parameter\n * @returns if the value is valid.\n */\n protected validatePKParam = (pkParamValue: string): boolean => {\n let validPkParam = true;\n if (pkParamValue.length <= 0) {\n this.logger.error('Primary Key is an Empty String', { pkParamValue });\n validPkParam = false;\n } else if (pkParamValue === 'undefined') {\n this.logger.error('Primary Key is the string \\'undefined\\'', { pkParamValue });\n validPkParam = false;\n }\n return validPkParam;\n }\n\n}\n","import {\n ComKey, Item, ItemQuery, LocKey, LocKeyArray, paramsToQuery, PriKey, QueryParams, validatePK\n} from \"@fjell/core\";\nimport { Request, Response } from \"express\";\nimport { ItemRouter, ItemRouterOptions } from \"@/ItemRouter\";\nimport LibLogger from \"@/logger\";\nimport { Contained } from \"@fjell/lib\";\n\nconst logger = LibLogger.get('CItemRouter');\ninterface ParsedQuery {\n [key: string]: undefined | string | string[] | ParsedQuery | ParsedQuery[];\n}\n\nexport class CItemRouter<\n T extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n> extends ItemRouter<S, L1, L2, L3, L4, L5> {\n\n private parentRoute: ItemRouter<L1, L2, L3, L4, L5, never>;\n\n constructor(\n lib: Contained.Operations<T, S, L1, L2, L3, L4, L5>,\n type: S,\n parentRoute: ItemRouter<L1, L2, L3, L4, L5, never>,\n options: ItemRouterOptions = {},\n ) {\n super(lib, type, options);\n this.parentRoute = parentRoute;\n }\n\n public hasParent(): boolean {\n return !!this.parentRoute;\n }\n\n public getIk(res: Response): ComKey<S, L1, L2, L3, L4, L5> {\n const pri = this.getPk(res) as PriKey<S>;\n const loc = this.getLocations(res) as LocKeyArray<L1, L2, L3, L4, L5>;\n return { kt: pri.kt, pk: pri.pk, loc }\n }\n\n public getLKA(res: Response): LocKeyArray<S, L1, L2, L3, L4> {\n /**\n * A location key array is passed to a child router to provide contextfor the items it will\n * be working with. It is always a concatenation of \"My LKA\" + \"Parent LKA\" which will\n * bubble all the way up to the root Primary.\n */\n let lka: LocKey<S | L1 | L2 | L3 | L4>[] = [this.getLk(res)];\n lka = lka.concat(this.parentRoute.getLKA(res) as LocKey<S | L1 | L2 | L3 | L4>[]);\n return lka as LocKeyArray<S, L1, L2, L3, L4>;\n }\n\n public getLocations(res: Response): LocKeyArray<L1, L2, L3, L4, L5> {\n return this.parentRoute.getLKA(res) as LocKeyArray<L1, L2, L3, L4, L5>;\n }\n\n protected createItem = async (req: Request, res: Response) => {\n logger.trace('Creating Item 2',\n { body: req?.body, query: req?.query, params: req?.params, locals: res?.locals });\n const itemToCreate = this.convertDates(req.body as Item<S, L1, L2, L3, L4, L5>);\n let item =\n validatePK(await this.lib.create(\n itemToCreate, { locations: this.getLocations(res) }), this.getPkType()) as Item<S, L1, L2, L3, L4, L5>;\n item = await this.postCreateItem(item);\n return res.json(item);\n };\n\n /* eslint-disable */\n protected findItems = async (req: Request, res: Response) => {\n logger.trace('Finding Items', { query: req.query, params: req.params, locals: res.locals });\n\n const query: ParsedQuery = req.query as unknown as ParsedQuery;\n const finder = query['finder'] as string;\n const finderParams = query['finderParams'] as string;\n\n let items: Item<S, L1, L2, L3, L4, L5>[] = [];\n\n if( finder ) { \n // If finder is defined? Call a finder.\n items = await this.lib.find(finder, JSON.parse(finderParams), this.getLocations(res));\n } else {\n // TODO: This is once of the more important places to perform some validaation and feedback\n const itemQuery: ItemQuery = paramsToQuery(req.query as QueryParams);\n items = await this.lib.all(itemQuery, this.getLocations(res));\n }\n\n return res.json(items.map((item: Item<S, L1, L2, L3, L4, L5>) => validatePK(item, this.getPkType())));\n };\n /* eslint-enable */\n\n}\n","import { Item, ItemQuery, paramsToQuery, PriKey, QueryParams, validatePK } from \"@fjell/core\";\nimport { Primary } from \"@fjell/lib\";\nimport { ItemRouter, ItemRouterOptions } from \"@/ItemRouter\";\nimport { Request, Response } from \"express\";\nimport LibLogger from \"@/logger\";\n\nconst logger = LibLogger.get('PItemRouter');\n\ninterface ParsedQuery {\n [key: string]: undefined | string | string[] | ParsedQuery | ParsedQuery[];\n}\n\nexport class PItemRouter<T extends Item<S>, S extends string> extends ItemRouter<S> {\n\n constructor(lib: Primary.Operations<T, S>, keyType: S, options: ItemRouterOptions = {}) {\n super(lib, keyType, options);\n }\n\n public getIk(res: Response): PriKey<S> {\n const pri = this.getPk(res) as PriKey<S>;\n return pri\n }\n\n public createItem = async (req: Request, res: Response) => {\n logger.default('Creating Item 2', { body: req.body, query: req.query, params: req.params, locals: res.locals });\n const itemToCreate = this.convertDates(req.body as Item<S>);\n let item =\n validatePK(await this.lib.create(itemToCreate), this.getPkType()) as Item<S>;\n item = await this.postCreateItem(item);\n return res.json(item);\n };\n\n /* eslint-disable */\n protected findItems = async (req: Request, res: Response) => {\n logger.default('Finding Items', { query: req.query, params: req.params, locals: res.locals });\n\n let items: Item<S>[] = [];\n\n const query: ParsedQuery = req.query as unknown as ParsedQuery;\n const finder = query['finder'] as string;\n const finderParams = query['finderParams'] as string;\n\n if( finder ) { \n // If finder is defined? Call a finder.\n logger.default('Finding Items with a finder', { finder, finderParams });\n items = await this.lib.find(finder, JSON.parse(finderParams));\n } else {\n logger.default('Finding Items with a query', { query: req.query });\n // TODO: This is once of the more important places to perform some validaation and feedback\n const itemQuery: ItemQuery = paramsToQuery(req.query as QueryParams);\n items = await this.lib.all(itemQuery);\n }\n\n return res.json(items.map((item: Item<S>) => validatePK(item, this.getPkType())));\n };\n /* eslint-enable */\n}\n"],"names":["LibLogger","Logging","getLogger","ItemRouter","getLk","res","kt","keyType","lk","locals","getPkParam","getLKA","getPk","cPK","getPkType","getLocations","Error","getIk","logger","debug","router","Router","configure","lib","options","_define_property","childRouters","itemActions","postItemAction","req","default","query","params","ik","actionKey","path","substring","lastIndexOf","error","status","json","item","validatePK","get","body","err","message","stack","pkType","findItems","post","createItem","allActions","configureAllActions","Object","keys","forEach","itemRouter","getItem","put","updateItem","delete","deleteItem","configureItemActions","pkParam","use","validatePrimaryKeyValue","configureChildRouters","next","pkParamValue","validatePKParam","addChildRouter","postCreateItem","removedItem","remove","NotFoundError","itemToUpdate","convertDates","retItem","update","events","key","assign","deepmerge","at","Date","validPkParam","length","CItemRouter","hasParent","parentRoute","pri","loc","pk","lka","concat","type","trace","itemToCreate","create","locations","finder","finderParams","items","find","JSON","parse","itemQuery","paramsToQuery","all","map","PItemRouter"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/logger.ts","../src/ItemRouter.ts","../src/CItemRouter.ts","../src/PItemRouter.ts"],"sourcesContent":["import Logging from '@fjell/logging';\n\nconst LibLogger = Logging.getLogger('@fjell/express-router');\n\nexport default LibLogger;\n","import {\n ComKey,\n cPK,\n Item,\n ItemEvent,\n ItemProperties,\n LocKey,\n LocKeyArray,\n PriKey,\n validatePK\n} from \"@fjell/core\";\nimport { NotFoundError, Operations } from \"@fjell/lib\";\nimport deepmerge from \"deepmerge\";\nimport { Request, Response, Router } from \"express\";\nimport LibLogger from \"./logger\";\n\nexport type ItemRouterOptions = Record<string, never>;\n\nexport class ItemRouter<\n S extends string,\n L1 extends string = never,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n> {\n\n protected lib: Operations<Item<S, L1, L2, L3, L4, L5>, S, L1, L2, L3, L4, L5>;\n private keyType: S;\n protected options: ItemRouterOptions;\n private childRouters: Record<string, Router> = {};\n private logger;\n\n constructor(\n lib: Operations<Item<S, L1, L2, L3, L4, L5>, S, L1, L2, L3, L4, L5>,\n keyType: S,\n options: ItemRouterOptions = {}\n ) {\n this.lib = lib;\n this.keyType = keyType;\n this.options = options;\n this.logger = LibLogger.get(\"ItemRouter\", keyType);\n }\n\n public getPkType = (): S => {\n return this.keyType;\n }\n\n protected getPkParam = (): string => {\n return `${this.getPkType()}Pk`;\n }\n\n protected getLk(res: Response): LocKey<S> {\n return { kt: this.keyType, lk: res.locals[this.getPkParam()] };\n }\n\n // this is meant to be consumed by children routers\n public getLKA(res: Response): LocKeyArray<S, L1, L2, L3, L4> {\n return [this.getLk(res)] as LocKeyArray<S, L1, L2, L3, L4>;\n }\n\n public getPk(res: Response): PriKey<S> {\n return cPK<S>(res.locals[this.getPkParam()], this.getPkType());\n }\n\n // Unless this is a contained router, the locations will always be an empty array.\n /* eslint-disable */\n protected getLocations(res: Response): LocKeyArray<L1, L2, L3, L4, L5> | [] {\n throw new Error('Method not implemented in an abstract router');\n }\n /* eslint-enable */\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected getIk(res: Response): PriKey<S> | ComKey<S, L1, L2, L3, L4, L5> {\n throw new Error('Method not implemented in an abstract router');\n }\n\n protected postItemAction = async (req: Request, res: Response) => {\n this.logger.default('Getting Item', { query: req?.query, params: req?.params, locals: res?.locals });\n const ik = this.getIk(res);\n const actionKey = req.path.substring(req.path.lastIndexOf('/') + 1);\n if (!this.lib.actions) {\n this.logger.error('Item Actions are not configured');\n res.status(500).json({ error: 'Item Actions are not configured' });\n return;\n }\n const action = this.lib.actions[actionKey];\n if (!action) {\n this.logger.error('Item Action is not configured', { actionKey });\n res.status(500).json({ error: 'Item Action is not configured' });\n return;\n }\n try {\n res.json(await this.lib.action(ik, actionKey, req.body));\n } catch (err: any) {\n this.logger.error('Error in Item Action', { message: err?.message, stack: err?.stack });\n res.status(500).json(err);\n }\n }\n\n protected getItemFacet = async (req: Request, res: Response) => {\n this.logger.default('Getting Item', { query: req?.query, params: req?.params, locals: res?.locals });\n const ik = this.getIk(res);\n const facetKey = req.path.substring(req.path.lastIndexOf('/') + 1);\n if (!this.lib.facets) {\n this.logger.error('Item Facets are not configured');\n res.status(500).json({ error: 'Item Facets are not configured' });\n return;\n }\n const facet = this.lib.facets[facetKey];\n if (!facet) {\n this.logger.error('Item Facet is not configured', { facetKey });\n res.status(500).json({ error: 'Item Facet is not configured' });\n return;\n }\n try {\n res.json(await this.lib.facet(ik, facetKey, req.params));\n } catch (err: any) {\n this.logger.error('Error in Item Facet', { message: err?.message, stack: err?.stack });\n res.status(500).json(err);\n }\n }\n\n private configure = (router: Router) => {\n this.logger.default('Configuring Router', { pkType: this.getPkType() });\n router.get('/', this.findItems);\n router.post('/', this.createItem);\n\n // const allActions = this.configureAllActions();\n // this.logger.debug('All Actions supplied to Router', { allActions });\n // if (allActions) {\n // Object.keys(allActions).forEach((actionKey) => {\n // this.logger.default('Configuring All Action', { actionKey });\n // // TODO: Ok, this is a bit of a hack, but we need to customize the types of the request handlers\n // router.post(`/${actionKey}`, ...allActions[actionKey]);\n // });\n // }\n\n const itemRouter = Router();\n itemRouter.get('/', this.getItem);\n itemRouter.put('/', this.updateItem);\n itemRouter.delete('/', this.deleteItem);\n\n this.logger.debug('Item Actions supplied to Router', { itemActions: this.lib.actions });\n if (this.lib.actions) {\n Object.keys(this.lib.actions).forEach((actionKey) => {\n this.logger.default('Configuring Item Action', { actionKey });\n // TODO: Ok, this is a bit of a hack, but we need to customize the types of the request handlers\n itemRouter.post(`/${actionKey}`, this.postItemAction)\n });\n }\n\n this.logger.debug('Item Facets supplied to Router', { itemFacets: this.lib.facets });\n if (this.lib.facets) {\n Object.keys(this.lib.facets).forEach((facetKey) => {\n this.logger.default('Configuring Item Facet', { facetKey });\n // TODO: Ok, this is a bit of a hack, but we need to customize the types of the request handlers\n itemRouter.get(`/${facetKey}`, this.getItemFacet)\n });\n }\n\n this.logger.default('Configuring Item Operations under PK Param', { pkParam: this.getPkParam() });\n router.use(`/:${this.getPkParam()}`, this.validatePrimaryKeyValue, itemRouter);\n\n if (this.childRouters) {\n this.configureChildRouters(itemRouter, this.childRouters);\n }\n return router;\n }\n\n private validatePrimaryKeyValue = (req: Request, res: Response, next: any) => {\n const pkParamValue = req.params[this.getPkParam()];\n if (this.validatePKParam(pkParamValue)) {\n res.locals[this.getPkParam()] = pkParamValue;\n next();\n } else {\n this.logger.error('Invalid Primary Key', { pkParamValue, path: req?.path });\n res.status(500).json({ error: 'Invalid Primary Key', path: req?.path });\n }\n }\n\n private configureChildRouters = (router: Router, childRouters: Record<string, Router>) => {\n for (const path in childRouters) {\n this.logger.default('Configuring Child Router at Path', { path });\n\n router.use(`/${path}`, childRouters[path]);\n }\n return router;\n }\n\n public addChildRouter = (path: string, router: Router) => {\n this.childRouters[path] = router;\n }\n\n /* istanbul ignore next */\n public getRouter(): Router {\n const router = Router();\n this.configure(router);\n return router;\n }\n\n /* istanbul ignore next */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected createItem = async (req: Request, res: Response): Promise<void> => {\n throw new Error('Method not implemented in an abstract router');\n };\n\n // TODO: Probably a better way to do this, but this postCreate hook only needs the item.\n /* istanbul ignore next */\n public postCreateItem = async (item: Item<S, L1, L2, L3, L4, L5>): Promise<Item<S, L1, L2, L3, L4, L5>> => {\n this.logger.default('Post Create Item', { item });\n return item;\n };\n\n protected deleteItem = async (req: Request, res: Response): Promise<void> => {\n this.logger.default('Deleting Item', { query: req.query, params: req.params, locals: res.locals });\n const ik = this.getIk(res);\n const removedItem = await this.lib.remove(ik);\n const item = validatePK(removedItem, this.getPkType());\n res.json(item);\n };\n\n /* eslint-disable */\n /* istanbul ignore next */\n protected findItems = async (req: Request, res: Response): Promise<void> => {\n throw new Error('Method not implemented in an abstract router');\n };\n /* eslint-enable */\n\n protected getItem = async (req: Request, res: Response) => {\n this.logger.default('Getting Item', { query: req.query, params: req.params, locals: res.locals });\n const ik = this.getIk(res);\n try {\n // TODO: What error does validate PK throw, when can that fail?\n const item = validatePK(await this.lib.get(ik), this.getPkType());\n res.json(item);\n } catch (err: any) {\n if (err instanceof NotFoundError) {\n this.logger.error('Item Not Found', { ik, message: err?.message, stack: err?.stack });\n res.status(404).json({\n ik,\n message: \"Item Not Found\",\n });\n } else {\n this.logger.error('General Error', { ik, message: err?.message, stack: err?.stack });\n res.status(500).json({\n ik,\n message: \"General Error\",\n });\n }\n }\n }\n\n protected updateItem = async (req: Request, res: Response) => {\n this.logger.default('Updating Item',\n { body: req?.body, query: req?.query, params: req?.params, locals: res?.locals });\n const ik = this.getIk(res);\n const itemToUpdate = this.convertDates(req.body as ItemProperties<S, L1, L2, L3, L4, L5>);\n const retItem = validatePK(await this.lib.update(ik, itemToUpdate), this.getPkType());\n res.json(retItem);\n };\n\n public convertDates = (item: Item<S, L1, L2, L3, L4, L5> | ItemProperties<S, L1, L2, L3, L4, L5>):\n Item<S, L1, L2, L3, L4, L5> | ItemProperties<S, L1, L2, L3, L4, L5> => {\n const events = item.events as Record<string, ItemEvent>;\n this.logger.default('Converting Dates', { item });\n if (events) {\n Object.keys(events).forEach((key: string) => {\n Object.assign(events, {\n [key]: deepmerge(events[key], { at: events[key].at ? new Date(events[key].at) : null })\n });\n });\n }\n Object.assign(item, { events });\n return item;\n };\n\n // TODO: Maybe just simplify this and require that everything is a UUID?\n /**\n * This method might be an annoyance, but we need to capture a few cases where someone passes\n * a PK parameter that has an odd string in it.\n *\n * @param pkParamValue The value of the primary key parameter\n * @returns if the value is valid.\n */\n protected validatePKParam = (pkParamValue: string): boolean => {\n let validPkParam = true;\n if (pkParamValue.length <= 0) {\n this.logger.error('Primary Key is an Empty String', { pkParamValue });\n validPkParam = false;\n } else if (pkParamValue === 'undefined') {\n this.logger.error('Primary Key is the string \\'undefined\\'', { pkParamValue });\n validPkParam = false;\n }\n return validPkParam;\n }\n\n}\n","import {\n ComKey, Item, ItemQuery, LocKey, LocKeyArray, paramsToQuery, PriKey, QueryParams, validatePK\n} from \"@fjell/core\";\nimport { Request, Response } from \"express\";\nimport { ItemRouter, ItemRouterOptions } from \"@/ItemRouter\";\nimport LibLogger from \"@/logger\";\nimport { Contained } from \"@fjell/lib\";\n\nconst logger = LibLogger.get('CItemRouter');\ninterface ParsedQuery {\n [key: string]: undefined | string | string[] | ParsedQuery | ParsedQuery[];\n}\n\nexport class CItemRouter<\n T extends Item<S, L1, L2, L3, L4, L5>,\n S extends string,\n L1 extends string,\n L2 extends string = never,\n L3 extends string = never,\n L4 extends string = never,\n L5 extends string = never\n> extends ItemRouter<S, L1, L2, L3, L4, L5> {\n\n private parentRoute: ItemRouter<L1, L2, L3, L4, L5, never>;\n\n constructor(\n lib: Contained.Operations<T, S, L1, L2, L3, L4, L5>,\n type: S,\n parentRoute: ItemRouter<L1, L2, L3, L4, L5, never>,\n options: ItemRouterOptions = {},\n ) {\n super(lib as any, type, options);\n this.parentRoute = parentRoute;\n }\n\n public hasParent(): boolean {\n return !!this.parentRoute;\n }\n\n public getIk(res: Response): ComKey<S, L1, L2, L3, L4, L5> {\n const pri = this.getPk(res) as PriKey<S>;\n const loc = this.getLocations(res) as LocKeyArray<L1, L2, L3, L4, L5>;\n return { kt: pri.kt, pk: pri.pk, loc }\n }\n\n public getLKA(res: Response): LocKeyArray<S, L1, L2, L3, L4> {\n /**\n * A location key array is passed to a child router to provide contextfor the items it will\n * be working with. It is always a concatenation of \"My LKA\" + \"Parent LKA\" which will\n * bubble all the way up to the root Primary.\n */\n let lka: LocKey<S | L1 | L2 | L3 | L4>[] = [this.getLk(res)];\n lka = lka.concat(this.parentRoute.getLKA(res) as LocKey<S | L1 | L2 | L3 | L4>[]);\n return lka as LocKeyArray<S, L1, L2, L3, L4>;\n }\n\n public getLocations(res: Response): LocKeyArray<L1, L2, L3, L4, L5> {\n return this.parentRoute.getLKA(res) as LocKeyArray<L1, L2, L3, L4, L5>;\n }\n\n protected createItem = async (req: Request, res: Response) => {\n logger.trace('Creating Item 2',\n { body: req?.body, query: req?.query, params: req?.params, locals: res?.locals });\n const itemToCreate = this.convertDates(req.body as Item<S, L1, L2, L3, L4, L5>);\n let item =\n validatePK(await this.lib.create(\n itemToCreate, { locations: this.getLocations(res) }), this.getPkType()) as Item<S, L1, L2, L3, L4, L5>;\n item = await this.postCreateItem(item);\n res.json(item);\n };\n\n protected findItems = async (req: Request, res: Response) => {\n logger.trace('Finding Items', { query: req.query, params: req.params, locals: res.locals });\n\n const query: ParsedQuery = req.query as unknown as ParsedQuery;\n const finder = query['finder'] as string;\n const finderParams = query['finderParams'] as string;\n const one = query['one'] as string;\n\n let items: Item<S, L1, L2, L3, L4, L5>[] = [];\n\n if (finder) {\n // If finder is defined? Call a finder.\n logger.trace('Finding Items with a finder', { finder, finderParams, one });\n\n if (one === 'true') {\n const item = await (this.lib as any).findOne(finder, JSON.parse(finderParams), this.getLocations(res));\n items = item ? [item] : [];\n } else {\n items = await this.lib.find(finder, JSON.parse(finderParams), this.getLocations(res));\n }\n } else {\n logger.trace('Finding Items with a query', { query: req.query });\n // TODO: This is once of the more important places to perform some validaation and feedback\n const itemQuery: ItemQuery = paramsToQuery(req.query as QueryParams);\n items = await this.lib.all(itemQuery, this.getLocations(res));\n }\n\n res.json(items.map((item: Item<S, L1, L2, L3, L4, L5>) => validatePK(item, this.getPkType())));\n };\n\n}\n","import { Item, ItemQuery, paramsToQuery, PriKey, QueryParams, validatePK } from \"@fjell/core\";\nimport { Primary } from \"@fjell/lib\";\nimport { ItemRouter, ItemRouterOptions } from \"@/ItemRouter\";\nimport { Request, Response } from \"express\";\nimport LibLogger from \"@/logger\";\n\nconst logger = LibLogger.get('PItemRouter');\n\ninterface ParsedQuery {\n [key: string]: undefined | string | string[] | ParsedQuery | ParsedQuery[];\n}\n\nexport class PItemRouter<T extends Item<S>, S extends string> extends ItemRouter<S> {\n\n constructor(lib: Primary.Operations<T, S>, keyType: S, options: ItemRouterOptions = {}) {\n super(lib as any, keyType, options);\n }\n\n public getIk(res: Response): PriKey<S> {\n const pri = this.getPk(res) as PriKey<S>;\n return pri\n }\n\n public createItem = async (req: Request, res: Response) => {\n logger.default('Creating Item 2', { body: req.body, query: req.query, params: req.params, locals: res.locals });\n const itemToCreate = this.convertDates(req.body as Item<S>);\n let item =\n validatePK(await this.lib.create(itemToCreate), this.getPkType()) as Item<S>;\n item = await this.postCreateItem(item);\n res.json(item);\n };\n\n protected findItems = async (req: Request, res: Response) => {\n logger.default('Finding Items', { query: req.query, params: req.params, locals: res.locals });\n\n let items: Item<S>[] = [];\n\n const query: ParsedQuery = req.query as unknown as ParsedQuery;\n const finder = query['finder'] as string;\n const finderParams = query['finderParams'] as string;\n const one = query['one'] as string;\n\n if (finder) {\n // If finder is defined? Call a finder.\n logger.default('Finding Items with a finder', { finder, finderParams, one });\n\n if (one === 'true') {\n const item = await (this.lib as any).findOne(finder, JSON.parse(finderParams));\n items = item ? [item] : [];\n } else {\n items = await this.lib.find(finder, JSON.parse(finderParams));\n }\n } else {\n logger.default('Finding Items with a query', { query: req.query });\n // TODO: This is once of the more important places to perform some validaation and feedback\n const itemQuery: ItemQuery = paramsToQuery(req.query as QueryParams);\n items = await this.lib.all(itemQuery);\n }\n\n res.json(items.map((item: Item<S>) => validatePK(item, this.getPkType())));\n };\n\n}\n"],"names":["LibLogger","Logging","getLogger","ItemRouter","getLk","res","kt","keyType","lk","locals","getPkParam","getLKA","getPk","cPK","getPkType","getLocations","Error","getIk","getRouter","router","Router","configure","lib","options","_define_property","childRouters","logger","postItemAction","req","default","query","params","ik","actionKey","path","substring","lastIndexOf","actions","error","status","json","action","body","err","message","stack","getItemFacet","facetKey","facets","facet","pkType","get","findItems","post","createItem","itemRouter","getItem","put","updateItem","delete","deleteItem","debug","itemActions","Object","keys","forEach","itemFacets","pkParam","use","validatePrimaryKeyValue","configureChildRouters","next","pkParamValue","validatePKParam","addChildRouter","postCreateItem","item","removedItem","remove","validatePK","NotFoundError","itemToUpdate","convertDates","retItem","update","events","key","assign","deepmerge","at","Date","validPkParam","length","CItemRouter","hasParent","parentRoute","pri","loc","pk","lka","concat","type","trace","itemToCreate","create","locations","finder","finderParams","one","items","findOne","JSON","parse","find","itemQuery","paramsToQuery","all","map","PItemRouter"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"logger.cjs","sources":["../src/logger.ts"],"sourcesContent":["import Logging from '@fjell/logging';\n\nconst LibLogger = Logging.getLogger('@fjell/express-router');\n\nexport default LibLogger;\n"],"names":["LibLogger","Logging","getLogger"],"mappings":";;;;;;AAEMA,MAAAA,SAAAA,GAAYC,OAAQC,CAAAA,SAAS,CAAC,uBAAA;;;;"}
1
+ {"version":3,"file":"logger.cjs","sources":["../src/logger.ts"],"sourcesContent":["import Logging from '@fjell/logging';\n\nconst LibLogger = Logging.getLogger('@fjell/express-router');\n\nexport default LibLogger;\n"],"names":["LibLogger","Logging","getLogger"],"mappings":";;;;;;AAEA,MAAMA,SAAAA,GAAYC,OAAAA,CAAQC,SAAS,CAAC,uBAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sources":["../src/logger.ts"],"sourcesContent":["import Logging from '@fjell/logging';\n\nconst LibLogger = Logging.getLogger('@fjell/express-router');\n\nexport default LibLogger;\n"],"names":["LibLogger","Logging","getLogger"],"mappings":";;AAEMA,MAAAA,SAAAA,GAAYC,OAAQC,CAAAA,SAAS,CAAC,uBAAA;;;;"}
1
+ {"version":3,"file":"logger.js","sources":["../src/logger.ts"],"sourcesContent":["import Logging from '@fjell/logging';\n\nconst LibLogger = Logging.getLogger('@fjell/express-router');\n\nexport default LibLogger;\n"],"names":["LibLogger","Logging","getLogger"],"mappings":";;AAEA,MAAMA,SAAAA,GAAYC,OAAAA,CAAQC,SAAS,CAAC,uBAAA;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fjell/express-router",
3
- "version": "4.4.1",
3
+ "version": "4.4.3",
4
4
  "license": "Apache-2.0",
5
5
  "description": "Express Router for Fjell",
6
6
  "engines": {
@@ -18,50 +18,26 @@
18
18
  "type": "module",
19
19
  "dependencies": {
20
20
  "@fjell/core": "^4.4.3",
21
- "@fjell/lib": "^4.4.1",
21
+ "@fjell/lib": "^4.4.3",
22
22
  "@fjell/logging": "^4.4.3",
23
- "@google-cloud/firestore": "^7.11.1",
24
- "cors": "^2.8.5",
25
- "dayjs": "^1.11.13",
26
23
  "deepmerge": "^4.3.1",
27
- "dotenv": "^16.5.0",
28
- "express": "^4.21.2",
29
- "multer": "1.4.5-lts.2",
30
- "nodemailer": "^6.10.1",
31
- "response-time": "^2.3.3",
32
- "specifier-resolution-node": "^1.1.4",
33
- "supertest": "^7.1.1",
34
- "winston": "^3.17.0"
24
+ "express": "^5.1.0"
35
25
  },
36
26
  "devDependencies": {
37
- "@babel/preset-env": "^7.27.2",
38
- "@babel/preset-react": "^7.27.1",
39
- "@babel/preset-typescript": "^7.27.1",
40
27
  "@eslint/eslintrc": "^3.3.1",
41
28
  "@eslint/js": "^9.29.0",
42
- "@jest/globals": "^29.7.0",
43
- "@swc/core": "^1.12.1",
44
- "@tsconfig/recommended": "^1.0.9",
45
- "@types/cors": "^2.8.19",
46
- "@types/express": "^4.17.23",
47
- "@types/jest": "^29.5.14",
48
- "@types/multer": "^1.4.13",
49
- "@types/node": "^20.19.1",
50
- "@types/nodemailer": "^6.4.17",
51
- "@types/react": "^18.3.23",
52
- "@types/response-time": "^2.3.9",
29
+ "@swc/core": "^1.12.5",
30
+ "@tsconfig/recommended": "^1.0.10",
31
+ "@types/express": "^5.0.3",
32
+ "@types/node": "^24.0.3",
53
33
  "@typescript-eslint/eslint-plugin": "^8.34.1",
54
34
  "@typescript-eslint/parser": "^8.34.1",
55
35
  "@vitest/coverage-v8": "^3.2.4",
56
36
  "@vitest/ui": "^3.2.4",
57
- "concurrently": "^9.1.2",
58
37
  "eslint": "^9.29.0",
59
- "jest": "^29.7.0",
60
38
  "nodemon": "^3.1.10",
61
39
  "rimraf": "^6.0.1",
62
- "ts-jest": "^29.4.0",
63
40
  "ts-node": "^10.9.2",
64
- "tsc-alias": "^1.8.16",
65
41
  "typescript": "^5.8.3",
66
42
  "vite": "^6.3.5",
67
43
  "vite-plugin-dts": "^4.5.4",
@@ -74,6 +50,7 @@
74
50
  },
75
51
  "scripts": {
76
52
  "build": "tsc --noEmit && vite build",
53
+ "dev": "nodemon --watch src --ext ts --exec 'pnpm build'",
77
54
  "lint": "eslint . --ext .ts --fix",
78
55
  "clean": "rimraf dist",
79
56
  "test": "pnpm run lint && vitest run --coverage"
@@ -29,7 +29,7 @@ export class CItemRouter<
29
29
  parentRoute: ItemRouter<L1, L2, L3, L4, L5, never>,
30
30
  options: ItemRouterOptions = {},
31
31
  ) {
32
- super(lib, type, options);
32
+ super(lib as any, type, options);
33
33
  this.parentRoute = parentRoute;
34
34
  }
35
35
 
@@ -66,30 +66,37 @@ export class CItemRouter<
66
66
  validatePK(await this.lib.create(
67
67
  itemToCreate, { locations: this.getLocations(res) }), this.getPkType()) as Item<S, L1, L2, L3, L4, L5>;
68
68
  item = await this.postCreateItem(item);
69
- return res.json(item);
69
+ res.json(item);
70
70
  };
71
71
 
72
- /* eslint-disable */
73
72
  protected findItems = async (req: Request, res: Response) => {
74
73
  logger.trace('Finding Items', { query: req.query, params: req.params, locals: res.locals });
75
74
 
76
75
  const query: ParsedQuery = req.query as unknown as ParsedQuery;
77
76
  const finder = query['finder'] as string;
78
77
  const finderParams = query['finderParams'] as string;
78
+ const one = query['one'] as string;
79
79
 
80
80
  let items: Item<S, L1, L2, L3, L4, L5>[] = [];
81
81
 
82
- if( finder ) {
82
+ if (finder) {
83
83
  // If finder is defined? Call a finder.
84
- items = await this.lib.find(finder, JSON.parse(finderParams), this.getLocations(res));
84
+ logger.trace('Finding Items with a finder', { finder, finderParams, one });
85
+
86
+ if (one === 'true') {
87
+ const item = await (this.lib as any).findOne(finder, JSON.parse(finderParams), this.getLocations(res));
88
+ items = item ? [item] : [];
89
+ } else {
90
+ items = await this.lib.find(finder, JSON.parse(finderParams), this.getLocations(res));
91
+ }
85
92
  } else {
93
+ logger.trace('Finding Items with a query', { query: req.query });
86
94
  // TODO: This is once of the more important places to perform some validaation and feedback
87
95
  const itemQuery: ItemQuery = paramsToQuery(req.query as QueryParams);
88
96
  items = await this.lib.all(itemQuery, this.getLocations(res));
89
97
  }
90
98
 
91
- return res.json(items.map((item: Item<S, L1, L2, L3, L4, L5>) => validatePK(item, this.getPkType())));
99
+ res.json(items.map((item: Item<S, L1, L2, L3, L4, L5>) => validatePK(item, this.getPkType())));
92
100
  };
93
- /* eslint-enable */
94
101
 
95
102
  }