@goatlab/node-backend 0.0.15 → 0.1.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.
Files changed (126) hide show
  1. package/README.md +54 -38
  2. package/dist/container/Container.d.ts +441 -0
  3. package/dist/container/Container.js +895 -0
  4. package/dist/container/Container.js.map +1 -0
  5. package/dist/container/DistributedCacheInvalidator.d.ts +84 -0
  6. package/dist/container/DistributedCacheInvalidator.js +213 -0
  7. package/dist/container/DistributedCacheInvalidator.js.map +1 -0
  8. package/dist/container/LruCache.d.ts +14 -0
  9. package/dist/container/LruCache.js +23 -0
  10. package/dist/container/LruCache.js.map +1 -0
  11. package/dist/container/types.d.ts +128 -0
  12. package/dist/container/types.js +6 -0
  13. package/dist/container/types.js.map +1 -0
  14. package/dist/index.d.ts +31 -0
  15. package/dist/index.js +53 -1
  16. package/dist/index.js.map +1 -1
  17. package/dist/server/bootstraps/getExpressTrpcApp.d.ts +17 -0
  18. package/dist/server/bootstraps/getExpressTrpcApp.js +98 -0
  19. package/dist/server/bootstraps/getExpressTrpcApp.js.map +1 -0
  20. package/dist/server/consts.d.ts +35 -0
  21. package/dist/server/consts.js +33 -0
  22. package/dist/server/consts.js.map +1 -0
  23. package/dist/server/context/context.model.d.ts +13 -0
  24. package/dist/server/context/context.model.js +3 -0
  25. package/dist/server/context/context.model.js.map +1 -0
  26. package/dist/server/context/request.context.d.ts +40 -0
  27. package/dist/server/context/request.context.js +65 -0
  28. package/dist/server/context/request.context.js.map +1 -0
  29. package/dist/server/context/trpc.context.d.ts +11 -0
  30. package/dist/server/context/trpc.context.js +67 -0
  31. package/dist/server/context/trpc.context.js.map +1 -0
  32. package/dist/server/initOpenApiDocs.d.ts +9 -0
  33. package/dist/server/initOpenApiDocs.js +18 -0
  34. package/dist/server/initOpenApiDocs.js.map +1 -0
  35. package/dist/server/middleware/cloudTaskDecrypt.middleware.d.ts +6 -0
  36. package/dist/server/middleware/cloudTaskDecrypt.middleware.js +44 -0
  37. package/dist/server/middleware/cloudTaskDecrypt.middleware.js.map +1 -0
  38. package/dist/server/middleware/error.middleware.d.ts +17 -0
  39. package/dist/server/middleware/error.middleware.js +66 -0
  40. package/dist/server/middleware/error.middleware.js.map +1 -0
  41. package/dist/server/middleware/handleRequest.middleware.d.ts +7 -0
  42. package/dist/server/middleware/handleRequest.middleware.js +40 -0
  43. package/dist/server/middleware/handleRequest.middleware.js.map +1 -0
  44. package/dist/server/middleware/logger/cloudRun.logger.d.ts +27 -0
  45. package/dist/server/middleware/logger/cloudRun.logger.js +87 -0
  46. package/dist/server/middleware/logger/cloudRun.logger.js.map +1 -0
  47. package/dist/server/middleware/logger/logger.service.d.ts +6 -0
  48. package/dist/server/middleware/logger/logger.service.js +17 -0
  49. package/dist/server/middleware/logger/logger.service.js.map +1 -0
  50. package/dist/server/middleware/logs.middleware.d.ts +7 -0
  51. package/dist/server/middleware/logs.middleware.js +130 -0
  52. package/dist/server/middleware/logs.middleware.js.map +1 -0
  53. package/dist/server/middleware/requireAuthenticated.d.ts +2 -0
  54. package/dist/server/middleware/requireAuthenticated.js +13 -0
  55. package/dist/server/middleware/requireAuthenticated.js.map +1 -0
  56. package/dist/server/middleware/trpcError.middleware.d.ts +4 -0
  57. package/dist/server/middleware/trpcError.middleware.js +38 -0
  58. package/dist/server/middleware/trpcError.middleware.js.map +1 -0
  59. package/dist/server/schemas/user.schema.d.ts +109 -0
  60. package/dist/server/schemas/user.schema.js +28 -0
  61. package/dist/server/schemas/user.schema.js.map +1 -0
  62. package/dist/server/sentry/getSentry.d.ts +6 -0
  63. package/dist/server/sentry/getSentry.js +45 -0
  64. package/dist/server/sentry/getSentry.js.map +1 -0
  65. package/dist/server/sentry/sentry.service.d.ts +34 -0
  66. package/dist/server/sentry/sentry.service.js +110 -0
  67. package/dist/server/sentry/sentry.service.js.map +1 -0
  68. package/dist/server/services/email/email.model.d.ts +84 -0
  69. package/dist/server/services/email/email.model.js +62 -0
  70. package/dist/server/services/email/email.model.js.map +1 -0
  71. package/dist/server/services/email/email.service.d.ts +23 -0
  72. package/dist/server/services/email/email.service.js +139 -0
  73. package/dist/server/services/email/email.service.js.map +1 -0
  74. package/dist/server/services/gcp/getGcpServiceAccountFromBase64.d.ts +15 -0
  75. package/dist/server/services/gcp/getGcpServiceAccountFromBase64.js +9 -0
  76. package/dist/server/services/gcp/getGcpServiceAccountFromBase64.js.map +1 -0
  77. package/dist/server/services/secrets/secret.service.d.ts +31 -0
  78. package/dist/server/services/secrets/secret.service.js +172 -0
  79. package/dist/server/services/secrets/secret.service.js.map +1 -0
  80. package/dist/server/services/sendgrid/sendgrid.model.d.ts +118 -0
  81. package/dist/server/services/sendgrid/sendgrid.model.js +3 -0
  82. package/dist/server/services/sendgrid/sendgrid.model.js.map +1 -0
  83. package/dist/server/services/sendgrid/sendgridApi.service.d.ts +13 -0
  84. package/dist/server/services/sendgrid/sendgridApi.service.js +79 -0
  85. package/dist/server/services/sendgrid/sendgridApi.service.js.map +1 -0
  86. package/dist/server/services/sendgrid/sendgridHooks.model.d.ts +27 -0
  87. package/dist/server/services/sendgrid/sendgridHooks.model.js +19 -0
  88. package/dist/server/services/sendgrid/sendgridHooks.model.js.map +1 -0
  89. package/dist/server/services/translations/template.util.d.ts +7 -0
  90. package/dist/server/services/translations/template.util.js +11 -0
  91. package/dist/server/services/translations/template.util.js.map +1 -0
  92. package/dist/server/services/translations/translation.model.d.ts +4 -0
  93. package/dist/server/services/translations/translation.model.js +6 -0
  94. package/dist/server/services/translations/translation.model.js.map +1 -0
  95. package/dist/server/services/translations/translation.service.d.ts +25 -0
  96. package/dist/server/services/translations/translation.service.js +97 -0
  97. package/dist/server/services/translations/translation.service.js.map +1 -0
  98. package/dist/server/services/util/benchmarker.d.ts +13 -0
  99. package/dist/server/services/util/benchmarker.js +34 -0
  100. package/dist/server/services/util/benchmarker.js.map +1 -0
  101. package/dist/server/services/util/pagination.d.ts +50 -0
  102. package/dist/server/services/util/pagination.js +57 -0
  103. package/dist/server/services/util/pagination.js.map +1 -0
  104. package/dist/server/services/util/url.service.d.ts +75 -0
  105. package/dist/server/services/util/url.service.js +139 -0
  106. package/dist/server/services/util/url.service.js.map +1 -0
  107. package/dist/server/test/express.mock.d.ts +6 -0
  108. package/dist/server/test/express.mock.js +49 -0
  109. package/dist/server/test/express.mock.js.map +1 -0
  110. package/dist/server/test/firebase.mock.d.ts +4 -0
  111. package/dist/server/test/firebase.mock.js +30 -0
  112. package/dist/server/test/firebase.mock.js.map +1 -0
  113. package/dist/server/test/mock.model.d.ts +5 -0
  114. package/dist/server/test/mock.model.js +3 -0
  115. package/dist/server/test/mock.model.js.map +1 -0
  116. package/dist/server/test/trpc.mock.d.ts +6 -0
  117. package/dist/server/test/trpc.mock.js +14 -0
  118. package/dist/server/test/trpc.mock.js.map +1 -0
  119. package/dist/server/trpc.d.ts +364 -0
  120. package/dist/server/trpc.js +87 -0
  121. package/dist/server/trpc.js.map +1 -0
  122. package/dist/server/types/Envinronment.d.ts +1 -0
  123. package/dist/server/types/Envinronment.js +3 -0
  124. package/dist/server/types/Envinronment.js.map +1 -0
  125. package/dist/tsconfig.tsbuildinfo +1 -1
  126. package/package.json +33 -3
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleRequest = void 0;
4
+ const zod_1 = require("zod");
5
+ const handleRequest = (schema, handler) => {
6
+ return async (req, res, next) => {
7
+ try {
8
+ // Parse and validate request body
9
+ const parsedBody = schema.parse(req.body);
10
+ // Pass the parsed body and other parameters to the handler
11
+ await handler({
12
+ req,
13
+ res,
14
+ body: parsedBody,
15
+ });
16
+ // If the response hasn't been sent by the handler, send a default 200 OK
17
+ if (!res.headersSent) {
18
+ return res.status(200).end();
19
+ }
20
+ return next();
21
+ }
22
+ catch (err) {
23
+ console.log(err);
24
+ // Handle validation errors (Zod)
25
+ if (err instanceof zod_1.ZodError) {
26
+ return res.status(400).json({
27
+ error: 'Invalid request body',
28
+ details: err.errors, // Send detailed validation errors
29
+ });
30
+ }
31
+ // Handle other errors and respond with a 500 status code
32
+ return res.status(500).json({
33
+ error: 'Internal Server Error',
34
+ message: err instanceof Error ? err.message : 'Unknown error',
35
+ });
36
+ }
37
+ };
38
+ };
39
+ exports.handleRequest = handleRequest;
40
+ //# sourceMappingURL=handleRequest.middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handleRequest.middleware.js","sourceRoot":"","sources":["../../../src/server/middleware/handleRequest.middleware.ts"],"names":[],"mappings":";;;AAEA,6BAA8B;AAEvB,MAAM,aAAa,GAAG,CAC3B,MAAS,EACT,OAImB,EACnB,EAAE;IACF,OAAO,KAAK,EACV,GAA2B,EAC3B,GAAa,EACb,IAAkB,EAClB,EAAE;QACF,IAAI,CAAC;YACH,kCAAkC;YAClC,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAEzC,2DAA2D;YAC3D,MAAM,OAAO,CAAC;gBACZ,GAAG;gBACH,GAAG;gBACH,IAAI,EAAE,UAAU;aACjB,CAAC,CAAA;YAEF,yEAAyE;YACzE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBACrB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAA;YAC9B,CAAC;YAED,OAAO,IAAI,EAAE,CAAA;QACf,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAChB,iCAAiC;YACjC,IAAI,GAAG,YAAY,cAAQ,EAAE,CAAC;gBAC5B,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBAC1B,KAAK,EAAE,sBAAsB;oBAC7B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,kCAAkC;iBACxD,CAAC,CAAA;YACJ,CAAC;YAED,yDAAyD;YACzD,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE,uBAAuB;gBAC9B,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;aAC9D,CAAC,CAAA;QACJ,CAAC;IACH,CAAC,CAAA;AACH,CAAC,CAAA;AA/CY,QAAA,aAAa,iBA+CzB"}
@@ -0,0 +1,27 @@
1
+ import type { Format } from 'logform';
2
+ import type { LoggerOptions } from 'winston';
3
+ import { Environment } from '../../types/Envinronment';
4
+ export type GetTraceFn = () => {
5
+ traceId: string;
6
+ spanId: string;
7
+ traceSampled?: boolean;
8
+ };
9
+ export type GetLabelsFn = () => Record<string, string | undefined>;
10
+ export interface WinstonCloudRunConfig {
11
+ appName: string;
12
+ appVersion: string;
13
+ environment: Environment;
14
+ production: boolean;
15
+ getTrace?: GetTraceFn;
16
+ getLabels?: GetLabelsFn;
17
+ }
18
+ /**
19
+ * Creates simple winston config for Cloud Run
20
+ *
21
+ * Log level is set like this: ```production ? 'error' : 'debug'```
22
+ */
23
+ export declare function getWinstonCloudRunConfig({ appName, appVersion, production, environment, getTrace, getLabels, }: WinstonCloudRunConfig): LoggerOptions;
24
+ /**
25
+ * Creates Winston format that specifies time and renames level to severity
26
+ */
27
+ export declare function getCloudLoggingFormat({ getTrace, getLabels, environment, }?: Pick<WinstonCloudRunConfig, 'getLabels' | 'getTrace' | 'environment'>): Format;
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getWinstonCloudRunConfig = getWinstonCloudRunConfig;
4
+ exports.getCloudLoggingFormat = getCloudLoggingFormat;
5
+ const logging_winston_1 = require("@google-cloud/logging-winston");
6
+ const colors_1 = require("kleur/colors");
7
+ const winston_1 = require("winston");
8
+ const logs_middleware_1 = require("../logs.middleware");
9
+ /**
10
+ * Creates simple winston config for Cloud Run
11
+ *
12
+ * Log level is set like this: ```production ? 'error' : 'debug'```
13
+ */
14
+ function getWinstonCloudRunConfig({ appName, appVersion, production, environment, getTrace, getLabels, }) {
15
+ const logTransports = [];
16
+ if (environment === 'local') {
17
+ const consoleLogger = new winston_1.transports.Console({
18
+ format: winston_1.format.combine(winston_1.format.colorize(), winston_1.format.printf((info) => `[${(0, colors_1.blue)((0, logs_middleware_1.getCurrentTimeFormatted)())}] ${info.level}: ${info.message}`)),
19
+ level: 'debug',
20
+ });
21
+ logTransports.push(consoleLogger);
22
+ }
23
+ else {
24
+ logTransports.push(new logging_winston_1.LoggingWinston({
25
+ serviceContext: {
26
+ service: appName,
27
+ version: appVersion,
28
+ },
29
+ labels: {
30
+ environment,
31
+ service: appName,
32
+ },
33
+ defaultCallback: (err) => {
34
+ if (err) {
35
+ console.error('Logging failed:', err);
36
+ }
37
+ },
38
+ level: 'error',
39
+ redirectToStdout: true,
40
+ }));
41
+ }
42
+ return {
43
+ level: production ? 'error' : 'debug',
44
+ format: getCloudLoggingFormat({ getTrace, getLabels, environment }),
45
+ transports: logTransports,
46
+ handleRejections: true,
47
+ handleExceptions: true,
48
+ };
49
+ }
50
+ /**
51
+ * Creates Winston format that specifies time and renames level to severity
52
+ */
53
+ function getCloudLoggingFormat({ getTrace, getLabels, environment, } = {
54
+ environment: 'local',
55
+ }) {
56
+ const traceInfo = getTrace ? getTraceInfo(getTrace) : {};
57
+ const logFormat = [
58
+ winston_1.format.errors({ stack: true }),
59
+ (0, winston_1.format)((info) => {
60
+ const { level } = info;
61
+ return {
62
+ ...info,
63
+ ...traceInfo,
64
+ severity: environment === 'local' ? undefined : level.toUpperCase(),
65
+ time: environment === 'local' ? undefined : new Date().toISOString(),
66
+ ...(getLabels && {
67
+ 'logging.googleapis.com/labels': getLabels(),
68
+ }),
69
+ };
70
+ })(),
71
+ ];
72
+ if (environment !== 'local') {
73
+ logFormat.push(winston_1.format.json());
74
+ }
75
+ return winston_1.format.combine(...logFormat);
76
+ }
77
+ function getTraceInfo(getTrace) {
78
+ const { traceId, spanId, traceSampled = true } = getTrace() || {};
79
+ return traceId && spanId
80
+ ? {
81
+ 'logging.googleapis.com/trace': traceId,
82
+ 'logging.googleapis.com/spanId': spanId,
83
+ 'logging.googleapis.com/trace_sampled': traceSampled,
84
+ }
85
+ : {};
86
+ }
87
+ //# sourceMappingURL=cloudRun.logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudRun.logger.js","sourceRoot":"","sources":["../../../../src/server/middleware/logger/cloudRun.logger.ts"],"names":[],"mappings":";;AA4BA,4DAqDC;AAKD,sDAgCC;AApHD,mEAA8D;AAC9D,yCAAmC;AACnC,qCAA4C;AAE5C,wDAA4D;AAiB5D;;;;GAIG;AACH,SAAgB,wBAAwB,CAAC,EACvC,OAAO,EACP,UAAU,EACV,UAAU,EACV,WAAW,EACX,QAAQ,EACR,SAAS,GACa;IACtB,MAAM,aAAa,GAAmD,EAAE,CAAA;IAExE,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;QAC5B,MAAM,aAAa,GAAG,IAAI,oBAAU,CAAC,OAAO,CAAC;YAC3C,MAAM,EAAE,gBAAM,CAAC,OAAO,CACpB,gBAAM,CAAC,QAAQ,EAAE,EACjB,gBAAM,CAAC,MAAM,CACX,CAAC,IAAI,EAAE,EAAE,CACP,IAAI,IAAA,aAAI,EAAC,IAAA,yCAAuB,GAAE,CAAC,KAAK,IAAI,CAAC,KAAK,KAChD,IAAI,CAAC,OACP,EAAE,CACL,CACF;YACD,KAAK,EAAE,OAAO;SACf,CAAC,CAAA;QACF,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IACnC,CAAC;SAAM,CAAC;QACN,aAAa,CAAC,IAAI,CAChB,IAAI,gCAAc,CAAC;YACjB,cAAc,EAAE;gBACd,OAAO,EAAE,OAAO;gBAChB,OAAO,EAAE,UAAU;aACpB;YACD,MAAM,EAAE;gBACN,WAAW;gBACX,OAAO,EAAE,OAAO;aACjB;YACD,eAAe,EAAE,CAAC,GAAG,EAAE,EAAE;gBACvB,IAAI,GAAG,EAAE,CAAC;oBACR,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAA;gBACvC,CAAC;YACH,CAAC;YACD,KAAK,EAAE,OAAO;YACd,gBAAgB,EAAE,IAAI;SACvB,CAAC,CACH,CAAA;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;QACrC,MAAM,EAAE,qBAAqB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;QACnE,UAAU,EAAE,aAAa;QACzB,gBAAgB,EAAE,IAAI;QACtB,gBAAgB,EAAE,IAAI;KACvB,CAAA;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB,CACnC,EACE,QAAQ,EACR,SAAS,EACT,WAAW,MAC8D;IACzE,WAAW,EAAE,OAAO;CACrB;IAED,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAExD,MAAM,SAAS,GAAG;QAChB,gBAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAC9B,IAAA,gBAAM,EAAC,CAAC,IAAI,EAAE,EAAE;YACd,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAA;YACtB,OAAO;gBACL,GAAG,IAAI;gBACP,GAAG,SAAS;gBACZ,QAAQ,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE;gBACnE,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACpE,GAAG,CAAC,SAAS,IAAI;oBACf,+BAA+B,EAAE,SAAS,EAAE;iBAC7C,CAAC;aACM,CAAA;QACZ,CAAC,CAAC,EAAE;KACL,CAAA;IAED,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;QAC5B,SAAS,CAAC,IAAI,CAAC,gBAAM,CAAC,IAAI,EAAE,CAAC,CAAA;IAC/B,CAAC;IAED,OAAO,gBAAM,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,CAAA;AACrC,CAAC;AAED,SAAS,YAAY,CAAC,QAAoB;IACxC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAA;IACjE,OAAO,OAAO,IAAI,MAAM;QACtB,CAAC,CAAC;YACE,8BAA8B,EAAE,OAAO;YACvC,+BAA+B,EAAE,MAAM;YACvC,sCAAsC,EAAE,YAAY;SACrD;QACH,CAAC,CAAC,EAAE,CAAA;AACR,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { WinstonCloudRunConfig } from './cloudRun.logger';
2
+ export type GetLoggerConfig = Omit<WinstonCloudRunConfig, 'appName' | 'appVersion'> & {
3
+ appName?: string;
4
+ appVersion?: string;
5
+ };
6
+ export declare const getLogger: (cfg: GetLoggerConfig) => import("winston").Logger;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getLogger = void 0;
4
+ const winston_1 = require("winston");
5
+ const consts_1 = require("../../consts");
6
+ const cloudRun_logger_1 = require("./cloudRun.logger");
7
+ const getLogger = (cfg) => {
8
+ return (0, winston_1.createLogger)({
9
+ ...(0, cloudRun_logger_1.getWinstonCloudRunConfig)({
10
+ ...cfg,
11
+ appName: cfg.appName || consts_1.pkg.name,
12
+ appVersion: cfg.appVersion || consts_1.pkg.version,
13
+ }),
14
+ });
15
+ };
16
+ exports.getLogger = getLogger;
17
+ //# sourceMappingURL=logger.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.service.js","sourceRoot":"","sources":["../../../../src/server/middleware/logger/logger.service.ts"],"names":[],"mappings":";;;AAAA,qCAAsC;AACtC,yCAAkC;AAClC,uDAG0B;AAUnB,MAAM,SAAS,GAAG,CAAC,GAAoB,EAAE,EAAE;IAChD,OAAO,IAAA,sBAAY,EAAC;QAClB,GAAG,IAAA,0CAAwB,EAAC;YAC1B,GAAG,GAAG;YACN,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,YAAG,CAAC,IAAI;YAChC,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,YAAG,CAAC,OAAO;SAC1C,CAAC;KACH,CAAC,CAAA;AACJ,CAAC,CAAA;AARY,QAAA,SAAS,aAQrB"}
@@ -0,0 +1,7 @@
1
+ import type { NextFunction, Request, Response } from 'express';
2
+ import { CommonLogger } from '@goatlab/js-utils';
3
+ export declare const httpResponseCodeColor: (statusCode: number) => string;
4
+ export declare const httpResponseTimeColor: (msTime: number) => string;
5
+ export declare const getActualRequestDurationInMilliseconds: (start: [number, number]) => number;
6
+ export declare const getCurrentTimeFormatted: () => string;
7
+ export declare const expressRequestLogger: (request: Request, response: Response, next: NextFunction, logger: CommonLogger) => void;
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.expressRequestLogger = exports.getCurrentTimeFormatted = exports.getActualRequestDurationInMilliseconds = exports.httpResponseTimeColor = exports.httpResponseCodeColor = void 0;
4
+ const js_utils_1 = require("@goatlab/js-utils");
5
+ const colors_1 = require("kleur/colors");
6
+ // Adds color to HTTP status codes based on their range
7
+ const httpResponseCodeColor = (statusCode) => {
8
+ if (statusCode >= 200 && statusCode < 400) {
9
+ return (0, colors_1.green)(statusCode.toString());
10
+ }
11
+ else if (statusCode >= 400 && statusCode < 500) {
12
+ return (0, colors_1.yellow)(statusCode.toString());
13
+ }
14
+ else {
15
+ return (0, colors_1.red)(statusCode.toString());
16
+ }
17
+ };
18
+ exports.httpResponseCodeColor = httpResponseCodeColor;
19
+ // Adds color to response time based on duration
20
+ const httpResponseTimeColor = (msTime) => {
21
+ if (msTime >= 0 && msTime < 500) {
22
+ return (0, colors_1.green)(js_utils_1.Time.ms(msTime));
23
+ }
24
+ else if (msTime >= 500 && msTime < 1000) {
25
+ return (0, colors_1.yellow)(js_utils_1.Time.ms(msTime));
26
+ }
27
+ else {
28
+ return (0, colors_1.red)(js_utils_1.Time.ms(msTime));
29
+ }
30
+ };
31
+ exports.httpResponseTimeColor = httpResponseTimeColor;
32
+ // Utility function to log based on status code
33
+ const logMessage = (message, statusCode, logger) => {
34
+ if (statusCode >= 500) {
35
+ logger.error(message);
36
+ }
37
+ else if (statusCode >= 400) {
38
+ logger.warn(message);
39
+ }
40
+ else {
41
+ logger.warn(message);
42
+ }
43
+ };
44
+ const getActualRequestDurationInMilliseconds = (start) => {
45
+ const NS_PER_SEC = 1e9; // Convert to nanoseconds
46
+ const NS_TO_MS = 1e6; // Convert to milliseconds
47
+ const diff = process.hrtime(start);
48
+ return (diff[0] * NS_PER_SEC + diff[1]) / NS_TO_MS;
49
+ };
50
+ exports.getActualRequestDurationInMilliseconds = getActualRequestDurationInMilliseconds;
51
+ const getCurrentTimeFormatted = () => new Date().toISOString();
52
+ exports.getCurrentTimeFormatted = getCurrentTimeFormatted;
53
+ const formatRequestLog = ({ method, url, statusCode, statusMessage, durationInMilliseconds, }) => {
54
+ return `${(0, colors_1.magenta)(method)}: ${(0, colors_1.bgBlack)(url)} | Response: ${(0, exports.httpResponseCodeColor)(statusCode)} (${statusMessage}) ${(0, exports.httpResponseTimeColor)(durationInMilliseconds)}`;
55
+ };
56
+ function logBatchRequests({ date, method, url, statusCode, statusMessage, durationInMilliseconds, logger, }) {
57
+ const decodedUrl = decodeURIComponent(url);
58
+ const urlParts = decodedUrl.split('?');
59
+ const baseUrl = urlParts[0] || '';
60
+ if (urlParts[1]) {
61
+ const queryParams = new URLSearchParams(urlParts[1]);
62
+ const input = queryParams.get('input');
63
+ const batch = queryParams.get('batch');
64
+ if (input && batch) {
65
+ try {
66
+ const parsedInput = JSON.parse(input);
67
+ const endpointString = baseUrl.split('/trpc/')[1];
68
+ const endpoints = endpointString ? endpointString.split(',') : [];
69
+ if (endpoints.length > 1) {
70
+ logger.warn(`Batch Requests: ${(0, colors_1.yellow)(`${endpoints.length} endpoints`)} \n\n${method.toUpperCase()} ${baseUrl} \n\n`);
71
+ }
72
+ endpoints.forEach((endpoint, index) => {
73
+ const params = parsedInput[index];
74
+ const message = ` ${formatRequestLog({
75
+ method,
76
+ url: endpoint,
77
+ statusCode,
78
+ statusMessage,
79
+ durationInMilliseconds,
80
+ })} | ${(0, colors_1.yellow)('Batch Params')}: ${JSON.stringify(params, null, 2)}`;
81
+ logMessage(message, statusCode, logger);
82
+ });
83
+ }
84
+ catch (err) {
85
+ logger.error(`[${date}] Error parsing batch input: ${err.message || 'unknown error'}`);
86
+ }
87
+ }
88
+ else {
89
+ const message = formatRequestLog({
90
+ method,
91
+ url: `${baseUrl}?${queryParams.toString()}`,
92
+ statusCode,
93
+ statusMessage,
94
+ durationInMilliseconds,
95
+ });
96
+ logMessage(message, statusCode, logger);
97
+ }
98
+ }
99
+ else {
100
+ const message = formatRequestLog({
101
+ method,
102
+ url: baseUrl,
103
+ statusCode,
104
+ statusMessage,
105
+ durationInMilliseconds,
106
+ });
107
+ logMessage(message, statusCode, logger);
108
+ }
109
+ }
110
+ const expressRequestLogger = (request, response, next, logger) => {
111
+ const formattedDate = (0, exports.getCurrentTimeFormatted)();
112
+ const start = process.hrtime();
113
+ response.on('finish', () => {
114
+ const { method, originalUrl } = request;
115
+ const { statusCode, statusMessage } = response;
116
+ const durationInMilliseconds = (0, exports.getActualRequestDurationInMilliseconds)(start);
117
+ logBatchRequests({
118
+ date: formattedDate,
119
+ method,
120
+ url: originalUrl,
121
+ statusCode,
122
+ statusMessage,
123
+ durationInMilliseconds,
124
+ logger,
125
+ });
126
+ });
127
+ next();
128
+ };
129
+ exports.expressRequestLogger = expressRequestLogger;
130
+ //# sourceMappingURL=logs.middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.middleware.js","sourceRoot":"","sources":["../../../src/server/middleware/logs.middleware.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { NextFunction, Request, Response } from 'express';
2
+ export declare const requireAuthenticated: (req: Request, res: Response, next: NextFunction) => void;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.requireAuthenticated = void 0;
4
+ const requireAuthenticated = (req, res, next) => {
5
+ const isAuthenticated = req.context.user;
6
+ if (!isAuthenticated) {
7
+ res.status(401).send('Unauthorized');
8
+ return;
9
+ }
10
+ next();
11
+ };
12
+ exports.requireAuthenticated = requireAuthenticated;
13
+ //# sourceMappingURL=requireAuthenticated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requireAuthenticated.js","sourceRoot":"","sources":["../../../src/server/middleware/requireAuthenticated.ts"],"names":[],"mappings":";;;AAEO,MAAM,oBAAoB,GAAG,CAClC,GAAY,EACZ,GAAa,EACb,IAAkB,EACZ,EAAE;IACR,MAAM,eAAe,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAA;IACxC,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QACpC,OAAM;IACR,CAAC;IAED,IAAI,EAAE,CAAA;AACR,CAAC,CAAA;AAZY,QAAA,oBAAoB,wBAYhC"}
@@ -0,0 +1,4 @@
1
+ import type { SentryService } from '../sentry/sentry.service';
2
+ export declare function trpcErrorMiddleware({ error, sentryService, }: {
3
+ sentryService: SentryService;
4
+ } & any): void;
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.trpcErrorMiddleware = trpcErrorMiddleware;
4
+ const js_utils_1 = require("@goatlab/js-utils");
5
+ const colors_1 = require("kleur/colors");
6
+ // dist/@trpc/server/http
7
+ const reportOnly5xx = false;
8
+ function trpcErrorMiddleware({ error, sentryService, }) {
9
+ const originalError = js_utils_1.Errors.anyToError(error, Error, {
10
+ stringifyFn: js_utils_1.Inspect.anyStringifyFn,
11
+ });
12
+ let errorId;
13
+ if (sentryService && shouldReportToSentry(originalError)) {
14
+ errorId = sentryService.captureException(originalError, false);
15
+ }
16
+ console.log(errorId);
17
+ const errorMessage = `${(0, colors_1.magenta)('Error')}: ${(0, colors_1.red)(error.code)} | ${error.message}`;
18
+ console.log(originalError);
19
+ console.error(errorMessage);
20
+ console.log(error.cause);
21
+ }
22
+ function shouldReportToSentry(error) {
23
+ const e = error;
24
+ // By default - report
25
+ if (!e.data)
26
+ return true;
27
+ // If `report` is set - do as it says
28
+ if (e.data.report === true)
29
+ return true;
30
+ if (e.data.report === false)
31
+ return false;
32
+ // Report if http 5xx, otherwise not
33
+ // If no httpCode - report
34
+ // if httpCode >= 500 - report
35
+ // Otherwise - report, unless !reportOnly5xx is set
36
+ return (!reportOnly5xx || !e.data.httpStatusCode || e.data.httpStatusCode >= 500);
37
+ }
38
+ //# sourceMappingURL=trpcError.middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trpcError.middleware.js","sourceRoot":"","sources":["../../../src/server/middleware/trpcError.middleware.ts"],"names":[],"mappings":";;AAQA,kDAuBC;AA9BD,gDAAmD;AACnD,yCAA2C;AAG3C,yBAAyB;AACzB,MAAM,aAAa,GAAG,KAAK,CAAA;AAE3B,SAAgB,mBAAmB,CAAC,EAClC,KAAK,EACL,aAAa,GAC0B;IACvC,MAAM,aAAa,GAAG,iBAAM,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE;QACpD,WAAW,EAAE,kBAAO,CAAC,cAAc;KACpC,CAAC,CAAA;IAEF,IAAI,OAA2B,CAAA;IAE/B,IAAI,aAAa,IAAI,oBAAoB,CAAC,aAAa,CAAC,EAAE,CAAC;QACzD,OAAO,GAAG,aAAa,CAAC,gBAAgB,CAAC,aAAa,EAAE,KAAK,CAAC,CAAA;IAChE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAEpB,MAAM,YAAY,GAAG,GAAG,IAAA,gBAAO,EAAC,OAAO,CAAC,KAAK,IAAA,YAAG,EAAC,KAAK,CAAC,IAAI,CAAC,MAC1D,KAAK,CAAC,OACR,EAAE,CAAA;IAEF,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;IAC1B,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;IAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;AAC1B,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAY;IACxC,MAAM,CAAC,GAAG,KAAkB,CAAA;IAE5B,sBAAsB;IACtB,IAAI,CAAC,CAAC,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IAExB,qCAAqC;IACrC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IACvC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,KAAK;QAAE,OAAO,KAAK,CAAA;IAEzC,oCAAoC;IACpC,0BAA0B;IAC1B,8BAA8B;IAC9B,mDAAmD;IACnD,OAAO,CACL,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,IAAI,GAAG,CACzE,CAAA;AACH,CAAC"}
@@ -0,0 +1,109 @@
1
+ import { z } from 'zod';
2
+ export declare const firebaseDecodedTokenSchema: z.ZodObject<{
3
+ iss: z.ZodString;
4
+ aud: z.ZodString;
5
+ auth_time: z.ZodNumber;
6
+ sub: z.ZodString;
7
+ iat: z.ZodNumber;
8
+ exp: z.ZodNumber;
9
+ email: z.ZodString;
10
+ email_verified: z.ZodBoolean;
11
+ firebase: z.ZodOptional<z.ZodAny>;
12
+ uid: z.ZodString;
13
+ displayName: z.ZodOptional<z.ZodString>;
14
+ name: z.ZodOptional<z.ZodString>;
15
+ ownerId: z.ZodOptional<z.ZodString>;
16
+ user_id: z.ZodOptional<z.ZodString>;
17
+ }, "strip", z.ZodTypeAny, {
18
+ iss?: string;
19
+ aud?: string;
20
+ auth_time?: number;
21
+ sub?: string;
22
+ iat?: number;
23
+ exp?: number;
24
+ email?: string;
25
+ email_verified?: boolean;
26
+ firebase?: any;
27
+ uid?: string;
28
+ displayName?: string;
29
+ name?: string;
30
+ ownerId?: string;
31
+ user_id?: string;
32
+ }, {
33
+ iss?: string;
34
+ aud?: string;
35
+ auth_time?: number;
36
+ sub?: string;
37
+ iat?: number;
38
+ exp?: number;
39
+ email?: string;
40
+ email_verified?: boolean;
41
+ firebase?: any;
42
+ uid?: string;
43
+ displayName?: string;
44
+ name?: string;
45
+ ownerId?: string;
46
+ user_id?: string;
47
+ }>;
48
+ export declare const internalTokenSchema: z.ZodObject<{
49
+ tokenPurpose: z.ZodOptional<z.ZodString>;
50
+ }, "strip", z.ZodTypeAny, {
51
+ tokenPurpose?: string;
52
+ }, {
53
+ tokenPurpose?: string;
54
+ }>;
55
+ export declare const requestTokenSchema: z.ZodUnion<[z.ZodObject<{
56
+ iss: z.ZodString;
57
+ aud: z.ZodString;
58
+ auth_time: z.ZodNumber;
59
+ sub: z.ZodString;
60
+ iat: z.ZodNumber;
61
+ exp: z.ZodNumber;
62
+ email: z.ZodString;
63
+ email_verified: z.ZodBoolean;
64
+ firebase: z.ZodOptional<z.ZodAny>;
65
+ uid: z.ZodString;
66
+ displayName: z.ZodOptional<z.ZodString>;
67
+ name: z.ZodOptional<z.ZodString>;
68
+ ownerId: z.ZodOptional<z.ZodString>;
69
+ user_id: z.ZodOptional<z.ZodString>;
70
+ }, "strip", z.ZodTypeAny, {
71
+ iss?: string;
72
+ aud?: string;
73
+ auth_time?: number;
74
+ sub?: string;
75
+ iat?: number;
76
+ exp?: number;
77
+ email?: string;
78
+ email_verified?: boolean;
79
+ firebase?: any;
80
+ uid?: string;
81
+ displayName?: string;
82
+ name?: string;
83
+ ownerId?: string;
84
+ user_id?: string;
85
+ }, {
86
+ iss?: string;
87
+ aud?: string;
88
+ auth_time?: number;
89
+ sub?: string;
90
+ iat?: number;
91
+ exp?: number;
92
+ email?: string;
93
+ email_verified?: boolean;
94
+ firebase?: any;
95
+ uid?: string;
96
+ displayName?: string;
97
+ name?: string;
98
+ ownerId?: string;
99
+ user_id?: string;
100
+ }>, z.ZodObject<{
101
+ tokenPurpose: z.ZodOptional<z.ZodString>;
102
+ }, "strip", z.ZodTypeAny, {
103
+ tokenPurpose?: string;
104
+ }, {
105
+ tokenPurpose?: string;
106
+ }>]>;
107
+ export type FirebaseDecodedToken = z.infer<typeof firebaseDecodedTokenSchema>;
108
+ export type TokenBasedAccess = z.infer<typeof internalTokenSchema>;
109
+ export type DecodedUserToken = z.infer<typeof requestTokenSchema>;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.requestTokenSchema = exports.internalTokenSchema = exports.firebaseDecodedTokenSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ exports.firebaseDecodedTokenSchema = zod_1.z.object({
6
+ iss: zod_1.z.string(),
7
+ aud: zod_1.z.string(),
8
+ auth_time: zod_1.z.number(),
9
+ sub: zod_1.z.string(),
10
+ iat: zod_1.z.number(),
11
+ exp: zod_1.z.number(),
12
+ email: zod_1.z.string(),
13
+ email_verified: zod_1.z.boolean(),
14
+ firebase: zod_1.z.any().optional(),
15
+ uid: zod_1.z.string(),
16
+ displayName: zod_1.z.string().optional(),
17
+ name: zod_1.z.string().optional(),
18
+ ownerId: zod_1.z.string().optional(),
19
+ user_id: zod_1.z.string().optional(),
20
+ });
21
+ exports.internalTokenSchema = zod_1.z.object({
22
+ tokenPurpose: zod_1.z.string().optional(),
23
+ });
24
+ exports.requestTokenSchema = zod_1.z.union([
25
+ exports.firebaseDecodedTokenSchema,
26
+ exports.internalTokenSchema,
27
+ ]);
28
+ //# sourceMappingURL=user.schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.schema.js","sourceRoot":"","sources":["../../../src/server/schemas/user.schema.ts"],"names":[],"mappings":";;;AAAA,6BAAuB;AAEV,QAAA,0BAA0B,GAAG,OAAC,CAAC,MAAM,CAAC;IACjD,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE;IACf,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE;IACf,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE;IACrB,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE;IACf,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE;IACf,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE;IACf,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE;IACjB,cAAc,EAAE,OAAC,CAAC,OAAO,EAAE;IAC3B,QAAQ,EAAE,OAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IAC5B,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE;IACf,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC/B,CAAC,CAAA;AAEW,QAAA,mBAAmB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC1C,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAA;AAEW,QAAA,kBAAkB,GAAG,OAAC,CAAC,KAAK,CAAC;IACxC,kCAA0B;IAC1B,2BAAmB;CACpB,CAAC,CAAA"}
@@ -0,0 +1,6 @@
1
+ import { SentryService } from './sentry.service';
2
+ export declare const getSentry: ({ dns, appVersion, environment, }: {
3
+ dns?: string;
4
+ appVersion?: string;
5
+ environment: string;
6
+ }) => SentryService;
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getSentry = void 0;
4
+ const js_utils_1 = require("@goatlab/js-utils");
5
+ // import { dedupeIntegration } from '@sentry/integrations'
6
+ const profiling_node_1 = require("@sentry/profiling-node");
7
+ const zod_1 = require("zod");
8
+ const consts_1 = require("../consts");
9
+ const sentry_service_1 = require("./sentry.service");
10
+ // https://docs.sentry.io/platforms/node/usage/sdk-fingerprinting/
11
+ // https://docs.sentry.io/product/data-management-settings/event-grouping/fingerprint-rules/#variables
12
+ const DEFAULT = '{{ default }}';
13
+ const getSentry = ({ dns, appVersion, environment, }) => {
14
+ const sentryService = new sentry_service_1.SentryService({
15
+ dsn: dns,
16
+ release: appVersion || consts_1.pkg.version,
17
+ environment: environment,
18
+ tracesSampleRate: 1,
19
+ profilesSampleRate: 1,
20
+ integrations: [(0, profiling_node_1.nodeProfilingIntegration)()],
21
+ beforeSend(event, hint) {
22
+ const error = hint?.originalException;
23
+ if (!error) {
24
+ return event;
25
+ }
26
+ if (error instanceof zod_1.ZodError && // Group by Zod objectName
27
+ error.name) {
28
+ event.fingerprint = [DEFAULT, 'ZodError', error.name];
29
+ return event;
30
+ }
31
+ const data = error.data;
32
+ if (data?.fingerprint) {
33
+ event.fingerprint = data.fingerprint;
34
+ return event;
35
+ }
36
+ return event;
37
+ },
38
+ });
39
+ sentryService.sentry().setTags(js_utils_1.Objects.deleteNulls({
40
+ ver: consts_1.pkg.version,
41
+ }));
42
+ return sentryService;
43
+ };
44
+ exports.getSentry = getSentry;
45
+ //# sourceMappingURL=getSentry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getSentry.js","sourceRoot":"","sources":["../../../src/server/sentry/getSentry.ts"],"names":[],"mappings":";;;AACA,gDAA2C;AAC3C,2DAA2D;AAC3D,2DAAiE;AACjE,6BAA8B;AAC9B,sCAA+B;AAC/B,qDAAgD;AAEhD,kEAAkE;AAClE,sGAAsG;AACtG,MAAM,OAAO,GAAG,eAAe,CAAA;AAExB,MAAM,SAAS,GAAG,CAAC,EACxB,GAAG,EACH,UAAU,EACV,WAAW,GAKZ,EAAE,EAAE;IACH,MAAM,aAAa,GAAG,IAAI,8BAAa,CAAC;QACtC,GAAG,EAAE,GAAG;QACR,OAAO,EAAE,UAAU,IAAI,YAAG,CAAC,OAAO;QAClC,WAAW,EAAE,WAAW;QACxB,gBAAgB,EAAE,CAAC;QACnB,kBAAkB,EAAE,CAAC;QACrB,YAAY,EAAE,CAAC,IAAA,yCAAwB,GAAS,CAAC;QACjD,UAAU,CAAC,KAAK,EAAE,IAAI;YACpB,MAAM,KAAK,GAAQ,IAAI,EAAE,iBAAiB,CAAA;YAE1C,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,KAAK,CAAA;YACd,CAAC;YAED,IACE,KAAK,YAAY,cAAQ,IAAI,0BAA0B;gBACvD,KAAK,CAAC,IAAI,EACV,CAAC;gBACD,KAAK,CAAC,WAAW,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;gBAErD,OAAO,KAAK,CAAA;YACd,CAAC;YAED,MAAM,IAAI,GAAI,KAAkB,CAAC,IAA6B,CAAA;YAE9D,IAAI,IAAI,EAAE,WAAW,EAAE,CAAC;gBACtB,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAA;gBACpC,OAAO,KAAK,CAAA;YACd,CAAC;YAED,OAAO,KAAK,CAAA;QACd,CAAC;KACF,CAAC,CAAA;IAEF,aAAa,CAAC,MAAM,EAAE,CAAC,OAAO,CAC5B,kBAAO,CAAC,WAAW,CAAC;QAClB,GAAG,EAAE,YAAG,CAAC,OAAO;KACjB,CAAC,CACH,CAAA;IAED,OAAO,aAAa,CAAA;AACtB,CAAC,CAAA;AAlDY,QAAA,SAAS,aAkDrB"}
@@ -0,0 +1,34 @@
1
+ import type * as SentryLib from '@sentry/node';
2
+ import { CommonLogger } from '@goatlab/js-utils';
3
+ import { Breadcrumb, NodeOptions, SeverityLevel } from '@sentry/node';
4
+ export type SentryServiceConfig = Record<string, unknown> & NodeOptions & {
5
+ logger?: CommonLogger;
6
+ };
7
+ export declare class SentryService {
8
+ private readonly config;
9
+ constructor(config: SentryServiceConfig);
10
+ sentry(): typeof SentryLib;
11
+ init(): void;
12
+ /**
13
+ * For GDPR reasons we never send more information than just User ID.
14
+ */
15
+ setUserId(id: string): void;
16
+ /**
17
+ * Does console.error(err)
18
+ * Returns "eventId" or undefined (if error was not reported).
19
+ */
20
+ captureException(error: any, logError?: boolean): string | undefined;
21
+ /**
22
+ * Returns "eventId"
23
+ */
24
+ captureMessage(message: string, level?: SeverityLevel): string;
25
+ addBreadcrumb(breadcrumb: Breadcrumb): void;
26
+ /**
27
+ * Currently it will only use `logger.error` ("error" level) and ignore `log` and `warn`.
28
+ *
29
+ * For each `logger.error` - it'll do a captureException.
30
+ *
31
+ * @experimental
32
+ */
33
+ getCommonLogger(): CommonLogger;
34
+ }