@openstax/ts-utils 1.25.1-pre1 → 1.25.1

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.
@@ -10,7 +10,7 @@ export declare type DefaultErrors = {
10
10
  SessionExpiredError: SessionExpiredError;
11
11
  };
12
12
  export declare type Handlers<E> = {
13
- [T in keyof E]: (e: E[T], logger: Logger) => ApiResponse<number, any>;
13
+ [T in keyof E]?: (e: E[T], logger: Logger) => ApiResponse<number, any>;
14
14
  };
15
15
  export declare const defaultHandlers: Handlers<DefaultErrors>;
16
16
  /**
@@ -22,16 +22,17 @@ export const createErrorHandler = (inputHandlers) => {
22
22
  return async (e, logger) => {
23
23
  const name = isAppError(e) ? e.constructor.TYPE : e.constructor.name;
24
24
  const handler = handlers[name];
25
+ const logLevel = handler ? Level.Info : Level.Error;
26
+ logger.logEvent(logLevel, {
27
+ name: e.name,
28
+ message: e.message,
29
+ stack: e.stack,
30
+ });
25
31
  if (handler) {
26
32
  // convincing typescript that this error is the right kind for the handler
27
33
  // we looked up based on the errors name is very annoying
28
34
  return handler(e, logger);
29
35
  }
30
- logger.logEvent(Level.Error, {
31
- name: e.name,
32
- message: e.message,
33
- stack: e.stack,
34
- });
35
36
  return apiTextResponse(500, '500 Error');
36
37
  };
37
38
  };
@@ -105,7 +105,10 @@ const bindRoute = (services, appBinder, pathExtractor, matcher) => (route) => {
105
105
  const path = pathExtractor(request);
106
106
  const match = getParamsFromPath(path);
107
107
  if ((!matcher || matcher(request, route)) && match) {
108
- return () => route.handler(match.params, boundServiceProvider ? boundServiceProvider({ request, logger }, { route, params: match.params }) : undefined);
108
+ return {
109
+ name: route.name,
110
+ executor: () => route.handler(match.params, boundServiceProvider ? boundServiceProvider({ request, logger }, { route, params: match.params }) : undefined)
111
+ };
109
112
  }
110
113
  };
111
114
  };
@@ -158,11 +161,13 @@ export const makeGetRequestResponder = () => ({ routes, pathExtractor, routeMatc
158
161
  if (logExtractor) {
159
162
  logger.setContext(logExtractor(request));
160
163
  }
164
+ logger.log('begin request');
161
165
  try {
162
- const executor = mapFind(boundRoutes, (route) => route(request, logger));
163
- if (executor) {
166
+ const route = mapFind(boundRoutes, (route) => route(request, logger));
167
+ if (route) {
168
+ logger.log(`route matched ${route.name}`);
164
169
  const result = boundResponseMiddleware ?
165
- boundResponseMiddleware(executor(), { request, logger }) : executor();
170
+ boundResponseMiddleware(route.executor(), { request, logger }) : route.executor();
166
171
  if (isPromise(result) && errorHandler) {
167
172
  const errorHandlerWithMiddleware = (e) => boundResponseMiddleware ?
168
173
  boundResponseMiddleware(errorHandler(e, logger), { request, logger }) : errorHandler(e, logger);
@@ -173,6 +178,7 @@ export const makeGetRequestResponder = () => ({ routes, pathExtractor, routeMatc
173
178
  }
174
179
  }
175
180
  else if (boundResponseMiddleware) {
181
+ logger.log('no route matched, returning 404');
176
182
  return boundResponseMiddleware(undefined, { request, logger });
177
183
  }
178
184
  }
@@ -8,7 +8,9 @@ interface Initializer<C> {
8
8
  }
9
9
  export declare const fileSystemVersionedDocumentStore: <C extends string = "fileSystem">(initializer: Initializer<C>) => <T extends VersionedTDocument<T>>() => (configProvider: { [key in C]: {
10
10
  tableName: import("../../../config").ConfigValueProvider<string>;
11
- }; }) => <K extends keyof T, A extends ((...a: any[]) => Promise<VersionedDocumentAuthor>) | undefined>(_: {}, hashKey: K, getAuthor: A) => {
11
+ }; }) => <K extends keyof T, A extends ((...a: any[]) => Promise<VersionedDocumentAuthor>) | undefined>(_: {}, hashKey: K, options?: {
12
+ getAuthor?: A | undefined;
13
+ } | undefined) => {
12
14
  loadAllDocumentsTheBadWay: () => Promise<T[]>;
13
15
  getVersions: (id: T[K], startVersion?: number | undefined) => Promise<{
14
16
  items: T[];
@@ -1,6 +1,6 @@
1
1
  import { fileSystemUnversionedDocumentStore } from '../unversioned/file-system';
2
2
  const PAGE_LIMIT = 5;
3
- export const fileSystemVersionedDocumentStore = (initializer) => () => (configProvider) => (_, hashKey, getAuthor) => {
3
+ export const fileSystemVersionedDocumentStore = (initializer) => () => (configProvider) => (_, hashKey, options) => {
4
4
  const unversionedDocuments = fileSystemUnversionedDocumentStore(initializer)()(configProvider)({}, 'id');
5
5
  return {
6
6
  loadAllDocumentsTheBadWay: () => {
@@ -31,7 +31,7 @@ export const fileSystemVersionedDocumentStore = (initializer) => () => (configPr
31
31
  },
32
32
  prepareItem: async (item, ...authorArgs) => {
33
33
  // this getAuthor type is terrible
34
- const author = getAuthor ? await getAuthor(...authorArgs) : authorArgs[0];
34
+ const author = (options === null || options === void 0 ? void 0 : options.getAuthor) ? await options.getAuthor(...authorArgs) : authorArgs[0];
35
35
  const timestamp = new Date().getTime();
36
36
  return {
37
37
  document: { ...item, timestamp, author },
@@ -47,7 +47,7 @@ export const fileSystemVersionedDocumentStore = (initializer) => () => (configPr
47
47
  },
48
48
  putItem: async (item, ...authorArgs) => {
49
49
  var _a;
50
- const author = getAuthor ? await getAuthor(...authorArgs) : authorArgs[0];
50
+ const author = (options === null || options === void 0 ? void 0 : options.getAuthor) ? await options.getAuthor(...authorArgs) : authorArgs[0];
51
51
  const document = { ...item, timestamp: new Date().getTime(), author };
52
52
  const container = (_a = await unversionedDocuments.getItem(document[hashKey])) !== null && _a !== void 0 ? _a : { id: document[hashKey], items: [] };
53
53
  const updated = { ...container, items: [...container.items, document] };