@openstax/ts-utils 1.2.0 → 1.2.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.
Files changed (54) hide show
  1. package/dist/cjs/config/index.d.ts +0 -1
  2. package/dist/cjs/config/index.js +0 -1
  3. package/dist/cjs/errors.d.ts +5 -0
  4. package/dist/cjs/errors.js +4 -1
  5. package/dist/cjs/middleware/apiErrorHandler.d.ts +7 -0
  6. package/dist/cjs/middleware/apiErrorHandler.js +29 -0
  7. package/dist/cjs/middleware/apiSlowResponseMiddleware.d.ts +11 -0
  8. package/dist/cjs/middleware/apiSlowResponseMiddleware.js +43 -0
  9. package/dist/cjs/middleware/lambdaCorsResponseMiddleware.d.ts +10 -0
  10. package/dist/cjs/middleware/lambdaCorsResponseMiddleware.js +32 -0
  11. package/dist/cjs/middleware/throwNotFoundMiddleware.d.ts +1 -0
  12. package/dist/cjs/middleware/throwNotFoundMiddleware.js +11 -0
  13. package/dist/cjs/profile.d.ts +2 -0
  14. package/dist/cjs/routing/index.d.ts +14 -4
  15. package/dist/cjs/routing/index.js +16 -8
  16. package/dist/cjs/services/apiGateway/index.js +2 -1
  17. package/dist/cjs/services/authProvider/browser.js +1 -1
  18. package/dist/cjs/services/logger/console.d.ts +1 -0
  19. package/dist/cjs/services/logger/console.js +9 -0
  20. package/dist/cjs/services/logger/index.d.ts +14 -0
  21. package/dist/cjs/services/logger/index.js +20 -0
  22. package/dist/cjs/tsconfig.without-specs.cjs.tsbuildinfo +1 -1
  23. package/dist/esm/config/index.d.ts +0 -1
  24. package/dist/esm/config/index.js +0 -1
  25. package/dist/esm/errors.d.ts +5 -0
  26. package/dist/esm/errors.js +2 -0
  27. package/dist/esm/middleware/apiErrorHandler.d.ts +7 -0
  28. package/dist/esm/middleware/apiErrorHandler.js +25 -0
  29. package/dist/esm/middleware/apiSlowResponseMiddleware.d.ts +11 -0
  30. package/dist/esm/middleware/apiSlowResponseMiddleware.js +39 -0
  31. package/dist/esm/middleware/lambdaCorsResponseMiddleware.d.ts +10 -0
  32. package/dist/esm/middleware/lambdaCorsResponseMiddleware.js +28 -0
  33. package/dist/esm/middleware/throwNotFoundMiddleware.d.ts +1 -0
  34. package/dist/esm/middleware/throwNotFoundMiddleware.js +7 -0
  35. package/dist/esm/profile.d.ts +2 -0
  36. package/dist/esm/routing/index.d.ts +14 -4
  37. package/dist/esm/routing/index.js +16 -8
  38. package/dist/esm/services/apiGateway/index.js +2 -1
  39. package/dist/esm/services/authProvider/browser.js +1 -1
  40. package/dist/esm/services/logger/console.d.ts +1 -0
  41. package/dist/esm/services/logger/console.js +5 -0
  42. package/dist/esm/services/logger/index.d.ts +14 -0
  43. package/dist/esm/services/logger/index.js +16 -0
  44. package/dist/esm/tsconfig.without-specs.esm.tsbuildinfo +1 -1
  45. package/package.json +4 -1
  46. package/dist/README.md +0 -118
  47. package/dist/cjs/aws/securityTokenService.d.ts +0 -2
  48. package/dist/cjs/aws/securityTokenService.js +0 -6
  49. package/dist/cjs/config/awsAccountConfig.d.ts +0 -5
  50. package/dist/cjs/config/awsAccountConfig.js +0 -35
  51. package/dist/esm/aws/securityTokenService.d.ts +0 -2
  52. package/dist/esm/aws/securityTokenService.js +0 -3
  53. package/dist/esm/config/awsAccountConfig.d.ts +0 -5
  54. package/dist/esm/config/awsAccountConfig.js +0 -31
@@ -16,6 +16,5 @@ export * from './resolveConfigValue';
16
16
  export declare const stubConfig: <V extends string>(configValue: V) => ConfigValueProvider<V>;
17
17
  export * from './envConfig';
18
18
  export * from './replaceConfig';
19
- export * from './awsAccountConfig';
20
19
  export * from './awsParameterConfig';
21
20
  export * from './lambdaParameterConfig';
@@ -34,6 +34,5 @@ const stubConfig = (configValue) => configValue;
34
34
  exports.stubConfig = stubConfig;
35
35
  __exportStar(require("./envConfig"), exports);
36
36
  __exportStar(require("./replaceConfig"), exports);
37
- __exportStar(require("./awsAccountConfig"), exports);
38
37
  __exportStar(require("./awsParameterConfig"), exports);
39
38
  __exportStar(require("./lambdaParameterConfig"), exports);
@@ -1,3 +1,8 @@
1
+ export declare const isAppError: (e: any) => e is Error & {
2
+ constructor: {
3
+ TYPE: string;
4
+ };
5
+ };
1
6
  export declare class InvalidRequestError extends Error {
2
7
  static readonly TYPE = "InvalidRequestError";
3
8
  static matches: (e: any) => e is typeof InvalidRequestError;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SessionExpiredError = exports.NotFoundError = exports.UnauthorizedError = exports.InvalidRequestError = void 0;
3
+ exports.SessionExpiredError = exports.NotFoundError = exports.UnauthorizedError = exports.InvalidRequestError = exports.isAppError = void 0;
4
4
  /*
5
5
  * if code is split into multiple bundles, sometimes each bundle
6
6
  * will get its own definition of this module and then instanceof checks
@@ -15,6 +15,9 @@ exports.SessionExpiredError = exports.NotFoundError = exports.UnauthorizedError
15
15
  */
16
16
  const errorIsType = ({ TYPE }) => (e) => e instanceof Error
17
17
  && e.constructor.TYPE === TYPE;
18
+ const isAppError = (e) => e instanceof Error
19
+ && typeof e.constructor.TYPE === 'string';
20
+ exports.isAppError = isAppError;
18
21
  class InvalidRequestError extends Error {
19
22
  }
20
23
  exports.InvalidRequestError = InvalidRequestError;
@@ -0,0 +1,7 @@
1
+ import type { ApiResponse } from '../routing';
2
+ import type { Logger } from '../services/logger';
3
+ declare type Handlers = {
4
+ [key: string]: (e: Error, logger: Logger) => ApiResponse<number, any>;
5
+ };
6
+ export declare const createErrorHandler: (inputHandlers?: Handlers | undefined) => (e: Error, logger: Logger) => Promise<ApiResponse<number, any>>;
7
+ export {};
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createErrorHandler = void 0;
4
+ const errors_1 = require("../errors");
5
+ const routing_1 = require("../routing");
6
+ const logger_1 = require("../services/logger");
7
+ const defaultHandlers = {
8
+ UnauthorizedError: () => (0, routing_1.apiTextResponse)(401, '401 UnauthorizedError'),
9
+ SessionExpiredError: () => (0, routing_1.apiTextResponse)(440, '440 SessionExpiredError'),
10
+ NotFoundError: (e) => (0, routing_1.apiTextResponse)(404, e.message || '404 NotFoundError'),
11
+ InvalidRequestError: (e) => (0, routing_1.apiTextResponse)(400, e.message || '400 InvalidRequestError'),
12
+ };
13
+ const createErrorHandler = (inputHandlers) => {
14
+ const handlers = { ...defaultHandlers, ...inputHandlers };
15
+ return async (e, logger) => {
16
+ const name = (0, errors_1.isAppError)(e) ? e.constructor.TYPE : e.constructor.name;
17
+ const handler = handlers[name];
18
+ if (handler) {
19
+ return handler(e, logger);
20
+ }
21
+ logger.logEvent(logger_1.Level.Error, {
22
+ name: e.name,
23
+ message: e.message,
24
+ stack: e.stack,
25
+ });
26
+ return (0, routing_1.apiTextResponse)(500, '500 Error');
27
+ };
28
+ };
29
+ exports.createErrorHandler = createErrorHandler;
@@ -0,0 +1,11 @@
1
+ import type { ConfigProviderForConfig } from '../config';
2
+ import type { ApiResponse } from '../routing';
3
+ import type { Logger } from '../services/logger';
4
+ declare type Config = {
5
+ logResponseSlowerThan: string;
6
+ timeoutResponseAfter: string;
7
+ };
8
+ export declare const createSlowResponseMiddleware: (config: ConfigProviderForConfig<Config>) => () => (response: Promise<ApiResponse<number, any>> | undefined, { logger }: {
9
+ logger: Logger;
10
+ }) => Promise<ApiResponse<number, string>> | undefined;
11
+ export {};
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSlowResponseMiddleware = void 0;
4
+ const resolveConfigValue_1 = require("../config/resolveConfigValue");
5
+ const helpers_1 = require("../misc/helpers");
6
+ const routing_1 = require("../routing");
7
+ const logger_1 = require("../services/logger");
8
+ const createSlowResponseMiddleware = (config) => {
9
+ const getSlowThreshold = (0, helpers_1.once)(() => (0, resolveConfigValue_1.resolveConfigValue)(config.logResponseSlowerThan).then(result => parseInt(result, 10)));
10
+ const getTimeoutAfter = (0, helpers_1.once)(() => (0, resolveConfigValue_1.resolveConfigValue)(config.timeoutResponseAfter).then(result => parseInt(result, 10)));
11
+ return () => (response, { logger }) => {
12
+ const start = Date.now();
13
+ if (!response) {
14
+ return response;
15
+ }
16
+ return Promise.all([getSlowThreshold(), getTimeoutAfter()]).then(([slowThreshold, timeoutAfter]) => {
17
+ let timeout = undefined;
18
+ const timeoutPromise = isNaN(timeoutAfter)
19
+ ? undefined
20
+ : new Promise(resolve => timeout = setTimeout(() => {
21
+ logger.logEvent(logger_1.Level.Error, {
22
+ message: 'request processing timed out',
23
+ });
24
+ resolve((0, routing_1.apiTextResponse)(504, '504 Gateway Timeout'));
25
+ }, timeoutAfter));
26
+ const requestPromise = response.then(response => {
27
+ const time = Date.now() - start;
28
+ if (timeout !== undefined) {
29
+ clearTimeout(timeout);
30
+ }
31
+ if (time > slowThreshold) {
32
+ logger.logEvent(logger_1.Level.Warn, {
33
+ message: 'slow response',
34
+ time,
35
+ });
36
+ }
37
+ return response;
38
+ });
39
+ return timeoutPromise ? Promise.race([timeoutPromise, requestPromise]) : requestPromise;
40
+ });
41
+ };
42
+ };
43
+ exports.createSlowResponseMiddleware = createSlowResponseMiddleware;
@@ -0,0 +1,10 @@
1
+ import { APIGatewayProxyEventV2 } from 'aws-lambda';
2
+ import { ConfigProviderForConfig } from '../config';
3
+ import { ApiResponse } from '../routing';
4
+ declare type Config = {
5
+ corsAllowedHostRegex: string;
6
+ };
7
+ export declare const createLambdaCorsResponseMiddleware: (config: ConfigProviderForConfig<Config>) => (responsePromise: Promise<ApiResponse<number, any>> | undefined, { request }: {
8
+ request: APIGatewayProxyEventV2;
9
+ }) => Promise<ApiResponse<number, any>> | undefined;
10
+ export {};
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createLambdaCorsResponseMiddleware = void 0;
4
+ const resolveConfigValue_1 = require("../config/resolveConfigValue");
5
+ const routing_1 = require("../routing");
6
+ const createLambdaCorsResponseMiddleware = (config) => (responsePromise, { request }) => {
7
+ const cors = async () => {
8
+ const allowedHost = await (0, resolveConfigValue_1.resolveConfigValue)(config.corsAllowedHostRegex);
9
+ if (request.headers.origin && new URL(request.headers.origin).hostname.match(new RegExp(allowedHost))) {
10
+ return {
11
+ 'Access-Control-Allow-Origin': request.headers.origin,
12
+ 'Access-Control-Allow-Credentials': 'true',
13
+ 'Access-Control-Allow-Headers': 'content-type',
14
+ 'Access-Control-Allow-Methods': 'POST, GET, OPTIONS',
15
+ };
16
+ }
17
+ };
18
+ if (responsePromise) {
19
+ return responsePromise.then(async (response) => {
20
+ response.headers = {
21
+ ...await cors(),
22
+ ...response.headers
23
+ };
24
+ return response;
25
+ });
26
+ }
27
+ if (request.requestContext.http.method === 'OPTIONS') {
28
+ return cors().then(headers => (0, routing_1.apiTextResponse)(200, '', headers));
29
+ }
30
+ return responsePromise;
31
+ };
32
+ exports.createLambdaCorsResponseMiddleware = createLambdaCorsResponseMiddleware;
@@ -0,0 +1 @@
1
+ export declare const createThrowNotFoundMiddleware: <Ro>() => () => (response: Promise<Ro> | undefined) => Promise<Ro>;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createThrowNotFoundMiddleware = void 0;
4
+ const errors_1 = require("../errors");
5
+ const createThrowNotFoundMiddleware = () => () => (response) => {
6
+ if (!response) {
7
+ throw new errors_1.NotFoundError('not found');
8
+ }
9
+ return response;
10
+ };
11
+ exports.createThrowNotFoundMiddleware = createThrowNotFoundMiddleware;
@@ -1,5 +1,6 @@
1
1
  import { GenericFetch } from './fetch';
2
2
  import { ApiResponse, HttpHeaders } from './routing';
3
+ import { Logger } from './services/logger';
3
4
  export interface Call {
4
5
  start: number;
5
6
  end?: number;
@@ -52,6 +53,7 @@ export declare const makeProfileApiResponseMiddleware: <Ri extends {
52
53
  }>(showReport: (request: Ri) => string | boolean) => () => (responsePromise: Promise<ApiResponse<number, any>> | undefined, { request, profile }: {
53
54
  request: Ri;
54
55
  profile: Track;
56
+ logger: Logger;
55
57
  }) => Promise<ApiResponse<number, any>> | undefined;
56
58
  export declare const makeHtmlReport: (report: CallReport) => string;
57
59
  export declare const makeHtmlProfileReport: (report: ProfileReport) => string;
@@ -1,4 +1,5 @@
1
1
  import { Track } from '../profile';
2
+ import { Logger } from '../services/logger';
2
3
  export declare type QueryParams = Record<string, string | undefined | string[] | null>;
3
4
  export declare type RouteParams = {
4
5
  [key: string]: string;
@@ -19,6 +20,7 @@ export declare type PayloadForRoute<R> = RequestServicesForRoute<R> extends {
19
20
  declare type RequestServiceProvider<Sa, Sr, Ri> = (app: Sa) => <R>(middleware: {
20
21
  request: Ri;
21
22
  profile: Track;
23
+ logger: Logger;
22
24
  }, match: RouteMatchRecord<R>) => Sr;
23
25
  declare type RouteHandler<P, Sr, Ro> = (params: P, request: Sr) => Ro;
24
26
  declare type Route<N extends string, P extends RouteParams | undefined, Sa, Sr, Ri, Ro> = (Sr extends undefined ? {
@@ -50,19 +52,27 @@ export declare const makeRenderRouteUrl: <Ru extends {
50
52
  }>() => <R extends Ru>(route: R, params: ParamsForRoute<R>, query?: QueryParams) => string;
51
53
  export declare const renderAnyRouteUrl: <R extends any>(route: R, params: ParamsForRoute<R>, query?: QueryParams) => string;
52
54
  declare type RequestPathExtractor<Ri> = (request: Ri) => string;
55
+ declare type RequestLogExtractor<Ri> = (request: Ri) => JsonCompatibleStruct;
53
56
  declare type RequestRouteMatcher<Ri, R> = (request: Ri, route: R) => boolean;
57
+ declare type CompatibleServices<T1> = keyof T1 extends 'logger' ? T1 extends {
58
+ logger: Logger;
59
+ } ? T1 : never : T1 & {
60
+ logger?: Logger;
61
+ };
54
62
  declare type RequestResponder<Sa, Ri, Ro> = {
55
- (services: Sa): (request: Ri) => Ro | undefined;
56
- <RoF>(services: Sa, responseMiddleware: (app: Sa) => (response: Ro | undefined, request: {
63
+ (services: CompatibleServices<Sa>): (request: Ri) => Ro | undefined;
64
+ <RoF>(services: CompatibleServices<Sa>, responseMiddleware: (app: Sa) => (response: Ro | undefined, request: {
57
65
  request: Ri;
58
66
  profile: Track;
67
+ logger: Logger;
59
68
  }) => RoF): (request: Ri) => RoF;
60
69
  };
61
- export declare const makeGetRequestResponder: <Sa, Ru, Ri, Ro>() => ({ routes, pathExtractor, routeMatcher, errorHandler }: {
70
+ export declare const makeGetRequestResponder: <Sa, Ru, Ri, Ro>() => ({ routes, pathExtractor, routeMatcher, errorHandler, logExtractor }: {
62
71
  routes: () => AnySpecificRoute<Ru, Sa, Ri, Ro>[];
63
72
  pathExtractor: RequestPathExtractor<Ri>;
73
+ logExtractor?: RequestLogExtractor<Ri> | undefined;
64
74
  routeMatcher?: RequestRouteMatcher<Ri, AnySpecificRoute<Ru, Sa, Ri, Ro>> | undefined;
65
- errorHandler?: ((e: Error) => Ro) | undefined;
75
+ errorHandler?: ((e: Error, logger: Logger) => Ro) | undefined;
66
76
  }) => RequestResponder<Sa, Ri, Ro>;
67
77
  export declare type HttpHeaders = {
68
78
  [key: string]: string | undefined | string[];
@@ -34,6 +34,7 @@ const pathToRegexp = __importStar(require("path-to-regexp"));
34
34
  const query_string_1 = __importDefault(require("query-string"));
35
35
  const helpers_1 = require("../misc/helpers");
36
36
  const profile_1 = require("../profile");
37
+ const console_1 = require("../services/logger/console");
37
38
  /*
38
39
  * route definition helper. the only required params of the route are the name, path, and handler. other params
39
40
  * can be added to the type and then later used in the routeMatcher. when defining the `createRoute` method, only
@@ -93,11 +94,11 @@ exports.renderAnyRouteUrl = (0, exports.makeRenderRouteUrl)();
93
94
  const bindRoute = (services, appBinder, pathExtractor, matcher) => (route) => {
94
95
  const getParamsFromPath = pathToRegexp.match(route.path, { decode: decodeURIComponent });
95
96
  const boundServiceProvider = route.requestServiceProvider && appBinder(services, route.requestServiceProvider);
96
- return (request, profile) => {
97
+ return (request, profile, logger) => {
97
98
  const path = pathExtractor(request);
98
99
  const match = getParamsFromPath(path);
99
100
  if ((!matcher || matcher(request, route)) && match) {
100
- return profile.track(route.name, routeProfile => () => route.handler(match.params, boundServiceProvider ? boundServiceProvider({ request, profile: routeProfile }, { route, params: match.params }) : undefined));
101
+ return profile.track(route.name, routeProfile => () => route.handler(match.params, boundServiceProvider ? boundServiceProvider({ request, profile: routeProfile, logger }, { route, params: match.params }) : undefined));
101
102
  }
102
103
  };
103
104
  };
@@ -120,11 +121,12 @@ const bindRoute = (services, appBinder, pathExtractor, matcher) => (route) => {
120
121
  * lambdaMiddleware // environment specific response middleware (like cors)
121
122
  * );
122
123
  */
123
- const makeGetRequestResponder = () => ({ routes, pathExtractor, routeMatcher, errorHandler }) => (services, responseMiddleware) => {
124
+ const makeGetRequestResponder = () => ({ routes, pathExtractor, routeMatcher, errorHandler, logExtractor }) => (services, responseMiddleware) => {
124
125
  const appBinderImpl = (app, middleware) => middleware(app, appBinder);
125
126
  const appBinder = (0, helpers_1.memoize)(appBinderImpl);
126
127
  const boundRoutes = routes().map(bindRoute(services, appBinder, pathExtractor, routeMatcher));
127
128
  const boundResponseMiddleware = responseMiddleware ? responseMiddleware(services) : undefined;
129
+ const appLogger = services.logger || (0, console_1.createConsoleLogger)();
128
130
  // *note* this opaque promise guard is less generic than i hoped so
129
131
  // i'm leaving it here instead of the guards file.
130
132
  //
@@ -135,14 +137,18 @@ const makeGetRequestResponder = () => ({ routes, pathExtractor, routeMatcher, er
135
137
  const isPromise = (thing) => thing instanceof Promise;
136
138
  return (request) => {
137
139
  const { end, ...profile } = (0, profile_1.createProfile)(new Date().toISOString()).start();
140
+ const logger = appLogger.createSubContext();
141
+ if (logExtractor) {
142
+ logger.setContext(logExtractor(request));
143
+ }
138
144
  try {
139
- const executor = (0, helpers_1.mapFind)(boundRoutes, (route) => route(request, profile));
145
+ const executor = (0, helpers_1.mapFind)(boundRoutes, (route) => route(request, profile, logger));
140
146
  if (executor) {
141
147
  const result = boundResponseMiddleware ?
142
- boundResponseMiddleware(executor(), { request, profile }) : executor();
148
+ boundResponseMiddleware(executor(), { request, profile, logger }) : executor();
143
149
  if (isPromise(result) && errorHandler) {
144
150
  const errorHandlerWithMiddleware = (e) => boundResponseMiddleware ?
145
- boundResponseMiddleware(errorHandler(e), { request, profile }) : errorHandler(e);
151
+ boundResponseMiddleware(errorHandler(e, logger), { request, profile, logger }) : errorHandler(e, logger);
146
152
  return result.catch(errorHandlerWithMiddleware);
147
153
  }
148
154
  else {
@@ -150,12 +156,14 @@ const makeGetRequestResponder = () => ({ routes, pathExtractor, routeMatcher, er
150
156
  }
151
157
  }
152
158
  else if (boundResponseMiddleware) {
153
- return boundResponseMiddleware(undefined, { request, profile });
159
+ return boundResponseMiddleware(undefined, { request, profile, logger });
154
160
  }
155
161
  }
156
162
  catch (e) {
157
163
  if (errorHandler && e instanceof Error) {
158
- return boundResponseMiddleware ? boundResponseMiddleware(errorHandler(e), { request, profile }) : errorHandler(e);
164
+ return boundResponseMiddleware
165
+ ? boundResponseMiddleware(errorHandler(e, logger), { request, profile, logger })
166
+ : errorHandler(e, logger);
159
167
  }
160
168
  throw e;
161
169
  }
@@ -75,8 +75,9 @@ const makeRouteClient = (initializer, config, route, authProvider) => {
75
75
  if (!status.includes(response.status)) {
76
76
  throw new Error('unexpected response from api');
77
77
  }
78
- return { status: response.status, load: (0, exports.loadResponse)(response) };
78
+ return { status: response.status, headers: response.headers, load: (0, exports.loadResponse)(response) };
79
79
  },
80
+ headers: response.headers,
80
81
  load: (0, exports.loadResponse)(response),
81
82
  };
82
83
  });
@@ -65,7 +65,7 @@ const browserAuthProvider = ({ window, configSpace }) => (configProvider) => {
65
65
  const timeout = setTimeout(() => {
66
66
  window.removeEventListener('message', handler);
67
67
  reject(new Error('loading user identity timed out'));
68
- }, 100);
68
+ }, 5000);
69
69
  });
70
70
  /*
71
71
  * requests user identity from accounts api using given token or cookie
@@ -0,0 +1 @@
1
+ export declare const createConsoleLogger: () => import(".").Logger;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createConsoleLogger = void 0;
4
+ const _1 = require(".");
5
+ const createConsoleLogger = () => (0, _1.createCoreLogger)((level, event) => console[level](JSON.stringify({
6
+ eventType: level.toUpperCase(),
7
+ ...event,
8
+ })));
9
+ exports.createConsoleLogger = createConsoleLogger;
@@ -0,0 +1,14 @@
1
+ import { JsonCompatibleStruct } from '../../routing';
2
+ export declare enum Level {
3
+ Info = "info",
4
+ Warn = "warn",
5
+ Error = "error"
6
+ }
7
+ export declare type LogEvent = (level: Level, event: JsonCompatibleStruct) => void;
8
+ export interface Logger {
9
+ setContext: (obj: JsonCompatibleStruct) => void;
10
+ logEvent: LogEvent;
11
+ log: (message: string, level?: Level) => void;
12
+ createSubContext: () => Logger;
13
+ }
14
+ export declare const createCoreLogger: (driver: LogEvent, getParentContext?: (() => JsonCompatibleStruct) | undefined) => Logger;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createCoreLogger = exports.Level = void 0;
4
+ var Level;
5
+ (function (Level) {
6
+ Level["Info"] = "info";
7
+ Level["Warn"] = "warn";
8
+ Level["Error"] = "error";
9
+ })(Level = exports.Level || (exports.Level = {}));
10
+ const createCoreLogger = (driver, getParentContext) => {
11
+ const context = {};
12
+ const getContext = () => ({ ...getParentContext === null || getParentContext === void 0 ? void 0 : getParentContext(), ...context });
13
+ return {
14
+ logEvent: (level, event) => driver(level, { ...event, context: getContext() }),
15
+ log: (message, level = Level.Info) => driver(level, { message, context: getContext() }),
16
+ setContext: (obj) => { Object.assign(context, obj); },
17
+ createSubContext: () => (0, exports.createCoreLogger)(driver, getContext),
18
+ };
19
+ };
20
+ exports.createCoreLogger = createCoreLogger;