@driveflux/reporter 5.0.8 → 5.1.2
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/.turbo/turbo-build.log +5 -4
- package/CHANGELOG.md +28 -0
- package/build.js +33 -22
- package/dist/cjs/index.js +38 -7
- package/dist/cjs/index.js.map +3 -3
- package/dist/cjs/package.json +2 -2
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +4 -1
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +37 -7
- package/dist/index.js.map +3 -3
- package/package.json +6 -6
- package/tsconfig.tsbuildinfo +1 -1
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
|
+
[43m[30m WARN [39m[49m Issue while reading "/Users/flux/Projects/flux-master/.npmrc". Failed to replace env in config: ${NPM_TOKEN}
|
|
1
2
|
|
|
2
|
-
> @driveflux/reporter@5.
|
|
3
|
+
> @driveflux/reporter@5.1.2 build /Users/flux/Projects/flux-master/packages/reporter
|
|
3
4
|
> npm run clean && npm run build:types && npm run build:js
|
|
4
5
|
|
|
5
6
|
|
|
6
|
-
> @driveflux/reporter@5.
|
|
7
|
+
> @driveflux/reporter@5.1.2 clean
|
|
7
8
|
> del dist/**/*.js
|
|
8
9
|
|
|
9
10
|
|
|
10
|
-
> @driveflux/reporter@5.
|
|
11
|
+
> @driveflux/reporter@5.1.2 build:types
|
|
11
12
|
> tsc --build
|
|
12
13
|
|
|
13
14
|
|
|
14
|
-
> @driveflux/reporter@5.
|
|
15
|
+
> @driveflux/reporter@5.1.2 build:js
|
|
15
16
|
> node -r esbuild-register build.js
|
|
16
17
|
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,33 @@
|
|
|
1
1
|
# @driveflux/reporter
|
|
2
2
|
|
|
3
|
+
## 5.1.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Minor updates on build
|
|
8
|
+
- Updated dependencies
|
|
9
|
+
- @driveflux/singleton@1.0.4
|
|
10
|
+
- @driveflux/problem@4.0.3
|
|
11
|
+
- @driveflux/redact@4.0.3
|
|
12
|
+
- @driveflux/fetch@6.0.8
|
|
13
|
+
- @driveflux/utils@3.0.8
|
|
14
|
+
|
|
15
|
+
## 5.1.1
|
|
16
|
+
|
|
17
|
+
### Patch Changes
|
|
18
|
+
|
|
19
|
+
- Upgraded all packages
|
|
20
|
+
- Updated dependencies
|
|
21
|
+
- @driveflux/singleton@1.0.3
|
|
22
|
+
- @driveflux/fetch@6.0.7
|
|
23
|
+
- @driveflux/utils@3.0.7
|
|
24
|
+
|
|
25
|
+
## 5.1.0
|
|
26
|
+
|
|
27
|
+
### Minor Changes
|
|
28
|
+
|
|
29
|
+
- Defer reporting
|
|
30
|
+
|
|
3
31
|
## 5.0.8
|
|
4
32
|
|
|
5
33
|
### Patch Changes
|
package/build.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { build } from 'esbuild'
|
|
2
2
|
import fs from 'node:fs'
|
|
3
|
-
const { dependencies, devDependencies } = JSON.parse(fs.readFileSync('./package.json'))
|
|
3
|
+
const { dependencies, devDependencies } = JSON.parse(fs.readFileSync('./package.json'))
|
|
4
4
|
|
|
5
5
|
const ESM_MODULES = ['flat']
|
|
6
6
|
|
|
@@ -9,30 +9,41 @@ const sharedConfig = {
|
|
|
9
9
|
platform: 'node',
|
|
10
10
|
bundle: true,
|
|
11
11
|
external: [...Object.keys(dependencies), ...Object.keys(devDependencies)],
|
|
12
|
-
sourcemap: true
|
|
12
|
+
sourcemap: true
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
outdir: 'dist',
|
|
18
|
-
format: 'esm'
|
|
19
|
-
}).catch((e) => {
|
|
15
|
+
const handleError = (e) => {
|
|
16
|
+
console.log('Error bundling')
|
|
20
17
|
console.error(e)
|
|
21
18
|
process.exit(1)
|
|
22
|
-
}
|
|
19
|
+
}
|
|
23
20
|
|
|
21
|
+
const buildAll = async () => {
|
|
22
|
+
try {
|
|
23
|
+
await Promise.all([
|
|
24
|
+
build({
|
|
25
|
+
...sharedConfig,
|
|
26
|
+
outdir: 'dist',
|
|
27
|
+
format: 'esm'
|
|
28
|
+
}),
|
|
24
29
|
|
|
25
|
-
build({
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}).
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}
|
|
38
|
-
|
|
30
|
+
build({
|
|
31
|
+
...sharedConfig,
|
|
32
|
+
external: sharedConfig.external.filter((e) => !ESM_MODULES.includes(e)),
|
|
33
|
+
outdir: 'dist/cjs',
|
|
34
|
+
format: 'cjs'
|
|
35
|
+
}).then(() => {
|
|
36
|
+
fs.writeFileSync(
|
|
37
|
+
'./dist/cjs/package.json',
|
|
38
|
+
`{
|
|
39
|
+
"type": "commonjs"
|
|
40
|
+
}`
|
|
41
|
+
)
|
|
42
|
+
})
|
|
43
|
+
])
|
|
44
|
+
} catch (e) {
|
|
45
|
+
handleError(e)
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
await buildAll()
|
package/dist/cjs/index.js
CHANGED
|
@@ -31,6 +31,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
31
31
|
var src_exports = {};
|
|
32
32
|
__export(src_exports, {
|
|
33
33
|
addDriver: () => addDriver,
|
|
34
|
+
commitReportingErrors: () => commitReportingErrors,
|
|
34
35
|
config: () => config,
|
|
35
36
|
getDriver: () => getDriver,
|
|
36
37
|
reportError: () => reportError,
|
|
@@ -40,6 +41,8 @@ __export(src_exports, {
|
|
|
40
41
|
setReporterPayload: () => setReporterPayload
|
|
41
42
|
});
|
|
42
43
|
module.exports = __toCommonJS(src_exports);
|
|
44
|
+
var import_problem3 = require("@driveflux/problem");
|
|
45
|
+
var import_singleton2 = require("@driveflux/singleton");
|
|
43
46
|
var import_utils2 = require("@driveflux/utils");
|
|
44
47
|
|
|
45
48
|
// src/config.ts
|
|
@@ -47,6 +50,7 @@ var import_problem = require("@driveflux/problem");
|
|
|
47
50
|
var import_singleton = require("@driveflux/singleton");
|
|
48
51
|
var getConfig = () => ({
|
|
49
52
|
isProd: process.env.APP_ENV === "production",
|
|
53
|
+
deferReporting: typeof process.env.REPORTER_DEFER === "string" && process.env.REPORTER_DEFER !== "" ? process.env.REPORTER_DEFER === "true" : true,
|
|
50
54
|
slack: {
|
|
51
55
|
errorChannelId: process.env.SLACK_ERROR_CHANNEL,
|
|
52
56
|
token: process.env.SLACK_TOKEN,
|
|
@@ -285,7 +289,8 @@ ${metadata.request?.method}`
|
|
|
285
289
|
};
|
|
286
290
|
|
|
287
291
|
// src/index.ts
|
|
288
|
-
var
|
|
292
|
+
var problemsAndErrorsToReport = (0, import_singleton2.singleton)("reporterProblemsAndErrors", /* @__PURE__ */ new Set());
|
|
293
|
+
var customDrivers = (0, import_singleton2.singleton)("reporterCustomDrivers", /* @__PURE__ */ new Map());
|
|
289
294
|
var addDriver = (name, reporter, enabled = true) => {
|
|
290
295
|
customDrivers.set(name, {
|
|
291
296
|
enabled,
|
|
@@ -321,8 +326,35 @@ var getDrivers = () => {
|
|
|
321
326
|
return;
|
|
322
327
|
}).filter((d) => d);
|
|
323
328
|
};
|
|
324
|
-
var reportError = async (err, metadata = {}) => {
|
|
325
|
-
|
|
329
|
+
var reportError = async (err, metadata = {}, sync) => {
|
|
330
|
+
const defer = typeof sync === "boolean" ? !sync : config.deferReporting;
|
|
331
|
+
if (defer) {
|
|
332
|
+
problemsAndErrorsToReport.add(err);
|
|
333
|
+
} else {
|
|
334
|
+
await commitSingleError(err, metadata);
|
|
335
|
+
}
|
|
336
|
+
return err;
|
|
337
|
+
};
|
|
338
|
+
var reportProblem = async (problem, sync) => {
|
|
339
|
+
const defer = typeof sync === "boolean" ? !sync : config.deferReporting;
|
|
340
|
+
if (defer) {
|
|
341
|
+
problemsAndErrorsToReport.add(problem);
|
|
342
|
+
} else {
|
|
343
|
+
await commitSingleProblem(problem);
|
|
344
|
+
}
|
|
345
|
+
return problem;
|
|
346
|
+
};
|
|
347
|
+
var commitReportingErrors = async () => {
|
|
348
|
+
const promises = [];
|
|
349
|
+
const problemsToReport = problemsAndErrorsToReport.values();
|
|
350
|
+
problemsAndErrorsToReport.clear();
|
|
351
|
+
for (const err of problemsToReport) {
|
|
352
|
+
promises.push((0, import_problem3.isAProblem)(err) ? commitSingleProblem(err) : commitSingleError(err));
|
|
353
|
+
}
|
|
354
|
+
await Promise.allSettled(promises);
|
|
355
|
+
};
|
|
356
|
+
var commitSingleError = (err, metadata = {}) => {
|
|
357
|
+
return Promise.allSettled(
|
|
326
358
|
getDrivers().map((driver) => {
|
|
327
359
|
return driver.reportError(err, {
|
|
328
360
|
request: metadata.request,
|
|
@@ -330,10 +362,9 @@ var reportError = async (err, metadata = {}) => {
|
|
|
330
362
|
});
|
|
331
363
|
})
|
|
332
364
|
);
|
|
333
|
-
return err;
|
|
334
365
|
};
|
|
335
|
-
var
|
|
336
|
-
|
|
366
|
+
var commitSingleProblem = (problem) => {
|
|
367
|
+
return Promise.allSettled(
|
|
337
368
|
getDrivers().map((driver) => {
|
|
338
369
|
return driver.reportProblem({
|
|
339
370
|
...problem,
|
|
@@ -347,7 +378,6 @@ var reportProblem = async (problem) => {
|
|
|
347
378
|
});
|
|
348
379
|
})
|
|
349
380
|
);
|
|
350
|
-
return problem;
|
|
351
381
|
};
|
|
352
382
|
var setReporterPayload = (payload) => {
|
|
353
383
|
getDrivers().forEach((driver) => {
|
|
@@ -357,6 +387,7 @@ var setReporterPayload = (payload) => {
|
|
|
357
387
|
// Annotate the CommonJS export names for ESM import in node:
|
|
358
388
|
0 && (module.exports = {
|
|
359
389
|
addDriver,
|
|
390
|
+
commitReportingErrors,
|
|
360
391
|
config,
|
|
361
392
|
getDriver,
|
|
362
393
|
reportError,
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/index.ts", "../../src/config.ts", "../../src/drivers/console.ts", "../../src/drivers/rollbar.ts", "../../src/drivers/slack.ts", "../../../../node_modules/.pnpm/flat@6.0.1/node_modules/flat/index.js"],
|
|
4
|
-
"sourcesContent": ["import { omit } from '@driveflux/utils'\nimport { config, type Config } from './config.js'\nimport { ConsoleDriver } from './drivers/console.js'\nimport { RollbarDriver } from './drivers/rollbar.js'\nimport { SlackDriver } from './drivers/slack.js'\nimport type { Metadata, Reporter } from './types.js'\n\ntype Driver = keyof Config['drivers']\n\nexport * from './config.js'\n\nconst customDrivers = new Map<string, { enabled: boolean; reporter: Reporter }>()\n\nexport const addDriver = (name: string, reporter: Reporter, enabled = true) => {\n customDrivers.set(name, {\n enabled,\n reporter\n })\n}\n\nexport const getDriver = (driver: string): Reporter => {\n switch (driver) {\n case 'console':\n return new ConsoleDriver()\n case 'rollbar':\n return new RollbarDriver(config.rollbar)\n case 'slack': {\n if (!config.slack) {\n throw new Error(`Slack config missing`)\n }\n return new SlackDriver(config.slack!)\n }\n default: {\n const customDriver = customDrivers.get(driver)\n if (!customDriver) {\n throw new Error(`Driver ${driver} not found.`)\n }\n\n return customDriver.reporter\n }\n }\n}\n\nconst getDrivers = (): Reporter[] => {\n return Object.keys(config.drivers)\n .map((driver) => {\n if (config.drivers[driver as Driver] || customDrivers.get(driver)?.enabled) {\n return getDriver(driver)\n }\n return\n })\n .filter((d) => d) as Reporter[]\n}\n\nexport const reportError = async (err: Error, metadata: Metadata = {}) => {\n await Promise.allSettled(\n getDrivers().map((driver) => {\n return driver.reportError(err, {\n request: metadata.request,\n others: omit(metadata, 'request')\n })\n })\n )\n\n return err\n}\n\n/**\n *\n * @todo make function\n * @param problem\n */\nexport const reportProblem = async (problem: import('@driveflux/problem').Problem) => {\n await Promise.allSettled(\n getDrivers().map((driver) => {\n return driver.reportProblem({\n ...problem,\n privateMetadata: {\n request: problem.privateMetadata?.request,\n others: {\n ...problem.metadata,\n ...(problem.privateMetadata ? omit(problem.privateMetadata, 'request') : undefined)\n }\n }\n })\n })\n )\n\n return problem\n}\n\nexport const setReporterPayload = (payload: Record<string, any>) => {\n getDrivers().forEach((driver) => {\n driver.setReporterPayload(payload)\n })\n}\n", "import { ProblemSeverity } from '@driveflux/problem'\nimport { singleton } from '@driveflux/singleton'\nimport { Configuration } from 'rollbar'\n\nexport type Config = {\n isProd: boolean\n slack?: {\n errorChannelId: string\n token: string\n minimumSeverity: ProblemSeverity,\n },\n drivers: {\n slack: boolean\n rollbar: boolean\n console: boolean\n }\n rollbar?: Configuration\n}\n\nconst getConfig = (): Config =>\n ({\n isProd: process.env.APP_ENV === 'production',\n slack: {\n errorChannelId: process.env.SLACK_ERROR_CHANNEL!,\n token: process.env.SLACK_TOKEN!,\n minimumSeverity: ProblemSeverity.CRITICAL,\n },\n drivers: {\n slack: process.env.REPORTER_USE_SLACK === 'true',\n rollbar: process.env.REPORTER_USE_ROLLBAR === 'true',\n console: process.env.REPORTER_USE_CONSOLE !== 'false'\n },\n rollbar: {\n accessToken: process.env.ROLLBAR_ACCESS_TOKEN,\n enabled: true,\n captureUncaught: true,\n captureUnhandledRejections: true,\n environment: process.env.APP_ENV || process.env.NODE_ENV\n }\n } as const)\n\nexport let config: Config = singleton('reporterConfig', getConfig())\n\nexport const resetConfig = () => {\n config = singleton('reporterConfig', getConfig(), true)\n\n return config\n}\n\nexport const setConfig = <Key extends keyof Config>(key: Key, value: Config[Key]) => {\n config[key] = value\n}\n", "import type { Problem } from '@driveflux/problem'\nimport type { Metadata, Reporter } from '../types.js'\nexport class ConsoleDriver implements Reporter {\n private payload: any\n\n async reportError(err: Error, _: Metadata) {\n console.error('An error happened')\n console.error('Error', err)\n console.error('Payload', this.payload)\n }\n\n async reportProblem(problem: Problem) {\n console.error('A problem happened')\n console.error('Problem', problem)\n console.error('Payload', this.payload)\n }\n\n setReporterPayload(payload: Record<string, any>) {\n this.payload = payload\n }\n}\n", "import type { Problem } from '@driveflux/problem'\nimport Rollbar from 'rollbar'\nimport type { Metadata, Reporter } from '../types.js'\n\nexport class RollbarDriver implements Reporter {\n private rollbar\n\n constructor(rollbarConfig?: import('rollbar').Configuration) {\n this.rollbar = new Rollbar(rollbarConfig)\n }\n\n async reportError(err: Error, metadata: Metadata) {\n this.rollbar.error(err, metadata.request || {}, metadata.others)\n }\n\n async reportProblem(problem: Problem) {\n await new Promise((resolve) => {\n this.rollbar.error(\n problem.privateMetadata?.error || new Error(problem.message || problem.code),\n problem.privateMetadata?.request,\n problem.privateMetadata || {},\n (error) => {\n resolve(error)\n }\n )\n })\n }\n\n setReporterPayload(payload: Record<string, any>) {\n this.rollbar.configure({ payload })\n }\n}\n", "import { enhancedFetch } from '@driveflux/fetch'\nimport { ProblemSeverity, hasSeverityGte, type Problem } from '@driveflux/problem'\nimport { isEmpty, omit } from '@driveflux/utils'\nimport { flatten } from 'flat'\nimport { config, type Config } from '../config.js'\nimport type { Metadata, Reporter } from '../types.js'\n\n\nconst lines = (object: any) => {\n return {\n type: 'section',\n fields: Object.keys(object).map((key) => ({\n type: 'mrkdwn',\n body: `*${key}:*\\n${JSON.stringify(object[key])}`\n }))\n }\n}\n\nexport class SlackDriver implements Reporter {\n private accessToken: string\n private payload: Record<string, any> = {}\n private channel: string\n\n constructor(slackConfig: NonNullable<Config['slack']>) {\n this.accessToken = slackConfig.token\n this.channel = slackConfig.errorChannelId\n }\n\n async reportError(err: Error, metadata: Metadata) {\n // We won't check for severity for Error objects as they are most likely always critical\n const blocks: any[] = [\n {\n type: 'header',\n text: {\n type: 'mrkdwn',\n text: ':fire: Unexpected error happened',\n emoji: true\n }\n },\n {\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: err.message\n }\n }\n ]\n this.standardBody(blocks, metadata)\n await this.slack(blocks)\n }\n\n async reportProblem(problem: Problem) {\n if(!hasSeverityGte(problem, config.slack?.minimumSeverity || ProblemSeverity.CRITICAL)) {\n return\n }\n\n const blocks: any[] = [\n {\n type: 'header',\n text: {\n type: 'plain_text',\n text: 'Problem',\n emoji: true\n }\n },\n {\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: `*Code:*: ${problem.code}\\n*Message:* ${problem.message}`\n }\n }\n ]\n this.standardBody(blocks, problem.metadata)\n await this.slack(blocks)\n }\n\n setReporterPayload(payload: Record<string, any>) {\n this.payload = payload\n }\n\n private async slack(blocks: any[]): Promise<any> {\n return await enhancedFetch('https://slack.com/api/chat.postMessage', {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.accessToken}`\n },\n body: JSON.stringify({\n channel: this.channel,\n blocks\n })\n })\n }\n\n private standardBody(blocks: any[], metadata?: Metadata) {\n if (metadata?.request) {\n blocks.push({\n type: 'section',\n text: {\n type: 'plain_text',\n text: 'Request:'\n }\n })\n blocks.push({\n type: 'section',\n fields: [\n {\n type: 'mrkdwn',\n body: `*URL:*\\n${metadata.request?.url}`\n },\n {\n type: 'mrkdwn',\n body: `*Method:*\\n${metadata.request?.method}`\n }\n ]\n })\n }\n\n if (metadata) {\n blocks.push({\n type: 'section',\n text: {\n type: 'plain_text',\n text: 'Other Information:'\n }\n })\n blocks.push(lines(flatten(omit(metadata, 'request'))))\n }\n\n if (!isEmpty(this.payload)) {\n blocks.push({\n type: 'section',\n text: {\n type: 'plain_text',\n text: 'Other Information:'\n }\n })\n blocks.push(lines(flatten(this.payload)))\n }\n }\n}\n", "function isBuffer (obj) {\n return obj &&\n obj.constructor &&\n (typeof obj.constructor.isBuffer === 'function') &&\n obj.constructor.isBuffer(obj)\n}\n\nfunction keyIdentity (key) {\n return key\n}\n\nexport function flatten (target, opts) {\n opts = opts || {}\n\n const delimiter = opts.delimiter || '.'\n const maxDepth = opts.maxDepth\n const transformKey = opts.transformKey || keyIdentity\n const output = {}\n\n function step (object, prev, currentDepth) {\n currentDepth = currentDepth || 1\n Object.keys(object).forEach(function (key) {\n const value = object[key]\n const isarray = opts.safe && Array.isArray(value)\n const type = Object.prototype.toString.call(value)\n const isbuffer = isBuffer(value)\n const isobject = (\n type === '[object Object]' ||\n type === '[object Array]'\n )\n\n const newKey = prev\n ? prev + delimiter + transformKey(key)\n : transformKey(key)\n\n if (!isarray && !isbuffer && isobject && Object.keys(value).length &&\n (!opts.maxDepth || currentDepth < maxDepth)) {\n return step(value, newKey, currentDepth + 1)\n }\n\n output[newKey] = value\n })\n }\n\n step(target)\n\n return output\n}\n\nexport function unflatten (target, opts) {\n opts = opts || {}\n\n const delimiter = opts.delimiter || '.'\n const overwrite = opts.overwrite || false\n const transformKey = opts.transformKey || keyIdentity\n const result = {}\n\n const isbuffer = isBuffer(target)\n if (isbuffer || Object.prototype.toString.call(target) !== '[object Object]') {\n return target\n }\n\n // safely ensure that the key is\n // an integer.\n function getkey (key) {\n const parsedKey = Number(key)\n\n return (\n isNaN(parsedKey) ||\n key.indexOf('.') !== -1 ||\n opts.object\n )\n ? key\n : parsedKey\n }\n\n function addKeys (keyPrefix, recipient, target) {\n return Object.keys(target).reduce(function (result, key) {\n result[keyPrefix + delimiter + key] = target[key]\n\n return result\n }, recipient)\n }\n\n function isEmpty (val) {\n const type = Object.prototype.toString.call(val)\n const isArray = type === '[object Array]'\n const isObject = type === '[object Object]'\n\n if (!val) {\n return true\n } else if (isArray) {\n return !val.length\n } else if (isObject) {\n return !Object.keys(val).length\n }\n }\n\n target = Object.keys(target).reduce(function (result, key) {\n const type = Object.prototype.toString.call(target[key])\n const isObject = (type === '[object Object]' || type === '[object Array]')\n if (!isObject || isEmpty(target[key])) {\n result[key] = target[key]\n return result\n } else {\n return addKeys(\n key,\n result,\n flatten(target[key], opts)\n )\n }\n }, {})\n\n Object.keys(target).forEach(function (key) {\n const split = key.split(delimiter).map(transformKey)\n let key1 = getkey(split.shift())\n let key2 = getkey(split[0])\n let recipient = result\n\n while (key2 !== undefined) {\n if (key1 === '__proto__') {\n return\n }\n\n const type = Object.prototype.toString.call(recipient[key1])\n const isobject = (\n type === '[object Object]' ||\n type === '[object Array]'\n )\n\n // do not write over falsey, non-undefined values if overwrite is false\n if (!overwrite && !isobject && typeof recipient[key1] !== 'undefined') {\n return\n }\n\n if ((overwrite && !isobject) || (!overwrite && recipient[key1] == null)) {\n recipient[key1] = (\n typeof key2 === 'number' &&\n !opts.object\n ? []\n : {}\n )\n }\n\n recipient = recipient[key1]\n if (split.length > 0) {\n key1 = getkey(split.shift())\n key2 = getkey(split[0])\n }\n }\n\n // unflatten again for 'messy objects'\n recipient[key1] = unflatten(target[key], opts)\n })\n\n return result\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,gBAAqB;;;
|
|
6
|
-
"names": ["import_utils", "Rollbar", "import_problem"]
|
|
4
|
+
"sourcesContent": ["import { Problem, isAProblem } from '@driveflux/problem'\nimport { singleton } from '@driveflux/singleton'\nimport { omit } from '@driveflux/utils'\nimport { config, type Config } from './config.js'\nimport { ConsoleDriver } from './drivers/console.js'\nimport { RollbarDriver } from './drivers/rollbar.js'\nimport { SlackDriver } from './drivers/slack.js'\nimport type { Metadata, Reporter } from './types.js'\n\ntype Driver = keyof Config['drivers']\n\nexport * from './config.js'\n\nconst problemsAndErrorsToReport = singleton('reporterProblemsAndErrors', new Set<Problem | Error>())\n\nconst customDrivers = singleton('reporterCustomDrivers', new Map<string, { enabled: boolean; reporter: Reporter }>())\n\nexport const addDriver = (name: string, reporter: Reporter, enabled = true) => {\n customDrivers.set(name, {\n enabled,\n reporter\n })\n}\n\nexport const getDriver = (driver: string): Reporter => {\n switch (driver) {\n case 'console':\n return new ConsoleDriver()\n case 'rollbar':\n return new RollbarDriver(config.rollbar)\n case 'slack': {\n if (!config.slack) {\n throw new Error(`Slack config missing`)\n }\n return new SlackDriver(config.slack!)\n }\n default: {\n const customDriver = customDrivers.get(driver)\n if (!customDriver) {\n throw new Error(`Driver ${driver} not found.`)\n }\n\n return customDriver.reporter\n }\n }\n}\n\nconst getDrivers = (): Reporter[] => {\n return Object.keys(config.drivers)\n .map((driver) => {\n if (config.drivers[driver as Driver] || customDrivers.get(driver)?.enabled) {\n return getDriver(driver)\n }\n return\n })\n .filter((d) => d) as Reporter[]\n}\n\nexport const reportError = async (err: Error, metadata: Metadata = {}, sync?: boolean) => {\n const defer = typeof sync === 'boolean' ? !sync : config.deferReporting\n if (defer) {\n problemsAndErrorsToReport.add(err)\n } else {\n await commitSingleError(err, metadata)\n }\n\n return err\n}\n\n/**\n *\n * @todo make function\n * @param problem\n */\nexport const reportProblem = async (problem: Problem, sync?: boolean) => {\n const defer = typeof sync === 'boolean' ? !sync : config.deferReporting\n if (defer) {\n problemsAndErrorsToReport.add(problem)\n } else {\n await commitSingleProblem(problem)\n }\n\n return problem\n}\n\nexport const commitReportingErrors = async () => {\n const promises: Promise<any>[] = []\n const problemsToReport = problemsAndErrorsToReport.values()\n problemsAndErrorsToReport.clear()\n \n for (const err of problemsToReport) {\n promises.push(isAProblem(err) ? commitSingleProblem(err) : commitSingleError(err))\n }\n\n await Promise.allSettled(promises)\n \n}\n\nconst commitSingleError = (err: Error, metadata: Metadata = {}) => {\n return Promise.allSettled(\n getDrivers().map((driver) => {\n return driver.reportError(err, {\n request: metadata.request,\n others: omit(metadata, 'request')\n })\n })\n )\n}\n\nconst commitSingleProblem = (problem: Problem) => {\n return Promise.allSettled(\n getDrivers().map((driver) => {\n return driver.reportProblem({\n ...problem,\n privateMetadata: {\n request: problem.privateMetadata?.request,\n others: {\n ...problem.metadata,\n ...(problem.privateMetadata ? omit(problem.privateMetadata, 'request') : undefined)\n }\n }\n })\n })\n )\n}\n\nexport const setReporterPayload = (payload: Record<string, any>) => {\n getDrivers().forEach((driver) => {\n driver.setReporterPayload(payload)\n })\n}\n", "import { ProblemSeverity } from '@driveflux/problem'\nimport { singleton } from '@driveflux/singleton'\nimport { Configuration } from 'rollbar'\n\nexport type Config = {\n isProd: boolean\n deferReporting: boolean\n slack?: {\n errorChannelId: string\n token: string\n minimumSeverity: ProblemSeverity\n }\n drivers: {\n slack: boolean\n rollbar: boolean\n console: boolean\n }\n rollbar?: Configuration\n}\n\nconst getConfig = (): Config =>\n ({\n isProd: process.env.APP_ENV === 'production',\n deferReporting:\n typeof process.env.REPORTER_DEFER === 'string' && process.env.REPORTER_DEFER !== ''\n ? process.env.REPORTER_DEFER === 'true'\n : true,\n slack: {\n errorChannelId: process.env.SLACK_ERROR_CHANNEL!,\n token: process.env.SLACK_TOKEN!,\n minimumSeverity: ProblemSeverity.CRITICAL\n },\n drivers: {\n slack: process.env.REPORTER_USE_SLACK === 'true',\n rollbar: process.env.REPORTER_USE_ROLLBAR === 'true',\n console: process.env.REPORTER_USE_CONSOLE !== 'false'\n },\n rollbar: {\n accessToken: process.env.ROLLBAR_ACCESS_TOKEN,\n enabled: true,\n captureUncaught: true,\n captureUnhandledRejections: true,\n environment: process.env.APP_ENV || process.env.NODE_ENV\n }\n }) as const\n\nexport let config: Config = singleton('reporterConfig', getConfig())\n\nexport const resetConfig = () => {\n config = singleton('reporterConfig', getConfig(), true)\n\n return config\n}\n\nexport const setConfig = <Key extends keyof Config>(key: Key, value: Config[Key]) => {\n config[key] = value\n}\n", "import type { Problem } from '@driveflux/problem'\nimport type { Metadata, Reporter } from '../types.js'\nexport class ConsoleDriver implements Reporter {\n private payload: any\n\n async reportError(err: Error, _: Metadata) {\n console.error('An error happened')\n console.error('Error', err)\n console.error('Payload', this.payload)\n }\n\n async reportProblem(problem: Problem) {\n console.error('A problem happened')\n console.error('Problem', problem)\n console.error('Payload', this.payload)\n }\n\n setReporterPayload(payload: Record<string, any>) {\n this.payload = payload\n }\n}\n", "import type { Problem } from '@driveflux/problem'\nimport Rollbar from 'rollbar'\nimport type { Metadata, Reporter } from '../types.js'\n\nexport class RollbarDriver implements Reporter {\n private rollbar\n\n constructor(rollbarConfig?: import('rollbar').Configuration) {\n this.rollbar = new Rollbar(rollbarConfig)\n }\n\n async reportError(err: Error, metadata: Metadata) {\n this.rollbar.error(err, metadata.request || {}, metadata.others)\n }\n\n async reportProblem(problem: Problem) {\n await new Promise((resolve) => {\n this.rollbar.error(\n problem.privateMetadata?.error || new Error(problem.message || problem.code),\n problem.privateMetadata?.request,\n problem.privateMetadata || {},\n (error) => {\n resolve(error)\n }\n )\n })\n }\n\n setReporterPayload(payload: Record<string, any>) {\n this.rollbar.configure({ payload })\n }\n}\n", "import { enhancedFetch } from '@driveflux/fetch'\nimport { ProblemSeverity, hasSeverityGte, type Problem } from '@driveflux/problem'\nimport { isEmpty, omit } from '@driveflux/utils'\nimport { flatten } from 'flat'\nimport { config, type Config } from '../config.js'\nimport type { Metadata, Reporter } from '../types.js'\n\n\nconst lines = (object: any) => {\n return {\n type: 'section',\n fields: Object.keys(object).map((key) => ({\n type: 'mrkdwn',\n body: `*${key}:*\\n${JSON.stringify(object[key])}`\n }))\n }\n}\n\nexport class SlackDriver implements Reporter {\n private accessToken: string\n private payload: Record<string, any> = {}\n private channel: string\n\n constructor(slackConfig: NonNullable<Config['slack']>) {\n this.accessToken = slackConfig.token\n this.channel = slackConfig.errorChannelId\n }\n\n async reportError(err: Error, metadata: Metadata) {\n // We won't check for severity for Error objects as they are most likely always critical\n const blocks: any[] = [\n {\n type: 'header',\n text: {\n type: 'mrkdwn',\n text: ':fire: Unexpected error happened',\n emoji: true\n }\n },\n {\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: err.message\n }\n }\n ]\n this.standardBody(blocks, metadata)\n await this.slack(blocks)\n }\n\n async reportProblem(problem: Problem) {\n if(!hasSeverityGte(problem, config.slack?.minimumSeverity || ProblemSeverity.CRITICAL)) {\n return\n }\n\n const blocks: any[] = [\n {\n type: 'header',\n text: {\n type: 'plain_text',\n text: 'Problem',\n emoji: true\n }\n },\n {\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: `*Code:*: ${problem.code}\\n*Message:* ${problem.message}`\n }\n }\n ]\n this.standardBody(blocks, problem.metadata)\n await this.slack(blocks)\n }\n\n setReporterPayload(payload: Record<string, any>) {\n this.payload = payload\n }\n\n private async slack(blocks: any[]): Promise<any> {\n return await enhancedFetch('https://slack.com/api/chat.postMessage', {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.accessToken}`\n },\n body: JSON.stringify({\n channel: this.channel,\n blocks\n })\n })\n }\n\n private standardBody(blocks: any[], metadata?: Metadata) {\n if (metadata?.request) {\n blocks.push({\n type: 'section',\n text: {\n type: 'plain_text',\n text: 'Request:'\n }\n })\n blocks.push({\n type: 'section',\n fields: [\n {\n type: 'mrkdwn',\n body: `*URL:*\\n${metadata.request?.url}`\n },\n {\n type: 'mrkdwn',\n body: `*Method:*\\n${metadata.request?.method}`\n }\n ]\n })\n }\n\n if (metadata) {\n blocks.push({\n type: 'section',\n text: {\n type: 'plain_text',\n text: 'Other Information:'\n }\n })\n blocks.push(lines(flatten(omit(metadata, 'request'))))\n }\n\n if (!isEmpty(this.payload)) {\n blocks.push({\n type: 'section',\n text: {\n type: 'plain_text',\n text: 'Other Information:'\n }\n })\n blocks.push(lines(flatten(this.payload)))\n }\n }\n}\n", "function isBuffer (obj) {\n return obj &&\n obj.constructor &&\n (typeof obj.constructor.isBuffer === 'function') &&\n obj.constructor.isBuffer(obj)\n}\n\nfunction keyIdentity (key) {\n return key\n}\n\nexport function flatten (target, opts) {\n opts = opts || {}\n\n const delimiter = opts.delimiter || '.'\n const maxDepth = opts.maxDepth\n const transformKey = opts.transformKey || keyIdentity\n const output = {}\n\n function step (object, prev, currentDepth) {\n currentDepth = currentDepth || 1\n Object.keys(object).forEach(function (key) {\n const value = object[key]\n const isarray = opts.safe && Array.isArray(value)\n const type = Object.prototype.toString.call(value)\n const isbuffer = isBuffer(value)\n const isobject = (\n type === '[object Object]' ||\n type === '[object Array]'\n )\n\n const newKey = prev\n ? prev + delimiter + transformKey(key)\n : transformKey(key)\n\n if (!isarray && !isbuffer && isobject && Object.keys(value).length &&\n (!opts.maxDepth || currentDepth < maxDepth)) {\n return step(value, newKey, currentDepth + 1)\n }\n\n output[newKey] = value\n })\n }\n\n step(target)\n\n return output\n}\n\nexport function unflatten (target, opts) {\n opts = opts || {}\n\n const delimiter = opts.delimiter || '.'\n const overwrite = opts.overwrite || false\n const transformKey = opts.transformKey || keyIdentity\n const result = {}\n\n const isbuffer = isBuffer(target)\n if (isbuffer || Object.prototype.toString.call(target) !== '[object Object]') {\n return target\n }\n\n // safely ensure that the key is\n // an integer.\n function getkey (key) {\n const parsedKey = Number(key)\n\n return (\n isNaN(parsedKey) ||\n key.indexOf('.') !== -1 ||\n opts.object\n )\n ? key\n : parsedKey\n }\n\n function addKeys (keyPrefix, recipient, target) {\n return Object.keys(target).reduce(function (result, key) {\n result[keyPrefix + delimiter + key] = target[key]\n\n return result\n }, recipient)\n }\n\n function isEmpty (val) {\n const type = Object.prototype.toString.call(val)\n const isArray = type === '[object Array]'\n const isObject = type === '[object Object]'\n\n if (!val) {\n return true\n } else if (isArray) {\n return !val.length\n } else if (isObject) {\n return !Object.keys(val).length\n }\n }\n\n target = Object.keys(target).reduce(function (result, key) {\n const type = Object.prototype.toString.call(target[key])\n const isObject = (type === '[object Object]' || type === '[object Array]')\n if (!isObject || isEmpty(target[key])) {\n result[key] = target[key]\n return result\n } else {\n return addKeys(\n key,\n result,\n flatten(target[key], opts)\n )\n }\n }, {})\n\n Object.keys(target).forEach(function (key) {\n const split = key.split(delimiter).map(transformKey)\n let key1 = getkey(split.shift())\n let key2 = getkey(split[0])\n let recipient = result\n\n while (key2 !== undefined) {\n if (key1 === '__proto__') {\n return\n }\n\n const type = Object.prototype.toString.call(recipient[key1])\n const isobject = (\n type === '[object Object]' ||\n type === '[object Array]'\n )\n\n // do not write over falsey, non-undefined values if overwrite is false\n if (!overwrite && !isobject && typeof recipient[key1] !== 'undefined') {\n return\n }\n\n if ((overwrite && !isobject) || (!overwrite && recipient[key1] == null)) {\n recipient[key1] = (\n typeof key2 === 'number' &&\n !opts.object\n ? []\n : {}\n )\n }\n\n recipient = recipient[key1]\n if (split.length > 0) {\n key1 = getkey(split.shift())\n key2 = getkey(split[0])\n }\n }\n\n // unflatten again for 'messy objects'\n recipient[key1] = unflatten(target[key], opts)\n })\n\n return result\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_problem", "import_singleton", "import_utils", "Rollbar", "import_problem"]
|
|
7
7
|
}
|
package/dist/cjs/package.json
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
}
|
|
2
|
+
"type": "commonjs"
|
|
3
|
+
}
|
package/dist/config.d.ts
CHANGED
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAEvC,MAAM,MAAM,MAAM,GAAG;IACnB,MAAM,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE;QACN,cAAc,EAAE,MAAM,CAAA;QACtB,KAAK,EAAE,MAAM,CAAA;QACb,eAAe,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAEvC,MAAM,MAAM,MAAM,GAAG;IACnB,MAAM,EAAE,OAAO,CAAA;IACf,cAAc,EAAE,OAAO,CAAA;IACvB,KAAK,CAAC,EAAE;QACN,cAAc,EAAE,MAAM,CAAA;QACtB,KAAK,EAAE,MAAM,CAAA;QACb,eAAe,EAAE,eAAe,CAAA;KACjC,CAAA;IACD,OAAO,EAAE;QACP,KAAK,EAAE,OAAO,CAAA;QACd,OAAO,EAAE,OAAO,CAAA;QAChB,OAAO,EAAE,OAAO,CAAA;KACjB,CAAA;IACD,OAAO,CAAC,EAAE,aAAa,CAAA;CACxB,CAAA;AA4BD,eAAO,IAAI,MAAM,EAAE,MAAiD,CAAA;AAEpE,eAAO,MAAM,WAAW,cAIvB,CAAA;AAED,eAAO,MAAM,SAAS,kCAAmC,GAAG,SAAS,MAAM,CAAC,GAAG,CAAC,SAE/E,CAAA"}
|
package/dist/config.js
CHANGED
|
@@ -2,10 +2,13 @@ import { ProblemSeverity } from '@driveflux/problem';
|
|
|
2
2
|
import { singleton } from '@driveflux/singleton';
|
|
3
3
|
const getConfig = () => ({
|
|
4
4
|
isProd: process.env.APP_ENV === 'production',
|
|
5
|
+
deferReporting: typeof process.env.REPORTER_DEFER === 'string' && process.env.REPORTER_DEFER !== ''
|
|
6
|
+
? process.env.REPORTER_DEFER === 'true'
|
|
7
|
+
: true,
|
|
5
8
|
slack: {
|
|
6
9
|
errorChannelId: process.env.SLACK_ERROR_CHANNEL,
|
|
7
10
|
token: process.env.SLACK_TOKEN,
|
|
8
|
-
minimumSeverity: ProblemSeverity.CRITICAL
|
|
11
|
+
minimumSeverity: ProblemSeverity.CRITICAL
|
|
9
12
|
},
|
|
10
13
|
drivers: {
|
|
11
14
|
slack: process.env.REPORTER_USE_SLACK === 'true',
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAmBhD,MAAM,SAAS,GAAG,GAAW,EAAE,CAC7B,CAAC;IACC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,YAAY;IAC5C,cAAc,EACZ,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,EAAE;QACjF,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,MAAM;QACvC,CAAC,CAAC,IAAI;IACV,KAAK,EAAE;QACL,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAoB;QAChD,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,WAAY;QAC/B,eAAe,EAAE,eAAe,CAAC,QAAQ;KAC1C;IACD,OAAO,EAAE;QACP,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,MAAM;QAChD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,MAAM;QACpD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,OAAO;KACtD;IACD,OAAO,EAAE;QACP,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB;QAC7C,OAAO,EAAE,IAAI;QACb,eAAe,EAAE,IAAI;QACrB,0BAA0B,EAAE,IAAI;QAChC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ;KACzD;CACF,CAAU,CAAA;AAEb,MAAM,CAAC,IAAI,MAAM,GAAW,SAAS,CAAC,gBAAgB,EAAE,SAAS,EAAE,CAAC,CAAA;AAEpE,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,EAAE;IAC9B,MAAM,GAAG,SAAS,CAAC,gBAAgB,EAAE,SAAS,EAAE,EAAE,IAAI,CAAC,CAAA;IAEvD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,CAA2B,GAAQ,EAAE,KAAkB,EAAE,EAAE;IAClF,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;AACrB,CAAC,CAAA"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
|
+
import { Problem } from '@driveflux/problem';
|
|
1
2
|
import type { Metadata, Reporter } from './types.js';
|
|
2
3
|
export * from './config.js';
|
|
3
4
|
export declare const addDriver: (name: string, reporter: Reporter, enabled?: boolean) => void;
|
|
4
5
|
export declare const getDriver: (driver: string) => Reporter;
|
|
5
|
-
export declare const reportError: (err: Error, metadata?: Metadata) => Promise<Error>;
|
|
6
|
+
export declare const reportError: (err: Error, metadata?: Metadata, sync?: boolean) => Promise<Error>;
|
|
6
7
|
/**
|
|
7
8
|
*
|
|
8
9
|
* @todo make function
|
|
9
10
|
* @param problem
|
|
10
11
|
*/
|
|
11
|
-
export declare const reportProblem: (problem:
|
|
12
|
+
export declare const reportProblem: (problem: Problem, sync?: boolean) => Promise<Problem>;
|
|
13
|
+
export declare const commitReportingErrors: () => Promise<void>;
|
|
12
14
|
export declare const setReporterPayload: (payload: Record<string, any>) => void;
|
|
13
15
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAc,MAAM,oBAAoB,CAAA;AAOxD,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAIpD,cAAc,aAAa,CAAA;AAM3B,eAAO,MAAM,SAAS,SAAU,MAAM,YAAY,QAAQ,4BAKzD,CAAA;AAED,eAAO,MAAM,SAAS,WAAY,MAAM,KAAG,QAqB1C,CAAA;AAaD,eAAO,MAAM,WAAW,QAAe,KAAK,aAAY,QAAQ,SAAc,OAAO,mBASpF,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,YAAmB,OAAO,SAAS,OAAO,qBASnE,CAAA;AAED,eAAO,MAAM,qBAAqB,qBAWjC,CAAA;AA8BD,eAAO,MAAM,kBAAkB,YAAa,OAAO,MAAM,EAAE,GAAG,CAAC,SAI9D,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
// src/index.ts
|
|
2
|
+
import { isAProblem } from "@driveflux/problem";
|
|
3
|
+
import { singleton as singleton2 } from "@driveflux/singleton";
|
|
2
4
|
import { omit as omit2 } from "@driveflux/utils";
|
|
3
5
|
|
|
4
6
|
// src/config.ts
|
|
@@ -6,6 +8,7 @@ import { ProblemSeverity } from "@driveflux/problem";
|
|
|
6
8
|
import { singleton } from "@driveflux/singleton";
|
|
7
9
|
var getConfig = () => ({
|
|
8
10
|
isProd: process.env.APP_ENV === "production",
|
|
11
|
+
deferReporting: typeof process.env.REPORTER_DEFER === "string" && process.env.REPORTER_DEFER !== "" ? process.env.REPORTER_DEFER === "true" : true,
|
|
9
12
|
slack: {
|
|
10
13
|
errorChannelId: process.env.SLACK_ERROR_CHANNEL,
|
|
11
14
|
token: process.env.SLACK_TOKEN,
|
|
@@ -211,7 +214,8 @@ ${metadata.request?.method}`
|
|
|
211
214
|
};
|
|
212
215
|
|
|
213
216
|
// src/index.ts
|
|
214
|
-
var
|
|
217
|
+
var problemsAndErrorsToReport = singleton2("reporterProblemsAndErrors", /* @__PURE__ */ new Set());
|
|
218
|
+
var customDrivers = singleton2("reporterCustomDrivers", /* @__PURE__ */ new Map());
|
|
215
219
|
var addDriver = (name, reporter, enabled = true) => {
|
|
216
220
|
customDrivers.set(name, {
|
|
217
221
|
enabled,
|
|
@@ -247,8 +251,35 @@ var getDrivers = () => {
|
|
|
247
251
|
return;
|
|
248
252
|
}).filter((d) => d);
|
|
249
253
|
};
|
|
250
|
-
var reportError = async (err, metadata = {}) => {
|
|
251
|
-
|
|
254
|
+
var reportError = async (err, metadata = {}, sync) => {
|
|
255
|
+
const defer = typeof sync === "boolean" ? !sync : config.deferReporting;
|
|
256
|
+
if (defer) {
|
|
257
|
+
problemsAndErrorsToReport.add(err);
|
|
258
|
+
} else {
|
|
259
|
+
await commitSingleError(err, metadata);
|
|
260
|
+
}
|
|
261
|
+
return err;
|
|
262
|
+
};
|
|
263
|
+
var reportProblem = async (problem, sync) => {
|
|
264
|
+
const defer = typeof sync === "boolean" ? !sync : config.deferReporting;
|
|
265
|
+
if (defer) {
|
|
266
|
+
problemsAndErrorsToReport.add(problem);
|
|
267
|
+
} else {
|
|
268
|
+
await commitSingleProblem(problem);
|
|
269
|
+
}
|
|
270
|
+
return problem;
|
|
271
|
+
};
|
|
272
|
+
var commitReportingErrors = async () => {
|
|
273
|
+
const promises = [];
|
|
274
|
+
const problemsToReport = problemsAndErrorsToReport.values();
|
|
275
|
+
problemsAndErrorsToReport.clear();
|
|
276
|
+
for (const err of problemsToReport) {
|
|
277
|
+
promises.push(isAProblem(err) ? commitSingleProblem(err) : commitSingleError(err));
|
|
278
|
+
}
|
|
279
|
+
await Promise.allSettled(promises);
|
|
280
|
+
};
|
|
281
|
+
var commitSingleError = (err, metadata = {}) => {
|
|
282
|
+
return Promise.allSettled(
|
|
252
283
|
getDrivers().map((driver) => {
|
|
253
284
|
return driver.reportError(err, {
|
|
254
285
|
request: metadata.request,
|
|
@@ -256,10 +287,9 @@ var reportError = async (err, metadata = {}) => {
|
|
|
256
287
|
});
|
|
257
288
|
})
|
|
258
289
|
);
|
|
259
|
-
return err;
|
|
260
290
|
};
|
|
261
|
-
var
|
|
262
|
-
|
|
291
|
+
var commitSingleProblem = (problem) => {
|
|
292
|
+
return Promise.allSettled(
|
|
263
293
|
getDrivers().map((driver) => {
|
|
264
294
|
return driver.reportProblem({
|
|
265
295
|
...problem,
|
|
@@ -273,7 +303,6 @@ var reportProblem = async (problem) => {
|
|
|
273
303
|
});
|
|
274
304
|
})
|
|
275
305
|
);
|
|
276
|
-
return problem;
|
|
277
306
|
};
|
|
278
307
|
var setReporterPayload = (payload) => {
|
|
279
308
|
getDrivers().forEach((driver) => {
|
|
@@ -282,6 +311,7 @@ var setReporterPayload = (payload) => {
|
|
|
282
311
|
};
|
|
283
312
|
export {
|
|
284
313
|
addDriver,
|
|
314
|
+
commitReportingErrors,
|
|
285
315
|
config,
|
|
286
316
|
getDriver,
|
|
287
317
|
reportError,
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts", "../src/config.ts", "../src/drivers/console.ts", "../src/drivers/rollbar.ts", "../src/drivers/slack.ts"],
|
|
4
|
-
"sourcesContent": ["import { omit } from '@driveflux/utils'\nimport { config, type Config } from './config.js'\nimport { ConsoleDriver } from './drivers/console.js'\nimport { RollbarDriver } from './drivers/rollbar.js'\nimport { SlackDriver } from './drivers/slack.js'\nimport type { Metadata, Reporter } from './types.js'\n\ntype Driver = keyof Config['drivers']\n\nexport * from './config.js'\n\nconst customDrivers = new Map<string, { enabled: boolean; reporter: Reporter }>()\n\nexport const addDriver = (name: string, reporter: Reporter, enabled = true) => {\n customDrivers.set(name, {\n enabled,\n reporter\n })\n}\n\nexport const getDriver = (driver: string): Reporter => {\n switch (driver) {\n case 'console':\n return new ConsoleDriver()\n case 'rollbar':\n return new RollbarDriver(config.rollbar)\n case 'slack': {\n if (!config.slack) {\n throw new Error(`Slack config missing`)\n }\n return new SlackDriver(config.slack!)\n }\n default: {\n const customDriver = customDrivers.get(driver)\n if (!customDriver) {\n throw new Error(`Driver ${driver} not found.`)\n }\n\n return customDriver.reporter\n }\n }\n}\n\nconst getDrivers = (): Reporter[] => {\n return Object.keys(config.drivers)\n .map((driver) => {\n if (config.drivers[driver as Driver] || customDrivers.get(driver)?.enabled) {\n return getDriver(driver)\n }\n return\n })\n .filter((d) => d) as Reporter[]\n}\n\nexport const reportError = async (err: Error, metadata: Metadata = {}) => {\n await Promise.allSettled(\n getDrivers().map((driver) => {\n return driver.reportError(err, {\n request: metadata.request,\n others: omit(metadata, 'request')\n })\n })\n )\n\n return err\n}\n\n/**\n *\n * @todo make function\n * @param problem\n */\nexport const reportProblem = async (problem: import('@driveflux/problem').Problem) => {\n await Promise.allSettled(\n getDrivers().map((driver) => {\n return driver.reportProblem({\n ...problem,\n privateMetadata: {\n request: problem.privateMetadata?.request,\n others: {\n ...problem.metadata,\n ...(problem.privateMetadata ? omit(problem.privateMetadata, 'request') : undefined)\n }\n }\n })\n })\n )\n\n return problem\n}\n\nexport const setReporterPayload = (payload: Record<string, any>) => {\n getDrivers().forEach((driver) => {\n driver.setReporterPayload(payload)\n })\n}\n", "import { ProblemSeverity } from '@driveflux/problem'\nimport { singleton } from '@driveflux/singleton'\nimport { Configuration } from 'rollbar'\n\nexport type Config = {\n isProd: boolean\n slack?: {\n errorChannelId: string\n token: string\n minimumSeverity: ProblemSeverity,\n },\n drivers: {\n slack: boolean\n rollbar: boolean\n console: boolean\n }\n rollbar?: Configuration\n}\n\nconst getConfig = (): Config =>\n ({\n isProd: process.env.APP_ENV === 'production',\n slack: {\n errorChannelId: process.env.SLACK_ERROR_CHANNEL!,\n token: process.env.SLACK_TOKEN!,\n minimumSeverity: ProblemSeverity.CRITICAL,\n },\n drivers: {\n slack: process.env.REPORTER_USE_SLACK === 'true',\n rollbar: process.env.REPORTER_USE_ROLLBAR === 'true',\n console: process.env.REPORTER_USE_CONSOLE !== 'false'\n },\n rollbar: {\n accessToken: process.env.ROLLBAR_ACCESS_TOKEN,\n enabled: true,\n captureUncaught: true,\n captureUnhandledRejections: true,\n environment: process.env.APP_ENV || process.env.NODE_ENV\n }\n } as const)\n\nexport let config: Config = singleton('reporterConfig', getConfig())\n\nexport const resetConfig = () => {\n config = singleton('reporterConfig', getConfig(), true)\n\n return config\n}\n\nexport const setConfig = <Key extends keyof Config>(key: Key, value: Config[Key]) => {\n config[key] = value\n}\n", "import type { Problem } from '@driveflux/problem'\nimport type { Metadata, Reporter } from '../types.js'\nexport class ConsoleDriver implements Reporter {\n private payload: any\n\n async reportError(err: Error, _: Metadata) {\n console.error('An error happened')\n console.error('Error', err)\n console.error('Payload', this.payload)\n }\n\n async reportProblem(problem: Problem) {\n console.error('A problem happened')\n console.error('Problem', problem)\n console.error('Payload', this.payload)\n }\n\n setReporterPayload(payload: Record<string, any>) {\n this.payload = payload\n }\n}\n", "import type { Problem } from '@driveflux/problem'\nimport Rollbar from 'rollbar'\nimport type { Metadata, Reporter } from '../types.js'\n\nexport class RollbarDriver implements Reporter {\n private rollbar\n\n constructor(rollbarConfig?: import('rollbar').Configuration) {\n this.rollbar = new Rollbar(rollbarConfig)\n }\n\n async reportError(err: Error, metadata: Metadata) {\n this.rollbar.error(err, metadata.request || {}, metadata.others)\n }\n\n async reportProblem(problem: Problem) {\n await new Promise((resolve) => {\n this.rollbar.error(\n problem.privateMetadata?.error || new Error(problem.message || problem.code),\n problem.privateMetadata?.request,\n problem.privateMetadata || {},\n (error) => {\n resolve(error)\n }\n )\n })\n }\n\n setReporterPayload(payload: Record<string, any>) {\n this.rollbar.configure({ payload })\n }\n}\n", "import { enhancedFetch } from '@driveflux/fetch'\nimport { ProblemSeverity, hasSeverityGte, type Problem } from '@driveflux/problem'\nimport { isEmpty, omit } from '@driveflux/utils'\nimport { flatten } from 'flat'\nimport { config, type Config } from '../config.js'\nimport type { Metadata, Reporter } from '../types.js'\n\n\nconst lines = (object: any) => {\n return {\n type: 'section',\n fields: Object.keys(object).map((key) => ({\n type: 'mrkdwn',\n body: `*${key}:*\\n${JSON.stringify(object[key])}`\n }))\n }\n}\n\nexport class SlackDriver implements Reporter {\n private accessToken: string\n private payload: Record<string, any> = {}\n private channel: string\n\n constructor(slackConfig: NonNullable<Config['slack']>) {\n this.accessToken = slackConfig.token\n this.channel = slackConfig.errorChannelId\n }\n\n async reportError(err: Error, metadata: Metadata) {\n // We won't check for severity for Error objects as they are most likely always critical\n const blocks: any[] = [\n {\n type: 'header',\n text: {\n type: 'mrkdwn',\n text: ':fire: Unexpected error happened',\n emoji: true\n }\n },\n {\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: err.message\n }\n }\n ]\n this.standardBody(blocks, metadata)\n await this.slack(blocks)\n }\n\n async reportProblem(problem: Problem) {\n if(!hasSeverityGte(problem, config.slack?.minimumSeverity || ProblemSeverity.CRITICAL)) {\n return\n }\n\n const blocks: any[] = [\n {\n type: 'header',\n text: {\n type: 'plain_text',\n text: 'Problem',\n emoji: true\n }\n },\n {\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: `*Code:*: ${problem.code}\\n*Message:* ${problem.message}`\n }\n }\n ]\n this.standardBody(blocks, problem.metadata)\n await this.slack(blocks)\n }\n\n setReporterPayload(payload: Record<string, any>) {\n this.payload = payload\n }\n\n private async slack(blocks: any[]): Promise<any> {\n return await enhancedFetch('https://slack.com/api/chat.postMessage', {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.accessToken}`\n },\n body: JSON.stringify({\n channel: this.channel,\n blocks\n })\n })\n }\n\n private standardBody(blocks: any[], metadata?: Metadata) {\n if (metadata?.request) {\n blocks.push({\n type: 'section',\n text: {\n type: 'plain_text',\n text: 'Request:'\n }\n })\n blocks.push({\n type: 'section',\n fields: [\n {\n type: 'mrkdwn',\n body: `*URL:*\\n${metadata.request?.url}`\n },\n {\n type: 'mrkdwn',\n body: `*Method:*\\n${metadata.request?.method}`\n }\n ]\n })\n }\n\n if (metadata) {\n blocks.push({\n type: 'section',\n text: {\n type: 'plain_text',\n text: 'Other Information:'\n }\n })\n blocks.push(lines(flatten(omit(metadata, 'request'))))\n }\n\n if (!isEmpty(this.payload)) {\n blocks.push({\n type: 'section',\n text: {\n type: 'plain_text',\n text: 'Other Information:'\n }\n })\n blocks.push(lines(flatten(this.payload)))\n }\n }\n}\n"],
|
|
5
|
-
"mappings": ";AAAA,SAAS,
|
|
6
|
-
"names": ["omit", "ProblemSeverity", "ProblemSeverity", "omit"]
|
|
4
|
+
"sourcesContent": ["import { Problem, isAProblem } from '@driveflux/problem'\nimport { singleton } from '@driveflux/singleton'\nimport { omit } from '@driveflux/utils'\nimport { config, type Config } from './config.js'\nimport { ConsoleDriver } from './drivers/console.js'\nimport { RollbarDriver } from './drivers/rollbar.js'\nimport { SlackDriver } from './drivers/slack.js'\nimport type { Metadata, Reporter } from './types.js'\n\ntype Driver = keyof Config['drivers']\n\nexport * from './config.js'\n\nconst problemsAndErrorsToReport = singleton('reporterProblemsAndErrors', new Set<Problem | Error>())\n\nconst customDrivers = singleton('reporterCustomDrivers', new Map<string, { enabled: boolean; reporter: Reporter }>())\n\nexport const addDriver = (name: string, reporter: Reporter, enabled = true) => {\n customDrivers.set(name, {\n enabled,\n reporter\n })\n}\n\nexport const getDriver = (driver: string): Reporter => {\n switch (driver) {\n case 'console':\n return new ConsoleDriver()\n case 'rollbar':\n return new RollbarDriver(config.rollbar)\n case 'slack': {\n if (!config.slack) {\n throw new Error(`Slack config missing`)\n }\n return new SlackDriver(config.slack!)\n }\n default: {\n const customDriver = customDrivers.get(driver)\n if (!customDriver) {\n throw new Error(`Driver ${driver} not found.`)\n }\n\n return customDriver.reporter\n }\n }\n}\n\nconst getDrivers = (): Reporter[] => {\n return Object.keys(config.drivers)\n .map((driver) => {\n if (config.drivers[driver as Driver] || customDrivers.get(driver)?.enabled) {\n return getDriver(driver)\n }\n return\n })\n .filter((d) => d) as Reporter[]\n}\n\nexport const reportError = async (err: Error, metadata: Metadata = {}, sync?: boolean) => {\n const defer = typeof sync === 'boolean' ? !sync : config.deferReporting\n if (defer) {\n problemsAndErrorsToReport.add(err)\n } else {\n await commitSingleError(err, metadata)\n }\n\n return err\n}\n\n/**\n *\n * @todo make function\n * @param problem\n */\nexport const reportProblem = async (problem: Problem, sync?: boolean) => {\n const defer = typeof sync === 'boolean' ? !sync : config.deferReporting\n if (defer) {\n problemsAndErrorsToReport.add(problem)\n } else {\n await commitSingleProblem(problem)\n }\n\n return problem\n}\n\nexport const commitReportingErrors = async () => {\n const promises: Promise<any>[] = []\n const problemsToReport = problemsAndErrorsToReport.values()\n problemsAndErrorsToReport.clear()\n \n for (const err of problemsToReport) {\n promises.push(isAProblem(err) ? commitSingleProblem(err) : commitSingleError(err))\n }\n\n await Promise.allSettled(promises)\n \n}\n\nconst commitSingleError = (err: Error, metadata: Metadata = {}) => {\n return Promise.allSettled(\n getDrivers().map((driver) => {\n return driver.reportError(err, {\n request: metadata.request,\n others: omit(metadata, 'request')\n })\n })\n )\n}\n\nconst commitSingleProblem = (problem: Problem) => {\n return Promise.allSettled(\n getDrivers().map((driver) => {\n return driver.reportProblem({\n ...problem,\n privateMetadata: {\n request: problem.privateMetadata?.request,\n others: {\n ...problem.metadata,\n ...(problem.privateMetadata ? omit(problem.privateMetadata, 'request') : undefined)\n }\n }\n })\n })\n )\n}\n\nexport const setReporterPayload = (payload: Record<string, any>) => {\n getDrivers().forEach((driver) => {\n driver.setReporterPayload(payload)\n })\n}\n", "import { ProblemSeverity } from '@driveflux/problem'\nimport { singleton } from '@driveflux/singleton'\nimport { Configuration } from 'rollbar'\n\nexport type Config = {\n isProd: boolean\n deferReporting: boolean\n slack?: {\n errorChannelId: string\n token: string\n minimumSeverity: ProblemSeverity\n }\n drivers: {\n slack: boolean\n rollbar: boolean\n console: boolean\n }\n rollbar?: Configuration\n}\n\nconst getConfig = (): Config =>\n ({\n isProd: process.env.APP_ENV === 'production',\n deferReporting:\n typeof process.env.REPORTER_DEFER === 'string' && process.env.REPORTER_DEFER !== ''\n ? process.env.REPORTER_DEFER === 'true'\n : true,\n slack: {\n errorChannelId: process.env.SLACK_ERROR_CHANNEL!,\n token: process.env.SLACK_TOKEN!,\n minimumSeverity: ProblemSeverity.CRITICAL\n },\n drivers: {\n slack: process.env.REPORTER_USE_SLACK === 'true',\n rollbar: process.env.REPORTER_USE_ROLLBAR === 'true',\n console: process.env.REPORTER_USE_CONSOLE !== 'false'\n },\n rollbar: {\n accessToken: process.env.ROLLBAR_ACCESS_TOKEN,\n enabled: true,\n captureUncaught: true,\n captureUnhandledRejections: true,\n environment: process.env.APP_ENV || process.env.NODE_ENV\n }\n }) as const\n\nexport let config: Config = singleton('reporterConfig', getConfig())\n\nexport const resetConfig = () => {\n config = singleton('reporterConfig', getConfig(), true)\n\n return config\n}\n\nexport const setConfig = <Key extends keyof Config>(key: Key, value: Config[Key]) => {\n config[key] = value\n}\n", "import type { Problem } from '@driveflux/problem'\nimport type { Metadata, Reporter } from '../types.js'\nexport class ConsoleDriver implements Reporter {\n private payload: any\n\n async reportError(err: Error, _: Metadata) {\n console.error('An error happened')\n console.error('Error', err)\n console.error('Payload', this.payload)\n }\n\n async reportProblem(problem: Problem) {\n console.error('A problem happened')\n console.error('Problem', problem)\n console.error('Payload', this.payload)\n }\n\n setReporterPayload(payload: Record<string, any>) {\n this.payload = payload\n }\n}\n", "import type { Problem } from '@driveflux/problem'\nimport Rollbar from 'rollbar'\nimport type { Metadata, Reporter } from '../types.js'\n\nexport class RollbarDriver implements Reporter {\n private rollbar\n\n constructor(rollbarConfig?: import('rollbar').Configuration) {\n this.rollbar = new Rollbar(rollbarConfig)\n }\n\n async reportError(err: Error, metadata: Metadata) {\n this.rollbar.error(err, metadata.request || {}, metadata.others)\n }\n\n async reportProblem(problem: Problem) {\n await new Promise((resolve) => {\n this.rollbar.error(\n problem.privateMetadata?.error || new Error(problem.message || problem.code),\n problem.privateMetadata?.request,\n problem.privateMetadata || {},\n (error) => {\n resolve(error)\n }\n )\n })\n }\n\n setReporterPayload(payload: Record<string, any>) {\n this.rollbar.configure({ payload })\n }\n}\n", "import { enhancedFetch } from '@driveflux/fetch'\nimport { ProblemSeverity, hasSeverityGte, type Problem } from '@driveflux/problem'\nimport { isEmpty, omit } from '@driveflux/utils'\nimport { flatten } from 'flat'\nimport { config, type Config } from '../config.js'\nimport type { Metadata, Reporter } from '../types.js'\n\n\nconst lines = (object: any) => {\n return {\n type: 'section',\n fields: Object.keys(object).map((key) => ({\n type: 'mrkdwn',\n body: `*${key}:*\\n${JSON.stringify(object[key])}`\n }))\n }\n}\n\nexport class SlackDriver implements Reporter {\n private accessToken: string\n private payload: Record<string, any> = {}\n private channel: string\n\n constructor(slackConfig: NonNullable<Config['slack']>) {\n this.accessToken = slackConfig.token\n this.channel = slackConfig.errorChannelId\n }\n\n async reportError(err: Error, metadata: Metadata) {\n // We won't check for severity for Error objects as they are most likely always critical\n const blocks: any[] = [\n {\n type: 'header',\n text: {\n type: 'mrkdwn',\n text: ':fire: Unexpected error happened',\n emoji: true\n }\n },\n {\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: err.message\n }\n }\n ]\n this.standardBody(blocks, metadata)\n await this.slack(blocks)\n }\n\n async reportProblem(problem: Problem) {\n if(!hasSeverityGte(problem, config.slack?.minimumSeverity || ProblemSeverity.CRITICAL)) {\n return\n }\n\n const blocks: any[] = [\n {\n type: 'header',\n text: {\n type: 'plain_text',\n text: 'Problem',\n emoji: true\n }\n },\n {\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: `*Code:*: ${problem.code}\\n*Message:* ${problem.message}`\n }\n }\n ]\n this.standardBody(blocks, problem.metadata)\n await this.slack(blocks)\n }\n\n setReporterPayload(payload: Record<string, any>) {\n this.payload = payload\n }\n\n private async slack(blocks: any[]): Promise<any> {\n return await enhancedFetch('https://slack.com/api/chat.postMessage', {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.accessToken}`\n },\n body: JSON.stringify({\n channel: this.channel,\n blocks\n })\n })\n }\n\n private standardBody(blocks: any[], metadata?: Metadata) {\n if (metadata?.request) {\n blocks.push({\n type: 'section',\n text: {\n type: 'plain_text',\n text: 'Request:'\n }\n })\n blocks.push({\n type: 'section',\n fields: [\n {\n type: 'mrkdwn',\n body: `*URL:*\\n${metadata.request?.url}`\n },\n {\n type: 'mrkdwn',\n body: `*Method:*\\n${metadata.request?.method}`\n }\n ]\n })\n }\n\n if (metadata) {\n blocks.push({\n type: 'section',\n text: {\n type: 'plain_text',\n text: 'Other Information:'\n }\n })\n blocks.push(lines(flatten(omit(metadata, 'request'))))\n }\n\n if (!isEmpty(this.payload)) {\n blocks.push({\n type: 'section',\n text: {\n type: 'plain_text',\n text: 'Other Information:'\n }\n })\n blocks.push(lines(flatten(this.payload)))\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["singleton", "omit", "ProblemSeverity", "ProblemSeverity", "singleton", "omit"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@driveflux/reporter",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.1.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
"./package.json": "./package.json",
|
|
@@ -19,11 +19,11 @@
|
|
|
19
19
|
"module": "dist/index.js",
|
|
20
20
|
"types": "dist/index.d.ts",
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@driveflux/fetch": "6.0.
|
|
23
|
-
"@driveflux/problem": "4.0.
|
|
24
|
-
"@driveflux/redact": "4.0.
|
|
25
|
-
"@driveflux/singleton": "1.0.
|
|
26
|
-
"@driveflux/utils": "3.0.
|
|
22
|
+
"@driveflux/fetch": "6.0.8",
|
|
23
|
+
"@driveflux/problem": "4.0.3",
|
|
24
|
+
"@driveflux/redact": "4.0.3",
|
|
25
|
+
"@driveflux/singleton": "1.0.4",
|
|
26
|
+
"@driveflux/utils": "3.0.8",
|
|
27
27
|
"@sentry/node": "^7.113.0",
|
|
28
28
|
"flat": "6.0.1",
|
|
29
29
|
"rollbar": "^2.26.4"
|