From 04f1b890b8b44b62bf43bcf4f53888181056ab36 Mon Sep 17 00:00:00 2001 From: Rowan Manning <138944+rowanmanning@users.noreply.github.com> Date: Mon, 24 Jun 2024 14:17:18 +0100 Subject: [PATCH 1/6] fix: add type declarations for crash-handler --- .gitignore | 1 - jsconfig.build.json | 1 - packages/crash-handler/.npmignore | 2 -- packages/crash-handler/lib/index.js | 12 +----------- packages/crash-handler/package.json | 3 ++- packages/crash-handler/types/index.d.ts | 13 +++++++++++++ scripts/clean-generated-types.sh | 1 - test/modules/js-commonjs-uncompiled/index.js | 4 ++++ test/modules/js-esm-sucrase/index.js | 4 ++++ test/modules/js-esm-uncompiled/index.js | 4 ++++ test/modules/ts-commonjs-interop/index.ts | 4 ++++ test/modules/ts-commonjs-nointerop/index.ts | 4 ++++ test/modules/ts-esm-interop/index.ts | 4 ++++ test/modules/ts-esm-nointerop/index.ts | 4 ++++ 14 files changed, 44 insertions(+), 17 deletions(-) create mode 100644 packages/crash-handler/types/index.d.ts diff --git a/.gitignore b/.gitignore index dd61ae70..8798dcbe 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ .husky/_ -packages/crash-handler/**/*.d.* packages/errors/**/*.d.* packages/fetch-error-handler/**/*.d.* packages/log-error/**/*.d.* diff --git a/jsconfig.build.json b/jsconfig.build.json index 7f37332b..65044b29 100644 --- a/jsconfig.build.json +++ b/jsconfig.build.json @@ -8,7 +8,6 @@ "removeComments": true }, "include": [ - "packages/crash-handler/**/*.js", "packages/errors/**/*.js", "packages/fetch-error-handler/**/*.js", "packages/log-error/**/*.js", diff --git a/packages/crash-handler/.npmignore b/packages/crash-handler/.npmignore index 880e79fa..d4b2e9ba 100644 --- a/packages/crash-handler/.npmignore +++ b/packages/crash-handler/.npmignore @@ -1,5 +1,3 @@ -!*.d.ts -!*.d.ts.map CHANGELOG.md docs test \ No newline at end of file diff --git a/packages/crash-handler/lib/index.js b/packages/crash-handler/lib/index.js index 0bee1ab0..88732b92 100644 --- a/packages/crash-handler/lib/index.js +++ b/packages/crash-handler/lib/index.js @@ -3,20 +3,10 @@ const { logUnhandledError } = require('@dotcom-reliability-kit/log-error'); -/** - * @typedef {object} CrashHandlerOptions - * @property {import('@dotcom-reliability-kit/log-error').Logger & {[key: string]: any}} [logger] - * The logger to use to output errors. Defaults to Reliability Kit logger. - * @property {import('process')} [process] - * The Node.js process to add crash handlers for. - */ - /** * Register a crash handler on a process. * - * @public - * @param {CrashHandlerOptions} [options] - * Options to configure the crash handler. + * @param {import('@dotcom-reliability-kit/crash-handler').CrashHandlerOptions} [options] */ function registerCrashHandler(options = {}) { const process = options.process || global.process; diff --git a/packages/crash-handler/package.json b/packages/crash-handler/package.json index 063f2b83..0ed71d39 100644 --- a/packages/crash-handler/package.json +++ b/packages/crash-handler/package.json @@ -14,7 +14,8 @@ "node": "18.x || 20.x || 22.x", "npm": "8.x || 9.x || 10.x" }, - "main": "lib", + "main": "lib/index.js", + "types": "types/index.d.ts", "dependencies": { "@dotcom-reliability-kit/log-error": "^4.1.2" } diff --git a/packages/crash-handler/types/index.d.ts b/packages/crash-handler/types/index.d.ts new file mode 100644 index 00000000..cc53ae84 --- /dev/null +++ b/packages/crash-handler/types/index.d.ts @@ -0,0 +1,13 @@ +import { Logger } from '@dotcom-reliability-kit/logger'; + +declare module '@dotcom-reliability-kit/crash-handler' { + export type CrashHandlerOptions = { + logger?: Logger & { [key: string]: any }; + process?: NodeJS.Process; + }; + + declare function registerCrashHandler(options?: CrashHandlerOptions): void; + + export default registerCrashHandler; + export = registerCrashHandler; +} diff --git a/scripts/clean-generated-types.sh b/scripts/clean-generated-types.sh index 40529db0..2e137760 100755 --- a/scripts/clean-generated-types.sh +++ b/scripts/clean-generated-types.sh @@ -1,6 +1,5 @@ #!/usr/bin/env bash -find ./packages/crash-handler -name "*.d.ts*" | xargs -r rm find ./packages/errors -name "*.d.ts*" | xargs -r rm find ./packages/fetch-error-handler -name "*.d.ts*" | xargs -r rm find ./packages/log-error -name "*.d.ts*" | xargs -r rm diff --git a/test/modules/js-commonjs-uncompiled/index.js b/test/modules/js-commonjs-uncompiled/index.js index 2770be7c..bf55be9d 100644 --- a/test/modules/js-commonjs-uncompiled/index.js +++ b/test/modules/js-commonjs-uncompiled/index.js @@ -5,6 +5,7 @@ const logger2 = require('@dotcom-reliability-kit/logger').default; const { Logger, transforms } = require('@dotcom-reliability-kit/logger'); const serializeError = require('@dotcom-reliability-kit/serialize-error'); const serializeRequest = require('@dotcom-reliability-kit/serialize-request'); +const registerCrashHandler = require('@dotcom-reliability-kit/crash-handler'); /** * @typedef {object} TypeTests @@ -42,4 +43,7 @@ new Logger({ serializeError(new Error('hi')); serializeRequest({ url: 'https://example.com' }); +// Test that crash handler works +registerCrashHandler({ process, logger: logger1 || logger2 }); + console.log('OK'); diff --git a/test/modules/js-esm-sucrase/index.js b/test/modules/js-esm-sucrase/index.js index 67907746..0043103e 100644 --- a/test/modules/js-esm-sucrase/index.js +++ b/test/modules/js-esm-sucrase/index.js @@ -5,6 +5,7 @@ import * as logger2 from '@dotcom-reliability-kit/logger'; import { Logger, transforms } from '@dotcom-reliability-kit/logger'; import serializeError from '@dotcom-reliability-kit/serialize-error'; import serializeRequest from '@dotcom-reliability-kit/serialize-request'; +import registerCrashHandler from '@dotcom-reliability-kit/crash-handler'; /** * @typedef {object} TypeTests @@ -42,4 +43,7 @@ new Logger({ serializeError(new Error('hi')); serializeRequest({ url: 'https://example.com' }); +// Test that crash handler works +registerCrashHandler({ process, logger: logger1 || logger2 }); + console.log('OK'); diff --git a/test/modules/js-esm-uncompiled/index.js b/test/modules/js-esm-uncompiled/index.js index 67907746..0043103e 100644 --- a/test/modules/js-esm-uncompiled/index.js +++ b/test/modules/js-esm-uncompiled/index.js @@ -5,6 +5,7 @@ import * as logger2 from '@dotcom-reliability-kit/logger'; import { Logger, transforms } from '@dotcom-reliability-kit/logger'; import serializeError from '@dotcom-reliability-kit/serialize-error'; import serializeRequest from '@dotcom-reliability-kit/serialize-request'; +import registerCrashHandler from '@dotcom-reliability-kit/crash-handler'; /** * @typedef {object} TypeTests @@ -42,4 +43,7 @@ new Logger({ serializeError(new Error('hi')); serializeRequest({ url: 'https://example.com' }); +// Test that crash handler works +registerCrashHandler({ process, logger: logger1 || logger2 }); + console.log('OK'); diff --git a/test/modules/ts-commonjs-interop/index.ts b/test/modules/ts-commonjs-interop/index.ts index 8cda10a4..4a067abc 100644 --- a/test/modules/ts-commonjs-interop/index.ts +++ b/test/modules/ts-commonjs-interop/index.ts @@ -5,6 +5,7 @@ const logger2 = require('@dotcom-reliability-kit/logger').default; const { Logger, transforms } = require('@dotcom-reliability-kit/logger'); const serializeError = require('@dotcom-reliability-kit/serialize-error'); const serializeRequest = require('@dotcom-reliability-kit/serialize-request'); +const registerCrashHandler = require('@dotcom-reliability-kit/crash-handler'); type TypeTests = { // @ts-ignore TODO this isn't working correctly and we'll need @@ -50,4 +51,7 @@ new Logger({ serializeError(new Error('hi')); serializeRequest({ url: 'https://example.com' }); +// Test that crash handler works +registerCrashHandler({ process, logger: logger1 || logger2 }); + console.log('OK'); diff --git a/test/modules/ts-commonjs-nointerop/index.ts b/test/modules/ts-commonjs-nointerop/index.ts index 0073a3d8..498e5dad 100644 --- a/test/modules/ts-commonjs-nointerop/index.ts +++ b/test/modules/ts-commonjs-nointerop/index.ts @@ -5,6 +5,7 @@ const logger2 = require('@dotcom-reliability-kit/logger').default; const { Logger, transforms } = require('@dotcom-reliability-kit/logger'); const serializeError = require('@dotcom-reliability-kit/serialize-error'); const serializeRequest = require('@dotcom-reliability-kit/serialize-request'); +const registerCrashHandler = require('@dotcom-reliability-kit/crash-handler'); type TypeTests = { // @ts-ignore TODO this isn't working correctly and we'll need @@ -48,4 +49,7 @@ new Logger({ serializeError(new Error('hi')); serializeRequest({ url: 'https://example.com' }); +// Test that crash handler works +registerCrashHandler({ process, logger: logger1 || logger2 }); + console.log('OK'); diff --git a/test/modules/ts-esm-interop/index.ts b/test/modules/ts-esm-interop/index.ts index 2f172598..3e92e2be 100644 --- a/test/modules/ts-esm-interop/index.ts +++ b/test/modules/ts-esm-interop/index.ts @@ -5,6 +5,7 @@ import * as logger2 from '@dotcom-reliability-kit/logger'; import { Logger, transforms } from '@dotcom-reliability-kit/logger'; import serializeError from '@dotcom-reliability-kit/serialize-error'; import serializeRequest from '@dotcom-reliability-kit/serialize-request'; +import registerCrashHandler from '@dotcom-reliability-kit/crash-handler'; type TypeTests = { logger1: Logger; @@ -40,4 +41,7 @@ new Logger({ serializeError(new Error('hi')); serializeRequest({ url: 'https://example.com' }); +// Test that crash handler works +registerCrashHandler({ process, logger: logger1 || logger2 }); + console.log('OK'); diff --git a/test/modules/ts-esm-nointerop/index.ts b/test/modules/ts-esm-nointerop/index.ts index 2f172598..3e92e2be 100644 --- a/test/modules/ts-esm-nointerop/index.ts +++ b/test/modules/ts-esm-nointerop/index.ts @@ -5,6 +5,7 @@ import * as logger2 from '@dotcom-reliability-kit/logger'; import { Logger, transforms } from '@dotcom-reliability-kit/logger'; import serializeError from '@dotcom-reliability-kit/serialize-error'; import serializeRequest from '@dotcom-reliability-kit/serialize-request'; +import registerCrashHandler from '@dotcom-reliability-kit/crash-handler'; type TypeTests = { logger1: Logger; @@ -40,4 +41,7 @@ new Logger({ serializeError(new Error('hi')); serializeRequest({ url: 'https://example.com' }); +// Test that crash handler works +registerCrashHandler({ process, logger: logger1 || logger2 }); + console.log('OK'); From d95b98d21c5d08c9278bfc29ca7e90141c09239a Mon Sep 17 00:00:00 2001 From: Rowan Manning <138944+rowanmanning@users.noreply.github.com> Date: Mon, 24 Jun 2024 14:48:56 +0100 Subject: [PATCH 2/6] fix: add type declarations for opentelemetry --- .gitignore | 1 - jsconfig.build.json | 3 +- packages/opentelemetry/.npmignore | 2 -- packages/opentelemetry/lib/config/metrics.js | 10 +----- packages/opentelemetry/lib/config/tracing.js | 12 +------ packages/opentelemetry/lib/index.js | 28 ++------------- packages/opentelemetry/package.json | 3 +- packages/opentelemetry/types/index.d.ts | 38 ++++++++++++++++++++ scripts/clean-generated-types.sh | 1 - 9 files changed, 45 insertions(+), 53 deletions(-) create mode 100644 packages/opentelemetry/types/index.d.ts diff --git a/.gitignore b/.gitignore index 8798dcbe..7a5db660 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,6 @@ packages/log-error/**/*.d.* packages/logger/**/*.d.* packages/middleware-log-errors/**/*.d.* packages/middleware-render-error-info/**/*.d.* -packages/opentelemetry/**/*.d.* coverage node_modules/ resources/logos/dist diff --git a/jsconfig.build.json b/jsconfig.build.json index 65044b29..2bae8268 100644 --- a/jsconfig.build.json +++ b/jsconfig.build.json @@ -13,7 +13,6 @@ "packages/log-error/**/*.js", "packages/logger/**/*.js", "packages/middleware-log-errors/**/*.js", - "packages/middleware-render-error-info/**/*.js", - "packages/opentelemetry/**/*.js" + "packages/middleware-render-error-info/**/*.js" ] } \ No newline at end of file diff --git a/packages/opentelemetry/.npmignore b/packages/opentelemetry/.npmignore index 880e79fa..d4b2e9ba 100644 --- a/packages/opentelemetry/.npmignore +++ b/packages/opentelemetry/.npmignore @@ -1,5 +1,3 @@ -!*.d.ts -!*.d.ts.map CHANGELOG.md docs test \ No newline at end of file diff --git a/packages/opentelemetry/lib/config/metrics.js b/packages/opentelemetry/lib/config/metrics.js index ae41f33c..28463134 100644 --- a/packages/opentelemetry/lib/config/metrics.js +++ b/packages/opentelemetry/lib/config/metrics.js @@ -8,18 +8,10 @@ const { PeriodicExportingMetricReader } = const logger = require('@dotcom-reliability-kit/logger'); const { METRICS_USER_AGENT } = require('./user-agents'); -/** - * @typedef {object} MetricsOptions - * @property {string} [apiGatewayKey] - * The API key to send to the metrics collector if you're using the FT's official metrics collector endpoint. - * @property {string} [endpoint] - * The URL to send OpenTelemetry metrics to, for example http://localhost:4318/v1/metrics. - */ - /** * Create an OpenTelemetry metrics configuration. * - * @param {MetricsOptions} options + * @param {import('@dotcom-reliability-kit/opentelemetry').MetricsOptions} options * @returns {Partial} */ exports.createMetricsConfig = function createMetricsConfig(options) { diff --git a/packages/opentelemetry/lib/config/tracing.js b/packages/opentelemetry/lib/config/tracing.js index ae07776f..71ed553c 100644 --- a/packages/opentelemetry/lib/config/tracing.js +++ b/packages/opentelemetry/lib/config/tracing.js @@ -9,20 +9,10 @@ const { TRACING_USER_AGENT } = require('./user-agents'); const DEFAULT_SAMPLE_PERCENTAGE = 5; -/** - * @typedef {object} TracingOptions - * @property {string} [authorizationHeader] - * The HTTP `Authorization` header to send with OpenTelemetry tracing requests if you're using the Customer Products trace collector endpoint. - * @property {string} [endpoint] - * The URL to send OpenTelemetry trace segments to, for example http://localhost:4318/v1/traces. - * @property {number} [samplePercentage] - * What percentage of traces should be sent onto the collector. - */ - /** * Create an OpenTelemetry tracing configuration. * - * @param {TracingOptions} options + * @param {import('@dotcom-reliability-kit/opentelemetry').TracingOptions} options * @returns {Partial} */ exports.createTracingConfig = function createTracingConfig(options) { diff --git a/packages/opentelemetry/lib/index.js b/packages/opentelemetry/lib/index.js index 810a0c8a..07d4dc62 100644 --- a/packages/opentelemetry/lib/index.js +++ b/packages/opentelemetry/lib/index.js @@ -7,29 +7,11 @@ const opentelemetry = require('@opentelemetry/sdk-node'); const logger = require('@dotcom-reliability-kit/logger'); /** - * @typedef {import('./config/metrics').MetricsOptions} MetricsOptions + * @typedef {import('@dotcom-reliability-kit/opentelemetry').Options} Options */ /** - * @typedef {import('./config/tracing').TracingOptions} TracingOptions - */ - -/** - * @typedef {object} Options - * @property {string} [authorizationHeader] - * [DEPRECATED] The HTTP `Authorization` header to send with OpenTelemetry requests. Use `tracing.authorizationHeader` instead. - * @property {MetricsOptions} [metrics] - * Configuration options for OpenTelemetry metrics. - * @property {TracingOptions} [tracing] - * Configuration options for OpenTelemetry tracing. - */ - -/** - * @typedef {object} Instances - * @property {opentelemetry.NodeSDK} sdk - * A singleton instance of the OpenTelemetry Node SDK. - * @property {HostMetrics} [hostMetrics] - * A singleton instances of the OpenTelemetry host metrics collector. + * @typedef {import('@dotcom-reliability-kit/opentelemetry').Instances} Instances */ /** @@ -43,9 +25,7 @@ let instances; * Set up OpenTelemetry tracing. * * @param {Options} [options] - * OpenTelemetry configuration options. * @returns {Instances} - * Returns any created SDK instances. */ function setupOpenTelemetry({ authorizationHeader, @@ -121,13 +101,9 @@ function setupOpenTelemetry({ * Get a metrics meter from the configured OpenTelemetry SDK. * * @param {string} name - * The meter name. * @param {string} [version] - * The meter version. * @param {opentelemetry.api.MeterOptions} [options] - * Additional configuration options for the meter. * @returns {opentelemetry.api.Meter} - * Returns a metrics meter. */ function getMeter(name, version, options) { if (!instances) { diff --git a/packages/opentelemetry/package.json b/packages/opentelemetry/package.json index 3f411e10..b320ad92 100644 --- a/packages/opentelemetry/package.json +++ b/packages/opentelemetry/package.json @@ -14,7 +14,8 @@ "node": "18.x || 20.x || 22.x", "npm": "8.x || 9.x || 10.x" }, - "main": "lib", + "main": "lib/index.js", + "types": "types/index.d.ts", "dependencies": { "@dotcom-reliability-kit/app-info": "^3.2.0", "@dotcom-reliability-kit/errors": "^3.1.0", diff --git a/packages/opentelemetry/types/index.d.ts b/packages/opentelemetry/types/index.d.ts new file mode 100644 index 00000000..cb4d03af --- /dev/null +++ b/packages/opentelemetry/types/index.d.ts @@ -0,0 +1,38 @@ +import { HostMetrics } from '@opentelemetry/host-metrics'; +import opentelemetry from '@opentelemetry/sdk-node'; + +declare module '@dotcom-reliability-kit/opentelemetry' { + export type MetricsOptions = { + apiGatewayKey?: string; + endpoint?: string; + }; + + export type TracingOptions = { + authorizationHeader?: string; + endpoint?: string; + samplePercentage?: number; + }; + + export type Options = { + /** @deprecated */ + authorizationHeader?: string; + metrics?: MetricsOptions; + tracing?: TracingOptions; + }; + + export type Instances = { + sdk: opentelemetry.NodeSDK; + hostMetrics?: HostMetrics; + }; + + export function setup(options?: Options): Instances; + export function getMeter( + name: string, + version?: string, + options?: opentelemetry.api.MeterOptions + ): opentelemetry.api.Meter; +} + +declare module '@dotcom-reliability-kit/opentelemetry/setup' { + export {}; +} diff --git a/scripts/clean-generated-types.sh b/scripts/clean-generated-types.sh index 2e137760..6215652e 100755 --- a/scripts/clean-generated-types.sh +++ b/scripts/clean-generated-types.sh @@ -6,4 +6,3 @@ find ./packages/log-error -name "*.d.ts*" | xargs -r rm find ./packages/logger -name "*.d.ts*" | xargs -r rm find ./packages/middleware-log-errors -name "*.d.ts*" | xargs -r rm find ./packages/middleware-render-error-info -name "*.d.ts*" | xargs -r rm -find ./packages/opentelemetry -name "*.d.ts*" | xargs -r rm From 5d261a01a449a2eb851bf0e55e0814820c30e3f3 Mon Sep 17 00:00:00 2001 From: Rowan Manning <138944+rowanmanning@users.noreply.github.com> Date: Mon, 24 Jun 2024 14:52:31 +0100 Subject: [PATCH 3/6] chore: remove unnecessary tests We don't recommend interop and it's deprecated, I'm fine not testing against these any more. --- .../modules/ts-commonjs-interop/tsconfig.json | 14 ----- .../ts-commonjs-nointerop/.eslintrc.json | 13 ----- test/modules/ts-commonjs-nointerop/index.ts | 55 ------------------- .../ts-commonjs-nointerop/package.json | 10 ---- .../.eslintrc.json | 0 .../.gitignore | 0 .../index.ts | 0 .../package.json | 2 +- .../tsconfig.json | 0 test/modules/ts-esm-interop/.gitignore | 1 - test/modules/ts-esm-interop/tsconfig.json | 15 ----- test/modules/ts-esm-nointerop/.eslintrc.json | 13 ----- test/modules/ts-esm-nointerop/.gitignore | 1 - test/modules/ts-esm-nointerop/index.ts | 47 ---------------- test/modules/ts-esm-nointerop/package.json | 10 ---- .../{ts-esm-interop => ts-esm}/.eslintrc.json | 0 .../.gitignore | 0 .../{ts-esm-interop => ts-esm}/index.ts | 0 .../{ts-esm-interop => ts-esm}/package.json | 2 +- .../tsconfig.json | 0 20 files changed, 2 insertions(+), 181 deletions(-) delete mode 100644 test/modules/ts-commonjs-interop/tsconfig.json delete mode 100644 test/modules/ts-commonjs-nointerop/.eslintrc.json delete mode 100644 test/modules/ts-commonjs-nointerop/index.ts delete mode 100644 test/modules/ts-commonjs-nointerop/package.json rename test/modules/{ts-commonjs-interop => ts-commonjs}/.eslintrc.json (100%) rename test/modules/{ts-commonjs-interop => ts-commonjs}/.gitignore (100%) rename test/modules/{ts-commonjs-interop => ts-commonjs}/index.ts (100%) rename test/modules/{ts-commonjs-interop => ts-commonjs}/package.json (72%) rename test/modules/{ts-commonjs-nointerop => ts-commonjs}/tsconfig.json (100%) delete mode 100644 test/modules/ts-esm-interop/.gitignore delete mode 100644 test/modules/ts-esm-interop/tsconfig.json delete mode 100644 test/modules/ts-esm-nointerop/.eslintrc.json delete mode 100644 test/modules/ts-esm-nointerop/.gitignore delete mode 100644 test/modules/ts-esm-nointerop/index.ts delete mode 100644 test/modules/ts-esm-nointerop/package.json rename test/modules/{ts-esm-interop => ts-esm}/.eslintrc.json (100%) rename test/modules/{ts-commonjs-nointerop => ts-esm}/.gitignore (100%) rename test/modules/{ts-esm-interop => ts-esm}/index.ts (100%) rename test/modules/{ts-esm-interop => ts-esm}/package.json (74%) rename test/modules/{ts-esm-nointerop => ts-esm}/tsconfig.json (100%) diff --git a/test/modules/ts-commonjs-interop/tsconfig.json b/test/modules/ts-commonjs-interop/tsconfig.json deleted file mode 100644 index 79b7e57e..00000000 --- a/test/modules/ts-commonjs-interop/tsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "compilerOptions": { - "esModuleInterop": true, - "module": "CommonJS", - "moduleResolution": "node", - "skipLibCheck": true, - "strict": true, - "target": "ES2022", - "types": ["node"] - }, - "include": [ - "**/*.ts" - ] -} \ No newline at end of file diff --git a/test/modules/ts-commonjs-nointerop/.eslintrc.json b/test/modules/ts-commonjs-nointerop/.eslintrc.json deleted file mode 100644 index 4c165768..00000000 --- a/test/modules/ts-commonjs-nointerop/.eslintrc.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "extends": [ - "../../../.eslintrc.json" - ], - "ignorePatterns": ["*.js"], - "parserOptions": { - "sourceType": "script" - }, - "rules": { - "no-console": "off", - "no-duplicate-imports": "off" - } -} diff --git a/test/modules/ts-commonjs-nointerop/index.ts b/test/modules/ts-commonjs-nointerop/index.ts deleted file mode 100644 index 498e5dad..00000000 --- a/test/modules/ts-commonjs-nointerop/index.ts +++ /dev/null @@ -1,55 +0,0 @@ -const appInfo = require('@dotcom-reliability-kit/app-info'); -const { environment } = require('@dotcom-reliability-kit/app-info'); -const logger1 = require('@dotcom-reliability-kit/logger'); -const logger2 = require('@dotcom-reliability-kit/logger').default; -const { Logger, transforms } = require('@dotcom-reliability-kit/logger'); -const serializeError = require('@dotcom-reliability-kit/serialize-error'); -const serializeRequest = require('@dotcom-reliability-kit/serialize-request'); -const registerCrashHandler = require('@dotcom-reliability-kit/crash-handler'); - -type TypeTests = { - // @ts-ignore TODO this isn't working correctly and we'll need - // to rethink the way we build our type definitions in order to - // support TypeScript written as CommonJS properly. - logger1: Logger; - - // @ts-ignore TODO this isn't working correctly and we'll need - // to rethink the way we build our type definitions in order to - // support TypeScript written as CommonJS properly. - logger2: Logger; - - environment1: string; - environment2: string; -}; - -const result: TypeTests = { - // These test that the default logger exports - // are instances of the Logger export - logger1, - logger2, - // These test that appInfo can be imported either - // as a default or named exports - environment1: environment, - environment2: appInfo.environment -}; -module.exports = result; - -// Test that appInfo exports the correct values -if (!appInfo.environment || appInfo.environment !== environment) { - throw new Error('appInfo is not working'); -} - -// Test that a logger can be constructed -new Logger({ - transforms: [transforms.legacyMask()] -}); - -// Test that error and request serialization works. -// See: https://github.com/Financial-Times/cp-content-pipeline/blob/90ce06158b65742cd03cbf03f5372790906cad9e/packages/api/src/plugins/logging.ts#L1-L3 -serializeError(new Error('hi')); -serializeRequest({ url: 'https://example.com' }); - -// Test that crash handler works -registerCrashHandler({ process, logger: logger1 || logger2 }); - -console.log('OK'); diff --git a/test/modules/ts-commonjs-nointerop/package.json b/test/modules/ts-commonjs-nointerop/package.json deleted file mode 100644 index 55155d4b..00000000 --- a/test/modules/ts-commonjs-nointerop/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "@dotcom-reliability-kit/test-ts-commonjs-nointerop", - "version": "0.0.0", - "private": true, - "type": "commonjs", - "scripts": { - "test": "tsc --project ./tsconfig.json && npm start", - "start": "node ." - } -} diff --git a/test/modules/ts-commonjs-interop/.eslintrc.json b/test/modules/ts-commonjs/.eslintrc.json similarity index 100% rename from test/modules/ts-commonjs-interop/.eslintrc.json rename to test/modules/ts-commonjs/.eslintrc.json diff --git a/test/modules/ts-commonjs-interop/.gitignore b/test/modules/ts-commonjs/.gitignore similarity index 100% rename from test/modules/ts-commonjs-interop/.gitignore rename to test/modules/ts-commonjs/.gitignore diff --git a/test/modules/ts-commonjs-interop/index.ts b/test/modules/ts-commonjs/index.ts similarity index 100% rename from test/modules/ts-commonjs-interop/index.ts rename to test/modules/ts-commonjs/index.ts diff --git a/test/modules/ts-commonjs-interop/package.json b/test/modules/ts-commonjs/package.json similarity index 72% rename from test/modules/ts-commonjs-interop/package.json rename to test/modules/ts-commonjs/package.json index b5116610..527237c6 100644 --- a/test/modules/ts-commonjs-interop/package.json +++ b/test/modules/ts-commonjs/package.json @@ -1,5 +1,5 @@ { - "name": "@dotcom-reliability-kit/test-ts-commonjs-interop", + "name": "@dotcom-reliability-kit/test-ts-commonjs", "version": "0.0.0", "private": true, "type": "commonjs", diff --git a/test/modules/ts-commonjs-nointerop/tsconfig.json b/test/modules/ts-commonjs/tsconfig.json similarity index 100% rename from test/modules/ts-commonjs-nointerop/tsconfig.json rename to test/modules/ts-commonjs/tsconfig.json diff --git a/test/modules/ts-esm-interop/.gitignore b/test/modules/ts-esm-interop/.gitignore deleted file mode 100644 index 4c43fe68..00000000 --- a/test/modules/ts-esm-interop/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.js \ No newline at end of file diff --git a/test/modules/ts-esm-interop/tsconfig.json b/test/modules/ts-esm-interop/tsconfig.json deleted file mode 100644 index bc9dbbb0..00000000 --- a/test/modules/ts-esm-interop/tsconfig.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "compilerOptions": { - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "module": "ES2022", - "moduleResolution": "node", - "skipLibCheck": true, - "strict": true, - "target": "ES2022", - "types": ["node"] - }, - "include": [ - "**/*.ts" - ] -} \ No newline at end of file diff --git a/test/modules/ts-esm-nointerop/.eslintrc.json b/test/modules/ts-esm-nointerop/.eslintrc.json deleted file mode 100644 index a5aeab60..00000000 --- a/test/modules/ts-esm-nointerop/.eslintrc.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "extends": [ - "../../../.eslintrc.json" - ], - "ignorePatterns": ["*.js"], - "parserOptions": { - "sourceType": "module" - }, - "rules": { - "no-console": "off", - "no-duplicate-imports": "off" - } -} diff --git a/test/modules/ts-esm-nointerop/.gitignore b/test/modules/ts-esm-nointerop/.gitignore deleted file mode 100644 index 4c43fe68..00000000 --- a/test/modules/ts-esm-nointerop/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.js \ No newline at end of file diff --git a/test/modules/ts-esm-nointerop/index.ts b/test/modules/ts-esm-nointerop/index.ts deleted file mode 100644 index 3e92e2be..00000000 --- a/test/modules/ts-esm-nointerop/index.ts +++ /dev/null @@ -1,47 +0,0 @@ -import appInfo from '@dotcom-reliability-kit/app-info'; -import { environment } from '@dotcom-reliability-kit/app-info'; -import logger1 from '@dotcom-reliability-kit/logger'; -import * as logger2 from '@dotcom-reliability-kit/logger'; -import { Logger, transforms } from '@dotcom-reliability-kit/logger'; -import serializeError from '@dotcom-reliability-kit/serialize-error'; -import serializeRequest from '@dotcom-reliability-kit/serialize-request'; -import registerCrashHandler from '@dotcom-reliability-kit/crash-handler'; - -type TypeTests = { - logger1: Logger; - logger2: Logger; - environment1: string; - environment2: string; -}; - -const result: TypeTests = { - // These test that the default logger exports - // are instances of the Logger export - logger1, - logger2, - // These test that appInfo can be imported either - // as a default or named exports - environment1: environment, - environment2: appInfo.environment -}; -export default result; - -// Test that appInfo exports the correct values -if (!appInfo.environment || appInfo.environment !== environment) { - throw new Error('appInfo is not working'); -} - -// Test that a logger can be constructed -new Logger({ - transforms: [transforms.legacyMask()] -}); - -// Test that error and request serialization works. -// See: https://github.com/Financial-Times/cp-content-pipeline/blob/90ce06158b65742cd03cbf03f5372790906cad9e/packages/api/src/plugins/logging.ts#L1-L3 -serializeError(new Error('hi')); -serializeRequest({ url: 'https://example.com' }); - -// Test that crash handler works -registerCrashHandler({ process, logger: logger1 || logger2 }); - -console.log('OK'); diff --git a/test/modules/ts-esm-nointerop/package.json b/test/modules/ts-esm-nointerop/package.json deleted file mode 100644 index 5fcf31be..00000000 --- a/test/modules/ts-esm-nointerop/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "@dotcom-reliability-kit/test-ts-esm-nointerop", - "version": "0.0.0", - "private": true, - "type": "module", - "scripts": { - "test": "tsc --project ./tsconfig.json && npm start", - "start": "node ." - } -} diff --git a/test/modules/ts-esm-interop/.eslintrc.json b/test/modules/ts-esm/.eslintrc.json similarity index 100% rename from test/modules/ts-esm-interop/.eslintrc.json rename to test/modules/ts-esm/.eslintrc.json diff --git a/test/modules/ts-commonjs-nointerop/.gitignore b/test/modules/ts-esm/.gitignore similarity index 100% rename from test/modules/ts-commonjs-nointerop/.gitignore rename to test/modules/ts-esm/.gitignore diff --git a/test/modules/ts-esm-interop/index.ts b/test/modules/ts-esm/index.ts similarity index 100% rename from test/modules/ts-esm-interop/index.ts rename to test/modules/ts-esm/index.ts diff --git a/test/modules/ts-esm-interop/package.json b/test/modules/ts-esm/package.json similarity index 74% rename from test/modules/ts-esm-interop/package.json rename to test/modules/ts-esm/package.json index 3795272c..4ff0f014 100644 --- a/test/modules/ts-esm-interop/package.json +++ b/test/modules/ts-esm/package.json @@ -1,5 +1,5 @@ { - "name": "@dotcom-reliability-kit/test-ts-esm-interop", + "name": "@dotcom-reliability-kit/test-ts-esm", "version": "0.0.0", "private": true, "type": "module", diff --git a/test/modules/ts-esm-nointerop/tsconfig.json b/test/modules/ts-esm/tsconfig.json similarity index 100% rename from test/modules/ts-esm-nointerop/tsconfig.json rename to test/modules/ts-esm/tsconfig.json From 97311fd115f7e9921f3970c51a6b421aec385f01 Mon Sep 17 00:00:00 2001 From: Rowan Manning <138944+rowanmanning@users.noreply.github.com> Date: Mon, 24 Jun 2024 15:37:34 +0100 Subject: [PATCH 4/6] fix: add type declarations for log-error --- .gitignore | 1 - jsconfig.build.json | 1 - packages/log-error/.npmignore | 2 -- packages/log-error/lib/index.js | 49 +++-------------------------- packages/log-error/package.json | 3 +- packages/log-error/types/index.d.ts | 24 ++++++++++++++ scripts/clean-generated-types.sh | 1 - 7 files changed, 31 insertions(+), 50 deletions(-) create mode 100644 packages/log-error/types/index.d.ts diff --git a/.gitignore b/.gitignore index 7a5db660..b999b722 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ .husky/_ packages/errors/**/*.d.* packages/fetch-error-handler/**/*.d.* -packages/log-error/**/*.d.* packages/logger/**/*.d.* packages/middleware-log-errors/**/*.d.* packages/middleware-render-error-info/**/*.d.* diff --git a/jsconfig.build.json b/jsconfig.build.json index 2bae8268..6a4d70fd 100644 --- a/jsconfig.build.json +++ b/jsconfig.build.json @@ -10,7 +10,6 @@ "include": [ "packages/errors/**/*.js", "packages/fetch-error-handler/**/*.js", - "packages/log-error/**/*.js", "packages/logger/**/*.js", "packages/middleware-log-errors/**/*.js", "packages/middleware-render-error-info/**/*.js" diff --git a/packages/log-error/.npmignore b/packages/log-error/.npmignore index 880e79fa..d4b2e9ba 100644 --- a/packages/log-error/.npmignore +++ b/packages/log-error/.npmignore @@ -1,5 +1,3 @@ -!*.d.ts -!*.d.ts.map CHANGELOG.md docs test \ No newline at end of file diff --git a/packages/log-error/lib/index.js b/packages/log-error/lib/index.js index 6de262f3..9e64be09 100644 --- a/packages/log-error/lib/index.js +++ b/packages/log-error/lib/index.js @@ -4,44 +4,14 @@ const serializeError = require('@dotcom-reliability-kit/serialize-error'); const serializeRequest = require('@dotcom-reliability-kit/serialize-request'); /** - * @typedef {(...logData: any) => any} LogMethod - */ - -/** - * @typedef {object} Logger - * @property {LogMethod} error - * A function to log an error. - * @property {LogMethod} [fatal] - * A function to log a fatal error. - * @property {LogMethod} warn - * A function to log a warning. - */ - -/** - * @typedef {object} ErrorLoggingOptions - * @property {(string | Error & Record)} error - * The error to log. - * @property {string[]} [includeHeaders] - * An array of request headers to include in the log. - * @property {Logger & {[key: string]: any}} [logger] - * The logger to use to output errors. Defaults to Reliability Kit logger. - * @property {(string | import('@dotcom-reliability-kit/serialize-request').Request)} [request] - * An request object to include in the log. - */ - -/** - * @typedef {object} InternalErrorLoggingOptions - * @property {string} event - * The event to log. - * @property {("error" | "fatal" | "warn")} level - * The log level to use. One of "error", "fatal", or "warn". + * @typedef {import('@dotcom-reliability-kit/log-error').ErrorLoggingOptions} ErrorLoggingOptions */ /** * Log an error object with optional request information. * * @private - * @param {ErrorLoggingOptions & InternalErrorLoggingOptions} options + * @param {ErrorLoggingOptions & {event: string, level: 'error' | 'fatal' | 'warn'}} options * The data to log. * @returns {void} */ @@ -110,10 +80,7 @@ function extractErrorMessage(serializedError) { /** * Log a handled error. * - * @public - * @param {ErrorLoggingOptions} options - * The data to log. - * @returns {void} + * @type {typeof import('@dotcom-reliability-kit/log-error').logHandledError} */ function logHandledError({ error, includeHeaders, logger, request }) { logError({ @@ -129,10 +96,7 @@ function logHandledError({ error, includeHeaders, logger, request }) { /** * Log a recoverable error. * - * @public - * @param {ErrorLoggingOptions} options - * The data to log. - * @returns {void} + * @type {typeof import('@dotcom-reliability-kit/log-error').logHandledError} */ function logRecoverableError({ error, includeHeaders, logger, request }) { logError({ @@ -148,10 +112,7 @@ function logRecoverableError({ error, includeHeaders, logger, request }) { /** * Log an unhandled error. * - * @public - * @param {ErrorLoggingOptions} options - * The data to log. - * @returns {void} + * @type {typeof import('@dotcom-reliability-kit/log-error').logHandledError} */ function logUnhandledError({ error, includeHeaders, logger, request }) { logError({ diff --git a/packages/log-error/package.json b/packages/log-error/package.json index 2c0f1f8c..9d6d7d09 100644 --- a/packages/log-error/package.json +++ b/packages/log-error/package.json @@ -14,7 +14,8 @@ "node": "18.x || 20.x || 22.x", "npm": "8.x || 9.x || 10.x" }, - "main": "lib", + "main": "lib/index.js", + "types": "types/index.d.ts", "dependencies": { "@dotcom-reliability-kit/app-info": "^3.2.0", "@dotcom-reliability-kit/logger": "^3.1.2", diff --git a/packages/log-error/types/index.d.ts b/packages/log-error/types/index.d.ts new file mode 100644 index 00000000..c0d56809 --- /dev/null +++ b/packages/log-error/types/index.d.ts @@ -0,0 +1,24 @@ +import { Request } from '@dotcom-reliability-kit/serialize-request'; + +declare module '@dotcom-reliability-kit/log-error' { + type LogMethod = (...logData: any) => any; + + export type Logger = { + error: LogMethod; + fatal?: LogMethod; + warn: LogMethod; + }; + + export type ErrorLoggingOptions = { + error: string | (Error & Record); + includeHeaders?: string[]; + logger?: Logger & { [key: string]: any }; + request?: string | Request; + }; + + export function logHandledError(options: ErrorLoggingOptions): void; + + export function logRecoverableError(options: ErrorLoggingOptions): void; + + export function logUnhandledError(options: ErrorLoggingOptions): void; +} diff --git a/scripts/clean-generated-types.sh b/scripts/clean-generated-types.sh index 6215652e..22de206f 100755 --- a/scripts/clean-generated-types.sh +++ b/scripts/clean-generated-types.sh @@ -2,7 +2,6 @@ find ./packages/errors -name "*.d.ts*" | xargs -r rm find ./packages/fetch-error-handler -name "*.d.ts*" | xargs -r rm -find ./packages/log-error -name "*.d.ts*" | xargs -r rm find ./packages/logger -name "*.d.ts*" | xargs -r rm find ./packages/middleware-log-errors -name "*.d.ts*" | xargs -r rm find ./packages/middleware-render-error-info -name "*.d.ts*" | xargs -r rm From 7a1249fe0caf0bb1d972a7ebc8eae47c9e4fa56c Mon Sep 17 00:00:00 2001 From: Rowan Manning <138944+rowanmanning@users.noreply.github.com> Date: Mon, 24 Jun 2024 15:43:20 +0100 Subject: [PATCH 5/6] chore: update the package creation script This ensures that the correct type definitions are created. --- scripts/create-package.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/scripts/create-package.js b/scripts/create-package.js index 047b0b63..96df29e0 100755 --- a/scripts/create-package.js +++ b/scripts/create-package.js @@ -34,7 +34,7 @@ const releasePleaseManifest = require('../.release-please-manifest.json'); license: rootManifest.license, engines: rootManifest.engines, main: 'lib/index.js', - types: 'lib/index.d.ts' + types: 'types/index.d.ts' }; console.log('📦 initialising "package.json"'); await fs.writeFile( @@ -56,7 +56,7 @@ This module is part of [FT.com Reliability Kit](https://github.com/Financial-Tim console.log('📄 adding ".npmignore"'); await fs.writeFile( path.join(packagePath, '.npmignore'), - ['!*.d.ts', '!*.d.ts.map', 'CHANGELOG.md', 'docs', 'test'].join('\n') + ['CHANGELOG.md', 'docs', 'test'].join('\n') ); // Bootstrap base JavaScript files @@ -68,6 +68,14 @@ This module is part of [FT.com Reliability Kit](https://github.com/Financial-Tim `module.exports = {}; ` ); + console.log('🏗 adding "types/index.d.ts"'); + const typesPath = path.join(packagePath, 'types'); + await fs.mkdir(typesPath); + await fs.writeFile( + path.join(typesPath, 'index.d.ts'), + `declare module '@dotcom-reliability-kit/${name}' {} +` + ); // Bootstrap test JavaScript files console.log('🏗 adding "test/unit/lib/index.spec.js"'); From 045b483334d97ce457a1c36fa3cfd1de6ddeae59 Mon Sep 17 00:00:00 2001 From: Rowan Manning <138944+rowanmanning@users.noreply.github.com> Date: Mon, 24 Jun 2024 16:29:14 +0100 Subject: [PATCH 6/6] fix: add type declarations for errors --- .gitignore | 1 - jsconfig.build.json | 1 - packages/errors/.npmignore | 2 - packages/errors/lib/base-error.js | 35 +++----------- packages/errors/lib/data-store-error.js | 3 +- packages/errors/lib/http-error.js | 30 ++++-------- packages/errors/lib/operational-error.js | 25 ++++------ packages/errors/lib/upstream-service-error.js | 3 +- packages/errors/lib/user-input-error.js | 3 +- packages/errors/package.json | 3 +- packages/errors/types/index.d.ts | 48 +++++++++++++++++++ scripts/clean-generated-types.sh | 1 - 12 files changed, 78 insertions(+), 77 deletions(-) create mode 100644 packages/errors/types/index.d.ts diff --git a/.gitignore b/.gitignore index b999b722..add5b15c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ .husky/_ -packages/errors/**/*.d.* packages/fetch-error-handler/**/*.d.* packages/logger/**/*.d.* packages/middleware-log-errors/**/*.d.* diff --git a/jsconfig.build.json b/jsconfig.build.json index 6a4d70fd..91cf56ff 100644 --- a/jsconfig.build.json +++ b/jsconfig.build.json @@ -8,7 +8,6 @@ "removeComments": true }, "include": [ - "packages/errors/**/*.js", "packages/fetch-error-handler/**/*.js", "packages/logger/**/*.js", "packages/middleware-log-errors/**/*.js", diff --git a/packages/errors/.npmignore b/packages/errors/.npmignore index 880e79fa..d4b2e9ba 100644 --- a/packages/errors/.npmignore +++ b/packages/errors/.npmignore @@ -1,5 +1,3 @@ -!*.d.ts -!*.d.ts.map CHANGELOG.md docs test \ No newline at end of file diff --git a/packages/errors/lib/base-error.js b/packages/errors/lib/base-error.js index 1d314d49..09cb070f 100644 --- a/packages/errors/lib/base-error.js +++ b/packages/errors/lib/base-error.js @@ -1,15 +1,5 @@ /** - * @typedef {object} ErrorStrictData - * @property {string} [code] - * A machine-readable error code which identifies the specific type of error. - * @property {string} [message] - * A human readable message which describes the error. - * @property {Error | null} [cause] - * The root cause error instance. - */ - -/** - * @typedef {ErrorStrictData & Record} ErrorData + * @typedef {import('@dotcom-reliability-kit/errors').BaseErrorData} ErrorData */ /** @@ -19,8 +9,7 @@ class BaseError extends Error { /** * @override * @readonly - * @public - * @type {string} + * @type {import('@dotcom-reliability-kit/errors').BaseError['name']} */ name = 'BaseError'; @@ -28,8 +17,7 @@ class BaseError extends Error { * Whether the error is operational. * * @readonly - * @public - * @type {boolean} + * @type {import('@dotcom-reliability-kit/errors').BaseError['isOperational']} */ isOperational = false; @@ -37,8 +25,7 @@ class BaseError extends Error { * A machine-readable error code which identifies the specific type of error. * * @readonly - * @public - * @type {string} + * @type {import('@dotcom-reliability-kit/errors').BaseError['code']} */ code = BaseError.defaultCode; @@ -46,8 +33,7 @@ class BaseError extends Error { * The root cause error instance. * * @readonly - * @public - * @type {Error | null} + * @type {import('@dotcom-reliability-kit/errors').BaseError['cause']} */ cause = null; @@ -55,8 +41,7 @@ class BaseError extends Error { * Additional error information. * * @readonly - * @public - * @type {{[key: string]: any}} + * @type {import('@dotcom-reliability-kit/errors').BaseError['data']} */ data = {}; @@ -134,13 +119,7 @@ class BaseError extends Error { static defaultMessage = 'An error occurred'; /** - * Get whether an error object is marked as operational (it has a truthy `isOperational` property). - * - * @public - * @param {Error} error - * The error object to check. - * @returns {boolean} - * Returns whether the error is operational. + * @type {(typeof import('@dotcom-reliability-kit/errors').BaseError)['isErrorMarkedAsOperational']} */ static isErrorMarkedAsOperational(error) { // @ts-ignore Error.prototype.isOperational does not exist, but it's OK to check in this diff --git a/packages/errors/lib/data-store-error.js b/packages/errors/lib/data-store-error.js index 51228e0c..a208c365 100644 --- a/packages/errors/lib/data-store-error.js +++ b/packages/errors/lib/data-store-error.js @@ -7,8 +7,7 @@ class DataStoreError extends OperationalError { /** * @override * @readonly - * @public - * @type {string} + * @type {import('@dotcom-reliability-kit/errors').DataStoreError['name']} */ name = 'DataStoreError'; } diff --git a/packages/errors/lib/http-error.js b/packages/errors/lib/http-error.js index 3c1f5e4d..c9a6c442 100644 --- a/packages/errors/lib/http-error.js +++ b/packages/errors/lib/http-error.js @@ -11,13 +11,7 @@ const OperationalError = require('./operational-error'); const STATUS_CODES = require('http').STATUS_CODES; /** - * @typedef {object} HttpErrorStrictData - * @property {number} [statusCode] - * An HTTP status code. - */ - -/** - * @typedef {HttpErrorStrictData & OperationalError.OperationalErrorData} HttpErrorData + * @typedef {import('@dotcom-reliability-kit/errors').HttpErrorData} ErrorData */ /** @@ -27,28 +21,24 @@ class HttpError extends OperationalError { /** * @override * @readonly - * @public - * @type {string} + * @type {import('@dotcom-reliability-kit/errors').HttpError['name']} */ name = 'HttpError'; /** * @readonly - * @public - * @type {number} + * @type {import('@dotcom-reliability-kit/errors').HttpError['statusCode']} */ statusCode; /** * @readonly - * @public - * @type {string} + * @type {import('@dotcom-reliability-kit/errors').HttpError['statusMessage']} */ statusMessage; /** - * @public - * @type {number} + * @type {import('@dotcom-reliability-kit/errors').HttpError['status']} */ get status() { return this.statusCode; @@ -63,7 +53,7 @@ class HttpError extends OperationalError { * Create an error with error data. * * @overload - * @param {HttpErrorData} data + * @param {ErrorData} data * Additional error information. */ /** @@ -72,7 +62,7 @@ class HttpError extends OperationalError { * @overload * @param {string} message * The error message. - * @param {HttpErrorData} [data] + * @param {ErrorData} [data] * Additional error information. */ /** @@ -81,14 +71,14 @@ class HttpError extends OperationalError { * @overload * @param {number} status * The error HTTP status code. - * @param {HttpErrorData} [data] + * @param {ErrorData} [data] * Additional error information. */ /** - * @param {string | number | HttpErrorData} [message] + * @param {string | number | ErrorData} [message] * The error message if it's a string, the HTTP status code if it's a number, or full error * information if an object. - * @param {HttpErrorData} [data] + * @param {ErrorData} [data] * Additional error information if `message` is a string or number. */ constructor(message, data = {}) { diff --git a/packages/errors/lib/operational-error.js b/packages/errors/lib/operational-error.js index c99503da..cfd911c7 100644 --- a/packages/errors/lib/operational-error.js +++ b/packages/errors/lib/operational-error.js @@ -1,13 +1,7 @@ const BaseError = require('./base-error'); /** - * @typedef {object} OperationalErrorStrictData - * @property {string[]} [relatesToSystems] - * An array of FT system codes which are related to this error. - */ - -/** - * @typedef {OperationalErrorStrictData & BaseError.ErrorData} OperationalErrorData + * @typedef {import('@dotcom-reliability-kit/errors').OperationalErrorData} ErrorData */ /** @@ -17,8 +11,7 @@ class OperationalError extends BaseError { /** * @override * @readonly - * @public - * @type {string} + * @type {import('@dotcom-reliability-kit/errors').OperationalError['name']} */ name = 'OperationalError'; @@ -27,8 +20,7 @@ class OperationalError extends BaseError { * * @override * @readonly - * @public - * @type {boolean} + * @type {import('@dotcom-reliability-kit/errors').OperationalError['isOperational']} */ isOperational = true; @@ -37,8 +29,7 @@ class OperationalError extends BaseError { * If this error is caused by one or more dependencies, include their system code here. * * @readonly - * @public - * @type {string[]} + * @type {import('@dotcom-reliability-kit/errors').OperationalError['relatesToSystems']} */ relatesToSystems = []; @@ -51,7 +42,7 @@ class OperationalError extends BaseError { * Create an error with error data. * * @overload - * @param {OperationalErrorData} data + * @param {ErrorData} data * Additional error information. */ /** @@ -60,13 +51,13 @@ class OperationalError extends BaseError { * @overload * @param {string} message * The error message. - * @param {OperationalErrorData} [data] + * @param {ErrorData} [data] * Additional error information. */ /** - * @param {string | OperationalErrorData} [message] + * @param {string | ErrorData} [message] * The error message if it's a string, or full error information if an object. - * @param {OperationalErrorData} [data] + * @param {ErrorData} [data] * Additional error information if `message` is a string. */ constructor(message, data = {}) { diff --git a/packages/errors/lib/upstream-service-error.js b/packages/errors/lib/upstream-service-error.js index fbb04618..cbbd540a 100644 --- a/packages/errors/lib/upstream-service-error.js +++ b/packages/errors/lib/upstream-service-error.js @@ -7,8 +7,7 @@ class UpstreamServiceError extends HttpError { /** * @override * @readonly - * @public - * @type {string} + * @type {import('@dotcom-reliability-kit/errors').UpstreamServiceError['name']} */ name = 'UpstreamServiceError'; diff --git a/packages/errors/lib/user-input-error.js b/packages/errors/lib/user-input-error.js index 5a74783d..8753aeb7 100644 --- a/packages/errors/lib/user-input-error.js +++ b/packages/errors/lib/user-input-error.js @@ -7,8 +7,7 @@ class UserInputError extends HttpError { /** * @override * @readonly - * @public - * @type {string} + * @type {import('@dotcom-reliability-kit/errors').UserInputError['name']} */ name = 'UserInputError'; diff --git a/packages/errors/package.json b/packages/errors/package.json index 76ad3dce..8787767c 100644 --- a/packages/errors/package.json +++ b/packages/errors/package.json @@ -14,5 +14,6 @@ "node": "18.x || 20.x || 22.x", "npm": "8.x || 9.x || 10.x" }, - "main": "lib" + "main": "lib/index.js", + "types": "types/index.d.ts" } \ No newline at end of file diff --git a/packages/errors/types/index.d.ts b/packages/errors/types/index.d.ts new file mode 100644 index 00000000..d64c6aef --- /dev/null +++ b/packages/errors/types/index.d.ts @@ -0,0 +1,48 @@ +declare module '@dotcom-reliability-kit/errors' { + type BaseErrorData = { + code?: string; + message?: string; + cause?: Error | null; + } & { [key: string]: any }; + + type OperationalErrorData = { relatesToSystems?: string[] } & BaseErrorData; + + type HttpErrorData = { statusCode?: number } & OperationalErrorData; + + export class BaseError extends Error { + constructor(); + constructor(data: BaseErrorData); + constructor(message: string, data?: BaseErrorData); + + public override readonly name: string; + public readonly isOperational: boolean; + public readonly code: string; + public readonly cause: Error | null; + public readonly data: { [key: string]: any }; + + public static isErrorMarkedAsOperational(error: Error): boolean; + } + + export class OperationalError extends BaseError { + constructor(); + constructor(data: OperationalErrorData); + constructor(message: string, data?: OperationalErrorData); + + public readonly relatesToSystems: string[]; + } + + export class HttpError extends OperationalError { + constructor(); + constructor(data: HttpErrorData); + constructor(message: string, data?: HttpErrorData); + constructor(status: number, data?: HttpErrorData); + + public readonly statusCode: number; + public readonly statusMessage: string; + public readonly status: number; + } + + export class DataStoreError extends OperationalError {} + export class UpstreamServiceError extends HttpError {} + export class UserInputError extends HttpError {} +} diff --git a/scripts/clean-generated-types.sh b/scripts/clean-generated-types.sh index 22de206f..6f8b7311 100755 --- a/scripts/clean-generated-types.sh +++ b/scripts/clean-generated-types.sh @@ -1,6 +1,5 @@ #!/usr/bin/env bash -find ./packages/errors -name "*.d.ts*" | xargs -r rm find ./packages/fetch-error-handler -name "*.d.ts*" | xargs -r rm find ./packages/logger -name "*.d.ts*" | xargs -r rm find ./packages/middleware-log-errors -name "*.d.ts*" | xargs -r rm