@fluojs/core 1.1.0 → 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 +22 -6
- package/README.md +22 -6
- package/dist/decorators.d.ts +3 -2
- package/dist/decorators.d.ts.map +1 -1
- package/dist/decorators.js +3 -2
- package/dist/metadata/types.d.ts +3 -3
- package/dist/metadata/types.d.ts.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -3
- package/dist/transaction-decorator-contract.notes.d.ts +0 -45
- package/dist/transaction-decorator-contract.notes.d.ts.map +0 -1
- package/dist/transaction-decorator-contract.notes.js +0 -1
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` 폴리필을 설치하지 않습니다.
|
|
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()`를 사용하면 됩니다.
|
|
@@ -97,6 +109,8 @@ class UsesDeferredAndOptionalDeps {}
|
|
|
97
109
|
|
|
98
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 동작을 유지합니다.
|
|
99
111
|
|
|
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가 소유합니다.
|
|
113
|
+
|
|
100
114
|
```ts
|
|
101
115
|
import { getModuleMetadata } from '@fluojs/core';
|
|
102
116
|
|
|
@@ -109,16 +123,18 @@ console.log(metadata.providers);
|
|
|
109
123
|
`AsyncModuleOptions<T>`는 외부 `ConfigService` 등에 의존하여 비동기적으로 초기화가 필요한 모듈을 위한 표준 계약입니다.
|
|
110
124
|
|
|
111
125
|
```ts
|
|
112
|
-
import { AsyncModuleOptions
|
|
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
|
-
|
|
121
|
-
|
|
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
|
```
|
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.
|
|
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.
|
|
@@ -99,6 +111,8 @@ class UsesDeferredAndOptionalDeps {}
|
|
|
99
111
|
|
|
100
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.
|
|
101
113
|
|
|
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.
|
|
115
|
+
|
|
102
116
|
```ts
|
|
103
117
|
import { getModuleMetadata } from '@fluojs/core';
|
|
104
118
|
|
|
@@ -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
|
|
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
|
-
|
|
123
|
-
|
|
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
|
```
|
package/dist/decorators.d.ts
CHANGED
|
@@ -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
|
|
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
|
|
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
|
*
|
package/dist/decorators.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
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"}
|
package/dist/decorators.js
CHANGED
|
@@ -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
|
|
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
|
};
|
package/dist/metadata/types.d.ts
CHANGED
|
@@ -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:
|
|
44
|
+
method: string;
|
|
45
45
|
path: string;
|
|
46
46
|
request?: new (...args: never[]) => unknown;
|
|
47
47
|
guards?: MetadataCollection;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/metadata/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,mBAAmB,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzH;;GAEG;AACH,MAAM,MAAM,kBAAkB,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/metadata/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -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
|
package/dist/types.d.ts.map
CHANGED
|
@@ -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,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,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": "
|
|
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": ">=
|
|
21
|
+
"node": ">=24.0.0 <27"
|
|
22
22
|
},
|
|
23
23
|
"publishConfig": {
|
|
24
24
|
"access": "public"
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"dist"
|
|
45
45
|
],
|
|
46
46
|
"devDependencies": {
|
|
47
|
-
"vitest": "^
|
|
47
|
+
"vitest": "^4.1.11"
|
|
48
48
|
},
|
|
49
49
|
"scripts": {
|
|
50
50
|
"prebuild": "node ../../tooling/scripts/clean-dist.mjs",
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TC39 standard method decorator contract for `Transaction`.
|
|
3
|
-
*
|
|
4
|
-
* - Uses the 2023-11 standard decorator shape.
|
|
5
|
-
* - Does not rely on `reflect-metadata` or legacy decorator emit.
|
|
6
|
-
* - The factory accepts a direct accessor function.
|
|
7
|
-
* - ORM packages that expose transaction options can also accept their package-specific options object.
|
|
8
|
-
*/
|
|
9
|
-
/**
|
|
10
|
-
* Resolves the transaction-facing service instance for a decorated method.
|
|
11
|
-
*
|
|
12
|
-
* Default behavior is implicit: `@Transaction()` uses the decorated instance itself.
|
|
13
|
-
* Explicit behavior is opt-in: `@Transaction((self) => self.namedClient)` can select
|
|
14
|
-
* a different service object such as a Prisma, Drizzle, or Mongoose client wrapper.
|
|
15
|
-
*
|
|
16
|
-
* Nested reuse is allowed by contract: if a transaction already exists for the
|
|
17
|
-
* current call chain, the implementation should reuse that transaction context
|
|
18
|
-
* instead of opening a nested one.
|
|
19
|
-
*
|
|
20
|
-
* Prisma and Drizzle may also accept package-specific transaction options at
|
|
21
|
-
* the outer boundary. Nested transaction helpers reject options while an
|
|
22
|
-
* ambient transaction already exists so option intent is not silently ignored.
|
|
23
|
-
*/
|
|
24
|
-
export type TransactionAccessor<T> = (self: T) => {
|
|
25
|
-
transaction: Function;
|
|
26
|
-
current: Function;
|
|
27
|
-
};
|
|
28
|
-
/**
|
|
29
|
-
* TC39 standard method decorator contract for `Transaction`.
|
|
30
|
-
*
|
|
31
|
-
* The decorator returned here is a standard 2023-11 method decorator and therefore
|
|
32
|
-
* receives `ClassMethodDecoratorContext` rather than any reflect-based metadata.
|
|
33
|
-
*/
|
|
34
|
-
export type TransactionDecorator = (value: Function, context: ClassMethodDecoratorContext) => Function | void;
|
|
35
|
-
/**
|
|
36
|
-
* Factory shape for the shared `Transaction` decorator used by ORM packages.
|
|
37
|
-
*
|
|
38
|
-
* Package-local API shape:
|
|
39
|
-
* - `Transaction()` => default accessor using `this`
|
|
40
|
-
* - `Transaction((self) => self.namedClient)` => explicit client selection
|
|
41
|
-
* - package-specific transaction options where the ORM wrapper supports them
|
|
42
|
-
* - no combined object shape such as `Transaction({ accessor: ... })`
|
|
43
|
-
*/
|
|
44
|
-
export type TransactionDecoratorFactory<T> = (accessor?: TransactionAccessor<T>) => TransactionDecorator;
|
|
45
|
-
//# sourceMappingURL=transaction-decorator-contract.notes.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transaction-decorator-contract.notes.d.ts","sourceRoot":"","sources":["../src/transaction-decorator-contract.notes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK;IAChD,WAAW,EAAE,QAAQ,CAAC;IACtB,OAAO,EAAE,QAAQ,CAAC;CACnB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAAG,CACjC,KAAK,EAAE,QAAQ,EACf,OAAO,EAAE,2BAA2B,KACjC,QAAQ,GAAG,IAAI,CAAC;AAErB;;;;;;;;GAQG;AACH,MAAM,MAAM,2BAA2B,CAAC,CAAC,IAAI,CAC3C,QAAQ,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,KAC9B,oBAAoB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|