diff --git a/biome.jsonc b/biome.jsonc index 39f4d297..35164366 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -7,9 +7,7 @@ // only run on changed files by default (faster, but happy to remove) "defaultBranch": "main" }, - "organizeImports": { - "enabled": true - }, + "assist": { "actions": { "source": { "organizeImports": "on" } } }, "formatter": { "indentStyle": "space", "indentWidth": 2, @@ -24,10 +22,22 @@ "linter": { "enabled": true, "rules": { - "recommended": true + "recommended": true, + "style": { + "noParameterAssign": "error", + "useAsConstAssertion": "error", + "useDefaultParameterLast": "error", + "useEnumInitializers": "error", + "useSelfClosingElements": "error", + "useSingleVarDeclarator": "error", + "noUnusedTemplateLiteral": "error", + "useNumberNamespace": "error", + "noInferrableTypes": "error", + "noUselessElse": "error" + } } }, "files": { - "ignore": ["pnpm-lock.yaml"] + "includes": ["**", "!**/pnpm-lock.yaml", "!dist"] } } diff --git a/package.json b/package.json index f1233ea5..e74dbcaa 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,9 @@ "main": "./dist/index.js", "module": "./dist/index.mjs", "types": "./dist/index.d.ts", - "files": ["dist/**"], + "files": [ + "dist/**" + ], "engines": { "node": ">=18" }, @@ -50,7 +52,7 @@ } }, "devDependencies": { - "@biomejs/biome": "1.9.4", + "@biomejs/biome": "2.2.0", "@types/node": "20.19.11", "@types/react": "19.1.2", "tsup": "8.5.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c93800b2..633dfc66 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,8 +13,8 @@ importers: version: 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) devDependencies: '@biomejs/biome': - specifier: 1.9.4 - version: 1.9.4 + specifier: 2.2.0 + version: 2.2.0 '@types/node': specifier: 20.19.11 version: 20.19.11 @@ -36,55 +36,55 @@ importers: packages: - '@biomejs/biome@1.9.4': - resolution: {integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==} + '@biomejs/biome@2.2.0': + resolution: {integrity: sha512-3On3RSYLsX+n9KnoSgfoYlckYBoU6VRM22cw1gB4Y0OuUVSYd/O/2saOJMrA4HFfA1Ff0eacOvMN1yAAvHtzIw==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@1.9.4': - resolution: {integrity: sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==} + '@biomejs/cli-darwin-arm64@2.2.0': + resolution: {integrity: sha512-zKbwUUh+9uFmWfS8IFxmVD6XwqFcENjZvEyfOxHs1epjdH3wyyMQG80FGDsmauPwS2r5kXdEM0v/+dTIA9FXAg==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@1.9.4': - resolution: {integrity: sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==} + '@biomejs/cli-darwin-x64@2.2.0': + resolution: {integrity: sha512-+OmT4dsX2eTfhD5crUOPw3RPhaR+SKVspvGVmSdZ9y9O/AgL8pla6T4hOn1q+VAFBHuHhsdxDRJgFCSC7RaMOw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@1.9.4': - resolution: {integrity: sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==} + '@biomejs/cli-linux-arm64-musl@2.2.0': + resolution: {integrity: sha512-egKpOa+4FL9YO+SMUMLUvf543cprjevNc3CAgDNFLcjknuNMcZ0GLJYa3EGTCR2xIkIUJDVneBV3O9OcIlCEZQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-arm64@1.9.4': - resolution: {integrity: sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==} + '@biomejs/cli-linux-arm64@2.2.0': + resolution: {integrity: sha512-6eoRdF2yW5FnW9Lpeivh7Mayhq0KDdaDMYOJnH9aT02KuSIX5V1HmWJCQQPwIQbhDh68Zrcpl8inRlTEan0SXw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-x64-musl@1.9.4': - resolution: {integrity: sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==} + '@biomejs/cli-linux-x64-musl@2.2.0': + resolution: {integrity: sha512-I5J85yWwUWpgJyC1CcytNSGusu2p9HjDnOPAFG4Y515hwRD0jpR9sT9/T1cKHtuCvEQ/sBvx+6zhz9l9wEJGAg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-linux-x64@1.9.4': - resolution: {integrity: sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==} + '@biomejs/cli-linux-x64@2.2.0': + resolution: {integrity: sha512-5UmQx/OZAfJfi25zAnAGHUMuOd+LOsliIt119x2soA2gLggQYrVPA+2kMUxR6Mw5M1deUF/AWWP2qpxgH7Nyfw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-win32-arm64@1.9.4': - resolution: {integrity: sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==} + '@biomejs/cli-win32-arm64@2.2.0': + resolution: {integrity: sha512-n9a1/f2CwIDmNMNkFs+JI0ZjFnMO0jdOyGNtihgUNFnlmd84yIYY2KMTBmMV58ZlVHjgmY5Y6E1hVTnSRieggA==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@1.9.4': - resolution: {integrity: sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==} + '@biomejs/cli-win32-x64@2.2.0': + resolution: {integrity: sha512-Nawu5nHjP/zPKTIryh2AavzTc/KEg4um/MxWdXW0A6P/RZOyIpa7+QSjeXwAwX/utJGaCoXRPWtF3m5U/bB3Ww==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -1007,39 +1007,39 @@ packages: snapshots: - '@biomejs/biome@1.9.4': + '@biomejs/biome@2.2.0': optionalDependencies: - '@biomejs/cli-darwin-arm64': 1.9.4 - '@biomejs/cli-darwin-x64': 1.9.4 - '@biomejs/cli-linux-arm64': 1.9.4 - '@biomejs/cli-linux-arm64-musl': 1.9.4 - '@biomejs/cli-linux-x64': 1.9.4 - '@biomejs/cli-linux-x64-musl': 1.9.4 - '@biomejs/cli-win32-arm64': 1.9.4 - '@biomejs/cli-win32-x64': 1.9.4 - - '@biomejs/cli-darwin-arm64@1.9.4': + '@biomejs/cli-darwin-arm64': 2.2.0 + '@biomejs/cli-darwin-x64': 2.2.0 + '@biomejs/cli-linux-arm64': 2.2.0 + '@biomejs/cli-linux-arm64-musl': 2.2.0 + '@biomejs/cli-linux-x64': 2.2.0 + '@biomejs/cli-linux-x64-musl': 2.2.0 + '@biomejs/cli-win32-arm64': 2.2.0 + '@biomejs/cli-win32-x64': 2.2.0 + + '@biomejs/cli-darwin-arm64@2.2.0': optional: true - '@biomejs/cli-darwin-x64@1.9.4': + '@biomejs/cli-darwin-x64@2.2.0': optional: true - '@biomejs/cli-linux-arm64-musl@1.9.4': + '@biomejs/cli-linux-arm64-musl@2.2.0': optional: true - '@biomejs/cli-linux-arm64@1.9.4': + '@biomejs/cli-linux-arm64@2.2.0': optional: true - '@biomejs/cli-linux-x64-musl@1.9.4': + '@biomejs/cli-linux-x64-musl@2.2.0': optional: true - '@biomejs/cli-linux-x64@1.9.4': + '@biomejs/cli-linux-x64@2.2.0': optional: true - '@biomejs/cli-win32-arm64@1.9.4': + '@biomejs/cli-win32-arm64@2.2.0': optional: true - '@biomejs/cli-win32-x64@1.9.4': + '@biomejs/cli-win32-x64@2.2.0': optional: true '@esbuild/aix-ppc64@0.25.8': diff --git a/src/api-keys/interfaces/remove-api-keys.interface.ts b/src/api-keys/interfaces/remove-api-keys.interface.ts index 0981478e..3b6b77dc 100644 --- a/src/api-keys/interfaces/remove-api-keys.interface.ts +++ b/src/api-keys/interfaces/remove-api-keys.interface.ts @@ -1,6 +1,6 @@ import type { Response } from '../../interfaces'; -// biome-ignore lint/complexity/noBannedTypes: +// biome-ignore lint/complexity/noBannedTypes: allow empty types export type RemoveApiKeyResponseSuccess = {}; export type RemoveApiKeyResponse = Response; diff --git a/src/batch/batch.spec.ts b/src/batch/batch.spec.ts index f641dbaa..c7450737 100644 --- a/src/batch/batch.spec.ts +++ b/src/batch/batch.spec.ts @@ -101,11 +101,11 @@ describe('Batch', () => { const lastCall = fetchMock.mock.calls[0]; expect(lastCall).toBeDefined(); - //@ts-ignore + //@ts-expect-error const hasIdempotencyKey = lastCall[1]?.headers.has('Idempotency-Key'); expect(hasIdempotencyKey).toBeFalsy(); - //@ts-ignore + //@ts-expect-error const usedIdempotencyKey = lastCall[1]?.headers.get('Idempotency-Key'); expect(usedIdempotencyKey).toBeNull(); }); @@ -145,11 +145,11 @@ describe('Batch', () => { // In the mock, headers is an object with key-value pairs expect(fetchMock.mock.calls[0][1]?.headers).toBeDefined(); - //@ts-ignore + //@ts-expect-error const hasIdempotencyKey = lastCall[1]?.headers.has('Idempotency-Key'); expect(hasIdempotencyKey).toBeTruthy(); - //@ts-ignore + //@ts-expect-error const usedIdempotencyKey = lastCall[1]?.headers.get('Idempotency-Key'); expect(usedIdempotencyKey).toBe(idempotencyKey); }); @@ -247,11 +247,11 @@ describe('Batch', () => { const lastCall = fetchMock.mock.calls[0]; expect(lastCall).toBeDefined(); - //@ts-ignore + //@ts-expect-error const hasIdempotencyKey = lastCall[1]?.headers.has('Idempotency-Key'); expect(hasIdempotencyKey).toBeFalsy(); - //@ts-ignore + //@ts-expect-error const usedIdempotencyKey = lastCall[1]?.headers.get('Idempotency-Key'); expect(usedIdempotencyKey).toBeNull(); }); @@ -291,11 +291,11 @@ describe('Batch', () => { // In the mock, headers is an object with key-value pairs expect(fetchMock.mock.calls[0][1]?.headers).toBeDefined(); - //@ts-ignore + //@ts-expect-error const hasIdempotencyKey = lastCall[1]?.headers.has('Idempotency-Key'); expect(hasIdempotencyKey).toBeTruthy(); - //@ts-ignore + //@ts-expect-error const usedIdempotencyKey = lastCall[1]?.headers.get('Idempotency-Key'); expect(usedIdempotencyKey).toBe(idempotencyKey); }); diff --git a/src/batch/batch.ts b/src/batch/batch.ts index 18829170..08158baa 100644 --- a/src/batch/batch.ts +++ b/src/batch/batch.ts @@ -32,7 +32,7 @@ export class Batch { try { const { renderAsync } = await import('@react-email/render'); this.renderAsync = renderAsync; - } catch (error) { + } catch { throw new Error( 'Failed to render React component. Make sure to install `@react-email/render`', ); diff --git a/src/broadcasts/broadcasts.ts b/src/broadcasts/broadcasts.ts index 90323b06..925adfaa 100644 --- a/src/broadcasts/broadcasts.ts +++ b/src/broadcasts/broadcasts.ts @@ -40,7 +40,7 @@ export class Broadcasts { try { const { renderAsync } = await import('@react-email/render'); this.renderAsync = renderAsync; - } catch (error) { + } catch { throw new Error( 'Failed to render React component. Make sure to install `@react-email/render`', ); diff --git a/src/emails/emails.spec.ts b/src/emails/emails.spec.ts index cabf987b..ccd58432 100644 --- a/src/emails/emails.spec.ts +++ b/src/emails/emails.spec.ts @@ -71,11 +71,11 @@ describe('Emails', () => { const lastCall = fetchMock.mock.calls[0]; expect(lastCall).toBeDefined(); - //@ts-ignore + //@ts-expect-error const hasIdempotencyKey = lastCall[1]?.headers.has('Idempotency-Key'); expect(hasIdempotencyKey).toBeFalsy(); - //@ts-ignore + //@ts-expect-error const usedIdempotencyKey = lastCall[1]?.headers.get('Idempotency-Key'); expect(usedIdempotencyKey).toBeNull(); }); @@ -109,11 +109,11 @@ describe('Emails', () => { // In the mock, headers is an object with key-value pairs expect(fetchMock.mock.calls[0][1]?.headers).toBeDefined(); - //@ts-ignore + //@ts-expect-error const hasIdempotencyKey = lastCall[1]?.headers.has('Idempotency-Key'); expect(hasIdempotencyKey).toBeTruthy(); - //@ts-ignore + //@ts-expect-error const usedIdempotencyKey = lastCall[1]?.headers.get('Idempotency-Key'); expect(usedIdempotencyKey).toBe(idempotencyKey); }); diff --git a/src/emails/emails.ts b/src/emails/emails.ts index 23c13b0c..84cdb7e8 100644 --- a/src/emails/emails.ts +++ b/src/emails/emails.ts @@ -41,7 +41,7 @@ export class Emails { try { const { renderAsync } = await import('@react-email/render'); this.renderAsync = renderAsync; - } catch (error) { + } catch { throw new Error( 'Failed to render React component. Make sure to install `@react-email/render`', ); diff --git a/src/index.ts b/src/index.ts index de508132..9cd7c1ed 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,3 @@ -export { Resend } from './resend'; -export { ErrorResponse } from './interfaces'; export * from './api-keys/interfaces/create-api-key-options.interface'; export * from './api-keys/interfaces/list-api-keys.interface'; export * from './api-keys/interfaces/remove-api-keys.interface'; @@ -7,9 +5,9 @@ export * from './audiences/interfaces/create-audience-options.interface'; export * from './audiences/interfaces/get-audience.interface'; export * from './audiences/interfaces/list-audiences.interface'; export * from './audiences/interfaces/remove-audience.interface'; +export * from './batch/interfaces/create-batch-options.interface'; export * from './broadcasts/interfaces/create-broadcast-options.interface'; export * from './broadcasts/interfaces/send-broadcast-options.interface'; -export * from './batch/interfaces/create-batch-options.interface'; export * from './contacts/interfaces/create-contact-options.interface'; export * from './contacts/interfaces/get-contact.interface'; export * from './contacts/interfaces/list-contacts.interface'; @@ -23,3 +21,5 @@ export * from './domains/interfaces/update-domain.interface'; export * from './domains/interfaces/verify-domain.interface'; export * from './emails/interfaces/create-email-options.interface'; export * from './emails/interfaces/get-email-options.interface'; +export { ErrorResponse } from './interfaces'; +export { Resend } from './resend'; diff --git a/src/rate-limiting.ts b/src/rate-limiting.ts index d9f6a4b5..76994fb2 100644 --- a/src/rate-limiting.ts +++ b/src/rate-limiting.ts @@ -1,4 +1,5 @@ -// @ts-ignore: this is used in the jsdoc for `shouldResetAfter` +// @ts-expect-error: this is used in the jsdoc for `shouldResetAfter` +// biome-ignore lint/correctness/noUnusedImports: this is used in the jsdoc for `shouldResetAfter` import type { Response } from './interfaces'; export type RateLimit = { diff --git a/src/resend.ts b/src/resend.ts index 3c114417..e5c17ed1 100644 --- a/src/resend.ts +++ b/src/resend.ts @@ -103,7 +103,7 @@ export class Resend { const data = await response.json(); return { data, rateLimiting, error: null }; - } catch (error) { + } catch { return { data: null, rateLimiting: null,