From 42657e9204caeb89609d38cd10e0a92d30d134d7 Mon Sep 17 00:00:00 2001 From: Maximiliano Salvatti <40447063+msalvatti@users.noreply.github.com> Date: Tue, 4 Aug 2026 07:33:45 -0300 Subject: [PATCH] fix(decorators): let the application own the reflect-metadata polyfill MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Four decorators carried `import 'reflect-metadata'`. None of the other eight `@bymax-one` libraries does — the polyfill belongs to the application, which loads it once in `main.ts`, and NestJS itself pulls it in: importing `@nestjs/common` alone takes `Reflect.defineMetadata` from `undefined` to `function`. Carrying it here also contradicted this package's own `"sideEffects": false`. That flag says no module in the package has a side effect, and an import whose entire purpose is its side effect is exactly one. Bundlers happen not to drop it — the decision is made by the imported package's flag, and `reflect-metadata` declares none — but a manifest should not assert something the code disproves. The measurable cost was in a consumer's bundle: with the import present, esbuild inlines the polyfill, taking a minimal bundle from 53 KB to 95 KB even when the application already loaded it. Specs keep their own `import 'reflect-metadata'`: a test file is its own entry point and has no application to load it. --- src/server/decorators/on-queue-event.decorator.ts | 1 - src/server/decorators/on-worker-event.decorator.ts | 10 +--------- src/server/decorators/process.decorator.ts | 5 +---- src/server/decorators/processor.decorator.ts | 1 - 4 files changed, 2 insertions(+), 15 deletions(-) diff --git a/src/server/decorators/on-queue-event.decorator.ts b/src/server/decorators/on-queue-event.decorator.ts index d16ea27..3d4b7c6 100644 --- a/src/server/decorators/on-queue-event.decorator.ts +++ b/src/server/decorators/on-queue-event.decorator.ts @@ -8,7 +8,6 @@ * @layer server/decorators */ -import 'reflect-metadata' import type { QueueEventListenerMetadata } from '../interfaces/processor-metadata.interface' import { QUEUE_EVENT_LISTENERS_METADATA_KEY } from './metadata-keys.constants' diff --git a/src/server/decorators/on-worker-event.decorator.ts b/src/server/decorators/on-worker-event.decorator.ts index d9087bd..2ca0cf2 100644 --- a/src/server/decorators/on-worker-event.decorator.ts +++ b/src/server/decorators/on-worker-event.decorator.ts @@ -7,7 +7,6 @@ * @layer server/decorators */ -import 'reflect-metadata' import type { QueueEventListenerMetadata } from '../interfaces/processor-metadata.interface' import { WORKER_EVENT_LISTENERS_METADATA_KEY } from './metadata-keys.constants' @@ -20,14 +19,7 @@ import { WORKER_EVENT_LISTENERS_METADATA_KEY } from './metadata-keys.constants' * @see https://docs.bullmq.io/guide/workers/worker-events */ export type WorkerEventName = - | 'completed' - | 'failed' - | 'progress' - | 'active' - | 'stalled' - | 'closing' - | 'closed' - | 'error' + 'completed' | 'failed' | 'progress' | 'active' | 'stalled' | 'closing' | 'closed' | 'error' /** * Marks a method as a worker-local event listener for the given event. The diff --git a/src/server/decorators/process.decorator.ts b/src/server/decorators/process.decorator.ts index 1854b5d..e7cb19b 100644 --- a/src/server/decorators/process.decorator.ts +++ b/src/server/decorators/process.decorator.ts @@ -6,7 +6,6 @@ * @layer server/decorators */ -import 'reflect-metadata' import type { ProcessHandlerMetadata } from '../interfaces/processor-metadata.interface' import { PROCESS_HANDLERS_METADATA_KEY } from './metadata-keys.constants' @@ -38,9 +37,7 @@ export function Process(jobName?: string): MethodDecorator { const existing = (Reflect.getOwnMetadata(PROCESS_HANDLERS_METADATA_KEY, target.constructor) ?? []) as ProcessHandlerMetadata[] const entry: ProcessHandlerMetadata = - jobName !== undefined - ? { jobName, methodKey: propertyKey } - : { methodKey: propertyKey } + jobName !== undefined ? { jobName, methodKey: propertyKey } : { methodKey: propertyKey } Reflect.defineMetadata(PROCESS_HANDLERS_METADATA_KEY, [...existing, entry], target.constructor) } } diff --git a/src/server/decorators/processor.decorator.ts b/src/server/decorators/processor.decorator.ts index 1d4c637..bd0c51f 100644 --- a/src/server/decorators/processor.decorator.ts +++ b/src/server/decorators/processor.decorator.ts @@ -5,7 +5,6 @@ * @layer server/decorators */ -import 'reflect-metadata' import { DEFAULT_WORKER_CONCURRENCY } from '../constants/default-options' import type { ProcessorMetadata } from '../interfaces/processor-metadata.interface' import type { WorkerOptions } from '../interfaces/worker-options.interface'