@fluojs/core 1.0.3 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.ko.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  <p><a href="./README.md"><kbd>English</kbd></a> <strong><kbd>한국어</kbd></strong></p>
4
4
 
5
+ Node.js 지원 범위는 `>=24.0.0 <27`입니다. 업그레이드 절차는 [Node.js 지원 및 마이그레이션](../../docs/reference/node-support.ko.md)을 참조하세요.
6
+
5
7
  모든 fluo 패키지가 공통으로 사용하는 표준 데코레이터, 공유 계약, 메타데이터 프리미티브를 제공하는 기반 패키지입니다.
6
8
 
7
9
  ## 목차
@@ -60,14 +62,24 @@ class UserService {
60
62
 
61
63
  fluo는 TC39 표준 데코레이터를 사용하므로 `experimentalDecorators: true`나 `emitDecoratorMetadata: true`에 의존하지 않습니다.
62
64
 
63
- core 메타데이터는 fluo가 소유한 저장소와 TC39 `Symbol.metadata` 통합 지점을 통해 기록되며, `reflect-metadata`나 컴파일러가 생성하는 design type 메타데이터를 사용하지 않습니다. `@fluojs/core`를 import하는 것만으로는 전역 `Symbol.metadata` 폴리필을 설치하지 않습니다. 런타임이 사용자 정의 표준 데코레이터를 평가하기 전에 폴리필을 설치해야 한다면 테스트나 부트스트랩 경계에서 `ensureMetadataSymbol()`을 호출하세요.
65
+ core 메타데이터는 fluo가 소유한 저장소와 TC39 `Symbol.metadata` 통합 지점을 통해 기록되며, `reflect-metadata`나 컴파일러가 생성하는 design type 메타데이터를 사용하지 않습니다. `@fluojs/core`를 import하는 것만으로는 전역 `Symbol.metadata` 폴리필을 설치하지 않습니다. fluo 내장 데코레이터는 framework-owned store를 통해 계속 동작하지만, `context.metadata`를 읽는 사용자 정의 표준 데코레이터는 decorated module이 평가되기 전에 `Symbol.metadata`가 필요합니다.
64
66
 
65
67
  ```ts
68
+ // preload.ts — 이 파일을 애플리케이션 entrypoint로 설정합니다.
66
69
  import { ensureMetadataSymbol } from '@fluojs/core';
67
70
 
68
71
  ensureMetadataSymbol();
72
+ await import('./bootstrap.js');
69
73
  ```
70
74
 
75
+ dynamic import는 의도적인 순서 보장입니다. decorated class를 static import한 일반 bootstrap module에서 나중에 `ensureMetadataSymbol()`을 호출하면 너무 늦습니다. ESM은 bootstrap module body를 실행하기 전에 static import graph를 먼저 평가하기 때문입니다.
76
+
77
+ ### 빈 module metadata
78
+
79
+ `@Module()`과 `@Module(undefined)`는 `@Module({})`의 축약입니다. Module metadata 등록,
80
+ 앞서 선언된 부분 필드와 어느 순서의 `@Global()` 보존, metadata version 갱신은 유지합니다.
81
+ Decorator가 없는 클래스와는 다릅니다.
82
+
71
83
  ### 명시적인 의존성 메타데이터
72
84
 
73
85
  `@Inject(...)`는 리플렉션 기반 추론 대신 코드 안에서 의존성 토큰을 직접 드러냅니다. 이 데코레이터는 표준 클래스 데코레이터이므로 constructor parameter나 property가 아니라 생성자 토큰을 선언할 클래스 위에 붙입니다. 상속된 constructor 토큰을 명시적으로 비우려면 `@Inject()`를 사용하면 됩니다.
@@ -93,9 +105,11 @@ class UsesDeferredAndOptionalDeps {}
93
105
 
94
106
  ### 형제 패키지를 위한 공용 메타데이터 헬퍼
95
107
 
96
- `getModuleMetadata()`는 테스트와 도구에서 read-only 모듈 inspection을 할 수 있도록 공개 루트 엔트리포인트에서 사용할 수 있습니다. 더 넓은 내부 메타데이터 reader/writer는 `@fluojs/core/internal` 아래에 있으며, `@fluojs/di`, `@fluojs/http`, `@fluojs/runtime` 같은 패키지들이 같은 메타데이터 모델을 공유할 수 있게 합니다.
108
+ `getModuleMetadata()`는 테스트와 도구에서 read-only 모듈 inspection을 할 수 있도록 공개 루트 엔트리포인트에서 사용할 수 있습니다. `@fluojs/validation`, `@fluojs/serialization`, `@fluojs/openapi` 같은 request-pipeline 패키지는 DTO validation/binding 및 표준 데코레이터 metadata bag 접근을 위해 문서화된 `@fluojs/core/request-pipeline` 메타데이터 통합 seam을 사용합니다. 더 넓은 내부 메타데이터 reader/writer는 `@fluojs/core/internal` 아래에 있으며, `@fluojs/di`, `@fluojs/http`, `@fluojs/runtime` 같은 패키지들이 같은 메타데이터 모델을 공유할 수 있게 합니다.
109
+
110
+ 애플리케이션 코드는 공개 데코레이터, `ensureMetadataSymbol()`, read-only module metadata inspection을 `@fluojs/core`에서 import해야 합니다. `@fluojs/core/internal` 서브패스는 메타데이터 레코드, 컨트롤러/라우트 헬퍼, injection/validation 헬퍼, clone 유틸리티가 필요한 fluo 패키지를 위한 경로입니다. 표준 metadata bag helper는 current/native `Symbol.metadata`와 fallback symbol이 섞인 lookup을 처리합니다. 어느 era에서 온 own metadata든 같은 key에 대해서는 어느 era에서 온 inherited metadata보다 우선하지만, child가 다른 key만 소유한 경우 parent constructor의 inherited key는 계속 보입니다. DI와 모듈 그래프 hot path의 allocation을 줄이기 위해 `getModuleMetadata()`, `getOwnClassDiMetadata()`, `getInheritedClassDiMetadata()`, `getClassDiMetadata()`는 frozen snapshot을 반환하며 write 사이에는 같은 reference를 재사용할 수 있습니다. 이 결과, collection 필드, class DI wrapper-token entry(`ForwardRefToken` / `OptionalInjectToken`), module provider descriptor wrapper와 middleware route-config wrapper(그 안의 `routes` 배열 포함)는 immutable로 취급해야 합니다. 데코레이션 이후 caller가 소유한 dependency wrapper 객체를 변경해도 저장된 class DI metadata를 다시 쓸 수 없습니다. `useValue` payload 객체와 runtime middleware/guard/interceptor instance는 mutable reference로 유지되며 이 snapshot 때문에 freeze되지 않습니다. 다른 metadata reader는 각 reader의 테스트가 stable-reference 재사용을 문서화하지 않는 한 기존 defensive-read 동작을 유지합니다.
97
111
 
98
- 애플리케이션 코드는 공개 데코레이터, `ensureMetadataSymbol()`, read-only module metadata inspection`@fluojs/core`에서 import해야 합니다. `@fluojs/core/internal` 서브패스는 메타데이터 레코드, 컨트롤러/라우트 헬퍼, injection/validation 헬퍼, clone 유틸리티가 필요한 fluo 패키지를 위한 경로입니다. 표준 metadata bag helper는 current/native `Symbol.metadata`와 fallback symbol이 섞인 lookup을 처리합니다. 어느 era에서 own metadata든 같은 key에 대해서는 어느 era에서 온 inherited metadata보다 우선하지만, child가 다른 key만 소유한 경우 parent constructor의 inherited key는 계속 보입니다. DI와 모듈 그래프 hot path의 allocation줄이기 위해 `getModuleMetadata()`, `getOwnClassDiMetadata()`, `getInheritedClassDiMetadata()`, `getClassDiMetadata()`는 frozen snapshot을 반환하며 write 사이에는 같은 reference를 재사용할 수 있습니다. 이 결과, collection 필드, module provider descriptor wrapper와 middleware route-config wrapper(그 안의 `routes` 배열 포함)는 immutable로 취급해야 합니다. `useValue` payload 객체와 runtime middleware/guard/interceptor instance는 mutable reference로 유지되며 snapshot 때문에 freeze되지 않습니다. 다른 metadata reader는 reader의 테스트가 stable-reference 재사용을 문서화하지 않는 한 기존 defensive-read 동작을 유지합니다.
112
+ Internal `RouteMetadata.method` declaration은 string받으므로 `@fluojs/http`가 built-in method reserved `ALL` wildcard sentinel과 함께 canonical uppercase custom HTTP method token저장할 수 있습니다. Method-token validation과 `ALL` reservation은low-level metadata record가 아니라 public HTTP decorator가 소유합니다.
99
113
 
100
114
  ```ts
101
115
  import { getModuleMetadata } from '@fluojs/core';
@@ -109,16 +123,18 @@ console.log(metadata.providers);
109
123
  `AsyncModuleOptions<T>`는 외부 `ConfigService` 등에 의존하여 비동기적으로 초기화가 필요한 모듈을 위한 표준 계약입니다.
110
124
 
111
125
  ```ts
112
- import { AsyncModuleOptions, MaybePromise, Token } from '@fluojs/core';
126
+ import { type AsyncModuleOptions } from '@fluojs/core';
127
+ import { defineModule, type ModuleType } from '@fluojs/runtime';
113
128
 
114
129
  interface Config {
115
130
  apiKey: string;
116
131
  }
117
132
 
118
133
  class EmailModule {
119
- static forRootAsync(options: AsyncModuleOptions<Config>) {
120
- return {
121
- module: EmailModule,
134
+ static forRootAsync(options: AsyncModuleOptions<Config>): ModuleType {
135
+ class EmailRuntimeModule {}
136
+
137
+ return defineModule(EmailRuntimeModule, {
122
138
  providers: [
123
139
  {
124
140
  provide: 'CONFIG',
@@ -126,7 +142,7 @@ class EmailModule {
126
142
  inject: options.inject,
127
143
  },
128
144
  ],
129
- };
145
+ });
130
146
  }
131
147
  }
132
148
  ```
@@ -169,7 +185,8 @@ class Logger {}
169
185
  - **에러**: `FluoError`, `InvariantError`, `FluoCodeError`, `FluoErrorOptions`, `formatTokenName`
170
186
  - **메타데이터 런타임**: `ensureMetadataSymbol`, `getModuleMetadata`
171
187
  - **타입**: `Constructor<T>`, `Token<T>`, `InjectionToken<T>`, `ForwardRefToken<T>`, `OptionalInjectToken<T>`, `MaybePromise<T>`, `AsyncModuleOptions`, `MetadataPropertyKey`, `MetadataSource`
172
- - **내부 서브패스**: `@fluojs/core/internal`을 통한 메타데이터 헬퍼, 컨트롤러/라우트 헬퍼, injection 헬퍼, validation 헬퍼, clone 유틸리티
188
+ - **Request-pipeline 통합 seam**: `@fluojs/core/request-pipeline`을 통한 DTO validation/binding 메타데이터 헬퍼와 표준 데코레이터 metadata bag reader
189
+ - **내부 서브패스**: `@fluojs/core/internal`을 통한 더 넓은 메타데이터 헬퍼, 컨트롤러/라우트 헬퍼, injection 헬퍼, clone 유틸리티
173
190
 
174
191
  ## 관련 패키지
175
192
 
package/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  <p><strong><kbd>English</kbd></strong> <a href="./README.ko.md"><kbd>한국어</kbd></a></p>
4
4
 
5
+ Node.js support is `>=24.0.0 <27`. See [Node.js support and migration](../../docs/reference/node-support.md) before upgrading.
6
+
5
7
  Shared contracts, standard decorators, and metadata primitives that every fluo package builds on.
6
8
 
7
9
  ## Table of Contents
@@ -62,14 +64,24 @@ class UserService {
62
64
 
63
65
  fluo uses TC39 standard decorators. You do not need `experimentalDecorators: true` or `emitDecoratorMetadata: true` to use `@Module`, `@Inject`, `@Global`, or `@Scope`.
64
66
 
65
- Core metadata is written through fluo-owned stores and TC39 `Symbol.metadata` integration points, never through `reflect-metadata` or compiler-emitted design types. Importing `@fluojs/core` does not install a global `Symbol.metadata` polyfill. Call `ensureMetadataSymbol()` at test or bootstrap boundaries when a runtime needs the polyfill installed before evaluating custom standard decorators.
67
+ Core metadata is written through fluo-owned stores and TC39 `Symbol.metadata` integration points, never through `reflect-metadata` or compiler-emitted design types. Importing `@fluojs/core` does not install a global `Symbol.metadata` polyfill. Fluo's built-in decorators keep working through framework-owned stores, but a custom standard decorator that reads `context.metadata` needs `Symbol.metadata` before its decorated module is evaluated.
66
68
 
67
69
  ```ts
70
+ // preload.ts — configure this as the application entrypoint
68
71
  import { ensureMetadataSymbol } from '@fluojs/core';
69
72
 
70
73
  ensureMetadataSymbol();
74
+ await import('./bootstrap.js');
71
75
  ```
72
76
 
77
+ The dynamic import is intentional. An ordinary bootstrap module that statically imports decorated classes and then calls `ensureMetadataSymbol()` is too late, because ESM evaluates the static import graph before running the bootstrap module body.
78
+
79
+ ### Empty module metadata
80
+
81
+ `@Module()` and `@Module(undefined)` are shorthand for `@Module({})`. They still register
82
+ module metadata, preserve previously declared partial fields and `@Global()` in either
83
+ order, and advance the metadata version. An undecorated class is different.
84
+
73
85
  ### Explicit dependency metadata
74
86
 
75
87
  `@Inject(...)` keeps dependency wiring visible in code instead of relying on emitted reflection metadata. It is a standard class decorator: place it on the class whose constructor tokens you are declaring, not on constructor parameters or properties. Call `@Inject()` when you want to record an explicit empty override for inherited constructor tokens.
@@ -95,9 +107,11 @@ class UsesDeferredAndOptionalDeps {}
95
107
 
96
108
  ### Shared metadata helpers for sibling packages
97
109
 
98
- `getModuleMetadata()` is available from the public root entrypoint for read-only module inspection in tests and tooling. Broader internal readers and writers live under `@fluojs/core/internal`, which is how packages like `@fluojs/di`, `@fluojs/http`, and `@fluojs/runtime` consume the same metadata model.
110
+ `getModuleMetadata()` is available from the public root entrypoint for read-only module inspection in tests and tooling. Request-pipeline packages such as `@fluojs/validation`, `@fluojs/serialization`, and `@fluojs/openapi` use the documented `@fluojs/core/request-pipeline` metadata integration seam for DTO validation, binding, and standard decorator metadata-bag access. Broader internal readers and writers live under `@fluojs/core/internal`, which is how packages like `@fluojs/di`, `@fluojs/http`, and `@fluojs/runtime` consume the same metadata model.
111
+
112
+ Application code should import public decorators, `ensureMetadataSymbol()`, and read-only module metadata inspection from `@fluojs/core`. The `@fluojs/core/internal` subpath is reserved for fluo packages that need metadata records, controller/route helpers, injection and validation helpers, or clone utilities. Standard metadata bag helpers handle mixed-era lookups across current/native `Symbol.metadata` and the fallback symbol: own metadata from either era overrides inherited metadata from either era for the same key, while inherited keys from parent constructors remain visible when the child owns a different key. To reduce DI and module-graph hot-path allocations, `getModuleMetadata()`, `getOwnClassDiMetadata()`, `getInheritedClassDiMetadata()`, and `getClassDiMetadata()` return frozen snapshots and may reuse the same reference between writes. Treat those results, their collection fields, class DI wrapper-token entries (`ForwardRefToken` / `OptionalInjectToken`), module provider descriptor wrappers, and middleware route-config wrappers (including their `routes` arrays) as immutable. Mutating caller-owned dependency wrapper objects after decoration cannot rewrite stored class DI metadata. `useValue` payload objects and runtime middleware/guard/interceptor instances remain mutable references and are not frozen by these snapshots. Other metadata readers keep their existing defensive-read behavior unless their own tests document stable-reference reuse.
99
113
 
100
- Application code should import public decorators, `ensureMetadataSymbol()`, and read-only module metadata inspection from `@fluojs/core`. The `@fluojs/core/internal` subpath is reserved for fluo packages that need metadata records, controller/route helpers, injection and validation helpers, or clone utilities. Standard metadata bag helpers handle mixed-era lookups across current/native `Symbol.metadata` and the fallback symbol: own metadata from either era overrides inherited metadata from either era for the same key, while inherited keys from parent constructors remain visible when the child owns a different key. To reduce DI and module-graph hot-path allocations, `getModuleMetadata()`, `getOwnClassDiMetadata()`, `getInheritedClassDiMetadata()`, and `getClassDiMetadata()` return frozen snapshots and may reuse the same reference between writes. Treat those results, their collection fields, module provider descriptor wrappers, and middleware route-config wrappers (including their `routes` arrays) as immutable. `useValue` payload objects and runtime middleware/guard/interceptor instances remain mutable references and are not frozen by these snapshots. Other metadata readers keep their existing defensive-read behavior unless their own tests document stable-reference reuse.
114
+ The internal `RouteMetadata.method` declaration accepts a string so `@fluojs/http` can store canonical uppercase custom HTTP method tokens as well as built-in methods and the reserved `ALL` wildcard sentinel. Method-token validation and `ALL` reservation remain owned by the public HTTP decorators rather than this low-level metadata record.
101
115
 
102
116
  ```ts
103
117
  import { getModuleMetadata } from '@fluojs/core';
@@ -111,16 +125,18 @@ console.log(metadata.providers);
111
125
  `AsyncModuleOptions<T>` is the standard contract for modules that require asynchronous initialization, such as those relying on an external `ConfigService`.
112
126
 
113
127
  ```ts
114
- import { AsyncModuleOptions, MaybePromise, Token } from '@fluojs/core';
128
+ import { type AsyncModuleOptions } from '@fluojs/core';
129
+ import { defineModule, type ModuleType } from '@fluojs/runtime';
115
130
 
116
131
  interface Config {
117
132
  apiKey: string;
118
133
  }
119
134
 
120
135
  class EmailModule {
121
- static forRootAsync(options: AsyncModuleOptions<Config>) {
122
- return {
123
- module: EmailModule,
136
+ static forRootAsync(options: AsyncModuleOptions<Config>): ModuleType {
137
+ class EmailRuntimeModule {}
138
+
139
+ return defineModule(EmailRuntimeModule, {
124
140
  providers: [
125
141
  {
126
142
  provide: 'CONFIG',
@@ -128,7 +144,7 @@ class EmailModule {
128
144
  inject: options.inject,
129
145
  },
130
146
  ],
131
- };
147
+ });
132
148
  }
133
149
  }
134
150
  ```
@@ -171,7 +187,8 @@ Standard decorators cannot automatically infer types for abstract classes or int
171
187
  - **Errors**: `FluoError`, `InvariantError`, `FluoCodeError`, `FluoErrorOptions`, `formatTokenName`
172
188
  - **Metadata runtime**: `ensureMetadataSymbol`, `getModuleMetadata`
173
189
  - **Types**: `Constructor<T>`, `Token<T>`, `InjectionToken<T>`, `ForwardRefToken<T>`, `OptionalInjectToken<T>`, `MaybePromise<T>`, `AsyncModuleOptions`, `MetadataPropertyKey`, `MetadataSource`
174
- - **Internal subpath**: metadata helpers, controller/route helpers, injection helpers, validation helpers, and clone utilities via `@fluojs/core/internal`
190
+ - **Request-pipeline integration seam**: DTO validation/binding metadata helpers plus standard decorator metadata-bag readers via `@fluojs/core/request-pipeline`
191
+ - **Internal subpath**: broader metadata helpers, controller/route helpers, injection helpers, and clone utilities via `@fluojs/core/internal`
175
192
 
176
193
  ## Related Packages
177
194
 
@@ -5,10 +5,11 @@ type TupleOnly<T extends readonly unknown[]> = number extends T['length'] ? neve
5
5
  /**
6
6
  * Declares module-level metadata (`imports`, `providers`, `controllers`, `exports`, `global`) on a class.
7
7
  *
8
- * @param definition Module composition metadata consumed by the runtime module-graph compiler.
8
+ * @param definition Module composition metadata; omission or `undefined` uses `{}`.
9
9
  * @returns A standard class decorator that records the module contract on the target class.
10
+ * @remarks Empty metadata still registers the module, preserves earlier partial fields, and updates its metadata version.
10
11
  */
11
- export declare function Module(definition: ModuleMetadata): StandardClassDecoratorFn;
12
+ export declare function Module(definition?: ModuleMetadata): StandardClassDecoratorFn;
12
13
  /**
13
14
  * Marks the decorated module as global so its exported providers are visible without explicit imports.
14
15
  *
@@ -1 +1 @@
1
- {"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,KAAK,wBAAwB,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,qBAAqB,KAAK,IAAI,CAAC;AAE1F,KAAK,SAAS,CAAC,CAAC,SAAS,SAAS,OAAO,EAAE,IAAI,MAAM,SAAS,CAAC,CAAC,QAAQ,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;AAEtF;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,UAAU,EAAE,cAAc,GAAG,wBAAwB,CAI3E;AAED;;;;GAIG;AACH,wBAAgB,MAAM,IAAI,wBAAwB,CAIjD;AAED;;;;;;;;;GASG;AACH,wBAAgB,MAAM,IAAI,wBAAwB,CAAC;AACnD;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,KAAK,CAAC,OAAO,SAAS,SAAS,cAAc,EAAE,EACpE,GAAG,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,GAC5B,wBAAwB,CAAC;AAC5B;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,GAAG,wBAAwB,CAAC;AAiBpF;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,GAAG,wBAAwB,CAI5F"}
1
+ {"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,eAAe,EAGpB,KAAK,cAAc,EACpB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,KAAK,wBAAwB,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,qBAAqB,KAAK,IAAI,CAAC;AAE1F,KAAK,SAAS,CAAC,CAAC,SAAS,SAAS,OAAO,EAAE,IAAI,MAAM,SAAS,CAAC,CAAC,QAAQ,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;AAEtF;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,UAAU,GAAE,cAAmB,GAAG,wBAAwB,CAIhF;AAED;;;;GAIG;AACH,wBAAgB,MAAM,IAAI,wBAAwB,CAIjD;AAED;;;;;;;;;GASG;AACH,wBAAgB,MAAM,IAAI,wBAAwB,CAAC;AACnD;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,KAAK,CAAC,OAAO,SAAS,SAAS,cAAc,EAAE,EACpE,GAAG,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,GAC5B,wBAAwB,CAAC;AAC5B;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,GAAG,wBAAwB,CAAC;AAiBpF;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,GAAG,wBAAwB,CAI5F"}
@@ -2,10 +2,11 @@ import { defineClassDiMetadata, defineModuleMetadata } from './metadata.js';
2
2
  /**
3
3
  * Declares module-level metadata (`imports`, `providers`, `controllers`, `exports`, `global`) on a class.
4
4
  *
5
- * @param definition Module composition metadata consumed by the runtime module-graph compiler.
5
+ * @param definition Module composition metadata; omission or `undefined` uses `{}`.
6
6
  * @returns A standard class decorator that records the module contract on the target class.
7
+ * @remarks Empty metadata still registers the module, preserves earlier partial fields, and updates its metadata version.
7
8
  */
8
- export function Module(definition) {
9
+ export function Module(definition = {}) {
9
10
  return target => {
10
11
  defineModuleMetadata(target, definition);
11
12
  };
@@ -1 +1 @@
1
- {"version":3,"file":"class-di.d.ts","sourceRoot":"","sources":["../../src/metadata/class-di.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AA2BlD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,GAAG,IAAI,CAQvF;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,QAAQ,GAAG,eAAe,GAAG,SAAS,CAEnF;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,QAAQ,GAAG,eAAe,GAAG,SAAS,CA4BzF;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,QAAQ,GAAG,eAAe,GAAG,SAAS,CAEhF;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CAElD"}
1
+ {"version":3,"file":"class-di.d.ts","sourceRoot":"","sources":["../../src/metadata/class-di.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AA4DlD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,GAAG,IAAI,CAQvF;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,QAAQ,GAAG,eAAe,GAAG,SAAS,CAEnF;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,QAAQ,GAAG,eAAe,GAAG,SAAS,CA4BzF;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,QAAQ,GAAG,eAAe,GAAG,SAAS,CAEhF;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CAElD"}
@@ -1,9 +1,35 @@
1
- const classDiMetadataStore = new WeakMap();
2
- const inheritedClassDiMetadataCache = new WeakMap();
3
- let classDiMetadataVersion = 0;
1
+ import { getGlobalMetadataCounter, getGlobalMetadataWeakMap, metadataKeys } from './shared.js';
2
+ const classDiMetadataVersionKey = Symbol.for('fluo.metadata.version.class-di');
3
+ const classDiMetadataStore = getGlobalMetadataWeakMap(metadataKeys.classDi);
4
+ const inheritedClassDiMetadataCache = getGlobalMetadataWeakMap(Symbol.for('fluo.metadata.cache.inherited-class-di'));
5
+ const classDiMetadataVersion = getGlobalMetadataCounter(classDiMetadataVersionKey);
6
+ function isForwardRefToken(token) {
7
+ return typeof token === 'object' && token !== null && '__forwardRef__' in token && token.__forwardRef__ === true;
8
+ }
9
+ function isOptionalInjectToken(token) {
10
+ return typeof token === 'object' && token !== null && '__optional__' in token && token.__optional__ === true;
11
+ }
12
+ function freezeInjectionToken(token) {
13
+ if (isForwardRefToken(token)) {
14
+ return Object.freeze({
15
+ __forwardRef__: true,
16
+ forwardRef: token.forwardRef
17
+ });
18
+ }
19
+ if (isOptionalInjectToken(token)) {
20
+ return Object.freeze({
21
+ __optional__: true,
22
+ token: token.token
23
+ });
24
+ }
25
+ return token;
26
+ }
27
+ function freezeInjectMetadata(inject) {
28
+ return inject ? Object.freeze(inject.map(freezeInjectionToken)) : undefined;
29
+ }
4
30
  function freezeClassDiMetadata(metadata) {
5
31
  return Object.freeze({
6
- inject: metadata.inject ? Object.freeze([...metadata.inject]) : undefined,
32
+ inject: freezeInjectMetadata(metadata.inject),
7
33
  scope: metadata.scope
8
34
  });
9
35
  }
@@ -30,7 +56,7 @@ export function defineClassDiMetadata(target, metadata) {
30
56
  inject: metadata.inject !== undefined ? metadata.inject : existing?.inject,
31
57
  scope: metadata.scope ?? existing?.scope
32
58
  }));
33
- classDiMetadataVersion += 1;
59
+ classDiMetadataVersion.value += 1;
34
60
  }
35
61
 
36
62
  /**
@@ -51,7 +77,7 @@ export function getOwnClassDiMetadata(target) {
51
77
  */
52
78
  export function getInheritedClassDiMetadata(target) {
53
79
  const cached = inheritedClassDiMetadataCache.get(target);
54
- if (cached?.version === classDiMetadataVersion) {
80
+ if (cached?.version === classDiMetadataVersion.value) {
55
81
  return cached.metadata ?? undefined;
56
82
  }
57
83
  let effective;
@@ -67,7 +93,7 @@ export function getInheritedClassDiMetadata(target) {
67
93
  }
68
94
  inheritedClassDiMetadataCache.set(target, {
69
95
  metadata: effective ?? null,
70
- version: classDiMetadataVersion
96
+ version: classDiMetadataVersion.value
71
97
  });
72
98
  return effective;
73
99
  }
@@ -88,5 +114,5 @@ export function getClassDiMetadata(target) {
88
114
  * @returns Monotonically increasing version bumped after each class-DI metadata write.
89
115
  */
90
116
  export function getClassDiMetadataVersion() {
91
- return classDiMetadataVersion;
117
+ return classDiMetadataVersion.value;
92
118
  }
@@ -1,5 +1,5 @@
1
- import type { ControllerMetadata, RouteMetadata } from './types.js';
2
1
  import type { MetadataPropertyKey } from '../types.js';
2
+ import type { ControllerMetadata, RouteMetadata } from './types.js';
3
3
  /**
4
4
  * Define controller metadata.
5
5
  *
@@ -1 +1 @@
1
- {"version":3,"file":"controller-route.d.ts","sourceRoot":"","sources":["../../src/metadata/controller-route.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAA+B,MAAM,YAAY,CAAC;AACjG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AA8DvD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAE7F;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,QAAQ,GAAG,kBAAkB,GAAG,SAAS,CActF;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,mBAAmB,EAChC,QAAQ,EAAE,aAAa,GACtB,IAAI,CAEN;AAsCD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,mBAAmB,GAAG,aAAa,GAAG,SAAS,CAW5G"}
1
+ {"version":3,"file":"controller-route.d.ts","sourceRoot":"","sources":["../../src/metadata/controller-route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAavD,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAA+B,MAAM,YAAY,CAAC;AAiEjG;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAE7F;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,QAAQ,GAAG,kBAAkB,GAAG,SAAS,CActF;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,mBAAmB,EAChC,QAAQ,EAAE,aAAa,GACtB,IAAI,CAEN;AAsCD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,mBAAmB,GAAG,aAAa,GAAG,SAAS,CAW5G"}
@@ -1,7 +1,7 @@
1
- import { cloneMutableValue, cloneCollection, getOrCreatePropertyMap, getStandardConstructorMetadataMap, getStandardMetadataBag, mergeUnique, standardMetadataKeys } from './shared.js';
1
+ import { cloneCollection, cloneMutableValue, getGlobalMetadataWeakMap, getOrCreatePropertyMap, getStandardConstructorMetadataMap, getStandardMetadataBag, mergeUnique, metadataKeys, standardMetadataKeys } from './shared.js';
2
2
  import { createClonedWeakMapStore } from './store.js';
3
- const controllerMetadataStore = createClonedWeakMapStore(cloneControllerMetadata);
4
- const routeMetadataStore = new WeakMap();
3
+ const controllerMetadataStore = createClonedWeakMapStore(cloneControllerMetadata, getGlobalMetadataWeakMap(metadataKeys.controller));
4
+ const routeMetadataStore = getGlobalMetadataWeakMap(metadataKeys.route);
5
5
  function cloneRouteHeaders(headers) {
6
6
  return headers?.map(header => ({
7
7
  ...header
@@ -1,5 +1,5 @@
1
- import type { InjectionMetadata, InjectionSchemaEntry } from './types.js';
2
1
  import type { MetadataPropertyKey } from '../types.js';
2
+ import type { InjectionMetadata, InjectionSchemaEntry } from './types.js';
3
3
  /**
4
4
  * Define injection metadata.
5
5
  *
@@ -1 +1 @@
1
- {"version":3,"file":"injection.d.ts","sourceRoot":"","sources":["../../src/metadata/injection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAA2B,MAAM,YAAY,CAAC;AACnG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAQvD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,mBAAmB,EAChC,QAAQ,EAAE,iBAAiB,GAC1B,IAAI,CAEN;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,EAAE,CAwBzE"}
1
+ {"version":3,"file":"injection.d.ts","sourceRoot":"","sources":["../../src/metadata/injection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AASvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAA2B,MAAM,YAAY,CAAC;AAQnG;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,mBAAmB,EAChC,QAAQ,EAAE,iBAAiB,GAC1B,IAAI,CAEN;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,EAAE,CAwBzE"}
@@ -1,5 +1,5 @@
1
- import { getOrCreatePropertyMap, getStandardConstructorMetadataMap, mergeMetadataPropertyKeys, standardMetadataKeys } from './shared.js';
2
- const injectionMetadataStore = new WeakMap();
1
+ import { getGlobalMetadataWeakMap, getOrCreatePropertyMap, getStandardConstructorMetadataMap, mergeMetadataPropertyKeys, metadataKeys, standardMetadataKeys } from './shared.js';
2
+ const injectionMetadataStore = getGlobalMetadataWeakMap(metadataKeys.injection);
3
3
  function getStandardInjectionMap(target) {
4
4
  return getStandardConstructorMetadataMap(target, standardMetadataKeys.injection);
5
5
  }
@@ -1 +1 @@
1
- {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../src/metadata/module.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA+FjD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI,CAYrF;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,QAAQ,GAAG,cAAc,GAAG,SAAS,CAE9E;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD"}
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../src/metadata/module.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAgGjD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI,CAYrF;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,QAAQ,GAAG,cAAc,GAAG,SAAS,CAE9E;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD"}
@@ -1,6 +1,7 @@
1
- import { cloneCollection, cloneMutableValue } from './shared.js';
2
- const moduleMetadataStore = new WeakMap();
3
- let moduleMetadataVersion = 0;
1
+ import { cloneCollection, cloneMutableValue, getGlobalMetadataCounter, getGlobalMetadataWeakMap, metadataKeys } from './shared.js';
2
+ const moduleMetadataVersionKey = Symbol.for('fluo.metadata.version.module');
3
+ const moduleMetadataStore = getGlobalMetadataWeakMap(metadataKeys.module);
4
+ const moduleMetadataVersion = getGlobalMetadataCounter(moduleMetadataVersionKey);
4
5
  function isValueProvider(provider) {
5
6
  return typeof provider === 'object' && provider !== null && 'useValue' in provider;
6
7
  }
@@ -89,7 +90,7 @@ export function defineModuleMetadata(target, metadata) {
89
90
  middleware: metadata.middleware ?? existing?.middleware,
90
91
  providers: metadata.providers ?? existing?.providers
91
92
  })));
92
- moduleMetadataVersion += 1;
93
+ moduleMetadataVersion.value += 1;
93
94
  }
94
95
 
95
96
  /**
@@ -108,5 +109,5 @@ export function getModuleMetadata(target) {
108
109
  * @returns Monotonically increasing version bumped after each module metadata write.
109
110
  */
110
111
  export function getModuleMetadataVersion() {
111
- return moduleMetadataVersion;
112
+ return moduleMetadataVersion.value;
112
113
  }
@@ -44,6 +44,23 @@ export declare const metadataKeys: {
44
44
  readonly classDi: symbol;
45
45
  readonly classValidation: symbol;
46
46
  };
47
+ interface MetadataCounter {
48
+ value: number;
49
+ }
50
+ /**
51
+ * Resolves a process-global WeakMap for explicit Fluo metadata stores.
52
+ *
53
+ * @param key Symbol key that identifies the metadata store.
54
+ * @returns The process-global WeakMap for the provided metadata key.
55
+ */
56
+ export declare function getGlobalMetadataWeakMap<TKey extends object, TValue>(key: symbol): WeakMap<TKey, TValue>;
57
+ /**
58
+ * Resolves a process-global counter for metadata cache invalidation.
59
+ *
60
+ * @param key Symbol key that identifies the counter.
61
+ * @returns The process-global counter for the provided metadata key.
62
+ */
63
+ export declare function getGlobalMetadataCounter(key: symbol): MetadataCounter;
47
64
  /**
48
65
  * Clones a readonly collection into a mutable array for defensive metadata reads and writes.
49
66
  *
@@ -147,4 +164,5 @@ export declare function appendPropertyMapValue<T>(store: WeakMap<object, Map<Met
147
164
  * @param value Value to append.
148
165
  */
149
166
  export declare function appendWeakMapValue<T>(store: WeakMap<Function, T[]>, target: Function, value: T): void;
167
+ export {};
150
168
  //# sourceMappingURL=shared.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/metadata/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGvD;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;AAK/D;;GAEG;AACH,eAAO,IAAI,cAAc,QAAwD,CAAC;AAElF;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAY7C;AA6ED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAMhD;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;;CAOvB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,YAAY;;;;;;;;;CASf,CAAC;AAEX;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,GAAG,SAAS,GAAG,CAAC,EAAE,GAAG,SAAS,CAExF;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EACtC,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,EACnD,MAAM,EAAE,MAAM,GACb,GAAG,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAS7B;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,GAAG,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,GAAG,SAAS,GAAG,CAAC,EAAE,GAAG,SAAS,CAgBpH;AAGD;;;;;;;;;GASG;AACH,wBAAgB,oCAAoC,CAAC,WAAW,EAAE,QAAQ,GAAG,mBAAmB,GAAG,SAAS,CAE3G;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAiBtF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAIjG;AAED;;;;;;GAMG;AACH,wBAAgB,oCAAoC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAElG;AAED;;;;;;GAMG;AACH,wBAAgB,iCAAiC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,mBAAmB,EAAE,CAAC,CAAC,GAAG,SAAS,CAEzH;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,SAAS,EAC1D,MAAM,EAAE,WAAW,CAAC,mBAAmB,EAAE,OAAO,CAAC,GAAG,SAAS,EAC7D,QAAQ,EAAE,WAAW,CAAC,mBAAmB,EAAE,SAAS,CAAC,GAAG,SAAS,GAChE,mBAAmB,EAAE,CAkBvB;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EACtC,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,mBAAmB,EAAE,CAAC,EAAE,CAAC,CAAC,EACrD,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,mBAAmB,EAChC,KAAK,EAAE,CAAC,GACP,IAAI,CAUN;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CASrG"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/metadata/shared.ts"],"names":[],"mappings":"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"}
@@ -118,6 +118,61 @@ export const metadataKeys = {
118
118
  classDi: Symbol.for('fluo.metadata.class-di'),
119
119
  classValidation: Symbol.for('fluo.metadata.class-validation')
120
120
  };
121
+ const metadataRegistryKey = Symbol.for('fluo.metadata.registry');
122
+ function getGlobalMetadataRegistry() {
123
+ const globalScope = globalThis;
124
+ const existing = globalScope[metadataRegistryKey];
125
+ if (existing) {
126
+ return existing;
127
+ }
128
+ const registry = {
129
+ counters: new Map(),
130
+ weakMaps: new Map()
131
+ };
132
+ Object.defineProperty(globalScope, metadataRegistryKey, {
133
+ configurable: false,
134
+ enumerable: false,
135
+ value: registry,
136
+ writable: false
137
+ });
138
+ return registry;
139
+ }
140
+
141
+ /**
142
+ * Resolves a process-global WeakMap for explicit Fluo metadata stores.
143
+ *
144
+ * @param key Symbol key that identifies the metadata store.
145
+ * @returns The process-global WeakMap for the provided metadata key.
146
+ */
147
+ export function getGlobalMetadataWeakMap(key) {
148
+ const registry = getGlobalMetadataRegistry();
149
+ const existing = registry.weakMaps.get(key);
150
+ if (existing) {
151
+ return existing;
152
+ }
153
+ const store = new WeakMap();
154
+ registry.weakMaps.set(key, store);
155
+ return store;
156
+ }
157
+
158
+ /**
159
+ * Resolves a process-global counter for metadata cache invalidation.
160
+ *
161
+ * @param key Symbol key that identifies the counter.
162
+ * @returns The process-global counter for the provided metadata key.
163
+ */
164
+ export function getGlobalMetadataCounter(key) {
165
+ const registry = getGlobalMetadataRegistry();
166
+ const existing = registry.counters.get(key);
167
+ if (existing) {
168
+ return existing;
169
+ }
170
+ const counter = {
171
+ value: 0
172
+ };
173
+ registry.counters.set(key, counter);
174
+ return counter;
175
+ }
121
176
 
122
177
  /**
123
178
  * Clones a readonly collection into a mutable array for defensive metadata reads and writes.
@@ -12,5 +12,5 @@ export interface ClonedWeakMapStore<TKey extends object, TValue> {
12
12
  * @param cloneValue Clone routine used to isolate stored metadata from caller mutations.
13
13
  * @returns A cloned WeakMap store for metadata helpers.
14
14
  */
15
- export declare function createClonedWeakMapStore<TKey extends object, TValue>(cloneValue: (value: TValue) => TValue): ClonedWeakMapStore<TKey, TValue>;
15
+ export declare function createClonedWeakMapStore<TKey extends object, TValue>(cloneValue: (value: TValue) => TValue, store?: WeakMap<TKey, TValue>): ClonedWeakMapStore<TKey, TValue>;
16
16
  //# sourceMappingURL=store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/metadata/store.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,kBAAkB,CAAC,IAAI,SAAS,MAAM,EAAE,MAAM;IAC7D,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;IACvC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,KAAK,MAAM,GAAG,IAAI,CAAC;IACjF,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1C;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,SAAS,MAAM,EAAE,MAAM,EAClE,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GACpC,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,CAelC"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/metadata/store.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,kBAAkB,CAAC,IAAI,SAAS,MAAM,EAAE,MAAM;IAC7D,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;IACvC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,KAAK,MAAM,GAAG,IAAI,CAAC;IACjF,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1C;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,SAAS,MAAM,EAAE,MAAM,EAClE,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,EACrC,KAAK,GAAE,OAAO,CAAC,IAAI,EAAE,MAAM,CAA+B,GACzD,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,CAalC"}
@@ -8,8 +8,7 @@
8
8
  * @param cloneValue Clone routine used to isolate stored metadata from caller mutations.
9
9
  * @returns A cloned WeakMap store for metadata helpers.
10
10
  */
11
- export function createClonedWeakMapStore(cloneValue) {
12
- const store = new WeakMap();
11
+ export function createClonedWeakMapStore(cloneValue, store = new WeakMap()) {
13
12
  return {
14
13
  read(target) {
15
14
  const value = store.get(target);
@@ -1,8 +1,8 @@
1
1
  import type { Constructor, InjectionToken, MaybePromise, MetadataPropertyKey, MetadataSource, Token } from '../types.js';
2
2
  /**
3
- * Defines the metadata collection type.
3
+ * Defines the read-only metadata collection type.
4
4
  */
5
- export type MetadataCollection<T = unknown> = T[];
5
+ export type MetadataCollection<T = unknown> = readonly T[];
6
6
  /**
7
7
  * Describes the module metadata contract.
8
8
  */
@@ -41,7 +41,7 @@ export interface RouteRedirect {
41
41
  * Describes the route metadata contract.
42
42
  */
43
43
  export interface RouteMetadata {
44
- method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'ALL';
44
+ method: string;
45
45
  path: string;
46
46
  request?: new (...args: never[]) => unknown;
47
47
  guards?: MetadataCollection;
@@ -235,7 +235,7 @@ export interface InjectionMetadata {
235
235
  * Describes the class di metadata contract.
236
236
  */
237
237
  export interface ClassDiMetadata {
238
- inject?: InjectionToken[];
238
+ inject?: readonly InjectionToken[];
239
239
  scope?: 'singleton' | 'request' | 'transient';
240
240
  }
241
241
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/metadata/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/metadata/types.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import type { ClassValidationRule, DtoBindingSchemaEntry, DtoFieldBindingMetadata, DtoFieldValidationRule, DtoValidationSchemaEntry } from './types.js';
2
1
  import type { Constructor, MetadataPropertyKey } from '../types.js';
2
+ import type { ClassValidationRule, DtoBindingSchemaEntry, DtoFieldBindingMetadata, DtoFieldValidationRule, DtoValidationSchemaEntry } from './types.js';
3
3
  /**
4
4
  * Get dto field binding metadata.
5
5
  *
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/metadata/validation.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,mBAAmB,EACnB,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACtB,wBAAwB,EAGzB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AA0FpE;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,mBAAmB,GAAG,uBAAuB,GAAG,SAAS,CAiBhI;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,mBAAmB,EAChC,QAAQ,EAAE,uBAAuB,GAChC,IAAI,CAEN;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,mBAAmB,EAChC,IAAI,EAAE,sBAAsB,GAC3B,IAAI,CAEN;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAI3F;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,WAAW,GAAG,qBAAqB,EAAE,CA8B7E;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,mBAAmB,GAAG,SAAS,sBAAsB,EAAE,CAQ9H;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,WAAW,GAAG,wBAAwB,EAAE,CAiBnF;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,mBAAmB,EAAE,CAExF"}
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/metadata/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAapE,OAAO,KAAK,EACV,mBAAmB,EACnB,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACtB,wBAAwB,EAGzB,MAAM,YAAY,CAAC;AA2FpB;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,mBAAmB,GAAG,uBAAuB,GAAG,SAAS,CAiBhI;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,mBAAmB,EAChC,QAAQ,EAAE,uBAAuB,GAChC,IAAI,CAEN;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,mBAAmB,EAChC,IAAI,EAAE,sBAAsB,GAC3B,IAAI,CAEN;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAI3F;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,WAAW,GAAG,qBAAqB,EAAE,CA8B7E;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,mBAAmB,GAAG,SAAS,sBAAsB,EAAE,CAQ9H;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,WAAW,GAAG,wBAAwB,EAAE,CAiBnF;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,mBAAmB,EAAE,CAExF"}
@@ -1,8 +1,8 @@
1
- import { appendPropertyMapValue, cloneMutableValue, getOrCreatePropertyMap, getStandardConstructorMetadataMap, getStandardMetadataBag, mergeMetadataPropertyKeys, standardMetadataKeys } from './shared.js';
1
+ import { appendPropertyMapValue, cloneMutableValue, getGlobalMetadataWeakMap, getOrCreatePropertyMap, getStandardConstructorMetadataMap, getStandardMetadataBag, mergeMetadataPropertyKeys, metadataKeys, standardMetadataKeys } from './shared.js';
2
2
  import { createClonedWeakMapStore } from './store.js';
3
- const dtoFieldBindingStore = new WeakMap();
4
- const dtoFieldValidationStore = new WeakMap();
5
- const classValidationStore = createClonedWeakMapStore(rules => rules.map(rule => cloneMutableValue(rule)));
3
+ const dtoFieldBindingStore = getGlobalMetadataWeakMap(metadataKeys.dtoFieldBinding);
4
+ const dtoFieldValidationStore = getGlobalMetadataWeakMap(metadataKeys.dtoFieldValidation);
5
+ const classValidationStore = createClonedWeakMapStore(rules => rules.map(rule => cloneMutableValue(rule)), getGlobalMetadataWeakMap(metadataKeys.classValidation));
6
6
  function getInheritedTargets(target) {
7
7
  const targets = [];
8
8
  let current = target;
@@ -0,0 +1,27 @@
1
+ export { appendClassValidationRule, appendDtoFieldValidationRule, defineDtoFieldBindingMetadata, getClassValidationRules, getDtoBindingSchema, getDtoFieldBindingMetadata, getDtoFieldValidationRules, getDtoValidationSchema, } from './metadata.js';
2
+ export type { ClassValidationRule, CustomClassValidator, CustomFieldValidationContext, CustomFieldValidator, CustomValidationDecoratorOptions, DtoBindingSchemaEntry, DtoFieldBindingMetadata, DtoFieldValidationRule, DtoValidationSchemaEntry, ValidationDecoratorOptions, ValidationIssueMetadata, ValidationRuleResult, } from './metadata.js';
3
+ /**
4
+ * Standard metadata bag shape used by first-party request-pipeline integrations.
5
+ */
6
+ export type RequestPipelineMetadataBag = Record<PropertyKey, unknown>;
7
+ /**
8
+ * Ensure the standard decorator metadata symbol exists for request-pipeline decorators.
9
+ *
10
+ * @returns The active metadata symbol used by fluo metadata helpers.
11
+ */
12
+ export declare function ensureRequestPipelineMetadataSymbol(): symbol;
13
+ /**
14
+ * Read the effective standard metadata bag for a request-pipeline target.
15
+ *
16
+ * @param target Constructor, prototype, or method owner that may carry standard decorator metadata.
17
+ * @returns The metadata bag when present, otherwise `undefined`.
18
+ */
19
+ export declare function getRequestPipelineMetadataBag(target: object): RequestPipelineMetadataBag | undefined;
20
+ /**
21
+ * Read the standard metadata bag owned directly by a constructor for request-pipeline inheritance walks.
22
+ *
23
+ * @param constructor Constructor whose own standard decorator metadata should be inspected.
24
+ * @returns The own constructor metadata bag when present, otherwise `undefined`.
25
+ */
26
+ export declare function getOwnConstructorRequestPipelineMetadataBag(constructor: Function): RequestPipelineMetadataBag | undefined;
27
+ //# sourceMappingURL=request-pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-pipeline.d.ts","sourceRoot":"","sources":["../src/request-pipeline.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,yBAAyB,EACzB,4BAA4B,EAC5B,6BAA6B,EAC7B,uBAAuB,EACvB,mBAAmB,EACnB,0BAA0B,EAC1B,0BAA0B,EAC1B,sBAAsB,GACvB,MAAM,eAAe,CAAC;AAEvB,YAAY,EACV,mBAAmB,EACnB,oBAAoB,EACpB,4BAA4B,EAC5B,oBAAoB,EACpB,gCAAgC,EAChC,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACtB,wBAAwB,EACxB,0BAA0B,EAC1B,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AAEvB;;GAEG;AACH,MAAM,MAAM,0BAA0B,GAAG,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;AAEtE;;;;GAIG;AACH,wBAAgB,mCAAmC,IAAI,MAAM,CAE5D;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,GAAG,0BAA0B,GAAG,SAAS,CAEpG;AAED;;;;;GAKG;AACH,wBAAgB,2CAA2C,CAAC,WAAW,EAAE,QAAQ,GAAG,0BAA0B,GAAG,SAAS,CAEzH"}
@@ -0,0 +1,35 @@
1
+ import { ensureMetadataSymbol, getOwnStandardConstructorMetadataBag, getStandardMetadataBag } from './metadata.js';
2
+ export { appendClassValidationRule, appendDtoFieldValidationRule, defineDtoFieldBindingMetadata, getClassValidationRules, getDtoBindingSchema, getDtoFieldBindingMetadata, getDtoFieldValidationRules, getDtoValidationSchema } from './metadata.js';
3
+
4
+ /**
5
+ * Standard metadata bag shape used by first-party request-pipeline integrations.
6
+ */
7
+
8
+ /**
9
+ * Ensure the standard decorator metadata symbol exists for request-pipeline decorators.
10
+ *
11
+ * @returns The active metadata symbol used by fluo metadata helpers.
12
+ */
13
+ export function ensureRequestPipelineMetadataSymbol() {
14
+ return ensureMetadataSymbol();
15
+ }
16
+
17
+ /**
18
+ * Read the effective standard metadata bag for a request-pipeline target.
19
+ *
20
+ * @param target Constructor, prototype, or method owner that may carry standard decorator metadata.
21
+ * @returns The metadata bag when present, otherwise `undefined`.
22
+ */
23
+ export function getRequestPipelineMetadataBag(target) {
24
+ return getStandardMetadataBag(target);
25
+ }
26
+
27
+ /**
28
+ * Read the standard metadata bag owned directly by a constructor for request-pipeline inheritance walks.
29
+ *
30
+ * @param constructor Constructor whose own standard decorator metadata should be inspected.
31
+ * @returns The own constructor metadata bag when present, otherwise `undefined`.
32
+ */
33
+ export function getOwnConstructorRequestPipelineMetadataBag(constructor) {
34
+ return getOwnStandardConstructorMetadataBag(constructor);
35
+ }
package/dist/types.d.ts CHANGED
@@ -23,8 +23,8 @@ export type Token<T = unknown> = string | symbol | Constructor<T>;
23
23
  * record tokens that are not available at decoration time without widening provider tokens.
24
24
  */
25
25
  export interface ForwardRefToken<T = unknown> {
26
- __forwardRef__: true;
27
- forwardRef: () => Token<T>;
26
+ readonly __forwardRef__: true;
27
+ readonly forwardRef: () => Token<T>;
28
28
  }
29
29
  /**
30
30
  * Optional dependency-token wrapper accepted inside injection metadata.
@@ -33,8 +33,8 @@ export interface ForwardRefToken<T = unknown> {
33
33
  * constructor dependencies can share the same class-level `@Inject(...)` list.
34
34
  */
35
35
  export interface OptionalInjectToken<T = unknown> {
36
- __optional__: true;
37
- token: Token<T>;
36
+ readonly __optional__: true;
37
+ readonly token: Token<T>;
38
38
  }
39
39
  /**
40
40
  * Constructor dependency entry accepted by `@Inject(...)` and provider inject arrays.
@@ -66,5 +66,5 @@ export type MetadataPropertyKey = string | symbol;
66
66
  /**
67
67
  * Canonical request-data origins used by packages that describe how metadata values are bound.
68
68
  */
69
- export type MetadataSource = 'path' | 'query' | 'header' | 'cookie' | 'body';
69
+ export type MetadataSource = 'path' | 'query' | 'header' | 'cookie' | 'body' | 'files';
70
70
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,OAAO,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAEjE;;;;;GAKG;AACH,MAAM,MAAM,KAAK,CAAC,CAAC,GAAG,OAAO,IAAI,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AAElE;;;;;GAKG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,OAAO;IAC1C,cAAc,EAAE,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC;CAC5B;AAED;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB,CAAC,CAAC,GAAG,OAAO;IAC9C,YAAY,EAAE,IAAI,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;CACjB;AAED;;;;;GAKG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;AAEjG;;;;;GAKG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAE7C;;;;GAIG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;IAC1B,UAAU,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC;CACrD;AAED;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,MAAM,CAAC;AAElD;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,OAAO,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAEjE;;;;;GAKG;AACH,MAAM,MAAM,KAAK,CAAC,CAAC,GAAG,OAAO,IAAI,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AAElE;;;;;GAKG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,OAAO;IAC1C,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC;CACrC;AAED;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB,CAAC,CAAC,GAAG,OAAO;IAC9C,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;CAC1B;AAED;;;;;GAKG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;AAEjG;;;;;GAKG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAE7C;;;;GAIG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;IAC1B,UAAU,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC;CACrD;AAED;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,MAAM,CAAC;AAElD;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC"}
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "types",
10
10
  "foundation"
11
11
  ],
12
- "version": "1.0.3",
12
+ "version": "2.0.0",
13
13
  "private": false,
14
14
  "license": "MIT",
15
15
  "repository": {
@@ -18,7 +18,7 @@
18
18
  "directory": "packages/core"
19
19
  },
20
20
  "engines": {
21
- "node": ">=20.0.0"
21
+ "node": ">=24.0.0 <27"
22
22
  },
23
23
  "publishConfig": {
24
24
  "access": "public"
@@ -32,6 +32,10 @@
32
32
  "./internal": {
33
33
  "types": "./dist/internal.d.ts",
34
34
  "import": "./dist/internal.js"
35
+ },
36
+ "./request-pipeline": {
37
+ "types": "./dist/request-pipeline.d.ts",
38
+ "import": "./dist/request-pipeline.js"
35
39
  }
36
40
  },
37
41
  "main": "./dist/index.js",
@@ -40,7 +44,7 @@
40
44
  "dist"
41
45
  ],
42
46
  "devDependencies": {
43
- "vitest": "^3.2.4"
47
+ "vitest": "^4.1.11"
44
48
  },
45
49
  "scripts": {
46
50
  "prebuild": "node ../../tooling/scripts/clean-dist.mjs",