nesties 1.1.7 → 1.1.9
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.md +251 -39
- package/dist/index.cjs +6 -3
- package/dist/index.cjs.map +3 -3
- package/dist/index.mjs +6 -3
- package/dist/index.mjs.map +3 -3
- package/dist/src/i18n-module/locale.pipe.d.ts +3 -1
- package/dist/src/resolver.d.ts +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -98,8 +98,6 @@ class ExampleController {
|
|
|
98
98
|
}
|
|
99
99
|
```
|
|
100
100
|
|
|
101
|
-
## Usage
|
|
102
|
-
|
|
103
101
|
### 4. Return Message DTOs
|
|
104
102
|
|
|
105
103
|
Nesties provides a set of DTOs for consistent API response structures, and it also includes a utility function `ReturnMessageDto` to generate DTOs dynamically based on the provided class type.
|
|
@@ -153,67 +151,281 @@ This approach automatically creates a DTO structure with the properties of `User
|
|
|
153
151
|
|
|
154
152
|
### 5. Token Guard
|
|
155
153
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
```typescript
|
|
159
|
-
import { RequireToken } from 'nesties';
|
|
160
|
-
|
|
161
|
-
@Controller('secure')
|
|
162
|
-
export class SecureController {
|
|
163
|
-
@Get()
|
|
164
|
-
@RequireToken()
|
|
165
|
-
secureEndpoint() {
|
|
166
|
-
// This endpoint requires a token
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
```
|
|
154
|
+
`TokenGuard` validates a single “server token” before invoking a controller method. By default it reads `SERVER_TOKEN` from `ConfigService` and compares it with the `x-server-token` header, returning a `401` when they differ.
|
|
170
155
|
|
|
171
|
-
####
|
|
156
|
+
#### Quick start (defaults only)
|
|
172
157
|
|
|
173
|
-
1. **
|
|
174
|
-
|
|
175
|
-
In your Nest.js configuration, make sure to set up the `SERVER_TOKEN` using the `@nestjs/config` package.
|
|
158
|
+
1. **Load the config module**
|
|
176
159
|
|
|
177
160
|
```typescript
|
|
178
161
|
import { ConfigModule } from '@nestjs/config';
|
|
179
162
|
|
|
180
163
|
@Module({
|
|
181
|
-
|
|
164
|
+
imports: [ConfigModule.forRoot()],
|
|
182
165
|
})
|
|
183
166
|
export class AppModule {}
|
|
184
167
|
```
|
|
185
168
|
|
|
186
|
-
|
|
169
|
+
2. **Set the secret**
|
|
187
170
|
|
|
188
171
|
```
|
|
189
172
|
SERVER_TOKEN=your-secure-token
|
|
190
173
|
```
|
|
191
174
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
`TokenGuard` checks the request headers for a token called `x-server-token`. If this token matches the one defined in your configuration, the request is allowed to proceed. If the token is missing or incorrect, a `401 Unauthorized` error is thrown.
|
|
195
|
-
|
|
196
|
-
This approach is ideal for simple token-based authentication for APIs. It provides a lightweight method to protect routes without implementing a full OAuth or JWT-based system.
|
|
197
|
-
|
|
198
|
-
3. **Use `RequireToken` Decorator**
|
|
199
|
-
|
|
200
|
-
Apply the `RequireToken` decorator to your controller methods to enforce token validation:
|
|
175
|
+
3. **Decorate the route**
|
|
201
176
|
|
|
202
177
|
```typescript
|
|
203
178
|
import { Controller, Get } from '@nestjs/common';
|
|
204
179
|
import { RequireToken } from 'nesties';
|
|
205
180
|
|
|
206
|
-
@Controller('
|
|
207
|
-
export class
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
181
|
+
@Controller('secure')
|
|
182
|
+
export class SecureController {
|
|
183
|
+
@Get()
|
|
184
|
+
@RequireToken() // expects x-server-token to match SERVER_TOKEN
|
|
185
|
+
secureEndpoint() {
|
|
186
|
+
return { message: 'Valid server token supplied' };
|
|
187
|
+
}
|
|
213
188
|
}
|
|
214
189
|
```
|
|
215
190
|
|
|
216
|
-
|
|
191
|
+
`RequireToken()` installs `TokenGuard`, generates the Swagger header metadata automatically, and documents the `401` response. If `SERVER_TOKEN` is empty (e.g., local dev) the guard becomes a no-op so you can disable it without touching code.
|
|
192
|
+
|
|
193
|
+
#### Advanced configuration
|
|
194
|
+
|
|
195
|
+
When you need to override the defaults, pass options into `RequireToken`:
|
|
196
|
+
|
|
197
|
+
- `resolver` (default: `{ paramType: 'header', paramName: 'x-server-token' }`): where to read the **client** token from. Accepts any `ResolverDual`, so query/header resolvers are all supported.
|
|
198
|
+
- `tokenSource` (default: `'SERVER_TOKEN'`): how to read the **server** token. Provide another config key or an async resolver `(ctx, moduleRef) => Promise<string>` for dynamic sources.
|
|
199
|
+
- `errorCode` (default: `401`): HTTP status when tokens do not match.
|
|
200
|
+
|
|
201
|
+
```typescript
|
|
202
|
+
@Controller('api')
|
|
203
|
+
export class ApiController {
|
|
204
|
+
@Get('protected')
|
|
205
|
+
@RequireToken({
|
|
206
|
+
resolver: { paramType: 'query', paramName: 'token' },
|
|
207
|
+
tokenSource: 'INTERNAL_TOKEN',
|
|
208
|
+
errorCode: 498,
|
|
209
|
+
})
|
|
210
|
+
fetch() {
|
|
211
|
+
return { data: 'guarded' };
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
Multi-tenant secrets are just another `tokenSource` resolver:
|
|
217
|
+
|
|
218
|
+
```typescript
|
|
219
|
+
import { ConfigService } from '@nestjs/config';
|
|
220
|
+
import { createResolver } from 'nesties';
|
|
221
|
+
|
|
222
|
+
const headerResolver = { paramType: 'header', paramName: 'x-tenant-token' };
|
|
223
|
+
|
|
224
|
+
@RequireToken({
|
|
225
|
+
resolver: headerResolver,
|
|
226
|
+
tokenSource: async (ctx, moduleRef) => {
|
|
227
|
+
const tenantId = await createResolver({
|
|
228
|
+
paramType: 'header',
|
|
229
|
+
paramName: 'x-tenant-id',
|
|
230
|
+
})(ctx, moduleRef);
|
|
231
|
+
const config = moduleRef.get(ConfigService);
|
|
232
|
+
return config.get<string>(`TENANT_${tenantId}_TOKEN`);
|
|
233
|
+
},
|
|
234
|
+
})
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
`TokenGuard` only throws when both values exist and differ, so clearing the config value temporarily disables the guard without a code change.
|
|
238
|
+
|
|
239
|
+
### 6. AbortableModule
|
|
240
|
+
|
|
241
|
+
Use `AbortableModule` when you want long‑running providers to respect the lifetime of the HTTP request. The module exposes a request‑scoped `AbortSignal` and wraps existing providers with [`nfkit`](https://www.npmjs.com/package/nfkit)'s `abortable` helper so that work can be canceled automatically when the client disconnects.
|
|
242
|
+
|
|
243
|
+
```typescript
|
|
244
|
+
import { AbortableModule, InjectAbortable } from 'nesties';
|
|
245
|
+
|
|
246
|
+
@Module({
|
|
247
|
+
imports: [
|
|
248
|
+
AbortableModule.forRoot(), // registers the request-level AbortSignal
|
|
249
|
+
AbortableModule.forFeature([DemoService]), // wrap DemoService with an abortable proxy
|
|
250
|
+
],
|
|
251
|
+
})
|
|
252
|
+
export class DemoModule {
|
|
253
|
+
constructor(@InjectAbortable() private readonly demo: DemoService) {}
|
|
254
|
+
|
|
255
|
+
getData() {
|
|
256
|
+
return this.demo.expensiveCall(); // aborts when request ends
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
- `AbortableModule.forRoot()` should be added once (typically in `AppModule`) to expose the shared `AbortSignal`.
|
|
262
|
+
- `AbortableModule.forFeature([Token], { abortableOptions })` registers one or more providers that will be resolved per request and automatically wrapped in an abortable proxy.
|
|
263
|
+
- `@InjectAbortable()` can infer the token type automatically, or accept an explicit injection token, and `InjectAbortSignal()` gives direct access to the `AbortSignal` if you need to manage cancellation manually.
|
|
264
|
+
|
|
265
|
+
#### Injecting `AbortSignal` with `@nestjs/axios`
|
|
266
|
+
|
|
267
|
+
```typescript
|
|
268
|
+
import { HttpModule, HttpService } from '@nestjs/axios';
|
|
269
|
+
import {
|
|
270
|
+
AbortableModule,
|
|
271
|
+
InjectAbortable,
|
|
272
|
+
InjectAbortSignal,
|
|
273
|
+
} from 'nesties';
|
|
274
|
+
|
|
275
|
+
@Module({
|
|
276
|
+
imports: [
|
|
277
|
+
HttpModule,
|
|
278
|
+
AbortableModule.forRoot(),
|
|
279
|
+
AbortableModule.forFeature([HttpService]),
|
|
280
|
+
],
|
|
281
|
+
})
|
|
282
|
+
export class WeatherModule {
|
|
283
|
+
constructor(
|
|
284
|
+
@InjectAbortable() private readonly http: HttpService,
|
|
285
|
+
@InjectAbortSignal() private readonly abortSignal: AbortSignal,
|
|
286
|
+
) {}
|
|
287
|
+
|
|
288
|
+
async fetchForecast() {
|
|
289
|
+
const { data } = await this.http.axiosRef.get(
|
|
290
|
+
'https://api.example.com/weather',
|
|
291
|
+
{ signal: this.abortSignal },
|
|
292
|
+
);
|
|
293
|
+
return data;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
The wrapped `HttpService` observes the same abort signal as the request, so in‑flight HTTP calls will be canceled as soon as the client disconnects or Nest aborts the request scope.
|
|
299
|
+
|
|
300
|
+
### 7. I18nModule
|
|
301
|
+
|
|
302
|
+
Nesties also ships an opinionated but flexible internationalization module. The typical workflow is to call `createI18n` to obtain `I18nModule` plus the `UseI18n` decorator, register locale lookup middleware (e.g., `I18nLookupMiddleware`), and then return DTOs that contain placeholders like `#{key}`—the interceptor installed by `@UseI18n()` will translate those placeholders automatically before the response leaves the server.
|
|
303
|
+
|
|
304
|
+
```typescript
|
|
305
|
+
import {
|
|
306
|
+
createI18n,
|
|
307
|
+
I18nService,
|
|
308
|
+
GenericReturnMessageDto,
|
|
309
|
+
I18nLookupMiddleware,
|
|
310
|
+
} from 'nesties';
|
|
311
|
+
|
|
312
|
+
const { I18nModule, UseI18n } = createI18n({
|
|
313
|
+
locales: ['en-US', 'zh-CN'],
|
|
314
|
+
defaultLocale: 'en-US',
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
@Module({
|
|
318
|
+
imports: [I18nModule],
|
|
319
|
+
})
|
|
320
|
+
export class AppModule {
|
|
321
|
+
constructor(private readonly i18n: I18nService) {
|
|
322
|
+
this.i18n.middleware(
|
|
323
|
+
I18nLookupMiddleware({
|
|
324
|
+
'en-US': { bar: 'Nesties' },
|
|
325
|
+
'zh-CN': { bar: '奈斯提' },
|
|
326
|
+
}),
|
|
327
|
+
);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
@Controller()
|
|
332
|
+
@UseI18n()
|
|
333
|
+
export class GreetingController {
|
|
334
|
+
@Get()
|
|
335
|
+
async greet() {
|
|
336
|
+
return new GenericReturnMessageDto(200, 'OK', {
|
|
337
|
+
greeting: 'Hello #{bar}',
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
#### `@PutLocale()` Per-handler Overrides
|
|
343
|
+
|
|
344
|
+
`@PutLocale()` lets you override how the locale is resolved for a specific handler or parameter. Pass a custom resolver (any shape supported by `ResolverDual`) when you want to read the locale from a query param, body field, or even headers different from the global resolver.
|
|
345
|
+
|
|
346
|
+
```typescript
|
|
347
|
+
import { GenericReturnMessageDto, PutLocale } from 'nesties';
|
|
348
|
+
|
|
349
|
+
@Controller('reports')
|
|
350
|
+
@UseI18n()
|
|
351
|
+
export class ReportController {
|
|
352
|
+
@Get()
|
|
353
|
+
async summary(
|
|
354
|
+
@PutLocale({ paramType: 'query', paramName: 'locale' }) locale: string,
|
|
355
|
+
) {
|
|
356
|
+
// locale now respects ?locale=...
|
|
357
|
+
return new GenericReturnMessageDto(200, 'OK', {
|
|
358
|
+
summary: 'report.summary',
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
#### Custom Middleware with TypeORM
|
|
365
|
+
|
|
366
|
+
You can register any number of middlewares that resolve placeholders. The example below queries a TypeORM repository to fetch translations stored in a database and falls back to the next middleware when no record is found.
|
|
367
|
+
|
|
368
|
+
```typescript
|
|
369
|
+
import { ExecutionContext, Injectable } from '@nestjs/common';
|
|
370
|
+
import { InjectRepository } from '@nestjs/typeorm';
|
|
371
|
+
import {
|
|
372
|
+
Repository,
|
|
373
|
+
Entity,
|
|
374
|
+
Column,
|
|
375
|
+
PrimaryGeneratedColumn,
|
|
376
|
+
} from 'typeorm';
|
|
377
|
+
import { I18nService } from 'nesties';
|
|
378
|
+
|
|
379
|
+
@Entity()
|
|
380
|
+
export class Translation {
|
|
381
|
+
@PrimaryGeneratedColumn()
|
|
382
|
+
id: number;
|
|
383
|
+
|
|
384
|
+
@Column()
|
|
385
|
+
locale: string;
|
|
386
|
+
|
|
387
|
+
@Column()
|
|
388
|
+
key: string;
|
|
389
|
+
|
|
390
|
+
@Column()
|
|
391
|
+
value: string;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
@Injectable()
|
|
395
|
+
export class TranslationMiddleware {
|
|
396
|
+
constructor(
|
|
397
|
+
private readonly i18n: I18nService,
|
|
398
|
+
@InjectRepository(Translation)
|
|
399
|
+
private readonly repo: Repository<Translation>,
|
|
400
|
+
) {
|
|
401
|
+
this.i18n.middleware(this.lookupFromDatabase.bind(this));
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
private async lookupFromDatabase(
|
|
405
|
+
locale: string,
|
|
406
|
+
key: string,
|
|
407
|
+
next: () => Promise<string | undefined>,
|
|
408
|
+
ctx?: ExecutionContext,
|
|
409
|
+
) {
|
|
410
|
+
const found = await this.repo.findOne({ where: { locale, key } });
|
|
411
|
+
if (found) {
|
|
412
|
+
return found.value;
|
|
413
|
+
}
|
|
414
|
+
return next();
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
Register `TranslationMiddleware` in any module that also imports `TypeOrmModule.forFeature([Translation])` so the service is instantiated and its middleware is attached to `I18nService`.
|
|
420
|
+
|
|
421
|
+
By composing multiple middlewares (dictionaries, database lookups, remote APIs), you can build a tiered fallback chain that covers every translation source you need.
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
- `createI18n` returns both a configured module (`I18nModule`) and a decorator (`UseI18n`) that adds the bundled interceptor and Swagger metadata describing the locale resolver.
|
|
425
|
+
- `UseI18n` wires the interceptor that walks the returned DTO (e.g., `GenericReturnMessageDto`) and replaces every string that contains placeholders (`Hello #{key}`) using the locale detected from the incoming request.
|
|
426
|
+
- `I18nService.middleware` lets you register middlewares such as `I18nLookupMiddleware` for dictionary lookups, database resolvers, or remote translation APIs.
|
|
427
|
+
- `LocalePipe`/`PutLocale` provide ergonomic access to the resolved locale inside route handlers, and you can override the resolver per parameter when necessary.
|
|
428
|
+
- `I18nService.translate` and `translateString` remain available for advanced manual flows (generating strings outside of interceptor scope, building static assets, etc.).
|
|
217
429
|
|
|
218
430
|
## DTO Classes
|
|
219
431
|
|
package/dist/index.cjs
CHANGED
|
@@ -859,15 +859,17 @@ var import_common11 = require("@nestjs/common");
|
|
|
859
859
|
|
|
860
860
|
// src/i18n-module/locale.pipe.ts
|
|
861
861
|
var import_common10 = require("@nestjs/common");
|
|
862
|
+
var import_core5 = require("@nestjs/core");
|
|
862
863
|
var LocalePipe = class {
|
|
863
|
-
constructor(i18nService) {
|
|
864
|
+
constructor(i18nService, moduleRef) {
|
|
864
865
|
this.i18nService = i18nService;
|
|
866
|
+
this.moduleRef = moduleRef;
|
|
865
867
|
}
|
|
866
868
|
async transform(ctx, metadata) {
|
|
867
869
|
const resolver = ctx.resolver;
|
|
868
870
|
if (resolver) {
|
|
869
871
|
const _resolver = createResolver(resolver);
|
|
870
|
-
const locale = await _resolver(ctx.ctx,
|
|
872
|
+
const locale = await _resolver(ctx.ctx, this.moduleRef);
|
|
871
873
|
return this.i18nService.getExactLocale(locale);
|
|
872
874
|
} else {
|
|
873
875
|
return this.i18nService.getExactLocaleFromRequest(ctx.ctx);
|
|
@@ -876,7 +878,8 @@ var LocalePipe = class {
|
|
|
876
878
|
};
|
|
877
879
|
LocalePipe = __decorateClass([
|
|
878
880
|
(0, import_common10.Injectable)(),
|
|
879
|
-
__decorateParam(0, (0, import_common10.Inject)(I18nService))
|
|
881
|
+
__decorateParam(0, (0, import_common10.Inject)(I18nService)),
|
|
882
|
+
__decorateParam(1, (0, import_common10.Inject)(import_core5.ModuleRef))
|
|
880
883
|
], LocalePipe);
|
|
881
884
|
var _dec = (0, import_common10.createParamDecorator)((resolver, ctx) => {
|
|
882
885
|
return { ctx, resolver };
|
package/dist/index.cjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../index.ts", "../src/insert-field.ts", "../src/merge.ts", "../src/return-message.ts", "../src/openapi.ts", "../src/pipe.ts", "../src/token.guard.ts", "../src/resolver.ts", "../src/abort-utils.ts", "../src/utility/abort-http-signal.ts", "../src/abortable-module/abortable.token.ts", "../src/abortable-module/abort-signal.provider.ts", "../src/create-provider.ts", "../src/abortable-module/abortable.module.ts", "../src/i18n-module/i18n.service.ts", "../src/i18n-module/i18n-token.ts", "../src/utility/parse-i18n.ts", "../src/i18n-module/i18n.module.ts", "../src/i18n-module/locale.pipe.ts", "../src/i18n-module/i18n-decorator.ts", "../src/i18n-module/i18n.interceptor.ts", "../src/i18n-module/i18n-factory.ts", "../src/i18n-module/middlewares/lookup.ts"],
|
|
4
|
-
"sourcesContent": ["export * from './src/insert-field';\nexport * from './src/merge';\nexport * from './src/return-message';\nexport * from './src/openapi';\nexport * from './src/pipe';\nexport * from './src/token.guard';\nexport * from './src/abort-utils';\nexport * from './src/abortable-module';\nexport * from './src/create-provider';\nexport * from './src/i18n-module';\nexport * from './src/resolver';\n", "import { ApiProperty, ApiPropertyOptions } from '@nestjs/swagger';\n\nexport type AnyClass = new (...args: any[]) => any;\nexport type ClassOrArray = AnyClass | [AnyClass];\nexport type ClassType<T> = new (...args: any[]) => T;\nexport type TypeFromClass<T> = T extends new (...args: any[]) => infer U\n ? U\n : never;\nexport type ParamsFromClass<T> = T extends new (...args: infer U) => any\n ? U\n : never;\nexport type ParseType<IC extends ClassOrArray> = IC extends [infer U]\n ? TypeFromClass<U>[]\n : TypeFromClass<IC>;\n\nexport function getClassFromClassOrArray(o: ClassOrArray) {\n return o instanceof Array ? o[0] : o;\n}\n\nexport interface InsertOptions<C extends ClassOrArray = ClassOrArray> {\n type: C;\n options?: ApiPropertyOptions;\n}\n\ntype TypeFromInsertOptions<O extends InsertOptions> =\n O extends InsertOptions<infer C>\n ?\n | ParseType<C>\n | (O extends { options: { required: true } } ? never : undefined)\n : never;\n\ntype Merge<T, U> = {\n [K in keyof T | keyof U]: K extends keyof T\n ? T[K]\n : K extends keyof U\n ? U[K]\n : never;\n};\n\nexport function InsertField<\n C extends AnyClass,\n M extends Record<string, InsertOptions>,\n>(\n cl: C,\n map: M,\n newName?: string,\n): new (...args: ParamsFromClass<C>) => Merge<\n {\n [F in keyof M]: TypeFromInsertOptions<M[F]>;\n },\n TypeFromClass<C>\n> {\n const extendedCl = class extends cl {};\n for (const key in map) {\n ApiProperty({\n type: map[key].type,\n ...(map[key].options || {}),\n })(extendedCl.prototype, key);\n }\n Object.defineProperty(extendedCl, 'name', {\n value: newName || cl.name,\n });\n return extendedCl;\n}\n", "export function MergePropertyDecorators(\n decs: PropertyDecorator[],\n): PropertyDecorator {\n return (obj, key) => {\n for (const dec of decs) {\n dec(obj, key);\n }\n };\n}\n\nexport function MergeMethodDecorators(\n decs: MethodDecorator[],\n): MethodDecorator {\n return (obj, key, descriptor) => {\n for (const dec of decs) {\n dec(obj, key, descriptor);\n }\n };\n}\n\nexport function MergeClassDecorators(decs: ClassDecorator[]): ClassDecorator {\n return (obj) => {\n for (const dec of decs) {\n dec(obj);\n }\n };\n}\n\nexport function MergeParameterDecorators(\n decs: ParameterDecorator[],\n): ParameterDecorator {\n return (obj, key, index) => {\n for (const dec of decs) {\n dec(obj, key, index);\n }\n };\n}\n\nexport function MergeClassOrMethodDecorators(\n decs: (ClassDecorator & MethodDecorator)[],\n): ClassDecorator & MethodDecorator {\n return (obj, key?, descriptor?) => {\n if (descriptor) {\n for (const dec of decs) {\n dec(obj, key, descriptor);\n }\n } else {\n for (const dec of decs) {\n dec(obj);\n }\n }\n };\n}\n", "import { ApiProperty } from '@nestjs/swagger';\nimport { HttpException } from '@nestjs/common';\nimport {\n AnyClass,\n ClassOrArray,\n getClassFromClassOrArray,\n InsertField,\n ParseType,\n} from './insert-field';\n\nexport interface PageSettingsWise {\n pageCount: number;\n recordsPerPage: number;\n}\n\nexport interface BlankReturnMessage {\n statusCode: number;\n message: string;\n success: boolean;\n timestamp: Date;\n}\n\nexport interface ReturnMessage<T> extends BlankReturnMessage {\n data?: T;\n}\n\nexport class BlankReturnMessageDto implements BlankReturnMessage {\n @ApiProperty({ description: 'Return code', type: Number })\n statusCode: number;\n @ApiProperty({ description: 'Return message', type: String })\n message: string;\n @ApiProperty({ description: 'Whether success.', type: Boolean })\n success: boolean;\n @ApiProperty({ description: 'Return timestamp', type: Date })\n timestamp: Date;\n constructor(statusCode: number, message?: string) {\n this.statusCode = statusCode;\n this.message = message || 'success';\n this.success = statusCode < 400;\n this.timestamp = new Date();\n }\n\n toException() {\n return new HttpException(this, this.statusCode);\n }\n}\n\nexport class BlankPaginatedReturnMessageDto\n extends BlankReturnMessageDto\n implements PageSettingsWise\n{\n @ApiProperty({ description: 'Total record count.', type: Number })\n total: number;\n @ApiProperty({ description: 'Total page count.', type: Number })\n totalPages: number;\n @ApiProperty({ description: 'Current page.', type: Number })\n pageCount: number;\n @ApiProperty({ description: 'Records per page.', type: Number })\n recordsPerPage: number;\n constructor(\n statusCode: number,\n message: string,\n total: number,\n pageSettings: PageSettingsWise,\n ) {\n super(statusCode, message);\n this.total = total;\n this.pageCount = pageSettings.pageCount;\n this.recordsPerPage = pageSettings.recordsPerPage;\n this.totalPages = Math.ceil(total / pageSettings.recordsPerPage);\n }\n}\n\nexport class GenericReturnMessageDto<T>\n extends BlankReturnMessageDto\n implements ReturnMessage<T>\n{\n data?: T;\n constructor(statusCode: number, message?: string, data?: T) {\n super(statusCode, message);\n this.data = data;\n }\n}\n\nexport function ReturnMessageDto<T extends ClassOrArray>(\n type: T,\n): new (\n statusCode: number,\n message: string,\n data: ParseType<T>,\n) => GenericReturnMessageDto<ParseType<T>> {\n return InsertField(\n GenericReturnMessageDto,\n {\n data: {\n type,\n options: {\n required: false,\n description: 'Return data.',\n },\n },\n },\n `${getClassFromClassOrArray(type).name}${Array.isArray(type) ? 'Array' : ''}ReturnMessageDto`,\n );\n}\n\nexport class GenericPaginatedReturnMessageDto<T>\n extends BlankPaginatedReturnMessageDto\n implements PageSettingsWise, ReturnMessage<T[]>\n{\n data: T[];\n constructor(\n statusCode: number,\n message: string,\n data: T[],\n total: number,\n pageSettings: PageSettingsWise,\n ) {\n super(statusCode, message, total, pageSettings);\n this.data = data;\n }\n}\n\nexport function PaginatedReturnMessageDto<T extends AnyClass>(\n type: T,\n): new (\n statusCode: number,\n message: string,\n data: InstanceType<T>[],\n total: number,\n pageSettings: PageSettingsWise,\n) => GenericPaginatedReturnMessageDto<InstanceType<T>> {\n return InsertField(\n GenericPaginatedReturnMessageDto,\n {\n data: {\n type: [type],\n options: {\n required: false,\n description: 'Return data.',\n },\n },\n },\n `${getClassFromClassOrArray(type).name}PaginatedReturnMessageDto`,\n );\n}\n\nexport class StringReturnMessageDto extends GenericReturnMessageDto<string> {\n @ApiProperty({ description: 'Return data.', type: String, required: false })\n data: string;\n}\n", "import { BlankReturnMessageDto, ReturnMessageDto } from './return-message';\nimport { ApiResponse, ApiResponseOptions } from '@nestjs/swagger';\nimport { ClassOrArray } from './insert-field';\n\nexport const ApiTypeResponse = (\n // eslint-disable-next-line @typescript-eslint/ban-types\n type: ClassOrArray,\n options: ApiResponseOptions = {},\n) =>\n ApiResponse({\n status: 200,\n type: ReturnMessageDto(type),\n ...options,\n });\n\nexport const ApiBlankResponse = (options: ApiResponseOptions = {}) =>\n ApiResponse({\n status: 200,\n type: BlankReturnMessageDto,\n ...options,\n });\n\nexport const ApiError = (status: number, description: string) =>\n ApiBlankResponse({ status, description });\n\nexport const ApiErrorTyped = (\n status: number,\n description: string,\n type: ClassOrArray,\n) =>\n ApiTypeResponse(type, {\n status,\n description,\n });\n", "import {\n Body,\n PipeTransform,\n Query,\n Type,\n ValidationPipe,\n} from '@nestjs/common';\n\nexport const DataPipe = () =>\n new ValidationPipe({\n transform: true,\n transformOptions: { enableImplicitConversion: true },\n });\n\nconst createDataPipeDec =\n (\n nestFieldDec: (\n ...pipes: (Type<PipeTransform> | PipeTransform)[]\n ) => ParameterDecorator,\n ) =>\n (...extraPipes: (Type<PipeTransform> | PipeTransform)[]) =>\n nestFieldDec(DataPipe(), ...extraPipes);\n\nexport const DataQuery = createDataPipeDec(Query);\nexport const DataBody = createDataPipeDec(Body);\n", "import {\n CanActivate,\n ExecutionContext,\n Inject,\n Injectable,\n UseGuards,\n} from '@nestjs/common';\nimport { ConfigService } from '@nestjs/config';\nimport { ApiHeader } from '@nestjs/swagger';\nimport { BlankReturnMessageDto } from './return-message';\nimport { MergeClassOrMethodDecorators } from './merge';\nimport { ApiError } from './openapi';\nimport {\n ApiFromResolver,\n createResolver,\n ResolverDual,\n ResolverDynamic,\n} from './resolver';\nimport { MetadataSetter, Reflector } from 'typed-reflector';\nimport { ModuleRef } from '@nestjs/core';\n\nexport interface RequireTokenOptions {\n resolver?: ResolverDual;\n tokenSource?: string | ResolverDynamic;\n errorCode?: number;\n}\n\ntype RequireTokenMetadataMap = {\n requireTokenOptions: RequireTokenOptions;\n};\n\nconst reflector = new Reflector<RequireTokenMetadataMap, {}>();\nconst Metadata = new MetadataSetter<RequireTokenMetadataMap, {}>();\n\nconst defaultHeaderName = 'x-server-token';\nconst defaultConfigName = 'SERVER_TOKEN';\nconst defaultErrorCode = 401;\n\n@Injectable()\nexport class TokenGuard implements CanActivate {\n constructor(\n @Inject(ConfigService) private config: ConfigService,\n @Inject(ModuleRef) private moduleRef: ModuleRef,\n ) {}\n\n async canActivate(context: ExecutionContext) {\n const controller = context.getClass();\n const handlerName = context.getHandler()?.name;\n let config = {} as RequireTokenOptions;\n if (controller) {\n if (handlerName) {\n config =\n reflector.get('requireTokenOptions', controller, handlerName) || {};\n } else {\n config = reflector.get('requireTokenOptions', controller) || {};\n }\n }\n const resolver = createResolver(\n config.resolver || { paramType: 'header', paramName: defaultHeaderName },\n );\n const tokenSource = config.tokenSource || defaultConfigName;\n const [tokenFromClient, tokenFromConfig] = await Promise.all([\n resolver(context, this.moduleRef),\n typeof tokenSource === 'function'\n ? tokenSource(context, this.moduleRef)\n : this.config.get<string>(tokenSource),\n ]);\n if (tokenFromConfig && tokenFromConfig !== tokenFromClient) {\n throw new BlankReturnMessageDto(\n config.errorCode || defaultErrorCode,\n 'Unauthorized',\n ).toException();\n }\n return true;\n }\n}\n\nexport const RequireToken = (options: RequireTokenOptions = {}) => {\n const swaggerDec = options.resolver\n ? ApiFromResolver(options.resolver, {\n description: 'Server token',\n required: false,\n })\n : ApiHeader({\n name: defaultHeaderName,\n description: 'Server token',\n required: false,\n });\n return MergeClassOrMethodDecorators([\n UseGuards(TokenGuard),\n swaggerDec,\n ApiError(\n options.errorCode || defaultErrorCode,\n 'Incorrect server token provided',\n ),\n ...(options ? [Metadata.set('requireTokenOptions', options)] : []),\n ]);\n};\n", "import type { Request } from 'express';\nimport { Awaitable } from './utility/awaitable';\nimport { ExecutionContext } from '@nestjs/common';\nimport { ModuleRef } from '@nestjs/core';\nimport {\n ApiHeader,\n ApiHeaderOptions,\n ApiQuery,\n ApiQueryOptions,\n} from '@nestjs/swagger';\n\nexport interface ResolverStatic {\n paramType: 'header' | 'query';\n paramName: string;\n}\n\nexport type ResolverDynamic = (\n ctx: ExecutionContext,\n ref?: ModuleRef,\n) => Awaitable<string>;\n\nexport type ResolverDual = ResolverStatic | ResolverDynamic;\n\ntype AnyReq = Request & {\n headers?: Record<string, any>;\n query?: any;\n url?: string;\n originalUrl?: string;\n getHeader?: (name: string) => any;\n get?: (name: string) => any;\n header?: (name: string) => any;\n};\n\nconst coerceToString = (v: any): string | undefined => {\n if (v == null) return undefined; // null / undefined\n if (v === false) return undefined; // \uD83D\uDC48 \u5173\u952E\uFF1A\u628A false \u5F53\u4F5C\u672A\u547D\u4E2D\n if (Array.isArray(v)) return v.length ? coerceToString(v[0]) : undefined;\n if (typeof v === 'string') return v;\n if (typeof v === 'number') return String(v);\n // \u5176\u4ED6\u7C7B\u578B\uFF08true / object / function / symbol / bigint\uFF09\u90FD\u4E0D\u63A5\u53D7\n return undefined;\n};\n\nconst getHeader = (req: AnyReq, name: string): string | undefined => {\n // \u5148\u8D70\u65B9\u6CD5\uFF08express/\u90E8\u5206\u9002\u914D\u5668\uFF09\n const viaMethod =\n (typeof req.getHeader === 'function' && req.getHeader(name)) ||\n (typeof (req as any).header === 'function' && (req as any).header(name)) ||\n (typeof (req as any).get === 'function' && (req as any).get(name));\n\n if (viaMethod) {\n return coerceToString(viaMethod);\n }\n\n // \u518D\u67E5 headers\uFF0C\u5927\u5C0F\u5199\u65E0\u5173\n const n = name.toLowerCase();\n const headers = req.headers ?? {};\n if (n in headers) return coerceToString((headers as any)[n]);\n\n const hit = Object.entries(headers).find(([k]) => k.toLowerCase() === n)?.[1];\n return coerceToString(hit);\n};\n\nconst pickPrimaryFromAcceptLanguage = (v?: string): string | undefined => {\n if (!v) return undefined;\n const first = v.split(',')[0]?.trim();\n return first?.split(';')[0]?.trim() || first;\n};\n\nfunction getQueryValue(req: AnyReq, key: string): string | undefined {\n // 1. \u666E\u901A\u5BF9\u8C61\u6A21\u5F0F\uFF08Express/Fastify \u5DF2\u89E3\u6790\uFF09\n const q = req.query;\n if (q && typeof q === 'object' && !('raw' in q)) {\n const v = (q as any)[key];\n if (v != null) return coerceToString(v);\n }\n\n // 2. fallback\uFF1A\u89E3\u6790 URLSearchParams\n const rawUrl = req.originalUrl ?? req.url;\n if (typeof rawUrl === 'string' && rawUrl.includes('?')) {\n try {\n // \u7528 http://localhost \u5360\u4F4D base\uFF0C\u907F\u514D\u76F8\u5BF9\u8DEF\u5F84\u9519\u8BEF\n const search = rawUrl.startsWith('http')\n ? new URL(rawUrl).search\n : new URL(rawUrl, 'http://localhost').search;\n\n if (search) {\n const params = new URLSearchParams(search);\n const val = params.get(key);\n if (val != null) return val;\n }\n } catch {\n // ignore malformed URL\n }\n }\n return undefined;\n}\n\nexport const createResolver = (_options: ResolverDual): ResolverDynamic => {\n if (typeof _options === 'function') {\n // it's already dynamic\n return _options;\n }\n const options = _options as ResolverStatic;\n const field = options.paramType; // 'header' | 'query'\n let name = options.paramName;\n if (field === 'header') name = name.toLowerCase();\n\n return (ctx) => {\n const req = ctx.switchToHttp().getRequest<AnyReq>();\n\n if (field === 'header') {\n let raw = getHeader(req, name);\n if (name === 'accept-language') raw = pickPrimaryFromAcceptLanguage(raw);\n return raw;\n }\n\n if (field === 'query') {\n return getQueryValue(req, name);\n }\n\n throw new Error(`Unsupported paramType: ${field}`);\n };\n};\n\nexport const ApiFromResolver = (\n _options: ResolverDual,\n extras: ApiHeaderOptions | ApiQueryOptions = {},\n): ClassDecorator & MethodDecorator => {\n if (typeof _options === 'function') {\n // dynamic resolver, no static param info\n return () => {};\n }\n const options = _options as ResolverStatic;\n const paramType = (options as ResolverStatic)?.paramType;\n const apiOptions: ApiHeaderOptions = {\n name: (options as ResolverStatic).paramName,\n ...extras,\n };\n return paramType === 'header'\n ? ApiHeader(apiOptions)\n : paramType === 'query'\n ? ApiQuery({ type: 'string', ...apiOptions })\n : () => {};\n};\n", "import { Observable, takeUntil } from 'rxjs';\nimport { createParamDecorator, ExecutionContext } from '@nestjs/common';\nimport type { Request } from 'express';\nimport { createAbortSignalFromHttp } from './utility/abort-http-signal';\n\nexport type AbortableFn<T> = (ac: AbortController) => Promise<T>;\n\nexport const fromAbortable = <T>(fn: AbortableFn<T>): Observable<T> => {\n return new Observable<T>((subscriber) => {\n const ac = new AbortController();\n\n fn(ac).then(\n (value) => {\n if (!ac.signal.aborted && !subscriber.closed) {\n subscriber.next(value);\n subscriber.complete();\n }\n },\n (err) => {\n if (ac.signal.aborted) {\n if (!subscriber.closed) subscriber.complete();\n return;\n }\n if (!subscriber.closed) subscriber.error(err);\n },\n );\n\n return () => {\n if (!ac.signal.aborted) ac.abort();\n };\n });\n};\n\nexport const takeUntilAbort = <T>(signal: AbortSignal) => {\n return (source: Observable<T>) => {\n return source.pipe(\n takeUntil(\n new Observable<void>((subscriber) => {\n const onAbort = () => subscriber.next();\n if (signal.aborted) {\n subscriber.next();\n } else {\n signal.addEventListener('abort', onAbort, { once: true });\n }\n return () => signal.removeEventListener('abort', onAbort);\n }),\n ),\n );\n };\n};\n\nexport const As = createParamDecorator(\n (_data: unknown, ctx: ExecutionContext) => {\n const req = ctx.switchToHttp().getRequest<Request>();\n return createAbortSignalFromHttp(req);\n },\n);\n", "// abort-http-signal.ts\nimport type { IncomingMessage } from 'http';\nimport type { Request as ExpressReq } from 'express';\nimport type { FastifyRequest } from 'fastify';\nimport { BlankReturnMessageDto } from '../return-message';\n\ntype AnyReq = ExpressReq | FastifyRequest | IncomingMessage;\n\nfunction toRawReq(req: AnyReq): IncomingMessage {\n // Fastify: req.raw \u662F IncomingMessage\uFF1BExpress: req \u672C\u8EAB\u5C31\u662F IncomingMessage\n if ((req as any)?.raw?.socket) return (req as any).raw as IncomingMessage;\n return req as IncomingMessage;\n}\n\n/**\n * \u4EC5\u901A\u8FC7 req \u81EA\u52A8\u9002\u914D Express/Fastify\uFF0C\u7ED1\u5B9A HTTP \u53D6\u6D88\u5230 AbortSignal\u3002\n * - \u4F18\u5148\u76D1\u542C 'aborted'\uFF08\u5BA2\u6237\u7AEF\u4E2D\u65AD\u6700\u53EF\u9760\u7684\u4FE1\u53F7\uFF09\n * - \u53EF\u9009\u515C\u5E95\uFF1A\u5728 socket 'close' \u65F6\uFF0C\u4EC5\u5F53\u8BF7\u6C42\u672A\u5B8C\u6574\u63A5\u6536/\u6216\u5DF2\u6807\u8BB0 aborted \u65F6\uFF0C\u624D\u89E6\u53D1 abort\uFF0C\u907F\u514D\u6B63\u5E38\u5B8C\u6210\u7684\u8BEF\u4F24\n * - reason \u56FA\u5B9A\u4E3A 499 HttpException\n *\n * \u6CE8\u610F\uFF1A\u82E5\u4F60\u7684 abortable() \u5728 signal.reason \u662F Error \u65F6\u4F1A\u201C\u539F\u6837 throw reason\u201D\uFF0C\n * \u90A3\u4E48\u4E0A\u5C42\u4F1A\u6536\u5230 HttpException(499)\u3002\u82E5\u4ECD\u60F3\u7EDF\u4E00\u629B AbortedError\uFF0C\u53EF\u6539\u4E3A\uFF1A\n * const reason = new AbortedError('Request aborted', httpErr);\n * \u5E76\u8BA9 throwIfAborted \u5148\u629B AbortedError\uFF08\u4FDD\u7559 cause\uFF09\u3002\n */\nexport function createAbortSignalFromHttp(req: AnyReq): AbortSignal {\n const rawReq = toRawReq(req);\n const ac = new AbortController();\n\n const makeReason = () =>\n new BlankReturnMessageDto(499, 'Request aborted').toException();\n\n const abortOnce = () => {\n if (!ac.signal.aborted) ac.abort(makeReason());\n cleanup();\n };\n\n const onClose = () => {\n abortOnce();\n };\n\n const cleanup = () => {\n rawReq.off?.('close', onClose);\n };\n\n rawReq.once?.('close', onClose);\n\n return ac.signal;\n}\n", "import { Inject, Scope } from '@nestjs/common';\nimport { abortable, AbortableOpts } from 'nfkit';\nimport { ABORT_SIGNAL } from './abort-signal.provider';\nimport { ContextIdFactory, ModuleRef, REQUEST } from '@nestjs/core';\nimport { createProvider } from '../create-provider';\nimport { InjectionToken } from '@nestjs/common/interfaces/modules/injection-token.interface';\n\nconst tokenMemo = new Map<any, symbol>();\nexport const abortableToken = (token: InjectionToken) => {\n if (tokenMemo.has(token)) return tokenMemo.get(token)!;\n const name = typeof token === 'function' ? token.name : String(token);\n const sym = Symbol.for(`Abortable(${name})`);\n tokenMemo.set(token, sym);\n return sym;\n};\n\n/**\n * \u652F\u6301\u4E24\u79CD\u7528\u6CD5\uFF1A\n * @InjectAbortable(SomeService)\n * @InjectAbortable() // \u81EA\u52A8\u63A8\u65AD\u7C7B\u578B\n */\nexport function InjectAbortable(token?: InjectionToken): ParameterDecorator {\n return (target, propertyKey, parameterIndex) => {\n let actualToken = token;\n\n if (!actualToken) {\n // \u5229\u7528 reflect-metadata \u83B7\u53D6\u53C2\u6570\u7C7B\u578B\n const paramTypes: any[] =\n Reflect.getMetadata('design:paramtypes', target, propertyKey) || [];\n actualToken = paramTypes[parameterIndex];\n if (!actualToken) {\n throw new Error(\n `@InjectAbortable() cannot infer type from metadata: ${target.constructor?.name}[${parameterIndex}]`,\n );\n }\n }\n\n Inject(abortableToken(actualToken))(target, propertyKey, parameterIndex);\n };\n}\n\nexport function createAbortableProvider<T>(\n token: InjectionToken<T>,\n opts?: AbortableOpts,\n) {\n const provide = abortableToken(token);\n\n return createProvider(\n {\n provide,\n scope: Scope.REQUEST,\n inject: [ModuleRef, REQUEST, ABORT_SIGNAL],\n },\n async (moduleRef, req: Request, signal) => {\n // \u8BA9\u89E3\u6790\u4E0E\u5F53\u524D\u8BF7\u6C42\u4E0A\u4E0B\u6587\u7ED1\u5B9A\uFF08\u652F\u6301 request/transient \u4F5C\u7528\u57DF\uFF09\n const ctxId = ContextIdFactory.getByRequest(req);\n // \u4E25\u683C\u6A21\u5F0F\u5173\u95ED\uFF0C\u5141\u8BB8\u8DE8\u6A21\u5757\u8FB9\u754C\u89E3\u6790\uFF08\u89E3\u51B3\u6D4B\u8BD5\u91CC forFeature \u5B50\u6A21\u5757\u770B\u4E0D\u5230 DemoService \u7684\u60C5\u51B5\uFF09\n const svc = await moduleRef.resolve<T>(token, ctxId, { strict: false });\n if (svc == null) {\n throw new Error(\n `Abortable: provider \"${String(\n (token as any).name ?? token,\n )}\" not found in container (even with strict:false)`,\n );\n }\n return abortable<T>(svc, signal, opts);\n },\n );\n}\n", "import { Inject, Scope, Type } from '@nestjs/common';\nimport { REQUEST } from '@nestjs/core';\nimport { createAbortSignalFromHttp } from '../utility/abort-http-signal';\nimport { createProvider } from '../create-provider';\n\nexport const ABORT_SIGNAL = Symbol(\n 'ABORT_SIGNAL',\n) as unknown as Type<AbortSignal>;\nexport const AbortSignalProvider = createProvider(\n {\n provide: ABORT_SIGNAL,\n scope: Scope.REQUEST,\n inject: [REQUEST],\n },\n createAbortSignalFromHttp,\n);\n\nexport const InjectAbortSignal = () => Inject(ABORT_SIGNAL);\n", "import { FactoryProvider } from '@nestjs/common';\nimport { InjectionToken } from '@nestjs/common/interfaces/modules/injection-token.interface';\n\ntype TypeFromToken<T> = T extends string | symbol\n ? any\n : T extends InjectionToken<infer U>\n ? U\n : any;\n\ntype TokensToTypes<A extends InjectionToken[]> = A extends []\n ? []\n : A extends [infer F, ...infer R]\n ? [TypeFromToken<F>, ...TokensToTypes<R extends InjectionToken[] ? R : []>]\n : [];\n\ntype Awaitable<T> = T | Promise<T>;\n\nexport interface TypedFactoryProvider<A extends InjectionToken[], R>\n extends FactoryProvider<R> {\n inject: A;\n useFactory: (...args: TokensToTypes<A>) => Awaitable<R>;\n}\n\nexport const createProvider = <const A extends InjectionToken[], R>(\n options: { inject: A } & Omit<FactoryProvider<R>, 'inject' | 'useFactory'>,\n factory: (...args: TokensToTypes<A>) => Awaitable<R>,\n): TypedFactoryProvider<A, R> => {\n return {\n useFactory: factory,\n ...options,\n };\n};\n", "import { DynamicModule, Module } from '@nestjs/common';\nimport { createAbortableProvider } from './abortable.token';\nimport { AbortableOpts } from 'nfkit';\nimport { AbortSignalProvider } from './abort-signal.provider';\nimport { InjectionToken } from '@nestjs/common/interfaces/modules/injection-token.interface';\n\nexport interface AbortableModuleOptions {\n abortableOptions?: AbortableOpts;\n}\n\n@Module({})\nexport class AbortableModule {\n static forRoot(): DynamicModule {\n return {\n module: AbortableModule,\n providers: [AbortSignalProvider],\n exports: [AbortSignalProvider],\n global: true,\n };\n }\n\n static forFeature(\n tokens: InjectionToken[],\n options?: AbortableModuleOptions,\n ): DynamicModule {\n const providers = tokens.map((token) =>\n createAbortableProvider(token, options?.abortableOptions),\n );\n\n return {\n module: AbortableModule,\n providers: [...providers],\n exports: [...providers],\n };\n }\n}\n", "import {\n ConsoleLogger,\n ExecutionContext,\n HttpException,\n Inject,\n Injectable,\n} from '@nestjs/common';\nimport { I18nModuleOptionsToken } from './i18n-token';\nimport { I18nModuleOptions } from './i18n-module.options';\nimport { I18nMiddleware } from './i18n-middleware.type';\nimport { parseI18n } from '../utility/parse-i18n';\nimport { ModuleRef } from '@nestjs/core';\nimport { createResolver } from '../resolver';\n\n@Injectable()\nexport class I18nService {\n constructor(\n @Inject(I18nModuleOptionsToken) private options: I18nModuleOptions,\n @Inject(ModuleRef) private moduleRef: ModuleRef,\n ) {}\n\n private resolver = createResolver(this.options.resolver);\n\n private locales = new Set(this.options.locales);\n private defaultLocale = this.options.defaultLocale ?? this.options.locales[0];\n\n private middlewares: I18nMiddleware[] = [];\n\n middleware(mw: I18nMiddleware, prior = false) {\n if (prior) {\n this.middlewares.unshift(mw);\n } else {\n this.middlewares.push(mw);\n }\n }\n\n private logger = new ConsoleLogger('I18nService');\n\n private buildFallbackChain(locale: string): string[] {\n const best = this.getExactLocale(locale); // \u4F60\u7684\u201C\u6700\u957F\u5339\u914D\u201D\u51FD\u6570\n // \u62C6\u5206 zh-Hans-CN -> ['zh-Hans-CN','zh-Hans','zh']\n const parts: string[] = [];\n const segs = best.split('-');\n for (let i = segs.length; i > 1; i--)\n parts.push(segs.slice(0, i).join('-'));\n parts.push(segs[0]); // 'zh'\n // \u9644\u52A0\u9ED8\u8BA4\u8BED\u8A00\n if (!parts.includes(this.defaultLocale)) parts.push(this.defaultLocale);\n // \u53BB\u91CD\n return Array.from(new Set(parts)).filter((p) => this.locales.has(p));\n }\n\n private async applyMiddlewares(\n locale: string,\n text: string,\n ctx?: ExecutionContext,\n ): Promise<string | undefined> {\n const mws = this.middlewares;\n\n const tryLocale = async (loc: string) => {\n const dispatch = async (i: number): Promise<string | undefined> => {\n if (i >= mws.length) return undefined;\n\n const mw = mws[i];\n let nextCalled = false;\n\n const next = async (): Promise<string | undefined> => {\n nextCalled = true;\n return dispatch(i + 1);\n };\n\n try {\n const res = await mw(loc, text, next, ctx as any);\n if (res == null && !nextCalled) {\n return dispatch(i + 1);\n }\n return res;\n } catch (e) {\n if (e instanceof HttpException) {\n // this HttpException should throw up directly\n throw e;\n }\n this.logger.warn(`Middleware at index ${i} threw an error: ${e}`);\n return dispatch(i + 1);\n }\n };\n return dispatch(0);\n };\n\n for (const loc of this.buildFallbackChain(locale)) {\n const result = await tryLocale(loc);\n if (result != null) {\n return result;\n }\n }\n return undefined;\n }\n\n getExactLocale(locale: string) {\n const input = (locale ?? '').trim();\n if (!input) return this.defaultLocale;\n\n if (this.locales.has(input)) return input;\n\n // \u5C0F\u5199\u5316\u6BD4\u8F83\uFF0C\u4FDD\u7559\u539F\u5927\u5C0F\u5199\n const entries = Array.from(this.locales).map((l) => ({\n orig: l,\n lower: l.toLowerCase(),\n }));\n const lower = input.toLowerCase();\n\n // 1) \u7CBE\u786E\u5339\u914D\uFF08\u5927\u5C0F\u5199\u4E0D\u654F\u611F\uFF09\n const exact = entries.find((e) => e.lower === lower);\n if (exact) return exact.orig;\n\n // 2) \u6309 '-' \u62C6\u5206\uFF0C\u4F9D\u6B21\u5C1D\u8BD5\u53BB\u6389\u6700\u53F3\u8FB9\u7684\u6BB5\n // zh-Hans-CN \u2192 zh-Hans \u2192 zh\n const parts = lower.split('-');\n while (parts.length > 1) {\n parts.pop();\n const candidate = parts.join('-');\n const hit = entries.find((e) => e.lower === candidate);\n if (hit) return hit.orig;\n }\n\n // 3) \u515C\u5E95\n return this.defaultLocale;\n }\n\n async getExactLocaleFromRequest(ctx: ExecutionContext) {\n const locale = await this.resolver(ctx, this.moduleRef);\n return this.getExactLocale(locale);\n }\n\n async translateString(\n locale: string,\n text: string,\n ctx?: ExecutionContext,\n ): Promise<string> {\n if (!text) return text;\n\n locale = this.getExactLocale(locale);\n\n const pieces = parseI18n(text);\n if (!pieces.some((p) => p.type === 'ph')) {\n return pieces\n .map((p) => (p.type === 'raw' ? p.value : `#{${p.rawInner}}`))\n .join('');\n }\n\n const promises: Array<Promise<string | undefined | null>> = [];\n\n for (const p of pieces) {\n if (p.type === 'ph') {\n promises.push(this.applyMiddlewares(locale, p.key, ctx));\n }\n }\n\n const results = await Promise.all(promises);\n\n let out = '';\n let k = 0;\n for (const p of pieces) {\n if (p.type === 'raw') {\n out += p.value;\n } else {\n const r = results[k++];\n out += r == null ? `#{${p.rawInner}}` : r;\n }\n }\n return out;\n }\n\n async translate<T>(\n locale: string,\n obj: T,\n ctx?: ExecutionContext,\n ): Promise<T> {\n const visited = new WeakSet<object>();\n\n const isBuiltInObject = (v: any): boolean => {\n if (v == null || typeof v !== 'object') return false;\n if (\n v instanceof Date ||\n v instanceof RegExp ||\n v instanceof Map ||\n v instanceof Set ||\n v instanceof WeakMap ||\n v instanceof WeakSet ||\n v instanceof ArrayBuffer ||\n v instanceof DataView ||\n ArrayBuffer.isView(v) // TypedArray / Buffer\n )\n return true;\n\n const tag = Object.prototype.toString.call(v);\n switch (tag) {\n case '[object URL]':\n case '[object URLSearchParams]':\n case '[object Error]':\n case '[object Blob]':\n case '[object File]':\n case '[object FormData]':\n return true;\n default:\n return false;\n }\n };\n\n const translateObjectPreservingProto = async (value: any): Promise<any> => {\n const proto = Object.getPrototypeOf(value);\n const out = Object.create(proto);\n\n const keys = Reflect.ownKeys(value);\n\n await Promise.all(\n keys.map(async (key) => {\n const desc = Object.getOwnPropertyDescriptor(value, key as any);\n if (!desc) return;\n\n // \u6570\u636E\u5C5E\u6027\uFF1A\u5E76\u53D1\u9012\u5F52\u5176 value\uFF0C\u4FDD\u6301\u539F\u5C5E\u6027\u7279\u6027\n if ('value' in desc) {\n const newVal = await visit(desc.value);\n Object.defineProperty(out, key, { ...desc, value: newVal });\n return;\n }\n\n // \u8BBF\u95EE\u5668\u5C5E\u6027\uFF1A\u5148\u590D\u5236 getter/setter\uFF0C\u518D\u5C1D\u8BD5\u8BFB\u503C\u2192\u7FFB\u8BD1\u2192\u5199\u56DE\n Object.defineProperty(out, key, desc);\n\n // \u6CA1\u6709 getter \u5C31\u65E0\u9700\u5904\u7406\uFF1B\u6709 getter \u4F46\u629B\u9519\u4E5F\u5FFD\u7565\n let current: any = undefined;\n if (typeof desc.get === 'function') {\n try {\n current = desc.get.call(value);\n } catch {\n /* ignore */\n }\n }\n if (current === undefined) return;\n\n // \u9012\u5F52\u7FFB\u8BD1 getter \u8FD4\u56DE\u7684\u503C\uFF1B\u82E5\u6709 setter \u5219\u5199\u56DE\n try {\n const newVal = await visit(current);\n if (typeof desc.set === 'function') {\n try {\n desc.set.call(out, newVal);\n } catch {\n /* ignore */\n }\n }\n } catch {\n // \u7FFB\u8BD1\u5931\u8D25\u4E0D\u5F71\u54CD\u5176\u4ED6\u952E\n }\n }),\n );\n\n return out;\n };\n\n const isTranslatable = (\n v: any,\n ): { ok: false } | { ok: true; kind: 'string' | 'object' } => {\n // 1) \u6240\u6709 falsy \u539F\u6837\uFF08null/undefined/false/0/''/NaN\uFF09\n if (!v) return { ok: false };\n\n // 2) \u57FA\u672C\u7C7B\u578B\u8FC7\u6EE4\n const t = typeof v;\n if (\n t === 'number' ||\n t === 'bigint' ||\n t === 'symbol' ||\n t === 'function'\n ) {\n return { ok: false };\n }\n\n // 3) \u53EF\u7FFB\u8BD1\uFF1A\u5B57\u7B26\u4E32 or \u5BF9\u8C61\uFF08\u5BF9\u8C61\u518D\u7531\u540E\u7EED\u903B\u8F91\u51B3\u5B9A\u662F\u5426\u6DF1\u5165\uFF09\n if (t === 'string') return { ok: true, kind: 'string' };\n if (t === 'object') {\n return { ok: true, kind: 'object' };\n }\n\n // \u5176\u5B83\uFF08boolean \u7B49\u5DF2\u5305\u542B\u5728 falsy/\u57FA\u672C\u7C7B\u578B\u91CC\uFF09\n return { ok: false };\n };\n\n const visit = async (value: any): Promise<any> => {\n // 1) \u68C0\u67E5\u662F\u5426\u53EF\u7FFB\u8BD1\n const check = isTranslatable(value);\n\n // 2) \u4E0D\u53EF\u7FFB\u8BD1\u7684\u539F\u6837\u8FD4\u56DE\n if (!check.ok) {\n return value;\n }\n\n if (check.kind === 'string') {\n // 3) \u5B57\u7B26\u4E32\uFF1A\u7FFB\u8BD1\n return this.translateString(locale, value, ctx);\n }\n\n // 4) Promise\uFF1A\u4E0D\u9690\u5F0F\u5C55\u5F00\uFF08\u4FDD\u6301\u8BED\u4E49\uFF09\n if (value instanceof Promise) {\n return value.then((resolved) => visit(resolved));\n }\n\n // 5) \u5BF9\u8C61\u7C7B\uFF1A\u8FC7\u6EE4\u5185\u7F6E\u5BF9\u8C61\n if (typeof value === 'object') {\n if (!Array.isArray(value) && isBuiltInObject(value)) return value;\n\n // \u9632\u73AF\n if (visited.has(value)) return value;\n visited.add(value);\n\n // \u6570\u7EC4\uFF1A\u5143\u7D20\u7EA7\u9012\u5F52\n if (Array.isArray(value)) {\n const out = await Promise.all(value.map((v) => visit(v)));\n return out as any;\n }\n\n // \u5176\u4ED6\u5BF9\u8C61\uFF08\u542B\u7C7B\u5B9E\u4F8B/DTO\uFF09\uFF1A\u4FDD\u7559\u539F\u578B\u5E76\u9012\u5F52\u81EA\u6709\u5C5E\u6027\n return translateObjectPreservingProto(value);\n }\n\n // \u5176\u4F59\u7C7B\u578B\uFF08boolean \u7B49\uFF09\u539F\u6837\u8FD4\u56DE\n return value;\n };\n\n return visit(obj);\n }\n\n async translateRequest(ctx: ExecutionContext, obj: any): Promise<any> {\n const locale = await this.resolver(ctx, this.moduleRef);\n return this.translate(locale, obj, ctx);\n }\n}\n", "import { ConfigurableModuleBuilder } from '@nestjs/common';\nimport { I18nModuleOptions } from './i18n-module.options';\n\nexport const I18nResolverToken = Symbol('I18nResolverToken');\n\nconst { ConfigurableModuleClass, MODULE_OPTIONS_TOKEN } =\n new ConfigurableModuleBuilder<I18nModuleOptions>()\n // .setExtras({}, (def) => ({ ...def, global: true }))\n .build();\nexport const I18nModuleOptionsToken = MODULE_OPTIONS_TOKEN;\nexport { ConfigurableModuleClass as I18nModuleBase };\n", "// \u2014\u2014 \u89E3\u6790\u7ED3\u679C\u7ED3\u6784 \u2014\u2014 //\nexport type I18nPiece =\n | { type: 'raw'; value: string }\n | { type: 'ph'; rawInner: string; key: string };\n\n/**\n * \u6808\u5F0F\u89E3\u6790 #{ ... } \u5360\u4F4D\u3002\u652F\u6301\u5185\u90E8\u6210\u5BF9\u82B1\u62EC\u53F7\uFF0C\u5982 #{ foo {{ bar }} }\u3002\n * - \u672A\u95ED\u5408\u65F6\uFF1A\u628A\u4ECE\u4E0A\u6B21\u4F4D\u7F6E i \u5230\u7ED3\u5C3E\u6574\u4F53\u4F5C\u4E3A raw \u653E\u56DE\uFF08\u907F\u514D\u88AB\u62C6\u6210\u4E24\u6BB5\uFF09\n * - key = trim(rawInner)\n */\nexport const parseI18n = (text: string): I18nPiece[] => {\n const pieces: I18nPiece[] = [];\n if (!text) return pieces;\n\n let i = 0;\n const n = text.length;\n\n while (i < n) {\n const start = text.indexOf('#{', i);\n if (start === -1) {\n // \u6CA1\u6709\u66F4\u591A\u5360\u4F4D\u7B26\n if (i < n) pieces.push({ type: 'raw', value: text.slice(i) });\n break;\n }\n\n // \u5148\u5C1D\u8BD5\u5339\u914D\u8FD9\u4E2A\u5360\u4F4D\u7B26\u662F\u5426\u95ED\u5408\uFF08\u6B64\u65F6\u4E0D\u7ACB\u5373\u63A8\u5165\u524D\u5BFC raw\uFF09\n let j = start + 2; // \u6307\u5411 '#{' \u540E\u7B2C\u4E00\u4E2A\u5B57\u7B26\n let depth = 1;\n while (j < n && depth > 0) {\n const ch = text.charCodeAt(j);\n if (ch === 123 /* '{' */) depth++;\n else if (ch === 125 /* '}' */) depth--;\n j++;\n }\n\n if (depth !== 0) {\n // \u672A\u95ED\u5408\uFF1A\u628A\u4ECE i \u5230\u672B\u5C3E\u6574\u4F53\u5F53\u4F5C raw\uFF08\u5305\u542B\u524D\u5BFC + '#{' \u5C3E\u5DF4\uFF09\n pieces.push({ type: 'raw', value: text.slice(i) });\n break;\n }\n\n // \u5230\u8FD9\u91CC\u8BF4\u660E\u5360\u4F4D\u95ED\u5408\uFF1A\u5148\u63A8\u5165\u524D\u5BFC raw\uFF0C\u518D\u63A8\u5360\u4F4D\u7247\u6BB5\n if (start > i) {\n pieces.push({ type: 'raw', value: text.slice(i, start) });\n }\n\n const rawInner = text.slice(start + 2, j - 1);\n const key = rawInner.trim();\n pieces.push({ type: 'ph', rawInner, key });\n\n i = j; // \u7EE7\u7EED\u5411\u540E\u626B\u63CF\n }\n\n return pieces;\n};\n", "import { Global, Module } from '@nestjs/common';\nimport { I18nModuleBase } from './i18n-token';\nimport { I18nService } from './i18n.service';\nimport { LocalePipe } from './locale.pipe';\n\n@Global()\n@Module({\n providers: [I18nService, LocalePipe],\n exports: [I18nService, LocalePipe],\n})\nexport class I18nModule extends I18nModuleBase {}\n", "import {\n ArgumentMetadata,\n createParamDecorator,\n ExecutionContext,\n Inject,\n Injectable,\n PipeTransform,\n} from '@nestjs/common';\nimport { I18nService } from './i18n.service';\nimport { createResolver, ResolverDual } from '../resolver';\n\ntype LocaleContext = {\n ctx: ExecutionContext;\n resolver?: ResolverDual;\n};\n\n@Injectable()\nexport class LocalePipe implements PipeTransform {\n constructor(@Inject(I18nService) private i18nService: I18nService) {}\n\n async transform(ctx: LocaleContext, metadata: ArgumentMetadata) {\n const resolver = ctx.resolver;\n if (resolver) {\n const _resolver = createResolver(resolver);\n const locale = await _resolver(ctx.ctx, undefined);\n return this.i18nService.getExactLocale(locale);\n } else {\n return this.i18nService.getExactLocaleFromRequest(ctx.ctx);\n }\n }\n}\n\nconst _dec = createParamDecorator((resolver: ResolverDual | undefined, ctx) => {\n return { ctx, resolver };\n});\n\nexport const PutLocale = (resolver?: ResolverDual) =>\n _dec(resolver, LocalePipe);\n", "import { I18nModuleOptions } from './i18n-module.options';\nimport { ApiFromResolver } from '../resolver';\nimport { MergeClassOrMethodDecorators } from '../merge';\nimport { UseInterceptors } from '@nestjs/common';\nimport { I18nInterceptor } from './i18n.interceptor';\n\nexport const createI18nDecorator = (options: I18nModuleOptions) => {\n return () =>\n MergeClassOrMethodDecorators([\n UseInterceptors(I18nInterceptor),\n ApiFromResolver(options.resolver, {\n description: 'Locale for internationalization',\n required: false,\n default: options.defaultLocale ?? options.locales[0],\n enum: options.locales,\n }),\n ]);\n};\n", "import {\n CallHandler,\n ExecutionContext,\n HttpException,\n Inject,\n Injectable,\n NestInterceptor,\n} from '@nestjs/common';\nimport { from, throwError } from 'rxjs';\nimport { catchError, mergeMap } from 'rxjs/operators';\nimport { I18nService } from './i18n.service';\n\n@Injectable()\nexport class I18nInterceptor implements NestInterceptor {\n constructor(@Inject(I18nService) private readonly i18nService: I18nService) {}\n\n intercept(context: ExecutionContext, next: CallHandler) {\n return next.handle().pipe(\n // \u6210\u529F\u8DEF\u5F84\uFF1A\u628A\u54CD\u5E94\u4F53\u4EA4\u7ED9 i18n \u505A\u5F02\u6B65\u7FFB\u8BD1\n mergeMap((data) => this.i18nService.translateRequest(context, data)),\n // \u9519\u8BEF\u8DEF\u5F84\uFF1A\u82E5\u662F HttpException\uFF0C\u628A\u5176 response \u7FFB\u8BD1\u540E\u518D\u629B\n catchError((err) => {\n if (err instanceof HttpException) {\n const status = err.getStatus();\n const resp = err.getResponse();\n return from(this.i18nService.translateRequest(context, resp)).pipe(\n mergeMap((translated) =>\n throwError(\n () => new HttpException(translated, status, { cause: err }),\n ),\n ),\n );\n }\n return throwError(() => err);\n }),\n );\n }\n}\n", "import { I18nModuleOptions } from './i18n-module.options';\nimport { createI18nDecorator } from './i18n-decorator';\nimport { I18nModule } from './i18n.module';\nimport { ResolverDual } from '../resolver';\n\nexport const createI18n = (\n options: Omit<I18nModuleOptions, 'resolver'> & { resolver?: ResolverDual },\n) => {\n if (!options.resolver) {\n options.resolver = {\n paramType: 'header',\n paramName: 'x-client-language',\n };\n }\n return {\n UseI18n: createI18nDecorator(options as I18nModuleOptions),\n I18nModule: I18nModule.register(options as I18nModuleOptions),\n };\n};\n", "import { I18nMiddleware } from '../i18n-middleware.type';\nimport { Awaitable } from '../../utility/awaitable';\nimport { ExecutionContext } from '@nestjs/common';\n\nexport type I18nDictionary = Record<string, Record<string, string>>;\n\ntype MatchType = 'exact' | 'hierarchy' | 'startsWith';\n\nexport const I18nLookupMiddleware = (\n dict:\n | I18nDictionary\n | ((\n locale: string,\n key: string,\n ctx?: ExecutionContext,\n ) => Awaitable<I18nDictionary>),\n options?: { matchType?: MatchType },\n): I18nMiddleware => {\n const matchType: MatchType = options?.matchType ?? 'exact';\n const dictFactory = typeof dict === 'function' ? dict : () => dict;\n\n // \u57FA\u4E8E locales \u5217\u8868\u505A\u201C\u7CBE\u786E\u2192\u5C42\u7EA7\u56DE\u9000(zh-Hans-CN\u2192zh-Hans\u2192zh)\u201D\u7684\u6700\u957F\u5339\u914D\n const pickBestByHierarchy = (\n input: string,\n locales: string[],\n ): string | undefined => {\n if (!input) return undefined;\n const entries = locales.map((l) => ({ orig: l, lower: l.toLowerCase() }));\n const lower = input.toLowerCase();\n\n // \u7CBE\u786E\u5339\u914D\uFF08\u5927\u5C0F\u5199\u4E0D\u654F\u611F\uFF09\n const exact = entries.find((e) => e.lower === lower);\n if (exact) return exact.orig;\n\n // \u9010\u7EA7\u56DE\u9000\uFF1Azh-Hans-CN -> zh-Hans -> zh\n const parts = lower.split('-');\n while (parts.length > 1) {\n parts.pop();\n const candidate = parts.join('-');\n const hit = entries.find((e) => e.lower === candidate);\n if (hit) return hit.orig;\n }\n return undefined;\n };\n\n return async (locale, key, next, ctx) => {\n const dictResolved = await dictFactory(locale, key, ctx);\n\n let dictionary = dictResolved[locale];\n\n if (!dictionary) {\n if (matchType === 'hierarchy') {\n const best = pickBestByHierarchy(locale, Object.keys(dictResolved));\n if (best) dictionary = dictResolved[best];\n } else if (matchType === 'startsWith') {\n const keys = Object.keys(dictResolved).filter((k) =>\n locale.startsWith(k),\n );\n if (keys.length) {\n const best = keys.reduce((a, b) => (b.length > a.length ? b : a));\n dictionary = dictResolved[best];\n }\n }\n }\n\n // \u547D\u4E2D\u5224\u65AD\uFF1A\u5141\u8BB8\u7A7A\u5B57\u7B26\u4E32 ''\uFF1B\u4EC5 null/undefined \u89C6\u4E3A\u672A\u547D\u4E2D\n if (dictionary && Object.prototype.hasOwnProperty.call(dictionary, key)) {\n const val = dictionary[key];\n if (val != null) {\n return val;\n }\n }\n\n return next();\n };\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["import_swagger", "import_swagger", "import_common", "import_common", "import_swagger", "import_swagger", "import_common", "import_common", "import_common", "import_core", "import_core", "import_common", "import_common", "import_common", "import_core", "import_common", "import_common", "import_common", "import_common", "import_rxjs"]
|
|
4
|
+
"sourcesContent": ["export * from './src/insert-field';\nexport * from './src/merge';\nexport * from './src/return-message';\nexport * from './src/openapi';\nexport * from './src/pipe';\nexport * from './src/token.guard';\nexport * from './src/abort-utils';\nexport * from './src/abortable-module';\nexport * from './src/create-provider';\nexport * from './src/i18n-module';\nexport * from './src/resolver';\n", "import { ApiProperty, ApiPropertyOptions } from '@nestjs/swagger';\n\nexport type AnyClass = new (...args: any[]) => any;\nexport type ClassOrArray = AnyClass | [AnyClass];\nexport type ClassType<T> = new (...args: any[]) => T;\nexport type TypeFromClass<T> = T extends new (...args: any[]) => infer U\n ? U\n : never;\nexport type ParamsFromClass<T> = T extends new (...args: infer U) => any\n ? U\n : never;\nexport type ParseType<IC extends ClassOrArray> = IC extends [infer U]\n ? TypeFromClass<U>[]\n : TypeFromClass<IC>;\n\nexport function getClassFromClassOrArray(o: ClassOrArray) {\n return o instanceof Array ? o[0] : o;\n}\n\nexport interface InsertOptions<C extends ClassOrArray = ClassOrArray> {\n type: C;\n options?: ApiPropertyOptions;\n}\n\ntype TypeFromInsertOptions<O extends InsertOptions> =\n O extends InsertOptions<infer C>\n ?\n | ParseType<C>\n | (O extends { options: { required: true } } ? never : undefined)\n : never;\n\ntype Merge<T, U> = {\n [K in keyof T | keyof U]: K extends keyof T\n ? T[K]\n : K extends keyof U\n ? U[K]\n : never;\n};\n\nexport function InsertField<\n C extends AnyClass,\n M extends Record<string, InsertOptions>,\n>(\n cl: C,\n map: M,\n newName?: string,\n): new (...args: ParamsFromClass<C>) => Merge<\n {\n [F in keyof M]: TypeFromInsertOptions<M[F]>;\n },\n TypeFromClass<C>\n> {\n const extendedCl = class extends cl {};\n for (const key in map) {\n ApiProperty({\n type: map[key].type,\n ...(map[key].options || {}),\n })(extendedCl.prototype, key);\n }\n Object.defineProperty(extendedCl, 'name', {\n value: newName || cl.name,\n });\n return extendedCl;\n}\n", "export function MergePropertyDecorators(\n decs: PropertyDecorator[],\n): PropertyDecorator {\n return (obj, key) => {\n for (const dec of decs) {\n dec(obj, key);\n }\n };\n}\n\nexport function MergeMethodDecorators(\n decs: MethodDecorator[],\n): MethodDecorator {\n return (obj, key, descriptor) => {\n for (const dec of decs) {\n dec(obj, key, descriptor);\n }\n };\n}\n\nexport function MergeClassDecorators(decs: ClassDecorator[]): ClassDecorator {\n return (obj) => {\n for (const dec of decs) {\n dec(obj);\n }\n };\n}\n\nexport function MergeParameterDecorators(\n decs: ParameterDecorator[],\n): ParameterDecorator {\n return (obj, key, index) => {\n for (const dec of decs) {\n dec(obj, key, index);\n }\n };\n}\n\nexport function MergeClassOrMethodDecorators(\n decs: (ClassDecorator & MethodDecorator)[],\n): ClassDecorator & MethodDecorator {\n return (obj, key?, descriptor?) => {\n if (descriptor) {\n for (const dec of decs) {\n dec(obj, key, descriptor);\n }\n } else {\n for (const dec of decs) {\n dec(obj);\n }\n }\n };\n}\n", "import { ApiProperty } from '@nestjs/swagger';\nimport { HttpException } from '@nestjs/common';\nimport {\n AnyClass,\n ClassOrArray,\n getClassFromClassOrArray,\n InsertField,\n ParseType,\n} from './insert-field';\n\nexport interface PageSettingsWise {\n pageCount: number;\n recordsPerPage: number;\n}\n\nexport interface BlankReturnMessage {\n statusCode: number;\n message: string;\n success: boolean;\n timestamp: Date;\n}\n\nexport interface ReturnMessage<T> extends BlankReturnMessage {\n data?: T;\n}\n\nexport class BlankReturnMessageDto implements BlankReturnMessage {\n @ApiProperty({ description: 'Return code', type: Number })\n statusCode: number;\n @ApiProperty({ description: 'Return message', type: String })\n message: string;\n @ApiProperty({ description: 'Whether success.', type: Boolean })\n success: boolean;\n @ApiProperty({ description: 'Return timestamp', type: Date })\n timestamp: Date;\n constructor(statusCode: number, message?: string) {\n this.statusCode = statusCode;\n this.message = message || 'success';\n this.success = statusCode < 400;\n this.timestamp = new Date();\n }\n\n toException() {\n return new HttpException(this, this.statusCode);\n }\n}\n\nexport class BlankPaginatedReturnMessageDto\n extends BlankReturnMessageDto\n implements PageSettingsWise\n{\n @ApiProperty({ description: 'Total record count.', type: Number })\n total: number;\n @ApiProperty({ description: 'Total page count.', type: Number })\n totalPages: number;\n @ApiProperty({ description: 'Current page.', type: Number })\n pageCount: number;\n @ApiProperty({ description: 'Records per page.', type: Number })\n recordsPerPage: number;\n constructor(\n statusCode: number,\n message: string,\n total: number,\n pageSettings: PageSettingsWise,\n ) {\n super(statusCode, message);\n this.total = total;\n this.pageCount = pageSettings.pageCount;\n this.recordsPerPage = pageSettings.recordsPerPage;\n this.totalPages = Math.ceil(total / pageSettings.recordsPerPage);\n }\n}\n\nexport class GenericReturnMessageDto<T>\n extends BlankReturnMessageDto\n implements ReturnMessage<T>\n{\n data?: T;\n constructor(statusCode: number, message?: string, data?: T) {\n super(statusCode, message);\n this.data = data;\n }\n}\n\nexport function ReturnMessageDto<T extends ClassOrArray>(\n type: T,\n): new (\n statusCode: number,\n message: string,\n data: ParseType<T>,\n) => GenericReturnMessageDto<ParseType<T>> {\n return InsertField(\n GenericReturnMessageDto,\n {\n data: {\n type,\n options: {\n required: false,\n description: 'Return data.',\n },\n },\n },\n `${getClassFromClassOrArray(type).name}${Array.isArray(type) ? 'Array' : ''}ReturnMessageDto`,\n );\n}\n\nexport class GenericPaginatedReturnMessageDto<T>\n extends BlankPaginatedReturnMessageDto\n implements PageSettingsWise, ReturnMessage<T[]>\n{\n data: T[];\n constructor(\n statusCode: number,\n message: string,\n data: T[],\n total: number,\n pageSettings: PageSettingsWise,\n ) {\n super(statusCode, message, total, pageSettings);\n this.data = data;\n }\n}\n\nexport function PaginatedReturnMessageDto<T extends AnyClass>(\n type: T,\n): new (\n statusCode: number,\n message: string,\n data: InstanceType<T>[],\n total: number,\n pageSettings: PageSettingsWise,\n) => GenericPaginatedReturnMessageDto<InstanceType<T>> {\n return InsertField(\n GenericPaginatedReturnMessageDto,\n {\n data: {\n type: [type],\n options: {\n required: false,\n description: 'Return data.',\n },\n },\n },\n `${getClassFromClassOrArray(type).name}PaginatedReturnMessageDto`,\n );\n}\n\nexport class StringReturnMessageDto extends GenericReturnMessageDto<string> {\n @ApiProperty({ description: 'Return data.', type: String, required: false })\n data: string;\n}\n", "import { BlankReturnMessageDto, ReturnMessageDto } from './return-message';\nimport { ApiResponse, ApiResponseOptions } from '@nestjs/swagger';\nimport { ClassOrArray } from './insert-field';\n\nexport const ApiTypeResponse = (\n // eslint-disable-next-line @typescript-eslint/ban-types\n type: ClassOrArray,\n options: ApiResponseOptions = {},\n) =>\n ApiResponse({\n status: 200,\n type: ReturnMessageDto(type),\n ...options,\n });\n\nexport const ApiBlankResponse = (options: ApiResponseOptions = {}) =>\n ApiResponse({\n status: 200,\n type: BlankReturnMessageDto,\n ...options,\n });\n\nexport const ApiError = (status: number, description: string) =>\n ApiBlankResponse({ status, description });\n\nexport const ApiErrorTyped = (\n status: number,\n description: string,\n type: ClassOrArray,\n) =>\n ApiTypeResponse(type, {\n status,\n description,\n });\n", "import {\n Body,\n PipeTransform,\n Query,\n Type,\n ValidationPipe,\n} from '@nestjs/common';\n\nexport const DataPipe = () =>\n new ValidationPipe({\n transform: true,\n transformOptions: { enableImplicitConversion: true },\n });\n\nconst createDataPipeDec =\n (\n nestFieldDec: (\n ...pipes: (Type<PipeTransform> | PipeTransform)[]\n ) => ParameterDecorator,\n ) =>\n (...extraPipes: (Type<PipeTransform> | PipeTransform)[]) =>\n nestFieldDec(DataPipe(), ...extraPipes);\n\nexport const DataQuery = createDataPipeDec(Query);\nexport const DataBody = createDataPipeDec(Body);\n", "import {\n CanActivate,\n ExecutionContext,\n Inject,\n Injectable,\n UseGuards,\n} from '@nestjs/common';\nimport { ConfigService } from '@nestjs/config';\nimport { ApiHeader } from '@nestjs/swagger';\nimport { BlankReturnMessageDto } from './return-message';\nimport { MergeClassOrMethodDecorators } from './merge';\nimport { ApiError } from './openapi';\nimport {\n ApiFromResolver,\n createResolver,\n ResolverDual,\n ResolverDynamic,\n} from './resolver';\nimport { MetadataSetter, Reflector } from 'typed-reflector';\nimport { ModuleRef } from '@nestjs/core';\n\nexport interface RequireTokenOptions {\n resolver?: ResolverDual;\n tokenSource?: string | ResolverDynamic;\n errorCode?: number;\n}\n\ntype RequireTokenMetadataMap = {\n requireTokenOptions: RequireTokenOptions;\n};\n\nconst reflector = new Reflector<RequireTokenMetadataMap, {}>();\nconst Metadata = new MetadataSetter<RequireTokenMetadataMap, {}>();\n\nconst defaultHeaderName = 'x-server-token';\nconst defaultConfigName = 'SERVER_TOKEN';\nconst defaultErrorCode = 401;\n\n@Injectable()\nexport class TokenGuard implements CanActivate {\n constructor(\n @Inject(ConfigService) private config: ConfigService,\n @Inject(ModuleRef) private moduleRef: ModuleRef,\n ) {}\n\n async canActivate(context: ExecutionContext) {\n const controller = context.getClass();\n const handlerName = context.getHandler()?.name;\n let config = {} as RequireTokenOptions;\n if (controller) {\n if (handlerName) {\n config =\n reflector.get('requireTokenOptions', controller, handlerName) || {};\n } else {\n config = reflector.get('requireTokenOptions', controller) || {};\n }\n }\n const resolver = createResolver(\n config.resolver || { paramType: 'header', paramName: defaultHeaderName },\n );\n const tokenSource = config.tokenSource || defaultConfigName;\n const [tokenFromClient, tokenFromConfig] = await Promise.all([\n resolver(context, this.moduleRef),\n typeof tokenSource === 'function'\n ? tokenSource(context, this.moduleRef)\n : this.config.get<string>(tokenSource),\n ]);\n if (tokenFromConfig && tokenFromConfig !== tokenFromClient) {\n throw new BlankReturnMessageDto(\n config.errorCode || defaultErrorCode,\n 'Unauthorized',\n ).toException();\n }\n return true;\n }\n}\n\nexport const RequireToken = (options: RequireTokenOptions = {}) => {\n const swaggerDec = options.resolver\n ? ApiFromResolver(options.resolver, {\n description: 'Server token',\n required: false,\n })\n : ApiHeader({\n name: defaultHeaderName,\n description: 'Server token',\n required: false,\n });\n return MergeClassOrMethodDecorators([\n UseGuards(TokenGuard),\n swaggerDec,\n ApiError(\n options.errorCode || defaultErrorCode,\n 'Incorrect server token provided',\n ),\n ...(options ? [Metadata.set('requireTokenOptions', options)] : []),\n ]);\n};\n", "import type { Request } from 'express';\nimport { Awaitable } from './utility/awaitable';\nimport { ExecutionContext } from '@nestjs/common';\nimport { ModuleRef } from '@nestjs/core';\nimport {\n ApiHeader,\n ApiHeaderOptions,\n ApiQuery,\n ApiQueryOptions,\n} from '@nestjs/swagger';\n\nexport interface ResolverStatic {\n paramType: 'header' | 'query';\n paramName: string;\n}\n\nexport type ResolverDynamic = (\n ctx: ExecutionContext,\n ref: ModuleRef,\n) => Awaitable<string>;\n\nexport type ResolverDual = ResolverStatic | ResolverDynamic;\n\ntype AnyReq = Request & {\n headers?: Record<string, any>;\n query?: any;\n url?: string;\n originalUrl?: string;\n getHeader?: (name: string) => any;\n get?: (name: string) => any;\n header?: (name: string) => any;\n};\n\nconst coerceToString = (v: any): string | undefined => {\n if (v == null) return undefined; // null / undefined\n if (v === false) return undefined; // \uD83D\uDC48 \u5173\u952E\uFF1A\u628A false \u5F53\u4F5C\u672A\u547D\u4E2D\n if (Array.isArray(v)) return v.length ? coerceToString(v[0]) : undefined;\n if (typeof v === 'string') return v;\n if (typeof v === 'number') return String(v);\n // \u5176\u4ED6\u7C7B\u578B\uFF08true / object / function / symbol / bigint\uFF09\u90FD\u4E0D\u63A5\u53D7\n return undefined;\n};\n\nconst getHeader = (req: AnyReq, name: string): string | undefined => {\n // \u5148\u8D70\u65B9\u6CD5\uFF08express/\u90E8\u5206\u9002\u914D\u5668\uFF09\n const viaMethod =\n (typeof req.getHeader === 'function' && req.getHeader(name)) ||\n (typeof (req as any).header === 'function' && (req as any).header(name)) ||\n (typeof (req as any).get === 'function' && (req as any).get(name));\n\n if (viaMethod) {\n return coerceToString(viaMethod);\n }\n\n // \u518D\u67E5 headers\uFF0C\u5927\u5C0F\u5199\u65E0\u5173\n const n = name.toLowerCase();\n const headers = req.headers ?? {};\n if (n in headers) return coerceToString((headers as any)[n]);\n\n const hit = Object.entries(headers).find(([k]) => k.toLowerCase() === n)?.[1];\n return coerceToString(hit);\n};\n\nconst pickPrimaryFromAcceptLanguage = (v?: string): string | undefined => {\n if (!v) return undefined;\n const first = v.split(',')[0]?.trim();\n return first?.split(';')[0]?.trim() || first;\n};\n\nfunction getQueryValue(req: AnyReq, key: string): string | undefined {\n // 1. \u666E\u901A\u5BF9\u8C61\u6A21\u5F0F\uFF08Express/Fastify \u5DF2\u89E3\u6790\uFF09\n const q = req.query;\n if (q && typeof q === 'object' && !('raw' in q)) {\n const v = (q as any)[key];\n if (v != null) return coerceToString(v);\n }\n\n // 2. fallback\uFF1A\u89E3\u6790 URLSearchParams\n const rawUrl = req.originalUrl ?? req.url;\n if (typeof rawUrl === 'string' && rawUrl.includes('?')) {\n try {\n // \u7528 http://localhost \u5360\u4F4D base\uFF0C\u907F\u514D\u76F8\u5BF9\u8DEF\u5F84\u9519\u8BEF\n const search = rawUrl.startsWith('http')\n ? new URL(rawUrl).search\n : new URL(rawUrl, 'http://localhost').search;\n\n if (search) {\n const params = new URLSearchParams(search);\n const val = params.get(key);\n if (val != null) return val;\n }\n } catch {\n // ignore malformed URL\n }\n }\n return undefined;\n}\n\nexport const createResolver = (_options: ResolverDual): ResolverDynamic => {\n if (typeof _options === 'function') {\n // it's already dynamic\n return _options;\n }\n const options = _options as ResolverStatic;\n const field = options.paramType; // 'header' | 'query'\n let name = options.paramName;\n if (field === 'header') name = name.toLowerCase();\n\n return (ctx) => {\n const req = ctx.switchToHttp().getRequest<AnyReq>();\n\n if (field === 'header') {\n let raw = getHeader(req, name);\n if (name === 'accept-language') raw = pickPrimaryFromAcceptLanguage(raw);\n return raw;\n }\n\n if (field === 'query') {\n return getQueryValue(req, name);\n }\n\n throw new Error(`Unsupported paramType: ${field}`);\n };\n};\n\nexport const ApiFromResolver = (\n _options: ResolverDual,\n extras: ApiHeaderOptions | ApiQueryOptions = {},\n): ClassDecorator & MethodDecorator => {\n if (typeof _options === 'function') {\n // dynamic resolver, no static param info\n return () => {};\n }\n const options = _options as ResolverStatic;\n const paramType = (options as ResolverStatic)?.paramType;\n const apiOptions: ApiHeaderOptions = {\n name: (options as ResolverStatic).paramName,\n ...extras,\n };\n return paramType === 'header'\n ? ApiHeader(apiOptions)\n : paramType === 'query'\n ? ApiQuery({ type: 'string', ...apiOptions })\n : () => {};\n};\n", "import { Observable, takeUntil } from 'rxjs';\nimport { createParamDecorator, ExecutionContext } from '@nestjs/common';\nimport type { Request } from 'express';\nimport { createAbortSignalFromHttp } from './utility/abort-http-signal';\n\nexport type AbortableFn<T> = (ac: AbortController) => Promise<T>;\n\nexport const fromAbortable = <T>(fn: AbortableFn<T>): Observable<T> => {\n return new Observable<T>((subscriber) => {\n const ac = new AbortController();\n\n fn(ac).then(\n (value) => {\n if (!ac.signal.aborted && !subscriber.closed) {\n subscriber.next(value);\n subscriber.complete();\n }\n },\n (err) => {\n if (ac.signal.aborted) {\n if (!subscriber.closed) subscriber.complete();\n return;\n }\n if (!subscriber.closed) subscriber.error(err);\n },\n );\n\n return () => {\n if (!ac.signal.aborted) ac.abort();\n };\n });\n};\n\nexport const takeUntilAbort = <T>(signal: AbortSignal) => {\n return (source: Observable<T>) => {\n return source.pipe(\n takeUntil(\n new Observable<void>((subscriber) => {\n const onAbort = () => subscriber.next();\n if (signal.aborted) {\n subscriber.next();\n } else {\n signal.addEventListener('abort', onAbort, { once: true });\n }\n return () => signal.removeEventListener('abort', onAbort);\n }),\n ),\n );\n };\n};\n\nexport const As = createParamDecorator(\n (_data: unknown, ctx: ExecutionContext) => {\n const req = ctx.switchToHttp().getRequest<Request>();\n return createAbortSignalFromHttp(req);\n },\n);\n", "// abort-http-signal.ts\nimport type { IncomingMessage } from 'http';\nimport type { Request as ExpressReq } from 'express';\nimport type { FastifyRequest } from 'fastify';\nimport { BlankReturnMessageDto } from '../return-message';\n\ntype AnyReq = ExpressReq | FastifyRequest | IncomingMessage;\n\nfunction toRawReq(req: AnyReq): IncomingMessage {\n // Fastify: req.raw \u662F IncomingMessage\uFF1BExpress: req \u672C\u8EAB\u5C31\u662F IncomingMessage\n if ((req as any)?.raw?.socket) return (req as any).raw as IncomingMessage;\n return req as IncomingMessage;\n}\n\n/**\n * \u4EC5\u901A\u8FC7 req \u81EA\u52A8\u9002\u914D Express/Fastify\uFF0C\u7ED1\u5B9A HTTP \u53D6\u6D88\u5230 AbortSignal\u3002\n * - \u4F18\u5148\u76D1\u542C 'aborted'\uFF08\u5BA2\u6237\u7AEF\u4E2D\u65AD\u6700\u53EF\u9760\u7684\u4FE1\u53F7\uFF09\n * - \u53EF\u9009\u515C\u5E95\uFF1A\u5728 socket 'close' \u65F6\uFF0C\u4EC5\u5F53\u8BF7\u6C42\u672A\u5B8C\u6574\u63A5\u6536/\u6216\u5DF2\u6807\u8BB0 aborted \u65F6\uFF0C\u624D\u89E6\u53D1 abort\uFF0C\u907F\u514D\u6B63\u5E38\u5B8C\u6210\u7684\u8BEF\u4F24\n * - reason \u56FA\u5B9A\u4E3A 499 HttpException\n *\n * \u6CE8\u610F\uFF1A\u82E5\u4F60\u7684 abortable() \u5728 signal.reason \u662F Error \u65F6\u4F1A\u201C\u539F\u6837 throw reason\u201D\uFF0C\n * \u90A3\u4E48\u4E0A\u5C42\u4F1A\u6536\u5230 HttpException(499)\u3002\u82E5\u4ECD\u60F3\u7EDF\u4E00\u629B AbortedError\uFF0C\u53EF\u6539\u4E3A\uFF1A\n * const reason = new AbortedError('Request aborted', httpErr);\n * \u5E76\u8BA9 throwIfAborted \u5148\u629B AbortedError\uFF08\u4FDD\u7559 cause\uFF09\u3002\n */\nexport function createAbortSignalFromHttp(req: AnyReq): AbortSignal {\n const rawReq = toRawReq(req);\n const ac = new AbortController();\n\n const makeReason = () =>\n new BlankReturnMessageDto(499, 'Request aborted').toException();\n\n const abortOnce = () => {\n if (!ac.signal.aborted) ac.abort(makeReason());\n cleanup();\n };\n\n const onClose = () => {\n abortOnce();\n };\n\n const cleanup = () => {\n rawReq.off?.('close', onClose);\n };\n\n rawReq.once?.('close', onClose);\n\n return ac.signal;\n}\n", "import { Inject, Scope } from '@nestjs/common';\nimport { abortable, AbortableOpts } from 'nfkit';\nimport { ABORT_SIGNAL } from './abort-signal.provider';\nimport { ContextIdFactory, ModuleRef, REQUEST } from '@nestjs/core';\nimport { createProvider } from '../create-provider';\nimport { InjectionToken } from '@nestjs/common/interfaces/modules/injection-token.interface';\n\nconst tokenMemo = new Map<any, symbol>();\nexport const abortableToken = (token: InjectionToken) => {\n if (tokenMemo.has(token)) return tokenMemo.get(token)!;\n const name = typeof token === 'function' ? token.name : String(token);\n const sym = Symbol.for(`Abortable(${name})`);\n tokenMemo.set(token, sym);\n return sym;\n};\n\n/**\n * \u652F\u6301\u4E24\u79CD\u7528\u6CD5\uFF1A\n * @InjectAbortable(SomeService)\n * @InjectAbortable() // \u81EA\u52A8\u63A8\u65AD\u7C7B\u578B\n */\nexport function InjectAbortable(token?: InjectionToken): ParameterDecorator {\n return (target, propertyKey, parameterIndex) => {\n let actualToken = token;\n\n if (!actualToken) {\n // \u5229\u7528 reflect-metadata \u83B7\u53D6\u53C2\u6570\u7C7B\u578B\n const paramTypes: any[] =\n Reflect.getMetadata('design:paramtypes', target, propertyKey) || [];\n actualToken = paramTypes[parameterIndex];\n if (!actualToken) {\n throw new Error(\n `@InjectAbortable() cannot infer type from metadata: ${target.constructor?.name}[${parameterIndex}]`,\n );\n }\n }\n\n Inject(abortableToken(actualToken))(target, propertyKey, parameterIndex);\n };\n}\n\nexport function createAbortableProvider<T>(\n token: InjectionToken<T>,\n opts?: AbortableOpts,\n) {\n const provide = abortableToken(token);\n\n return createProvider(\n {\n provide,\n scope: Scope.REQUEST,\n inject: [ModuleRef, REQUEST, ABORT_SIGNAL],\n },\n async (moduleRef, req: Request, signal) => {\n // \u8BA9\u89E3\u6790\u4E0E\u5F53\u524D\u8BF7\u6C42\u4E0A\u4E0B\u6587\u7ED1\u5B9A\uFF08\u652F\u6301 request/transient \u4F5C\u7528\u57DF\uFF09\n const ctxId = ContextIdFactory.getByRequest(req);\n // \u4E25\u683C\u6A21\u5F0F\u5173\u95ED\uFF0C\u5141\u8BB8\u8DE8\u6A21\u5757\u8FB9\u754C\u89E3\u6790\uFF08\u89E3\u51B3\u6D4B\u8BD5\u91CC forFeature \u5B50\u6A21\u5757\u770B\u4E0D\u5230 DemoService \u7684\u60C5\u51B5\uFF09\n const svc = await moduleRef.resolve<T>(token, ctxId, { strict: false });\n if (svc == null) {\n throw new Error(\n `Abortable: provider \"${String(\n (token as any).name ?? token,\n )}\" not found in container (even with strict:false)`,\n );\n }\n return abortable<T>(svc, signal, opts);\n },\n );\n}\n", "import { Inject, Scope, Type } from '@nestjs/common';\nimport { REQUEST } from '@nestjs/core';\nimport { createAbortSignalFromHttp } from '../utility/abort-http-signal';\nimport { createProvider } from '../create-provider';\n\nexport const ABORT_SIGNAL = Symbol(\n 'ABORT_SIGNAL',\n) as unknown as Type<AbortSignal>;\nexport const AbortSignalProvider = createProvider(\n {\n provide: ABORT_SIGNAL,\n scope: Scope.REQUEST,\n inject: [REQUEST],\n },\n createAbortSignalFromHttp,\n);\n\nexport const InjectAbortSignal = () => Inject(ABORT_SIGNAL);\n", "import { FactoryProvider } from '@nestjs/common';\nimport { InjectionToken } from '@nestjs/common/interfaces/modules/injection-token.interface';\n\ntype TypeFromToken<T> = T extends string | symbol\n ? any\n : T extends InjectionToken<infer U>\n ? U\n : any;\n\ntype TokensToTypes<A extends InjectionToken[]> = A extends []\n ? []\n : A extends [infer F, ...infer R]\n ? [TypeFromToken<F>, ...TokensToTypes<R extends InjectionToken[] ? R : []>]\n : [];\n\ntype Awaitable<T> = T | Promise<T>;\n\nexport interface TypedFactoryProvider<A extends InjectionToken[], R>\n extends FactoryProvider<R> {\n inject: A;\n useFactory: (...args: TokensToTypes<A>) => Awaitable<R>;\n}\n\nexport const createProvider = <const A extends InjectionToken[], R>(\n options: { inject: A } & Omit<FactoryProvider<R>, 'inject' | 'useFactory'>,\n factory: (...args: TokensToTypes<A>) => Awaitable<R>,\n): TypedFactoryProvider<A, R> => {\n return {\n useFactory: factory,\n ...options,\n };\n};\n", "import { DynamicModule, Module } from '@nestjs/common';\nimport { createAbortableProvider } from './abortable.token';\nimport { AbortableOpts } from 'nfkit';\nimport { AbortSignalProvider } from './abort-signal.provider';\nimport { InjectionToken } from '@nestjs/common/interfaces/modules/injection-token.interface';\n\nexport interface AbortableModuleOptions {\n abortableOptions?: AbortableOpts;\n}\n\n@Module({})\nexport class AbortableModule {\n static forRoot(): DynamicModule {\n return {\n module: AbortableModule,\n providers: [AbortSignalProvider],\n exports: [AbortSignalProvider],\n global: true,\n };\n }\n\n static forFeature(\n tokens: InjectionToken[],\n options?: AbortableModuleOptions,\n ): DynamicModule {\n const providers = tokens.map((token) =>\n createAbortableProvider(token, options?.abortableOptions),\n );\n\n return {\n module: AbortableModule,\n providers: [...providers],\n exports: [...providers],\n };\n }\n}\n", "import {\n ConsoleLogger,\n ExecutionContext,\n HttpException,\n Inject,\n Injectable,\n} from '@nestjs/common';\nimport { I18nModuleOptionsToken } from './i18n-token';\nimport { I18nModuleOptions } from './i18n-module.options';\nimport { I18nMiddleware } from './i18n-middleware.type';\nimport { parseI18n } from '../utility/parse-i18n';\nimport { ModuleRef } from '@nestjs/core';\nimport { createResolver } from '../resolver';\n\n@Injectable()\nexport class I18nService {\n constructor(\n @Inject(I18nModuleOptionsToken) private options: I18nModuleOptions,\n @Inject(ModuleRef) private moduleRef: ModuleRef,\n ) {}\n\n private resolver = createResolver(this.options.resolver);\n\n private locales = new Set(this.options.locales);\n private defaultLocale = this.options.defaultLocale ?? this.options.locales[0];\n\n private middlewares: I18nMiddleware[] = [];\n\n middleware(mw: I18nMiddleware, prior = false) {\n if (prior) {\n this.middlewares.unshift(mw);\n } else {\n this.middlewares.push(mw);\n }\n }\n\n private logger = new ConsoleLogger('I18nService');\n\n private buildFallbackChain(locale: string): string[] {\n const best = this.getExactLocale(locale); // \u4F60\u7684\u201C\u6700\u957F\u5339\u914D\u201D\u51FD\u6570\n // \u62C6\u5206 zh-Hans-CN -> ['zh-Hans-CN','zh-Hans','zh']\n const parts: string[] = [];\n const segs = best.split('-');\n for (let i = segs.length; i > 1; i--)\n parts.push(segs.slice(0, i).join('-'));\n parts.push(segs[0]); // 'zh'\n // \u9644\u52A0\u9ED8\u8BA4\u8BED\u8A00\n if (!parts.includes(this.defaultLocale)) parts.push(this.defaultLocale);\n // \u53BB\u91CD\n return Array.from(new Set(parts)).filter((p) => this.locales.has(p));\n }\n\n private async applyMiddlewares(\n locale: string,\n text: string,\n ctx?: ExecutionContext,\n ): Promise<string | undefined> {\n const mws = this.middlewares;\n\n const tryLocale = async (loc: string) => {\n const dispatch = async (i: number): Promise<string | undefined> => {\n if (i >= mws.length) return undefined;\n\n const mw = mws[i];\n let nextCalled = false;\n\n const next = async (): Promise<string | undefined> => {\n nextCalled = true;\n return dispatch(i + 1);\n };\n\n try {\n const res = await mw(loc, text, next, ctx as any);\n if (res == null && !nextCalled) {\n return dispatch(i + 1);\n }\n return res;\n } catch (e) {\n if (e instanceof HttpException) {\n // this HttpException should throw up directly\n throw e;\n }\n this.logger.warn(`Middleware at index ${i} threw an error: ${e}`);\n return dispatch(i + 1);\n }\n };\n return dispatch(0);\n };\n\n for (const loc of this.buildFallbackChain(locale)) {\n const result = await tryLocale(loc);\n if (result != null) {\n return result;\n }\n }\n return undefined;\n }\n\n getExactLocale(locale: string) {\n const input = (locale ?? '').trim();\n if (!input) return this.defaultLocale;\n\n if (this.locales.has(input)) return input;\n\n // \u5C0F\u5199\u5316\u6BD4\u8F83\uFF0C\u4FDD\u7559\u539F\u5927\u5C0F\u5199\n const entries = Array.from(this.locales).map((l) => ({\n orig: l,\n lower: l.toLowerCase(),\n }));\n const lower = input.toLowerCase();\n\n // 1) \u7CBE\u786E\u5339\u914D\uFF08\u5927\u5C0F\u5199\u4E0D\u654F\u611F\uFF09\n const exact = entries.find((e) => e.lower === lower);\n if (exact) return exact.orig;\n\n // 2) \u6309 '-' \u62C6\u5206\uFF0C\u4F9D\u6B21\u5C1D\u8BD5\u53BB\u6389\u6700\u53F3\u8FB9\u7684\u6BB5\n // zh-Hans-CN \u2192 zh-Hans \u2192 zh\n const parts = lower.split('-');\n while (parts.length > 1) {\n parts.pop();\n const candidate = parts.join('-');\n const hit = entries.find((e) => e.lower === candidate);\n if (hit) return hit.orig;\n }\n\n // 3) \u515C\u5E95\n return this.defaultLocale;\n }\n\n async getExactLocaleFromRequest(ctx: ExecutionContext) {\n const locale = await this.resolver(ctx, this.moduleRef);\n return this.getExactLocale(locale);\n }\n\n async translateString(\n locale: string,\n text: string,\n ctx?: ExecutionContext,\n ): Promise<string> {\n if (!text) return text;\n\n locale = this.getExactLocale(locale);\n\n const pieces = parseI18n(text);\n if (!pieces.some((p) => p.type === 'ph')) {\n return pieces\n .map((p) => (p.type === 'raw' ? p.value : `#{${p.rawInner}}`))\n .join('');\n }\n\n const promises: Array<Promise<string | undefined | null>> = [];\n\n for (const p of pieces) {\n if (p.type === 'ph') {\n promises.push(this.applyMiddlewares(locale, p.key, ctx));\n }\n }\n\n const results = await Promise.all(promises);\n\n let out = '';\n let k = 0;\n for (const p of pieces) {\n if (p.type === 'raw') {\n out += p.value;\n } else {\n const r = results[k++];\n out += r == null ? `#{${p.rawInner}}` : r;\n }\n }\n return out;\n }\n\n async translate<T>(\n locale: string,\n obj: T,\n ctx?: ExecutionContext,\n ): Promise<T> {\n const visited = new WeakSet<object>();\n\n const isBuiltInObject = (v: any): boolean => {\n if (v == null || typeof v !== 'object') return false;\n if (\n v instanceof Date ||\n v instanceof RegExp ||\n v instanceof Map ||\n v instanceof Set ||\n v instanceof WeakMap ||\n v instanceof WeakSet ||\n v instanceof ArrayBuffer ||\n v instanceof DataView ||\n ArrayBuffer.isView(v) // TypedArray / Buffer\n )\n return true;\n\n const tag = Object.prototype.toString.call(v);\n switch (tag) {\n case '[object URL]':\n case '[object URLSearchParams]':\n case '[object Error]':\n case '[object Blob]':\n case '[object File]':\n case '[object FormData]':\n return true;\n default:\n return false;\n }\n };\n\n const translateObjectPreservingProto = async (value: any): Promise<any> => {\n const proto = Object.getPrototypeOf(value);\n const out = Object.create(proto);\n\n const keys = Reflect.ownKeys(value);\n\n await Promise.all(\n keys.map(async (key) => {\n const desc = Object.getOwnPropertyDescriptor(value, key as any);\n if (!desc) return;\n\n // \u6570\u636E\u5C5E\u6027\uFF1A\u5E76\u53D1\u9012\u5F52\u5176 value\uFF0C\u4FDD\u6301\u539F\u5C5E\u6027\u7279\u6027\n if ('value' in desc) {\n const newVal = await visit(desc.value);\n Object.defineProperty(out, key, { ...desc, value: newVal });\n return;\n }\n\n // \u8BBF\u95EE\u5668\u5C5E\u6027\uFF1A\u5148\u590D\u5236 getter/setter\uFF0C\u518D\u5C1D\u8BD5\u8BFB\u503C\u2192\u7FFB\u8BD1\u2192\u5199\u56DE\n Object.defineProperty(out, key, desc);\n\n // \u6CA1\u6709 getter \u5C31\u65E0\u9700\u5904\u7406\uFF1B\u6709 getter \u4F46\u629B\u9519\u4E5F\u5FFD\u7565\n let current: any = undefined;\n if (typeof desc.get === 'function') {\n try {\n current = desc.get.call(value);\n } catch {\n /* ignore */\n }\n }\n if (current === undefined) return;\n\n // \u9012\u5F52\u7FFB\u8BD1 getter \u8FD4\u56DE\u7684\u503C\uFF1B\u82E5\u6709 setter \u5219\u5199\u56DE\n try {\n const newVal = await visit(current);\n if (typeof desc.set === 'function') {\n try {\n desc.set.call(out, newVal);\n } catch {\n /* ignore */\n }\n }\n } catch {\n // \u7FFB\u8BD1\u5931\u8D25\u4E0D\u5F71\u54CD\u5176\u4ED6\u952E\n }\n }),\n );\n\n return out;\n };\n\n const isTranslatable = (\n v: any,\n ): { ok: false } | { ok: true; kind: 'string' | 'object' } => {\n // 1) \u6240\u6709 falsy \u539F\u6837\uFF08null/undefined/false/0/''/NaN\uFF09\n if (!v) return { ok: false };\n\n // 2) \u57FA\u672C\u7C7B\u578B\u8FC7\u6EE4\n const t = typeof v;\n if (\n t === 'number' ||\n t === 'bigint' ||\n t === 'symbol' ||\n t === 'function'\n ) {\n return { ok: false };\n }\n\n // 3) \u53EF\u7FFB\u8BD1\uFF1A\u5B57\u7B26\u4E32 or \u5BF9\u8C61\uFF08\u5BF9\u8C61\u518D\u7531\u540E\u7EED\u903B\u8F91\u51B3\u5B9A\u662F\u5426\u6DF1\u5165\uFF09\n if (t === 'string') return { ok: true, kind: 'string' };\n if (t === 'object') {\n return { ok: true, kind: 'object' };\n }\n\n // \u5176\u5B83\uFF08boolean \u7B49\u5DF2\u5305\u542B\u5728 falsy/\u57FA\u672C\u7C7B\u578B\u91CC\uFF09\n return { ok: false };\n };\n\n const visit = async (value: any): Promise<any> => {\n // 1) \u68C0\u67E5\u662F\u5426\u53EF\u7FFB\u8BD1\n const check = isTranslatable(value);\n\n // 2) \u4E0D\u53EF\u7FFB\u8BD1\u7684\u539F\u6837\u8FD4\u56DE\n if (!check.ok) {\n return value;\n }\n\n if (check.kind === 'string') {\n // 3) \u5B57\u7B26\u4E32\uFF1A\u7FFB\u8BD1\n return this.translateString(locale, value, ctx);\n }\n\n // 4) Promise\uFF1A\u4E0D\u9690\u5F0F\u5C55\u5F00\uFF08\u4FDD\u6301\u8BED\u4E49\uFF09\n if (value instanceof Promise) {\n return value.then((resolved) => visit(resolved));\n }\n\n // 5) \u5BF9\u8C61\u7C7B\uFF1A\u8FC7\u6EE4\u5185\u7F6E\u5BF9\u8C61\n if (typeof value === 'object') {\n if (!Array.isArray(value) && isBuiltInObject(value)) return value;\n\n // \u9632\u73AF\n if (visited.has(value)) return value;\n visited.add(value);\n\n // \u6570\u7EC4\uFF1A\u5143\u7D20\u7EA7\u9012\u5F52\n if (Array.isArray(value)) {\n const out = await Promise.all(value.map((v) => visit(v)));\n return out as any;\n }\n\n // \u5176\u4ED6\u5BF9\u8C61\uFF08\u542B\u7C7B\u5B9E\u4F8B/DTO\uFF09\uFF1A\u4FDD\u7559\u539F\u578B\u5E76\u9012\u5F52\u81EA\u6709\u5C5E\u6027\n return translateObjectPreservingProto(value);\n }\n\n // \u5176\u4F59\u7C7B\u578B\uFF08boolean \u7B49\uFF09\u539F\u6837\u8FD4\u56DE\n return value;\n };\n\n return visit(obj);\n }\n\n async translateRequest(ctx: ExecutionContext, obj: any): Promise<any> {\n const locale = await this.resolver(ctx, this.moduleRef);\n return this.translate(locale, obj, ctx);\n }\n}\n", "import { ConfigurableModuleBuilder } from '@nestjs/common';\nimport { I18nModuleOptions } from './i18n-module.options';\n\nexport const I18nResolverToken = Symbol('I18nResolverToken');\n\nconst { ConfigurableModuleClass, MODULE_OPTIONS_TOKEN } =\n new ConfigurableModuleBuilder<I18nModuleOptions>()\n // .setExtras({}, (def) => ({ ...def, global: true }))\n .build();\nexport const I18nModuleOptionsToken = MODULE_OPTIONS_TOKEN;\nexport { ConfigurableModuleClass as I18nModuleBase };\n", "// \u2014\u2014 \u89E3\u6790\u7ED3\u679C\u7ED3\u6784 \u2014\u2014 //\nexport type I18nPiece =\n | { type: 'raw'; value: string }\n | { type: 'ph'; rawInner: string; key: string };\n\n/**\n * \u6808\u5F0F\u89E3\u6790 #{ ... } \u5360\u4F4D\u3002\u652F\u6301\u5185\u90E8\u6210\u5BF9\u82B1\u62EC\u53F7\uFF0C\u5982 #{ foo {{ bar }} }\u3002\n * - \u672A\u95ED\u5408\u65F6\uFF1A\u628A\u4ECE\u4E0A\u6B21\u4F4D\u7F6E i \u5230\u7ED3\u5C3E\u6574\u4F53\u4F5C\u4E3A raw \u653E\u56DE\uFF08\u907F\u514D\u88AB\u62C6\u6210\u4E24\u6BB5\uFF09\n * - key = trim(rawInner)\n */\nexport const parseI18n = (text: string): I18nPiece[] => {\n const pieces: I18nPiece[] = [];\n if (!text) return pieces;\n\n let i = 0;\n const n = text.length;\n\n while (i < n) {\n const start = text.indexOf('#{', i);\n if (start === -1) {\n // \u6CA1\u6709\u66F4\u591A\u5360\u4F4D\u7B26\n if (i < n) pieces.push({ type: 'raw', value: text.slice(i) });\n break;\n }\n\n // \u5148\u5C1D\u8BD5\u5339\u914D\u8FD9\u4E2A\u5360\u4F4D\u7B26\u662F\u5426\u95ED\u5408\uFF08\u6B64\u65F6\u4E0D\u7ACB\u5373\u63A8\u5165\u524D\u5BFC raw\uFF09\n let j = start + 2; // \u6307\u5411 '#{' \u540E\u7B2C\u4E00\u4E2A\u5B57\u7B26\n let depth = 1;\n while (j < n && depth > 0) {\n const ch = text.charCodeAt(j);\n if (ch === 123 /* '{' */) depth++;\n else if (ch === 125 /* '}' */) depth--;\n j++;\n }\n\n if (depth !== 0) {\n // \u672A\u95ED\u5408\uFF1A\u628A\u4ECE i \u5230\u672B\u5C3E\u6574\u4F53\u5F53\u4F5C raw\uFF08\u5305\u542B\u524D\u5BFC + '#{' \u5C3E\u5DF4\uFF09\n pieces.push({ type: 'raw', value: text.slice(i) });\n break;\n }\n\n // \u5230\u8FD9\u91CC\u8BF4\u660E\u5360\u4F4D\u95ED\u5408\uFF1A\u5148\u63A8\u5165\u524D\u5BFC raw\uFF0C\u518D\u63A8\u5360\u4F4D\u7247\u6BB5\n if (start > i) {\n pieces.push({ type: 'raw', value: text.slice(i, start) });\n }\n\n const rawInner = text.slice(start + 2, j - 1);\n const key = rawInner.trim();\n pieces.push({ type: 'ph', rawInner, key });\n\n i = j; // \u7EE7\u7EED\u5411\u540E\u626B\u63CF\n }\n\n return pieces;\n};\n", "import { Global, Module } from '@nestjs/common';\nimport { I18nModuleBase } from './i18n-token';\nimport { I18nService } from './i18n.service';\nimport { LocalePipe } from './locale.pipe';\n\n@Global()\n@Module({\n providers: [I18nService, LocalePipe],\n exports: [I18nService, LocalePipe],\n})\nexport class I18nModule extends I18nModuleBase {}\n", "import {\n ArgumentMetadata,\n createParamDecorator,\n ExecutionContext,\n Inject,\n Injectable,\n PipeTransform,\n} from '@nestjs/common';\nimport { I18nService } from './i18n.service';\nimport { createResolver, ResolverDual } from '../resolver';\nimport { ModuleRef } from '@nestjs/core';\n\ntype LocaleContext = {\n ctx: ExecutionContext;\n resolver?: ResolverDual;\n};\n\n@Injectable()\nexport class LocalePipe implements PipeTransform {\n constructor(\n @Inject(I18nService) private i18nService: I18nService,\n @Inject(ModuleRef) private moduleRef: ModuleRef,\n ) {}\n\n async transform(ctx: LocaleContext, metadata: ArgumentMetadata) {\n const resolver = ctx.resolver;\n if (resolver) {\n const _resolver = createResolver(resolver);\n const locale = await _resolver(ctx.ctx, this.moduleRef);\n return this.i18nService.getExactLocale(locale);\n } else {\n return this.i18nService.getExactLocaleFromRequest(ctx.ctx);\n }\n }\n}\n\nconst _dec = createParamDecorator((resolver: ResolverDual | undefined, ctx) => {\n return { ctx, resolver };\n});\n\nexport const PutLocale = (resolver?: ResolverDual) =>\n _dec(resolver, LocalePipe);\n", "import { I18nModuleOptions } from './i18n-module.options';\nimport { ApiFromResolver } from '../resolver';\nimport { MergeClassOrMethodDecorators } from '../merge';\nimport { UseInterceptors } from '@nestjs/common';\nimport { I18nInterceptor } from './i18n.interceptor';\n\nexport const createI18nDecorator = (options: I18nModuleOptions) => {\n return () =>\n MergeClassOrMethodDecorators([\n UseInterceptors(I18nInterceptor),\n ApiFromResolver(options.resolver, {\n description: 'Locale for internationalization',\n required: false,\n default: options.defaultLocale ?? options.locales[0],\n enum: options.locales,\n }),\n ]);\n};\n", "import {\n CallHandler,\n ExecutionContext,\n HttpException,\n Inject,\n Injectable,\n NestInterceptor,\n} from '@nestjs/common';\nimport { from, throwError } from 'rxjs';\nimport { catchError, mergeMap } from 'rxjs/operators';\nimport { I18nService } from './i18n.service';\n\n@Injectable()\nexport class I18nInterceptor implements NestInterceptor {\n constructor(@Inject(I18nService) private readonly i18nService: I18nService) {}\n\n intercept(context: ExecutionContext, next: CallHandler) {\n return next.handle().pipe(\n // \u6210\u529F\u8DEF\u5F84\uFF1A\u628A\u54CD\u5E94\u4F53\u4EA4\u7ED9 i18n \u505A\u5F02\u6B65\u7FFB\u8BD1\n mergeMap((data) => this.i18nService.translateRequest(context, data)),\n // \u9519\u8BEF\u8DEF\u5F84\uFF1A\u82E5\u662F HttpException\uFF0C\u628A\u5176 response \u7FFB\u8BD1\u540E\u518D\u629B\n catchError((err) => {\n if (err instanceof HttpException) {\n const status = err.getStatus();\n const resp = err.getResponse();\n return from(this.i18nService.translateRequest(context, resp)).pipe(\n mergeMap((translated) =>\n throwError(\n () => new HttpException(translated, status, { cause: err }),\n ),\n ),\n );\n }\n return throwError(() => err);\n }),\n );\n }\n}\n", "import { I18nModuleOptions } from './i18n-module.options';\nimport { createI18nDecorator } from './i18n-decorator';\nimport { I18nModule } from './i18n.module';\nimport { ResolverDual } from '../resolver';\n\nexport const createI18n = (\n options: Omit<I18nModuleOptions, 'resolver'> & { resolver?: ResolverDual },\n) => {\n if (!options.resolver) {\n options.resolver = {\n paramType: 'header',\n paramName: 'x-client-language',\n };\n }\n return {\n UseI18n: createI18nDecorator(options as I18nModuleOptions),\n I18nModule: I18nModule.register(options as I18nModuleOptions),\n };\n};\n", "import { I18nMiddleware } from '../i18n-middleware.type';\nimport { Awaitable } from '../../utility/awaitable';\nimport { ExecutionContext } from '@nestjs/common';\n\nexport type I18nDictionary = Record<string, Record<string, string>>;\n\ntype MatchType = 'exact' | 'hierarchy' | 'startsWith';\n\nexport const I18nLookupMiddleware = (\n dict:\n | I18nDictionary\n | ((\n locale: string,\n key: string,\n ctx?: ExecutionContext,\n ) => Awaitable<I18nDictionary>),\n options?: { matchType?: MatchType },\n): I18nMiddleware => {\n const matchType: MatchType = options?.matchType ?? 'exact';\n const dictFactory = typeof dict === 'function' ? dict : () => dict;\n\n // \u57FA\u4E8E locales \u5217\u8868\u505A\u201C\u7CBE\u786E\u2192\u5C42\u7EA7\u56DE\u9000(zh-Hans-CN\u2192zh-Hans\u2192zh)\u201D\u7684\u6700\u957F\u5339\u914D\n const pickBestByHierarchy = (\n input: string,\n locales: string[],\n ): string | undefined => {\n if (!input) return undefined;\n const entries = locales.map((l) => ({ orig: l, lower: l.toLowerCase() }));\n const lower = input.toLowerCase();\n\n // \u7CBE\u786E\u5339\u914D\uFF08\u5927\u5C0F\u5199\u4E0D\u654F\u611F\uFF09\n const exact = entries.find((e) => e.lower === lower);\n if (exact) return exact.orig;\n\n // \u9010\u7EA7\u56DE\u9000\uFF1Azh-Hans-CN -> zh-Hans -> zh\n const parts = lower.split('-');\n while (parts.length > 1) {\n parts.pop();\n const candidate = parts.join('-');\n const hit = entries.find((e) => e.lower === candidate);\n if (hit) return hit.orig;\n }\n return undefined;\n };\n\n return async (locale, key, next, ctx) => {\n const dictResolved = await dictFactory(locale, key, ctx);\n\n let dictionary = dictResolved[locale];\n\n if (!dictionary) {\n if (matchType === 'hierarchy') {\n const best = pickBestByHierarchy(locale, Object.keys(dictResolved));\n if (best) dictionary = dictResolved[best];\n } else if (matchType === 'startsWith') {\n const keys = Object.keys(dictResolved).filter((k) =>\n locale.startsWith(k),\n );\n if (keys.length) {\n const best = keys.reduce((a, b) => (b.length > a.length ? b : a));\n dictionary = dictResolved[best];\n }\n }\n }\n\n // \u547D\u4E2D\u5224\u65AD\uFF1A\u5141\u8BB8\u7A7A\u5B57\u7B26\u4E32 ''\uFF1B\u4EC5 null/undefined \u89C6\u4E3A\u672A\u547D\u4E2D\n if (dictionary && Object.prototype.hasOwnProperty.call(dictionary, key)) {\n const val = dictionary[key];\n if (val != null) {\n return val;\n }\n }\n\n return next();\n };\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_swagger", "import_swagger", "import_common", "import_common", "import_swagger", "import_swagger", "import_common", "import_common", "import_common", "import_core", "import_core", "import_common", "import_common", "import_common", "import_core", "import_common", "import_common", "import_core", "import_common", "import_common", "import_rxjs"]
|
|
7
7
|
}
|
package/dist/index.mjs
CHANGED
|
@@ -814,15 +814,17 @@ import {
|
|
|
814
814
|
Inject as Inject5,
|
|
815
815
|
Injectable as Injectable3
|
|
816
816
|
} from "@nestjs/common";
|
|
817
|
+
import { ModuleRef as ModuleRef4 } from "@nestjs/core";
|
|
817
818
|
var LocalePipe = class {
|
|
818
|
-
constructor(i18nService) {
|
|
819
|
+
constructor(i18nService, moduleRef) {
|
|
819
820
|
this.i18nService = i18nService;
|
|
821
|
+
this.moduleRef = moduleRef;
|
|
820
822
|
}
|
|
821
823
|
async transform(ctx, metadata) {
|
|
822
824
|
const resolver = ctx.resolver;
|
|
823
825
|
if (resolver) {
|
|
824
826
|
const _resolver = createResolver(resolver);
|
|
825
|
-
const locale = await _resolver(ctx.ctx,
|
|
827
|
+
const locale = await _resolver(ctx.ctx, this.moduleRef);
|
|
826
828
|
return this.i18nService.getExactLocale(locale);
|
|
827
829
|
} else {
|
|
828
830
|
return this.i18nService.getExactLocaleFromRequest(ctx.ctx);
|
|
@@ -831,7 +833,8 @@ var LocalePipe = class {
|
|
|
831
833
|
};
|
|
832
834
|
LocalePipe = __decorateClass([
|
|
833
835
|
Injectable3(),
|
|
834
|
-
__decorateParam(0, Inject5(I18nService))
|
|
836
|
+
__decorateParam(0, Inject5(I18nService)),
|
|
837
|
+
__decorateParam(1, Inject5(ModuleRef4))
|
|
835
838
|
], LocalePipe);
|
|
836
839
|
var _dec = createParamDecorator2((resolver, ctx) => {
|
|
837
840
|
return { ctx, resolver };
|
package/dist/index.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/insert-field.ts", "../src/merge.ts", "../src/return-message.ts", "../src/openapi.ts", "../src/pipe.ts", "../src/token.guard.ts", "../src/resolver.ts", "../src/abort-utils.ts", "../src/utility/abort-http-signal.ts", "../src/abortable-module/abortable.token.ts", "../src/abortable-module/abort-signal.provider.ts", "../src/create-provider.ts", "../src/abortable-module/abortable.module.ts", "../src/i18n-module/i18n.service.ts", "../src/i18n-module/i18n-token.ts", "../src/utility/parse-i18n.ts", "../src/i18n-module/i18n.module.ts", "../src/i18n-module/locale.pipe.ts", "../src/i18n-module/i18n-decorator.ts", "../src/i18n-module/i18n.interceptor.ts", "../src/i18n-module/i18n-factory.ts", "../src/i18n-module/middlewares/lookup.ts"],
|
|
4
|
-
"sourcesContent": ["import { ApiProperty, ApiPropertyOptions } from '@nestjs/swagger';\n\nexport type AnyClass = new (...args: any[]) => any;\nexport type ClassOrArray = AnyClass | [AnyClass];\nexport type ClassType<T> = new (...args: any[]) => T;\nexport type TypeFromClass<T> = T extends new (...args: any[]) => infer U\n ? U\n : never;\nexport type ParamsFromClass<T> = T extends new (...args: infer U) => any\n ? U\n : never;\nexport type ParseType<IC extends ClassOrArray> = IC extends [infer U]\n ? TypeFromClass<U>[]\n : TypeFromClass<IC>;\n\nexport function getClassFromClassOrArray(o: ClassOrArray) {\n return o instanceof Array ? o[0] : o;\n}\n\nexport interface InsertOptions<C extends ClassOrArray = ClassOrArray> {\n type: C;\n options?: ApiPropertyOptions;\n}\n\ntype TypeFromInsertOptions<O extends InsertOptions> =\n O extends InsertOptions<infer C>\n ?\n | ParseType<C>\n | (O extends { options: { required: true } } ? never : undefined)\n : never;\n\ntype Merge<T, U> = {\n [K in keyof T | keyof U]: K extends keyof T\n ? T[K]\n : K extends keyof U\n ? U[K]\n : never;\n};\n\nexport function InsertField<\n C extends AnyClass,\n M extends Record<string, InsertOptions>,\n>(\n cl: C,\n map: M,\n newName?: string,\n): new (...args: ParamsFromClass<C>) => Merge<\n {\n [F in keyof M]: TypeFromInsertOptions<M[F]>;\n },\n TypeFromClass<C>\n> {\n const extendedCl = class extends cl {};\n for (const key in map) {\n ApiProperty({\n type: map[key].type,\n ...(map[key].options || {}),\n })(extendedCl.prototype, key);\n }\n Object.defineProperty(extendedCl, 'name', {\n value: newName || cl.name,\n });\n return extendedCl;\n}\n", "export function MergePropertyDecorators(\n decs: PropertyDecorator[],\n): PropertyDecorator {\n return (obj, key) => {\n for (const dec of decs) {\n dec(obj, key);\n }\n };\n}\n\nexport function MergeMethodDecorators(\n decs: MethodDecorator[],\n): MethodDecorator {\n return (obj, key, descriptor) => {\n for (const dec of decs) {\n dec(obj, key, descriptor);\n }\n };\n}\n\nexport function MergeClassDecorators(decs: ClassDecorator[]): ClassDecorator {\n return (obj) => {\n for (const dec of decs) {\n dec(obj);\n }\n };\n}\n\nexport function MergeParameterDecorators(\n decs: ParameterDecorator[],\n): ParameterDecorator {\n return (obj, key, index) => {\n for (const dec of decs) {\n dec(obj, key, index);\n }\n };\n}\n\nexport function MergeClassOrMethodDecorators(\n decs: (ClassDecorator & MethodDecorator)[],\n): ClassDecorator & MethodDecorator {\n return (obj, key?, descriptor?) => {\n if (descriptor) {\n for (const dec of decs) {\n dec(obj, key, descriptor);\n }\n } else {\n for (const dec of decs) {\n dec(obj);\n }\n }\n };\n}\n", "import { ApiProperty } from '@nestjs/swagger';\nimport { HttpException } from '@nestjs/common';\nimport {\n AnyClass,\n ClassOrArray,\n getClassFromClassOrArray,\n InsertField,\n ParseType,\n} from './insert-field';\n\nexport interface PageSettingsWise {\n pageCount: number;\n recordsPerPage: number;\n}\n\nexport interface BlankReturnMessage {\n statusCode: number;\n message: string;\n success: boolean;\n timestamp: Date;\n}\n\nexport interface ReturnMessage<T> extends BlankReturnMessage {\n data?: T;\n}\n\nexport class BlankReturnMessageDto implements BlankReturnMessage {\n @ApiProperty({ description: 'Return code', type: Number })\n statusCode: number;\n @ApiProperty({ description: 'Return message', type: String })\n message: string;\n @ApiProperty({ description: 'Whether success.', type: Boolean })\n success: boolean;\n @ApiProperty({ description: 'Return timestamp', type: Date })\n timestamp: Date;\n constructor(statusCode: number, message?: string) {\n this.statusCode = statusCode;\n this.message = message || 'success';\n this.success = statusCode < 400;\n this.timestamp = new Date();\n }\n\n toException() {\n return new HttpException(this, this.statusCode);\n }\n}\n\nexport class BlankPaginatedReturnMessageDto\n extends BlankReturnMessageDto\n implements PageSettingsWise\n{\n @ApiProperty({ description: 'Total record count.', type: Number })\n total: number;\n @ApiProperty({ description: 'Total page count.', type: Number })\n totalPages: number;\n @ApiProperty({ description: 'Current page.', type: Number })\n pageCount: number;\n @ApiProperty({ description: 'Records per page.', type: Number })\n recordsPerPage: number;\n constructor(\n statusCode: number,\n message: string,\n total: number,\n pageSettings: PageSettingsWise,\n ) {\n super(statusCode, message);\n this.total = total;\n this.pageCount = pageSettings.pageCount;\n this.recordsPerPage = pageSettings.recordsPerPage;\n this.totalPages = Math.ceil(total / pageSettings.recordsPerPage);\n }\n}\n\nexport class GenericReturnMessageDto<T>\n extends BlankReturnMessageDto\n implements ReturnMessage<T>\n{\n data?: T;\n constructor(statusCode: number, message?: string, data?: T) {\n super(statusCode, message);\n this.data = data;\n }\n}\n\nexport function ReturnMessageDto<T extends ClassOrArray>(\n type: T,\n): new (\n statusCode: number,\n message: string,\n data: ParseType<T>,\n) => GenericReturnMessageDto<ParseType<T>> {\n return InsertField(\n GenericReturnMessageDto,\n {\n data: {\n type,\n options: {\n required: false,\n description: 'Return data.',\n },\n },\n },\n `${getClassFromClassOrArray(type).name}${Array.isArray(type) ? 'Array' : ''}ReturnMessageDto`,\n );\n}\n\nexport class GenericPaginatedReturnMessageDto<T>\n extends BlankPaginatedReturnMessageDto\n implements PageSettingsWise, ReturnMessage<T[]>\n{\n data: T[];\n constructor(\n statusCode: number,\n message: string,\n data: T[],\n total: number,\n pageSettings: PageSettingsWise,\n ) {\n super(statusCode, message, total, pageSettings);\n this.data = data;\n }\n}\n\nexport function PaginatedReturnMessageDto<T extends AnyClass>(\n type: T,\n): new (\n statusCode: number,\n message: string,\n data: InstanceType<T>[],\n total: number,\n pageSettings: PageSettingsWise,\n) => GenericPaginatedReturnMessageDto<InstanceType<T>> {\n return InsertField(\n GenericPaginatedReturnMessageDto,\n {\n data: {\n type: [type],\n options: {\n required: false,\n description: 'Return data.',\n },\n },\n },\n `${getClassFromClassOrArray(type).name}PaginatedReturnMessageDto`,\n );\n}\n\nexport class StringReturnMessageDto extends GenericReturnMessageDto<string> {\n @ApiProperty({ description: 'Return data.', type: String, required: false })\n data: string;\n}\n", "import { BlankReturnMessageDto, ReturnMessageDto } from './return-message';\nimport { ApiResponse, ApiResponseOptions } from '@nestjs/swagger';\nimport { ClassOrArray } from './insert-field';\n\nexport const ApiTypeResponse = (\n // eslint-disable-next-line @typescript-eslint/ban-types\n type: ClassOrArray,\n options: ApiResponseOptions = {},\n) =>\n ApiResponse({\n status: 200,\n type: ReturnMessageDto(type),\n ...options,\n });\n\nexport const ApiBlankResponse = (options: ApiResponseOptions = {}) =>\n ApiResponse({\n status: 200,\n type: BlankReturnMessageDto,\n ...options,\n });\n\nexport const ApiError = (status: number, description: string) =>\n ApiBlankResponse({ status, description });\n\nexport const ApiErrorTyped = (\n status: number,\n description: string,\n type: ClassOrArray,\n) =>\n ApiTypeResponse(type, {\n status,\n description,\n });\n", "import {\n Body,\n PipeTransform,\n Query,\n Type,\n ValidationPipe,\n} from '@nestjs/common';\n\nexport const DataPipe = () =>\n new ValidationPipe({\n transform: true,\n transformOptions: { enableImplicitConversion: true },\n });\n\nconst createDataPipeDec =\n (\n nestFieldDec: (\n ...pipes: (Type<PipeTransform> | PipeTransform)[]\n ) => ParameterDecorator,\n ) =>\n (...extraPipes: (Type<PipeTransform> | PipeTransform)[]) =>\n nestFieldDec(DataPipe(), ...extraPipes);\n\nexport const DataQuery = createDataPipeDec(Query);\nexport const DataBody = createDataPipeDec(Body);\n", "import {\n CanActivate,\n ExecutionContext,\n Inject,\n Injectable,\n UseGuards,\n} from '@nestjs/common';\nimport { ConfigService } from '@nestjs/config';\nimport { ApiHeader } from '@nestjs/swagger';\nimport { BlankReturnMessageDto } from './return-message';\nimport { MergeClassOrMethodDecorators } from './merge';\nimport { ApiError } from './openapi';\nimport {\n ApiFromResolver,\n createResolver,\n ResolverDual,\n ResolverDynamic,\n} from './resolver';\nimport { MetadataSetter, Reflector } from 'typed-reflector';\nimport { ModuleRef } from '@nestjs/core';\n\nexport interface RequireTokenOptions {\n resolver?: ResolverDual;\n tokenSource?: string | ResolverDynamic;\n errorCode?: number;\n}\n\ntype RequireTokenMetadataMap = {\n requireTokenOptions: RequireTokenOptions;\n};\n\nconst reflector = new Reflector<RequireTokenMetadataMap, {}>();\nconst Metadata = new MetadataSetter<RequireTokenMetadataMap, {}>();\n\nconst defaultHeaderName = 'x-server-token';\nconst defaultConfigName = 'SERVER_TOKEN';\nconst defaultErrorCode = 401;\n\n@Injectable()\nexport class TokenGuard implements CanActivate {\n constructor(\n @Inject(ConfigService) private config: ConfigService,\n @Inject(ModuleRef) private moduleRef: ModuleRef,\n ) {}\n\n async canActivate(context: ExecutionContext) {\n const controller = context.getClass();\n const handlerName = context.getHandler()?.name;\n let config = {} as RequireTokenOptions;\n if (controller) {\n if (handlerName) {\n config =\n reflector.get('requireTokenOptions', controller, handlerName) || {};\n } else {\n config = reflector.get('requireTokenOptions', controller) || {};\n }\n }\n const resolver = createResolver(\n config.resolver || { paramType: 'header', paramName: defaultHeaderName },\n );\n const tokenSource = config.tokenSource || defaultConfigName;\n const [tokenFromClient, tokenFromConfig] = await Promise.all([\n resolver(context, this.moduleRef),\n typeof tokenSource === 'function'\n ? tokenSource(context, this.moduleRef)\n : this.config.get<string>(tokenSource),\n ]);\n if (tokenFromConfig && tokenFromConfig !== tokenFromClient) {\n throw new BlankReturnMessageDto(\n config.errorCode || defaultErrorCode,\n 'Unauthorized',\n ).toException();\n }\n return true;\n }\n}\n\nexport const RequireToken = (options: RequireTokenOptions = {}) => {\n const swaggerDec = options.resolver\n ? ApiFromResolver(options.resolver, {\n description: 'Server token',\n required: false,\n })\n : ApiHeader({\n name: defaultHeaderName,\n description: 'Server token',\n required: false,\n });\n return MergeClassOrMethodDecorators([\n UseGuards(TokenGuard),\n swaggerDec,\n ApiError(\n options.errorCode || defaultErrorCode,\n 'Incorrect server token provided',\n ),\n ...(options ? [Metadata.set('requireTokenOptions', options)] : []),\n ]);\n};\n", "import type { Request } from 'express';\nimport { Awaitable } from './utility/awaitable';\nimport { ExecutionContext } from '@nestjs/common';\nimport { ModuleRef } from '@nestjs/core';\nimport {\n ApiHeader,\n ApiHeaderOptions,\n ApiQuery,\n ApiQueryOptions,\n} from '@nestjs/swagger';\n\nexport interface ResolverStatic {\n paramType: 'header' | 'query';\n paramName: string;\n}\n\nexport type ResolverDynamic = (\n ctx: ExecutionContext,\n ref?: ModuleRef,\n) => Awaitable<string>;\n\nexport type ResolverDual = ResolverStatic | ResolverDynamic;\n\ntype AnyReq = Request & {\n headers?: Record<string, any>;\n query?: any;\n url?: string;\n originalUrl?: string;\n getHeader?: (name: string) => any;\n get?: (name: string) => any;\n header?: (name: string) => any;\n};\n\nconst coerceToString = (v: any): string | undefined => {\n if (v == null) return undefined; // null / undefined\n if (v === false) return undefined; // \uD83D\uDC48 \u5173\u952E\uFF1A\u628A false \u5F53\u4F5C\u672A\u547D\u4E2D\n if (Array.isArray(v)) return v.length ? coerceToString(v[0]) : undefined;\n if (typeof v === 'string') return v;\n if (typeof v === 'number') return String(v);\n // \u5176\u4ED6\u7C7B\u578B\uFF08true / object / function / symbol / bigint\uFF09\u90FD\u4E0D\u63A5\u53D7\n return undefined;\n};\n\nconst getHeader = (req: AnyReq, name: string): string | undefined => {\n // \u5148\u8D70\u65B9\u6CD5\uFF08express/\u90E8\u5206\u9002\u914D\u5668\uFF09\n const viaMethod =\n (typeof req.getHeader === 'function' && req.getHeader(name)) ||\n (typeof (req as any).header === 'function' && (req as any).header(name)) ||\n (typeof (req as any).get === 'function' && (req as any).get(name));\n\n if (viaMethod) {\n return coerceToString(viaMethod);\n }\n\n // \u518D\u67E5 headers\uFF0C\u5927\u5C0F\u5199\u65E0\u5173\n const n = name.toLowerCase();\n const headers = req.headers ?? {};\n if (n in headers) return coerceToString((headers as any)[n]);\n\n const hit = Object.entries(headers).find(([k]) => k.toLowerCase() === n)?.[1];\n return coerceToString(hit);\n};\n\nconst pickPrimaryFromAcceptLanguage = (v?: string): string | undefined => {\n if (!v) return undefined;\n const first = v.split(',')[0]?.trim();\n return first?.split(';')[0]?.trim() || first;\n};\n\nfunction getQueryValue(req: AnyReq, key: string): string | undefined {\n // 1. \u666E\u901A\u5BF9\u8C61\u6A21\u5F0F\uFF08Express/Fastify \u5DF2\u89E3\u6790\uFF09\n const q = req.query;\n if (q && typeof q === 'object' && !('raw' in q)) {\n const v = (q as any)[key];\n if (v != null) return coerceToString(v);\n }\n\n // 2. fallback\uFF1A\u89E3\u6790 URLSearchParams\n const rawUrl = req.originalUrl ?? req.url;\n if (typeof rawUrl === 'string' && rawUrl.includes('?')) {\n try {\n // \u7528 http://localhost \u5360\u4F4D base\uFF0C\u907F\u514D\u76F8\u5BF9\u8DEF\u5F84\u9519\u8BEF\n const search = rawUrl.startsWith('http')\n ? new URL(rawUrl).search\n : new URL(rawUrl, 'http://localhost').search;\n\n if (search) {\n const params = new URLSearchParams(search);\n const val = params.get(key);\n if (val != null) return val;\n }\n } catch {\n // ignore malformed URL\n }\n }\n return undefined;\n}\n\nexport const createResolver = (_options: ResolverDual): ResolverDynamic => {\n if (typeof _options === 'function') {\n // it's already dynamic\n return _options;\n }\n const options = _options as ResolverStatic;\n const field = options.paramType; // 'header' | 'query'\n let name = options.paramName;\n if (field === 'header') name = name.toLowerCase();\n\n return (ctx) => {\n const req = ctx.switchToHttp().getRequest<AnyReq>();\n\n if (field === 'header') {\n let raw = getHeader(req, name);\n if (name === 'accept-language') raw = pickPrimaryFromAcceptLanguage(raw);\n return raw;\n }\n\n if (field === 'query') {\n return getQueryValue(req, name);\n }\n\n throw new Error(`Unsupported paramType: ${field}`);\n };\n};\n\nexport const ApiFromResolver = (\n _options: ResolverDual,\n extras: ApiHeaderOptions | ApiQueryOptions = {},\n): ClassDecorator & MethodDecorator => {\n if (typeof _options === 'function') {\n // dynamic resolver, no static param info\n return () => {};\n }\n const options = _options as ResolverStatic;\n const paramType = (options as ResolverStatic)?.paramType;\n const apiOptions: ApiHeaderOptions = {\n name: (options as ResolverStatic).paramName,\n ...extras,\n };\n return paramType === 'header'\n ? ApiHeader(apiOptions)\n : paramType === 'query'\n ? ApiQuery({ type: 'string', ...apiOptions })\n : () => {};\n};\n", "import { Observable, takeUntil } from 'rxjs';\nimport { createParamDecorator, ExecutionContext } from '@nestjs/common';\nimport type { Request } from 'express';\nimport { createAbortSignalFromHttp } from './utility/abort-http-signal';\n\nexport type AbortableFn<T> = (ac: AbortController) => Promise<T>;\n\nexport const fromAbortable = <T>(fn: AbortableFn<T>): Observable<T> => {\n return new Observable<T>((subscriber) => {\n const ac = new AbortController();\n\n fn(ac).then(\n (value) => {\n if (!ac.signal.aborted && !subscriber.closed) {\n subscriber.next(value);\n subscriber.complete();\n }\n },\n (err) => {\n if (ac.signal.aborted) {\n if (!subscriber.closed) subscriber.complete();\n return;\n }\n if (!subscriber.closed) subscriber.error(err);\n },\n );\n\n return () => {\n if (!ac.signal.aborted) ac.abort();\n };\n });\n};\n\nexport const takeUntilAbort = <T>(signal: AbortSignal) => {\n return (source: Observable<T>) => {\n return source.pipe(\n takeUntil(\n new Observable<void>((subscriber) => {\n const onAbort = () => subscriber.next();\n if (signal.aborted) {\n subscriber.next();\n } else {\n signal.addEventListener('abort', onAbort, { once: true });\n }\n return () => signal.removeEventListener('abort', onAbort);\n }),\n ),\n );\n };\n};\n\nexport const As = createParamDecorator(\n (_data: unknown, ctx: ExecutionContext) => {\n const req = ctx.switchToHttp().getRequest<Request>();\n return createAbortSignalFromHttp(req);\n },\n);\n", "// abort-http-signal.ts\nimport type { IncomingMessage } from 'http';\nimport type { Request as ExpressReq } from 'express';\nimport type { FastifyRequest } from 'fastify';\nimport { BlankReturnMessageDto } from '../return-message';\n\ntype AnyReq = ExpressReq | FastifyRequest | IncomingMessage;\n\nfunction toRawReq(req: AnyReq): IncomingMessage {\n // Fastify: req.raw \u662F IncomingMessage\uFF1BExpress: req \u672C\u8EAB\u5C31\u662F IncomingMessage\n if ((req as any)?.raw?.socket) return (req as any).raw as IncomingMessage;\n return req as IncomingMessage;\n}\n\n/**\n * \u4EC5\u901A\u8FC7 req \u81EA\u52A8\u9002\u914D Express/Fastify\uFF0C\u7ED1\u5B9A HTTP \u53D6\u6D88\u5230 AbortSignal\u3002\n * - \u4F18\u5148\u76D1\u542C 'aborted'\uFF08\u5BA2\u6237\u7AEF\u4E2D\u65AD\u6700\u53EF\u9760\u7684\u4FE1\u53F7\uFF09\n * - \u53EF\u9009\u515C\u5E95\uFF1A\u5728 socket 'close' \u65F6\uFF0C\u4EC5\u5F53\u8BF7\u6C42\u672A\u5B8C\u6574\u63A5\u6536/\u6216\u5DF2\u6807\u8BB0 aborted \u65F6\uFF0C\u624D\u89E6\u53D1 abort\uFF0C\u907F\u514D\u6B63\u5E38\u5B8C\u6210\u7684\u8BEF\u4F24\n * - reason \u56FA\u5B9A\u4E3A 499 HttpException\n *\n * \u6CE8\u610F\uFF1A\u82E5\u4F60\u7684 abortable() \u5728 signal.reason \u662F Error \u65F6\u4F1A\u201C\u539F\u6837 throw reason\u201D\uFF0C\n * \u90A3\u4E48\u4E0A\u5C42\u4F1A\u6536\u5230 HttpException(499)\u3002\u82E5\u4ECD\u60F3\u7EDF\u4E00\u629B AbortedError\uFF0C\u53EF\u6539\u4E3A\uFF1A\n * const reason = new AbortedError('Request aborted', httpErr);\n * \u5E76\u8BA9 throwIfAborted \u5148\u629B AbortedError\uFF08\u4FDD\u7559 cause\uFF09\u3002\n */\nexport function createAbortSignalFromHttp(req: AnyReq): AbortSignal {\n const rawReq = toRawReq(req);\n const ac = new AbortController();\n\n const makeReason = () =>\n new BlankReturnMessageDto(499, 'Request aborted').toException();\n\n const abortOnce = () => {\n if (!ac.signal.aborted) ac.abort(makeReason());\n cleanup();\n };\n\n const onClose = () => {\n abortOnce();\n };\n\n const cleanup = () => {\n rawReq.off?.('close', onClose);\n };\n\n rawReq.once?.('close', onClose);\n\n return ac.signal;\n}\n", "import { Inject, Scope } from '@nestjs/common';\nimport { abortable, AbortableOpts } from 'nfkit';\nimport { ABORT_SIGNAL } from './abort-signal.provider';\nimport { ContextIdFactory, ModuleRef, REQUEST } from '@nestjs/core';\nimport { createProvider } from '../create-provider';\nimport { InjectionToken } from '@nestjs/common/interfaces/modules/injection-token.interface';\n\nconst tokenMemo = new Map<any, symbol>();\nexport const abortableToken = (token: InjectionToken) => {\n if (tokenMemo.has(token)) return tokenMemo.get(token)!;\n const name = typeof token === 'function' ? token.name : String(token);\n const sym = Symbol.for(`Abortable(${name})`);\n tokenMemo.set(token, sym);\n return sym;\n};\n\n/**\n * \u652F\u6301\u4E24\u79CD\u7528\u6CD5\uFF1A\n * @InjectAbortable(SomeService)\n * @InjectAbortable() // \u81EA\u52A8\u63A8\u65AD\u7C7B\u578B\n */\nexport function InjectAbortable(token?: InjectionToken): ParameterDecorator {\n return (target, propertyKey, parameterIndex) => {\n let actualToken = token;\n\n if (!actualToken) {\n // \u5229\u7528 reflect-metadata \u83B7\u53D6\u53C2\u6570\u7C7B\u578B\n const paramTypes: any[] =\n Reflect.getMetadata('design:paramtypes', target, propertyKey) || [];\n actualToken = paramTypes[parameterIndex];\n if (!actualToken) {\n throw new Error(\n `@InjectAbortable() cannot infer type from metadata: ${target.constructor?.name}[${parameterIndex}]`,\n );\n }\n }\n\n Inject(abortableToken(actualToken))(target, propertyKey, parameterIndex);\n };\n}\n\nexport function createAbortableProvider<T>(\n token: InjectionToken<T>,\n opts?: AbortableOpts,\n) {\n const provide = abortableToken(token);\n\n return createProvider(\n {\n provide,\n scope: Scope.REQUEST,\n inject: [ModuleRef, REQUEST, ABORT_SIGNAL],\n },\n async (moduleRef, req: Request, signal) => {\n // \u8BA9\u89E3\u6790\u4E0E\u5F53\u524D\u8BF7\u6C42\u4E0A\u4E0B\u6587\u7ED1\u5B9A\uFF08\u652F\u6301 request/transient \u4F5C\u7528\u57DF\uFF09\n const ctxId = ContextIdFactory.getByRequest(req);\n // \u4E25\u683C\u6A21\u5F0F\u5173\u95ED\uFF0C\u5141\u8BB8\u8DE8\u6A21\u5757\u8FB9\u754C\u89E3\u6790\uFF08\u89E3\u51B3\u6D4B\u8BD5\u91CC forFeature \u5B50\u6A21\u5757\u770B\u4E0D\u5230 DemoService \u7684\u60C5\u51B5\uFF09\n const svc = await moduleRef.resolve<T>(token, ctxId, { strict: false });\n if (svc == null) {\n throw new Error(\n `Abortable: provider \"${String(\n (token as any).name ?? token,\n )}\" not found in container (even with strict:false)`,\n );\n }\n return abortable<T>(svc, signal, opts);\n },\n );\n}\n", "import { Inject, Scope, Type } from '@nestjs/common';\nimport { REQUEST } from '@nestjs/core';\nimport { createAbortSignalFromHttp } from '../utility/abort-http-signal';\nimport { createProvider } from '../create-provider';\n\nexport const ABORT_SIGNAL = Symbol(\n 'ABORT_SIGNAL',\n) as unknown as Type<AbortSignal>;\nexport const AbortSignalProvider = createProvider(\n {\n provide: ABORT_SIGNAL,\n scope: Scope.REQUEST,\n inject: [REQUEST],\n },\n createAbortSignalFromHttp,\n);\n\nexport const InjectAbortSignal = () => Inject(ABORT_SIGNAL);\n", "import { FactoryProvider } from '@nestjs/common';\nimport { InjectionToken } from '@nestjs/common/interfaces/modules/injection-token.interface';\n\ntype TypeFromToken<T> = T extends string | symbol\n ? any\n : T extends InjectionToken<infer U>\n ? U\n : any;\n\ntype TokensToTypes<A extends InjectionToken[]> = A extends []\n ? []\n : A extends [infer F, ...infer R]\n ? [TypeFromToken<F>, ...TokensToTypes<R extends InjectionToken[] ? R : []>]\n : [];\n\ntype Awaitable<T> = T | Promise<T>;\n\nexport interface TypedFactoryProvider<A extends InjectionToken[], R>\n extends FactoryProvider<R> {\n inject: A;\n useFactory: (...args: TokensToTypes<A>) => Awaitable<R>;\n}\n\nexport const createProvider = <const A extends InjectionToken[], R>(\n options: { inject: A } & Omit<FactoryProvider<R>, 'inject' | 'useFactory'>,\n factory: (...args: TokensToTypes<A>) => Awaitable<R>,\n): TypedFactoryProvider<A, R> => {\n return {\n useFactory: factory,\n ...options,\n };\n};\n", "import { DynamicModule, Module } from '@nestjs/common';\nimport { createAbortableProvider } from './abortable.token';\nimport { AbortableOpts } from 'nfkit';\nimport { AbortSignalProvider } from './abort-signal.provider';\nimport { InjectionToken } from '@nestjs/common/interfaces/modules/injection-token.interface';\n\nexport interface AbortableModuleOptions {\n abortableOptions?: AbortableOpts;\n}\n\n@Module({})\nexport class AbortableModule {\n static forRoot(): DynamicModule {\n return {\n module: AbortableModule,\n providers: [AbortSignalProvider],\n exports: [AbortSignalProvider],\n global: true,\n };\n }\n\n static forFeature(\n tokens: InjectionToken[],\n options?: AbortableModuleOptions,\n ): DynamicModule {\n const providers = tokens.map((token) =>\n createAbortableProvider(token, options?.abortableOptions),\n );\n\n return {\n module: AbortableModule,\n providers: [...providers],\n exports: [...providers],\n };\n }\n}\n", "import {\n ConsoleLogger,\n ExecutionContext,\n HttpException,\n Inject,\n Injectable,\n} from '@nestjs/common';\nimport { I18nModuleOptionsToken } from './i18n-token';\nimport { I18nModuleOptions } from './i18n-module.options';\nimport { I18nMiddleware } from './i18n-middleware.type';\nimport { parseI18n } from '../utility/parse-i18n';\nimport { ModuleRef } from '@nestjs/core';\nimport { createResolver } from '../resolver';\n\n@Injectable()\nexport class I18nService {\n constructor(\n @Inject(I18nModuleOptionsToken) private options: I18nModuleOptions,\n @Inject(ModuleRef) private moduleRef: ModuleRef,\n ) {}\n\n private resolver = createResolver(this.options.resolver);\n\n private locales = new Set(this.options.locales);\n private defaultLocale = this.options.defaultLocale ?? this.options.locales[0];\n\n private middlewares: I18nMiddleware[] = [];\n\n middleware(mw: I18nMiddleware, prior = false) {\n if (prior) {\n this.middlewares.unshift(mw);\n } else {\n this.middlewares.push(mw);\n }\n }\n\n private logger = new ConsoleLogger('I18nService');\n\n private buildFallbackChain(locale: string): string[] {\n const best = this.getExactLocale(locale); // \u4F60\u7684\u201C\u6700\u957F\u5339\u914D\u201D\u51FD\u6570\n // \u62C6\u5206 zh-Hans-CN -> ['zh-Hans-CN','zh-Hans','zh']\n const parts: string[] = [];\n const segs = best.split('-');\n for (let i = segs.length; i > 1; i--)\n parts.push(segs.slice(0, i).join('-'));\n parts.push(segs[0]); // 'zh'\n // \u9644\u52A0\u9ED8\u8BA4\u8BED\u8A00\n if (!parts.includes(this.defaultLocale)) parts.push(this.defaultLocale);\n // \u53BB\u91CD\n return Array.from(new Set(parts)).filter((p) => this.locales.has(p));\n }\n\n private async applyMiddlewares(\n locale: string,\n text: string,\n ctx?: ExecutionContext,\n ): Promise<string | undefined> {\n const mws = this.middlewares;\n\n const tryLocale = async (loc: string) => {\n const dispatch = async (i: number): Promise<string | undefined> => {\n if (i >= mws.length) return undefined;\n\n const mw = mws[i];\n let nextCalled = false;\n\n const next = async (): Promise<string | undefined> => {\n nextCalled = true;\n return dispatch(i + 1);\n };\n\n try {\n const res = await mw(loc, text, next, ctx as any);\n if (res == null && !nextCalled) {\n return dispatch(i + 1);\n }\n return res;\n } catch (e) {\n if (e instanceof HttpException) {\n // this HttpException should throw up directly\n throw e;\n }\n this.logger.warn(`Middleware at index ${i} threw an error: ${e}`);\n return dispatch(i + 1);\n }\n };\n return dispatch(0);\n };\n\n for (const loc of this.buildFallbackChain(locale)) {\n const result = await tryLocale(loc);\n if (result != null) {\n return result;\n }\n }\n return undefined;\n }\n\n getExactLocale(locale: string) {\n const input = (locale ?? '').trim();\n if (!input) return this.defaultLocale;\n\n if (this.locales.has(input)) return input;\n\n // \u5C0F\u5199\u5316\u6BD4\u8F83\uFF0C\u4FDD\u7559\u539F\u5927\u5C0F\u5199\n const entries = Array.from(this.locales).map((l) => ({\n orig: l,\n lower: l.toLowerCase(),\n }));\n const lower = input.toLowerCase();\n\n // 1) \u7CBE\u786E\u5339\u914D\uFF08\u5927\u5C0F\u5199\u4E0D\u654F\u611F\uFF09\n const exact = entries.find((e) => e.lower === lower);\n if (exact) return exact.orig;\n\n // 2) \u6309 '-' \u62C6\u5206\uFF0C\u4F9D\u6B21\u5C1D\u8BD5\u53BB\u6389\u6700\u53F3\u8FB9\u7684\u6BB5\n // zh-Hans-CN \u2192 zh-Hans \u2192 zh\n const parts = lower.split('-');\n while (parts.length > 1) {\n parts.pop();\n const candidate = parts.join('-');\n const hit = entries.find((e) => e.lower === candidate);\n if (hit) return hit.orig;\n }\n\n // 3) \u515C\u5E95\n return this.defaultLocale;\n }\n\n async getExactLocaleFromRequest(ctx: ExecutionContext) {\n const locale = await this.resolver(ctx, this.moduleRef);\n return this.getExactLocale(locale);\n }\n\n async translateString(\n locale: string,\n text: string,\n ctx?: ExecutionContext,\n ): Promise<string> {\n if (!text) return text;\n\n locale = this.getExactLocale(locale);\n\n const pieces = parseI18n(text);\n if (!pieces.some((p) => p.type === 'ph')) {\n return pieces\n .map((p) => (p.type === 'raw' ? p.value : `#{${p.rawInner}}`))\n .join('');\n }\n\n const promises: Array<Promise<string | undefined | null>> = [];\n\n for (const p of pieces) {\n if (p.type === 'ph') {\n promises.push(this.applyMiddlewares(locale, p.key, ctx));\n }\n }\n\n const results = await Promise.all(promises);\n\n let out = '';\n let k = 0;\n for (const p of pieces) {\n if (p.type === 'raw') {\n out += p.value;\n } else {\n const r = results[k++];\n out += r == null ? `#{${p.rawInner}}` : r;\n }\n }\n return out;\n }\n\n async translate<T>(\n locale: string,\n obj: T,\n ctx?: ExecutionContext,\n ): Promise<T> {\n const visited = new WeakSet<object>();\n\n const isBuiltInObject = (v: any): boolean => {\n if (v == null || typeof v !== 'object') return false;\n if (\n v instanceof Date ||\n v instanceof RegExp ||\n v instanceof Map ||\n v instanceof Set ||\n v instanceof WeakMap ||\n v instanceof WeakSet ||\n v instanceof ArrayBuffer ||\n v instanceof DataView ||\n ArrayBuffer.isView(v) // TypedArray / Buffer\n )\n return true;\n\n const tag = Object.prototype.toString.call(v);\n switch (tag) {\n case '[object URL]':\n case '[object URLSearchParams]':\n case '[object Error]':\n case '[object Blob]':\n case '[object File]':\n case '[object FormData]':\n return true;\n default:\n return false;\n }\n };\n\n const translateObjectPreservingProto = async (value: any): Promise<any> => {\n const proto = Object.getPrototypeOf(value);\n const out = Object.create(proto);\n\n const keys = Reflect.ownKeys(value);\n\n await Promise.all(\n keys.map(async (key) => {\n const desc = Object.getOwnPropertyDescriptor(value, key as any);\n if (!desc) return;\n\n // \u6570\u636E\u5C5E\u6027\uFF1A\u5E76\u53D1\u9012\u5F52\u5176 value\uFF0C\u4FDD\u6301\u539F\u5C5E\u6027\u7279\u6027\n if ('value' in desc) {\n const newVal = await visit(desc.value);\n Object.defineProperty(out, key, { ...desc, value: newVal });\n return;\n }\n\n // \u8BBF\u95EE\u5668\u5C5E\u6027\uFF1A\u5148\u590D\u5236 getter/setter\uFF0C\u518D\u5C1D\u8BD5\u8BFB\u503C\u2192\u7FFB\u8BD1\u2192\u5199\u56DE\n Object.defineProperty(out, key, desc);\n\n // \u6CA1\u6709 getter \u5C31\u65E0\u9700\u5904\u7406\uFF1B\u6709 getter \u4F46\u629B\u9519\u4E5F\u5FFD\u7565\n let current: any = undefined;\n if (typeof desc.get === 'function') {\n try {\n current = desc.get.call(value);\n } catch {\n /* ignore */\n }\n }\n if (current === undefined) return;\n\n // \u9012\u5F52\u7FFB\u8BD1 getter \u8FD4\u56DE\u7684\u503C\uFF1B\u82E5\u6709 setter \u5219\u5199\u56DE\n try {\n const newVal = await visit(current);\n if (typeof desc.set === 'function') {\n try {\n desc.set.call(out, newVal);\n } catch {\n /* ignore */\n }\n }\n } catch {\n // \u7FFB\u8BD1\u5931\u8D25\u4E0D\u5F71\u54CD\u5176\u4ED6\u952E\n }\n }),\n );\n\n return out;\n };\n\n const isTranslatable = (\n v: any,\n ): { ok: false } | { ok: true; kind: 'string' | 'object' } => {\n // 1) \u6240\u6709 falsy \u539F\u6837\uFF08null/undefined/false/0/''/NaN\uFF09\n if (!v) return { ok: false };\n\n // 2) \u57FA\u672C\u7C7B\u578B\u8FC7\u6EE4\n const t = typeof v;\n if (\n t === 'number' ||\n t === 'bigint' ||\n t === 'symbol' ||\n t === 'function'\n ) {\n return { ok: false };\n }\n\n // 3) \u53EF\u7FFB\u8BD1\uFF1A\u5B57\u7B26\u4E32 or \u5BF9\u8C61\uFF08\u5BF9\u8C61\u518D\u7531\u540E\u7EED\u903B\u8F91\u51B3\u5B9A\u662F\u5426\u6DF1\u5165\uFF09\n if (t === 'string') return { ok: true, kind: 'string' };\n if (t === 'object') {\n return { ok: true, kind: 'object' };\n }\n\n // \u5176\u5B83\uFF08boolean \u7B49\u5DF2\u5305\u542B\u5728 falsy/\u57FA\u672C\u7C7B\u578B\u91CC\uFF09\n return { ok: false };\n };\n\n const visit = async (value: any): Promise<any> => {\n // 1) \u68C0\u67E5\u662F\u5426\u53EF\u7FFB\u8BD1\n const check = isTranslatable(value);\n\n // 2) \u4E0D\u53EF\u7FFB\u8BD1\u7684\u539F\u6837\u8FD4\u56DE\n if (!check.ok) {\n return value;\n }\n\n if (check.kind === 'string') {\n // 3) \u5B57\u7B26\u4E32\uFF1A\u7FFB\u8BD1\n return this.translateString(locale, value, ctx);\n }\n\n // 4) Promise\uFF1A\u4E0D\u9690\u5F0F\u5C55\u5F00\uFF08\u4FDD\u6301\u8BED\u4E49\uFF09\n if (value instanceof Promise) {\n return value.then((resolved) => visit(resolved));\n }\n\n // 5) \u5BF9\u8C61\u7C7B\uFF1A\u8FC7\u6EE4\u5185\u7F6E\u5BF9\u8C61\n if (typeof value === 'object') {\n if (!Array.isArray(value) && isBuiltInObject(value)) return value;\n\n // \u9632\u73AF\n if (visited.has(value)) return value;\n visited.add(value);\n\n // \u6570\u7EC4\uFF1A\u5143\u7D20\u7EA7\u9012\u5F52\n if (Array.isArray(value)) {\n const out = await Promise.all(value.map((v) => visit(v)));\n return out as any;\n }\n\n // \u5176\u4ED6\u5BF9\u8C61\uFF08\u542B\u7C7B\u5B9E\u4F8B/DTO\uFF09\uFF1A\u4FDD\u7559\u539F\u578B\u5E76\u9012\u5F52\u81EA\u6709\u5C5E\u6027\n return translateObjectPreservingProto(value);\n }\n\n // \u5176\u4F59\u7C7B\u578B\uFF08boolean \u7B49\uFF09\u539F\u6837\u8FD4\u56DE\n return value;\n };\n\n return visit(obj);\n }\n\n async translateRequest(ctx: ExecutionContext, obj: any): Promise<any> {\n const locale = await this.resolver(ctx, this.moduleRef);\n return this.translate(locale, obj, ctx);\n }\n}\n", "import { ConfigurableModuleBuilder } from '@nestjs/common';\nimport { I18nModuleOptions } from './i18n-module.options';\n\nexport const I18nResolverToken = Symbol('I18nResolverToken');\n\nconst { ConfigurableModuleClass, MODULE_OPTIONS_TOKEN } =\n new ConfigurableModuleBuilder<I18nModuleOptions>()\n // .setExtras({}, (def) => ({ ...def, global: true }))\n .build();\nexport const I18nModuleOptionsToken = MODULE_OPTIONS_TOKEN;\nexport { ConfigurableModuleClass as I18nModuleBase };\n", "// \u2014\u2014 \u89E3\u6790\u7ED3\u679C\u7ED3\u6784 \u2014\u2014 //\nexport type I18nPiece =\n | { type: 'raw'; value: string }\n | { type: 'ph'; rawInner: string; key: string };\n\n/**\n * \u6808\u5F0F\u89E3\u6790 #{ ... } \u5360\u4F4D\u3002\u652F\u6301\u5185\u90E8\u6210\u5BF9\u82B1\u62EC\u53F7\uFF0C\u5982 #{ foo {{ bar }} }\u3002\n * - \u672A\u95ED\u5408\u65F6\uFF1A\u628A\u4ECE\u4E0A\u6B21\u4F4D\u7F6E i \u5230\u7ED3\u5C3E\u6574\u4F53\u4F5C\u4E3A raw \u653E\u56DE\uFF08\u907F\u514D\u88AB\u62C6\u6210\u4E24\u6BB5\uFF09\n * - key = trim(rawInner)\n */\nexport const parseI18n = (text: string): I18nPiece[] => {\n const pieces: I18nPiece[] = [];\n if (!text) return pieces;\n\n let i = 0;\n const n = text.length;\n\n while (i < n) {\n const start = text.indexOf('#{', i);\n if (start === -1) {\n // \u6CA1\u6709\u66F4\u591A\u5360\u4F4D\u7B26\n if (i < n) pieces.push({ type: 'raw', value: text.slice(i) });\n break;\n }\n\n // \u5148\u5C1D\u8BD5\u5339\u914D\u8FD9\u4E2A\u5360\u4F4D\u7B26\u662F\u5426\u95ED\u5408\uFF08\u6B64\u65F6\u4E0D\u7ACB\u5373\u63A8\u5165\u524D\u5BFC raw\uFF09\n let j = start + 2; // \u6307\u5411 '#{' \u540E\u7B2C\u4E00\u4E2A\u5B57\u7B26\n let depth = 1;\n while (j < n && depth > 0) {\n const ch = text.charCodeAt(j);\n if (ch === 123 /* '{' */) depth++;\n else if (ch === 125 /* '}' */) depth--;\n j++;\n }\n\n if (depth !== 0) {\n // \u672A\u95ED\u5408\uFF1A\u628A\u4ECE i \u5230\u672B\u5C3E\u6574\u4F53\u5F53\u4F5C raw\uFF08\u5305\u542B\u524D\u5BFC + '#{' \u5C3E\u5DF4\uFF09\n pieces.push({ type: 'raw', value: text.slice(i) });\n break;\n }\n\n // \u5230\u8FD9\u91CC\u8BF4\u660E\u5360\u4F4D\u95ED\u5408\uFF1A\u5148\u63A8\u5165\u524D\u5BFC raw\uFF0C\u518D\u63A8\u5360\u4F4D\u7247\u6BB5\n if (start > i) {\n pieces.push({ type: 'raw', value: text.slice(i, start) });\n }\n\n const rawInner = text.slice(start + 2, j - 1);\n const key = rawInner.trim();\n pieces.push({ type: 'ph', rawInner, key });\n\n i = j; // \u7EE7\u7EED\u5411\u540E\u626B\u63CF\n }\n\n return pieces;\n};\n", "import { Global, Module } from '@nestjs/common';\nimport { I18nModuleBase } from './i18n-token';\nimport { I18nService } from './i18n.service';\nimport { LocalePipe } from './locale.pipe';\n\n@Global()\n@Module({\n providers: [I18nService, LocalePipe],\n exports: [I18nService, LocalePipe],\n})\nexport class I18nModule extends I18nModuleBase {}\n", "import {\n ArgumentMetadata,\n createParamDecorator,\n ExecutionContext,\n Inject,\n Injectable,\n PipeTransform,\n} from '@nestjs/common';\nimport { I18nService } from './i18n.service';\nimport { createResolver, ResolverDual } from '../resolver';\n\ntype LocaleContext = {\n ctx: ExecutionContext;\n resolver?: ResolverDual;\n};\n\n@Injectable()\nexport class LocalePipe implements PipeTransform {\n constructor(@Inject(I18nService) private i18nService: I18nService) {}\n\n async transform(ctx: LocaleContext, metadata: ArgumentMetadata) {\n const resolver = ctx.resolver;\n if (resolver) {\n const _resolver = createResolver(resolver);\n const locale = await _resolver(ctx.ctx, undefined);\n return this.i18nService.getExactLocale(locale);\n } else {\n return this.i18nService.getExactLocaleFromRequest(ctx.ctx);\n }\n }\n}\n\nconst _dec = createParamDecorator((resolver: ResolverDual | undefined, ctx) => {\n return { ctx, resolver };\n});\n\nexport const PutLocale = (resolver?: ResolverDual) =>\n _dec(resolver, LocalePipe);\n", "import { I18nModuleOptions } from './i18n-module.options';\nimport { ApiFromResolver } from '../resolver';\nimport { MergeClassOrMethodDecorators } from '../merge';\nimport { UseInterceptors } from '@nestjs/common';\nimport { I18nInterceptor } from './i18n.interceptor';\n\nexport const createI18nDecorator = (options: I18nModuleOptions) => {\n return () =>\n MergeClassOrMethodDecorators([\n UseInterceptors(I18nInterceptor),\n ApiFromResolver(options.resolver, {\n description: 'Locale for internationalization',\n required: false,\n default: options.defaultLocale ?? options.locales[0],\n enum: options.locales,\n }),\n ]);\n};\n", "import {\n CallHandler,\n ExecutionContext,\n HttpException,\n Inject,\n Injectable,\n NestInterceptor,\n} from '@nestjs/common';\nimport { from, throwError } from 'rxjs';\nimport { catchError, mergeMap } from 'rxjs/operators';\nimport { I18nService } from './i18n.service';\n\n@Injectable()\nexport class I18nInterceptor implements NestInterceptor {\n constructor(@Inject(I18nService) private readonly i18nService: I18nService) {}\n\n intercept(context: ExecutionContext, next: CallHandler) {\n return next.handle().pipe(\n // \u6210\u529F\u8DEF\u5F84\uFF1A\u628A\u54CD\u5E94\u4F53\u4EA4\u7ED9 i18n \u505A\u5F02\u6B65\u7FFB\u8BD1\n mergeMap((data) => this.i18nService.translateRequest(context, data)),\n // \u9519\u8BEF\u8DEF\u5F84\uFF1A\u82E5\u662F HttpException\uFF0C\u628A\u5176 response \u7FFB\u8BD1\u540E\u518D\u629B\n catchError((err) => {\n if (err instanceof HttpException) {\n const status = err.getStatus();\n const resp = err.getResponse();\n return from(this.i18nService.translateRequest(context, resp)).pipe(\n mergeMap((translated) =>\n throwError(\n () => new HttpException(translated, status, { cause: err }),\n ),\n ),\n );\n }\n return throwError(() => err);\n }),\n );\n }\n}\n", "import { I18nModuleOptions } from './i18n-module.options';\nimport { createI18nDecorator } from './i18n-decorator';\nimport { I18nModule } from './i18n.module';\nimport { ResolverDual } from '../resolver';\n\nexport const createI18n = (\n options: Omit<I18nModuleOptions, 'resolver'> & { resolver?: ResolverDual },\n) => {\n if (!options.resolver) {\n options.resolver = {\n paramType: 'header',\n paramName: 'x-client-language',\n };\n }\n return {\n UseI18n: createI18nDecorator(options as I18nModuleOptions),\n I18nModule: I18nModule.register(options as I18nModuleOptions),\n };\n};\n", "import { I18nMiddleware } from '../i18n-middleware.type';\nimport { Awaitable } from '../../utility/awaitable';\nimport { ExecutionContext } from '@nestjs/common';\n\nexport type I18nDictionary = Record<string, Record<string, string>>;\n\ntype MatchType = 'exact' | 'hierarchy' | 'startsWith';\n\nexport const I18nLookupMiddleware = (\n dict:\n | I18nDictionary\n | ((\n locale: string,\n key: string,\n ctx?: ExecutionContext,\n ) => Awaitable<I18nDictionary>),\n options?: { matchType?: MatchType },\n): I18nMiddleware => {\n const matchType: MatchType = options?.matchType ?? 'exact';\n const dictFactory = typeof dict === 'function' ? dict : () => dict;\n\n // \u57FA\u4E8E locales \u5217\u8868\u505A\u201C\u7CBE\u786E\u2192\u5C42\u7EA7\u56DE\u9000(zh-Hans-CN\u2192zh-Hans\u2192zh)\u201D\u7684\u6700\u957F\u5339\u914D\n const pickBestByHierarchy = (\n input: string,\n locales: string[],\n ): string | undefined => {\n if (!input) return undefined;\n const entries = locales.map((l) => ({ orig: l, lower: l.toLowerCase() }));\n const lower = input.toLowerCase();\n\n // \u7CBE\u786E\u5339\u914D\uFF08\u5927\u5C0F\u5199\u4E0D\u654F\u611F\uFF09\n const exact = entries.find((e) => e.lower === lower);\n if (exact) return exact.orig;\n\n // \u9010\u7EA7\u56DE\u9000\uFF1Azh-Hans-CN -> zh-Hans -> zh\n const parts = lower.split('-');\n while (parts.length > 1) {\n parts.pop();\n const candidate = parts.join('-');\n const hit = entries.find((e) => e.lower === candidate);\n if (hit) return hit.orig;\n }\n return undefined;\n };\n\n return async (locale, key, next, ctx) => {\n const dictResolved = await dictFactory(locale, key, ctx);\n\n let dictionary = dictResolved[locale];\n\n if (!dictionary) {\n if (matchType === 'hierarchy') {\n const best = pickBestByHierarchy(locale, Object.keys(dictResolved));\n if (best) dictionary = dictResolved[best];\n } else if (matchType === 'startsWith') {\n const keys = Object.keys(dictResolved).filter((k) =>\n locale.startsWith(k),\n );\n if (keys.length) {\n const best = keys.reduce((a, b) => (b.length > a.length ? b : a));\n dictionary = dictResolved[best];\n }\n }\n }\n\n // \u547D\u4E2D\u5224\u65AD\uFF1A\u5141\u8BB8\u7A7A\u5B57\u7B26\u4E32 ''\uFF1B\u4EC5 null/undefined \u89C6\u4E3A\u672A\u547D\u4E2D\n if (dictionary && Object.prototype.hasOwnProperty.call(dictionary, key)) {\n const val = dictionary[key];\n if (val != null) {\n return val;\n }\n }\n\n return next();\n };\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["ApiProperty", "ApiProperty", "ApiHeader", "ApiHeader", "Inject", "Scope", "Inject", "Inject", "ModuleRef", "REQUEST", "Inject", "Scope", "ModuleRef", "REQUEST", "HttpException", "Inject", "Injectable", "ModuleRef", "HttpException", "Injectable", "Inject", "ModuleRef", "Module", "createParamDecorator", "Inject", "Injectable", "Injectable", "Inject", "createParamDecorator", "Module", "HttpException", "Inject", "Injectable", "HttpException", "Injectable", "Inject"]
|
|
4
|
+
"sourcesContent": ["import { ApiProperty, ApiPropertyOptions } from '@nestjs/swagger';\n\nexport type AnyClass = new (...args: any[]) => any;\nexport type ClassOrArray = AnyClass | [AnyClass];\nexport type ClassType<T> = new (...args: any[]) => T;\nexport type TypeFromClass<T> = T extends new (...args: any[]) => infer U\n ? U\n : never;\nexport type ParamsFromClass<T> = T extends new (...args: infer U) => any\n ? U\n : never;\nexport type ParseType<IC extends ClassOrArray> = IC extends [infer U]\n ? TypeFromClass<U>[]\n : TypeFromClass<IC>;\n\nexport function getClassFromClassOrArray(o: ClassOrArray) {\n return o instanceof Array ? o[0] : o;\n}\n\nexport interface InsertOptions<C extends ClassOrArray = ClassOrArray> {\n type: C;\n options?: ApiPropertyOptions;\n}\n\ntype TypeFromInsertOptions<O extends InsertOptions> =\n O extends InsertOptions<infer C>\n ?\n | ParseType<C>\n | (O extends { options: { required: true } } ? never : undefined)\n : never;\n\ntype Merge<T, U> = {\n [K in keyof T | keyof U]: K extends keyof T\n ? T[K]\n : K extends keyof U\n ? U[K]\n : never;\n};\n\nexport function InsertField<\n C extends AnyClass,\n M extends Record<string, InsertOptions>,\n>(\n cl: C,\n map: M,\n newName?: string,\n): new (...args: ParamsFromClass<C>) => Merge<\n {\n [F in keyof M]: TypeFromInsertOptions<M[F]>;\n },\n TypeFromClass<C>\n> {\n const extendedCl = class extends cl {};\n for (const key in map) {\n ApiProperty({\n type: map[key].type,\n ...(map[key].options || {}),\n })(extendedCl.prototype, key);\n }\n Object.defineProperty(extendedCl, 'name', {\n value: newName || cl.name,\n });\n return extendedCl;\n}\n", "export function MergePropertyDecorators(\n decs: PropertyDecorator[],\n): PropertyDecorator {\n return (obj, key) => {\n for (const dec of decs) {\n dec(obj, key);\n }\n };\n}\n\nexport function MergeMethodDecorators(\n decs: MethodDecorator[],\n): MethodDecorator {\n return (obj, key, descriptor) => {\n for (const dec of decs) {\n dec(obj, key, descriptor);\n }\n };\n}\n\nexport function MergeClassDecorators(decs: ClassDecorator[]): ClassDecorator {\n return (obj) => {\n for (const dec of decs) {\n dec(obj);\n }\n };\n}\n\nexport function MergeParameterDecorators(\n decs: ParameterDecorator[],\n): ParameterDecorator {\n return (obj, key, index) => {\n for (const dec of decs) {\n dec(obj, key, index);\n }\n };\n}\n\nexport function MergeClassOrMethodDecorators(\n decs: (ClassDecorator & MethodDecorator)[],\n): ClassDecorator & MethodDecorator {\n return (obj, key?, descriptor?) => {\n if (descriptor) {\n for (const dec of decs) {\n dec(obj, key, descriptor);\n }\n } else {\n for (const dec of decs) {\n dec(obj);\n }\n }\n };\n}\n", "import { ApiProperty } from '@nestjs/swagger';\nimport { HttpException } from '@nestjs/common';\nimport {\n AnyClass,\n ClassOrArray,\n getClassFromClassOrArray,\n InsertField,\n ParseType,\n} from './insert-field';\n\nexport interface PageSettingsWise {\n pageCount: number;\n recordsPerPage: number;\n}\n\nexport interface BlankReturnMessage {\n statusCode: number;\n message: string;\n success: boolean;\n timestamp: Date;\n}\n\nexport interface ReturnMessage<T> extends BlankReturnMessage {\n data?: T;\n}\n\nexport class BlankReturnMessageDto implements BlankReturnMessage {\n @ApiProperty({ description: 'Return code', type: Number })\n statusCode: number;\n @ApiProperty({ description: 'Return message', type: String })\n message: string;\n @ApiProperty({ description: 'Whether success.', type: Boolean })\n success: boolean;\n @ApiProperty({ description: 'Return timestamp', type: Date })\n timestamp: Date;\n constructor(statusCode: number, message?: string) {\n this.statusCode = statusCode;\n this.message = message || 'success';\n this.success = statusCode < 400;\n this.timestamp = new Date();\n }\n\n toException() {\n return new HttpException(this, this.statusCode);\n }\n}\n\nexport class BlankPaginatedReturnMessageDto\n extends BlankReturnMessageDto\n implements PageSettingsWise\n{\n @ApiProperty({ description: 'Total record count.', type: Number })\n total: number;\n @ApiProperty({ description: 'Total page count.', type: Number })\n totalPages: number;\n @ApiProperty({ description: 'Current page.', type: Number })\n pageCount: number;\n @ApiProperty({ description: 'Records per page.', type: Number })\n recordsPerPage: number;\n constructor(\n statusCode: number,\n message: string,\n total: number,\n pageSettings: PageSettingsWise,\n ) {\n super(statusCode, message);\n this.total = total;\n this.pageCount = pageSettings.pageCount;\n this.recordsPerPage = pageSettings.recordsPerPage;\n this.totalPages = Math.ceil(total / pageSettings.recordsPerPage);\n }\n}\n\nexport class GenericReturnMessageDto<T>\n extends BlankReturnMessageDto\n implements ReturnMessage<T>\n{\n data?: T;\n constructor(statusCode: number, message?: string, data?: T) {\n super(statusCode, message);\n this.data = data;\n }\n}\n\nexport function ReturnMessageDto<T extends ClassOrArray>(\n type: T,\n): new (\n statusCode: number,\n message: string,\n data: ParseType<T>,\n) => GenericReturnMessageDto<ParseType<T>> {\n return InsertField(\n GenericReturnMessageDto,\n {\n data: {\n type,\n options: {\n required: false,\n description: 'Return data.',\n },\n },\n },\n `${getClassFromClassOrArray(type).name}${Array.isArray(type) ? 'Array' : ''}ReturnMessageDto`,\n );\n}\n\nexport class GenericPaginatedReturnMessageDto<T>\n extends BlankPaginatedReturnMessageDto\n implements PageSettingsWise, ReturnMessage<T[]>\n{\n data: T[];\n constructor(\n statusCode: number,\n message: string,\n data: T[],\n total: number,\n pageSettings: PageSettingsWise,\n ) {\n super(statusCode, message, total, pageSettings);\n this.data = data;\n }\n}\n\nexport function PaginatedReturnMessageDto<T extends AnyClass>(\n type: T,\n): new (\n statusCode: number,\n message: string,\n data: InstanceType<T>[],\n total: number,\n pageSettings: PageSettingsWise,\n) => GenericPaginatedReturnMessageDto<InstanceType<T>> {\n return InsertField(\n GenericPaginatedReturnMessageDto,\n {\n data: {\n type: [type],\n options: {\n required: false,\n description: 'Return data.',\n },\n },\n },\n `${getClassFromClassOrArray(type).name}PaginatedReturnMessageDto`,\n );\n}\n\nexport class StringReturnMessageDto extends GenericReturnMessageDto<string> {\n @ApiProperty({ description: 'Return data.', type: String, required: false })\n data: string;\n}\n", "import { BlankReturnMessageDto, ReturnMessageDto } from './return-message';\nimport { ApiResponse, ApiResponseOptions } from '@nestjs/swagger';\nimport { ClassOrArray } from './insert-field';\n\nexport const ApiTypeResponse = (\n // eslint-disable-next-line @typescript-eslint/ban-types\n type: ClassOrArray,\n options: ApiResponseOptions = {},\n) =>\n ApiResponse({\n status: 200,\n type: ReturnMessageDto(type),\n ...options,\n });\n\nexport const ApiBlankResponse = (options: ApiResponseOptions = {}) =>\n ApiResponse({\n status: 200,\n type: BlankReturnMessageDto,\n ...options,\n });\n\nexport const ApiError = (status: number, description: string) =>\n ApiBlankResponse({ status, description });\n\nexport const ApiErrorTyped = (\n status: number,\n description: string,\n type: ClassOrArray,\n) =>\n ApiTypeResponse(type, {\n status,\n description,\n });\n", "import {\n Body,\n PipeTransform,\n Query,\n Type,\n ValidationPipe,\n} from '@nestjs/common';\n\nexport const DataPipe = () =>\n new ValidationPipe({\n transform: true,\n transformOptions: { enableImplicitConversion: true },\n });\n\nconst createDataPipeDec =\n (\n nestFieldDec: (\n ...pipes: (Type<PipeTransform> | PipeTransform)[]\n ) => ParameterDecorator,\n ) =>\n (...extraPipes: (Type<PipeTransform> | PipeTransform)[]) =>\n nestFieldDec(DataPipe(), ...extraPipes);\n\nexport const DataQuery = createDataPipeDec(Query);\nexport const DataBody = createDataPipeDec(Body);\n", "import {\n CanActivate,\n ExecutionContext,\n Inject,\n Injectable,\n UseGuards,\n} from '@nestjs/common';\nimport { ConfigService } from '@nestjs/config';\nimport { ApiHeader } from '@nestjs/swagger';\nimport { BlankReturnMessageDto } from './return-message';\nimport { MergeClassOrMethodDecorators } from './merge';\nimport { ApiError } from './openapi';\nimport {\n ApiFromResolver,\n createResolver,\n ResolverDual,\n ResolverDynamic,\n} from './resolver';\nimport { MetadataSetter, Reflector } from 'typed-reflector';\nimport { ModuleRef } from '@nestjs/core';\n\nexport interface RequireTokenOptions {\n resolver?: ResolverDual;\n tokenSource?: string | ResolverDynamic;\n errorCode?: number;\n}\n\ntype RequireTokenMetadataMap = {\n requireTokenOptions: RequireTokenOptions;\n};\n\nconst reflector = new Reflector<RequireTokenMetadataMap, {}>();\nconst Metadata = new MetadataSetter<RequireTokenMetadataMap, {}>();\n\nconst defaultHeaderName = 'x-server-token';\nconst defaultConfigName = 'SERVER_TOKEN';\nconst defaultErrorCode = 401;\n\n@Injectable()\nexport class TokenGuard implements CanActivate {\n constructor(\n @Inject(ConfigService) private config: ConfigService,\n @Inject(ModuleRef) private moduleRef: ModuleRef,\n ) {}\n\n async canActivate(context: ExecutionContext) {\n const controller = context.getClass();\n const handlerName = context.getHandler()?.name;\n let config = {} as RequireTokenOptions;\n if (controller) {\n if (handlerName) {\n config =\n reflector.get('requireTokenOptions', controller, handlerName) || {};\n } else {\n config = reflector.get('requireTokenOptions', controller) || {};\n }\n }\n const resolver = createResolver(\n config.resolver || { paramType: 'header', paramName: defaultHeaderName },\n );\n const tokenSource = config.tokenSource || defaultConfigName;\n const [tokenFromClient, tokenFromConfig] = await Promise.all([\n resolver(context, this.moduleRef),\n typeof tokenSource === 'function'\n ? tokenSource(context, this.moduleRef)\n : this.config.get<string>(tokenSource),\n ]);\n if (tokenFromConfig && tokenFromConfig !== tokenFromClient) {\n throw new BlankReturnMessageDto(\n config.errorCode || defaultErrorCode,\n 'Unauthorized',\n ).toException();\n }\n return true;\n }\n}\n\nexport const RequireToken = (options: RequireTokenOptions = {}) => {\n const swaggerDec = options.resolver\n ? ApiFromResolver(options.resolver, {\n description: 'Server token',\n required: false,\n })\n : ApiHeader({\n name: defaultHeaderName,\n description: 'Server token',\n required: false,\n });\n return MergeClassOrMethodDecorators([\n UseGuards(TokenGuard),\n swaggerDec,\n ApiError(\n options.errorCode || defaultErrorCode,\n 'Incorrect server token provided',\n ),\n ...(options ? [Metadata.set('requireTokenOptions', options)] : []),\n ]);\n};\n", "import type { Request } from 'express';\nimport { Awaitable } from './utility/awaitable';\nimport { ExecutionContext } from '@nestjs/common';\nimport { ModuleRef } from '@nestjs/core';\nimport {\n ApiHeader,\n ApiHeaderOptions,\n ApiQuery,\n ApiQueryOptions,\n} from '@nestjs/swagger';\n\nexport interface ResolverStatic {\n paramType: 'header' | 'query';\n paramName: string;\n}\n\nexport type ResolverDynamic = (\n ctx: ExecutionContext,\n ref: ModuleRef,\n) => Awaitable<string>;\n\nexport type ResolverDual = ResolverStatic | ResolverDynamic;\n\ntype AnyReq = Request & {\n headers?: Record<string, any>;\n query?: any;\n url?: string;\n originalUrl?: string;\n getHeader?: (name: string) => any;\n get?: (name: string) => any;\n header?: (name: string) => any;\n};\n\nconst coerceToString = (v: any): string | undefined => {\n if (v == null) return undefined; // null / undefined\n if (v === false) return undefined; // \uD83D\uDC48 \u5173\u952E\uFF1A\u628A false \u5F53\u4F5C\u672A\u547D\u4E2D\n if (Array.isArray(v)) return v.length ? coerceToString(v[0]) : undefined;\n if (typeof v === 'string') return v;\n if (typeof v === 'number') return String(v);\n // \u5176\u4ED6\u7C7B\u578B\uFF08true / object / function / symbol / bigint\uFF09\u90FD\u4E0D\u63A5\u53D7\n return undefined;\n};\n\nconst getHeader = (req: AnyReq, name: string): string | undefined => {\n // \u5148\u8D70\u65B9\u6CD5\uFF08express/\u90E8\u5206\u9002\u914D\u5668\uFF09\n const viaMethod =\n (typeof req.getHeader === 'function' && req.getHeader(name)) ||\n (typeof (req as any).header === 'function' && (req as any).header(name)) ||\n (typeof (req as any).get === 'function' && (req as any).get(name));\n\n if (viaMethod) {\n return coerceToString(viaMethod);\n }\n\n // \u518D\u67E5 headers\uFF0C\u5927\u5C0F\u5199\u65E0\u5173\n const n = name.toLowerCase();\n const headers = req.headers ?? {};\n if (n in headers) return coerceToString((headers as any)[n]);\n\n const hit = Object.entries(headers).find(([k]) => k.toLowerCase() === n)?.[1];\n return coerceToString(hit);\n};\n\nconst pickPrimaryFromAcceptLanguage = (v?: string): string | undefined => {\n if (!v) return undefined;\n const first = v.split(',')[0]?.trim();\n return first?.split(';')[0]?.trim() || first;\n};\n\nfunction getQueryValue(req: AnyReq, key: string): string | undefined {\n // 1. \u666E\u901A\u5BF9\u8C61\u6A21\u5F0F\uFF08Express/Fastify \u5DF2\u89E3\u6790\uFF09\n const q = req.query;\n if (q && typeof q === 'object' && !('raw' in q)) {\n const v = (q as any)[key];\n if (v != null) return coerceToString(v);\n }\n\n // 2. fallback\uFF1A\u89E3\u6790 URLSearchParams\n const rawUrl = req.originalUrl ?? req.url;\n if (typeof rawUrl === 'string' && rawUrl.includes('?')) {\n try {\n // \u7528 http://localhost \u5360\u4F4D base\uFF0C\u907F\u514D\u76F8\u5BF9\u8DEF\u5F84\u9519\u8BEF\n const search = rawUrl.startsWith('http')\n ? new URL(rawUrl).search\n : new URL(rawUrl, 'http://localhost').search;\n\n if (search) {\n const params = new URLSearchParams(search);\n const val = params.get(key);\n if (val != null) return val;\n }\n } catch {\n // ignore malformed URL\n }\n }\n return undefined;\n}\n\nexport const createResolver = (_options: ResolverDual): ResolverDynamic => {\n if (typeof _options === 'function') {\n // it's already dynamic\n return _options;\n }\n const options = _options as ResolverStatic;\n const field = options.paramType; // 'header' | 'query'\n let name = options.paramName;\n if (field === 'header') name = name.toLowerCase();\n\n return (ctx) => {\n const req = ctx.switchToHttp().getRequest<AnyReq>();\n\n if (field === 'header') {\n let raw = getHeader(req, name);\n if (name === 'accept-language') raw = pickPrimaryFromAcceptLanguage(raw);\n return raw;\n }\n\n if (field === 'query') {\n return getQueryValue(req, name);\n }\n\n throw new Error(`Unsupported paramType: ${field}`);\n };\n};\n\nexport const ApiFromResolver = (\n _options: ResolverDual,\n extras: ApiHeaderOptions | ApiQueryOptions = {},\n): ClassDecorator & MethodDecorator => {\n if (typeof _options === 'function') {\n // dynamic resolver, no static param info\n return () => {};\n }\n const options = _options as ResolverStatic;\n const paramType = (options as ResolverStatic)?.paramType;\n const apiOptions: ApiHeaderOptions = {\n name: (options as ResolverStatic).paramName,\n ...extras,\n };\n return paramType === 'header'\n ? ApiHeader(apiOptions)\n : paramType === 'query'\n ? ApiQuery({ type: 'string', ...apiOptions })\n : () => {};\n};\n", "import { Observable, takeUntil } from 'rxjs';\nimport { createParamDecorator, ExecutionContext } from '@nestjs/common';\nimport type { Request } from 'express';\nimport { createAbortSignalFromHttp } from './utility/abort-http-signal';\n\nexport type AbortableFn<T> = (ac: AbortController) => Promise<T>;\n\nexport const fromAbortable = <T>(fn: AbortableFn<T>): Observable<T> => {\n return new Observable<T>((subscriber) => {\n const ac = new AbortController();\n\n fn(ac).then(\n (value) => {\n if (!ac.signal.aborted && !subscriber.closed) {\n subscriber.next(value);\n subscriber.complete();\n }\n },\n (err) => {\n if (ac.signal.aborted) {\n if (!subscriber.closed) subscriber.complete();\n return;\n }\n if (!subscriber.closed) subscriber.error(err);\n },\n );\n\n return () => {\n if (!ac.signal.aborted) ac.abort();\n };\n });\n};\n\nexport const takeUntilAbort = <T>(signal: AbortSignal) => {\n return (source: Observable<T>) => {\n return source.pipe(\n takeUntil(\n new Observable<void>((subscriber) => {\n const onAbort = () => subscriber.next();\n if (signal.aborted) {\n subscriber.next();\n } else {\n signal.addEventListener('abort', onAbort, { once: true });\n }\n return () => signal.removeEventListener('abort', onAbort);\n }),\n ),\n );\n };\n};\n\nexport const As = createParamDecorator(\n (_data: unknown, ctx: ExecutionContext) => {\n const req = ctx.switchToHttp().getRequest<Request>();\n return createAbortSignalFromHttp(req);\n },\n);\n", "// abort-http-signal.ts\nimport type { IncomingMessage } from 'http';\nimport type { Request as ExpressReq } from 'express';\nimport type { FastifyRequest } from 'fastify';\nimport { BlankReturnMessageDto } from '../return-message';\n\ntype AnyReq = ExpressReq | FastifyRequest | IncomingMessage;\n\nfunction toRawReq(req: AnyReq): IncomingMessage {\n // Fastify: req.raw \u662F IncomingMessage\uFF1BExpress: req \u672C\u8EAB\u5C31\u662F IncomingMessage\n if ((req as any)?.raw?.socket) return (req as any).raw as IncomingMessage;\n return req as IncomingMessage;\n}\n\n/**\n * \u4EC5\u901A\u8FC7 req \u81EA\u52A8\u9002\u914D Express/Fastify\uFF0C\u7ED1\u5B9A HTTP \u53D6\u6D88\u5230 AbortSignal\u3002\n * - \u4F18\u5148\u76D1\u542C 'aborted'\uFF08\u5BA2\u6237\u7AEF\u4E2D\u65AD\u6700\u53EF\u9760\u7684\u4FE1\u53F7\uFF09\n * - \u53EF\u9009\u515C\u5E95\uFF1A\u5728 socket 'close' \u65F6\uFF0C\u4EC5\u5F53\u8BF7\u6C42\u672A\u5B8C\u6574\u63A5\u6536/\u6216\u5DF2\u6807\u8BB0 aborted \u65F6\uFF0C\u624D\u89E6\u53D1 abort\uFF0C\u907F\u514D\u6B63\u5E38\u5B8C\u6210\u7684\u8BEF\u4F24\n * - reason \u56FA\u5B9A\u4E3A 499 HttpException\n *\n * \u6CE8\u610F\uFF1A\u82E5\u4F60\u7684 abortable() \u5728 signal.reason \u662F Error \u65F6\u4F1A\u201C\u539F\u6837 throw reason\u201D\uFF0C\n * \u90A3\u4E48\u4E0A\u5C42\u4F1A\u6536\u5230 HttpException(499)\u3002\u82E5\u4ECD\u60F3\u7EDF\u4E00\u629B AbortedError\uFF0C\u53EF\u6539\u4E3A\uFF1A\n * const reason = new AbortedError('Request aborted', httpErr);\n * \u5E76\u8BA9 throwIfAborted \u5148\u629B AbortedError\uFF08\u4FDD\u7559 cause\uFF09\u3002\n */\nexport function createAbortSignalFromHttp(req: AnyReq): AbortSignal {\n const rawReq = toRawReq(req);\n const ac = new AbortController();\n\n const makeReason = () =>\n new BlankReturnMessageDto(499, 'Request aborted').toException();\n\n const abortOnce = () => {\n if (!ac.signal.aborted) ac.abort(makeReason());\n cleanup();\n };\n\n const onClose = () => {\n abortOnce();\n };\n\n const cleanup = () => {\n rawReq.off?.('close', onClose);\n };\n\n rawReq.once?.('close', onClose);\n\n return ac.signal;\n}\n", "import { Inject, Scope } from '@nestjs/common';\nimport { abortable, AbortableOpts } from 'nfkit';\nimport { ABORT_SIGNAL } from './abort-signal.provider';\nimport { ContextIdFactory, ModuleRef, REQUEST } from '@nestjs/core';\nimport { createProvider } from '../create-provider';\nimport { InjectionToken } from '@nestjs/common/interfaces/modules/injection-token.interface';\n\nconst tokenMemo = new Map<any, symbol>();\nexport const abortableToken = (token: InjectionToken) => {\n if (tokenMemo.has(token)) return tokenMemo.get(token)!;\n const name = typeof token === 'function' ? token.name : String(token);\n const sym = Symbol.for(`Abortable(${name})`);\n tokenMemo.set(token, sym);\n return sym;\n};\n\n/**\n * \u652F\u6301\u4E24\u79CD\u7528\u6CD5\uFF1A\n * @InjectAbortable(SomeService)\n * @InjectAbortable() // \u81EA\u52A8\u63A8\u65AD\u7C7B\u578B\n */\nexport function InjectAbortable(token?: InjectionToken): ParameterDecorator {\n return (target, propertyKey, parameterIndex) => {\n let actualToken = token;\n\n if (!actualToken) {\n // \u5229\u7528 reflect-metadata \u83B7\u53D6\u53C2\u6570\u7C7B\u578B\n const paramTypes: any[] =\n Reflect.getMetadata('design:paramtypes', target, propertyKey) || [];\n actualToken = paramTypes[parameterIndex];\n if (!actualToken) {\n throw new Error(\n `@InjectAbortable() cannot infer type from metadata: ${target.constructor?.name}[${parameterIndex}]`,\n );\n }\n }\n\n Inject(abortableToken(actualToken))(target, propertyKey, parameterIndex);\n };\n}\n\nexport function createAbortableProvider<T>(\n token: InjectionToken<T>,\n opts?: AbortableOpts,\n) {\n const provide = abortableToken(token);\n\n return createProvider(\n {\n provide,\n scope: Scope.REQUEST,\n inject: [ModuleRef, REQUEST, ABORT_SIGNAL],\n },\n async (moduleRef, req: Request, signal) => {\n // \u8BA9\u89E3\u6790\u4E0E\u5F53\u524D\u8BF7\u6C42\u4E0A\u4E0B\u6587\u7ED1\u5B9A\uFF08\u652F\u6301 request/transient \u4F5C\u7528\u57DF\uFF09\n const ctxId = ContextIdFactory.getByRequest(req);\n // \u4E25\u683C\u6A21\u5F0F\u5173\u95ED\uFF0C\u5141\u8BB8\u8DE8\u6A21\u5757\u8FB9\u754C\u89E3\u6790\uFF08\u89E3\u51B3\u6D4B\u8BD5\u91CC forFeature \u5B50\u6A21\u5757\u770B\u4E0D\u5230 DemoService \u7684\u60C5\u51B5\uFF09\n const svc = await moduleRef.resolve<T>(token, ctxId, { strict: false });\n if (svc == null) {\n throw new Error(\n `Abortable: provider \"${String(\n (token as any).name ?? token,\n )}\" not found in container (even with strict:false)`,\n );\n }\n return abortable<T>(svc, signal, opts);\n },\n );\n}\n", "import { Inject, Scope, Type } from '@nestjs/common';\nimport { REQUEST } from '@nestjs/core';\nimport { createAbortSignalFromHttp } from '../utility/abort-http-signal';\nimport { createProvider } from '../create-provider';\n\nexport const ABORT_SIGNAL = Symbol(\n 'ABORT_SIGNAL',\n) as unknown as Type<AbortSignal>;\nexport const AbortSignalProvider = createProvider(\n {\n provide: ABORT_SIGNAL,\n scope: Scope.REQUEST,\n inject: [REQUEST],\n },\n createAbortSignalFromHttp,\n);\n\nexport const InjectAbortSignal = () => Inject(ABORT_SIGNAL);\n", "import { FactoryProvider } from '@nestjs/common';\nimport { InjectionToken } from '@nestjs/common/interfaces/modules/injection-token.interface';\n\ntype TypeFromToken<T> = T extends string | symbol\n ? any\n : T extends InjectionToken<infer U>\n ? U\n : any;\n\ntype TokensToTypes<A extends InjectionToken[]> = A extends []\n ? []\n : A extends [infer F, ...infer R]\n ? [TypeFromToken<F>, ...TokensToTypes<R extends InjectionToken[] ? R : []>]\n : [];\n\ntype Awaitable<T> = T | Promise<T>;\n\nexport interface TypedFactoryProvider<A extends InjectionToken[], R>\n extends FactoryProvider<R> {\n inject: A;\n useFactory: (...args: TokensToTypes<A>) => Awaitable<R>;\n}\n\nexport const createProvider = <const A extends InjectionToken[], R>(\n options: { inject: A } & Omit<FactoryProvider<R>, 'inject' | 'useFactory'>,\n factory: (...args: TokensToTypes<A>) => Awaitable<R>,\n): TypedFactoryProvider<A, R> => {\n return {\n useFactory: factory,\n ...options,\n };\n};\n", "import { DynamicModule, Module } from '@nestjs/common';\nimport { createAbortableProvider } from './abortable.token';\nimport { AbortableOpts } from 'nfkit';\nimport { AbortSignalProvider } from './abort-signal.provider';\nimport { InjectionToken } from '@nestjs/common/interfaces/modules/injection-token.interface';\n\nexport interface AbortableModuleOptions {\n abortableOptions?: AbortableOpts;\n}\n\n@Module({})\nexport class AbortableModule {\n static forRoot(): DynamicModule {\n return {\n module: AbortableModule,\n providers: [AbortSignalProvider],\n exports: [AbortSignalProvider],\n global: true,\n };\n }\n\n static forFeature(\n tokens: InjectionToken[],\n options?: AbortableModuleOptions,\n ): DynamicModule {\n const providers = tokens.map((token) =>\n createAbortableProvider(token, options?.abortableOptions),\n );\n\n return {\n module: AbortableModule,\n providers: [...providers],\n exports: [...providers],\n };\n }\n}\n", "import {\n ConsoleLogger,\n ExecutionContext,\n HttpException,\n Inject,\n Injectable,\n} from '@nestjs/common';\nimport { I18nModuleOptionsToken } from './i18n-token';\nimport { I18nModuleOptions } from './i18n-module.options';\nimport { I18nMiddleware } from './i18n-middleware.type';\nimport { parseI18n } from '../utility/parse-i18n';\nimport { ModuleRef } from '@nestjs/core';\nimport { createResolver } from '../resolver';\n\n@Injectable()\nexport class I18nService {\n constructor(\n @Inject(I18nModuleOptionsToken) private options: I18nModuleOptions,\n @Inject(ModuleRef) private moduleRef: ModuleRef,\n ) {}\n\n private resolver = createResolver(this.options.resolver);\n\n private locales = new Set(this.options.locales);\n private defaultLocale = this.options.defaultLocale ?? this.options.locales[0];\n\n private middlewares: I18nMiddleware[] = [];\n\n middleware(mw: I18nMiddleware, prior = false) {\n if (prior) {\n this.middlewares.unshift(mw);\n } else {\n this.middlewares.push(mw);\n }\n }\n\n private logger = new ConsoleLogger('I18nService');\n\n private buildFallbackChain(locale: string): string[] {\n const best = this.getExactLocale(locale); // \u4F60\u7684\u201C\u6700\u957F\u5339\u914D\u201D\u51FD\u6570\n // \u62C6\u5206 zh-Hans-CN -> ['zh-Hans-CN','zh-Hans','zh']\n const parts: string[] = [];\n const segs = best.split('-');\n for (let i = segs.length; i > 1; i--)\n parts.push(segs.slice(0, i).join('-'));\n parts.push(segs[0]); // 'zh'\n // \u9644\u52A0\u9ED8\u8BA4\u8BED\u8A00\n if (!parts.includes(this.defaultLocale)) parts.push(this.defaultLocale);\n // \u53BB\u91CD\n return Array.from(new Set(parts)).filter((p) => this.locales.has(p));\n }\n\n private async applyMiddlewares(\n locale: string,\n text: string,\n ctx?: ExecutionContext,\n ): Promise<string | undefined> {\n const mws = this.middlewares;\n\n const tryLocale = async (loc: string) => {\n const dispatch = async (i: number): Promise<string | undefined> => {\n if (i >= mws.length) return undefined;\n\n const mw = mws[i];\n let nextCalled = false;\n\n const next = async (): Promise<string | undefined> => {\n nextCalled = true;\n return dispatch(i + 1);\n };\n\n try {\n const res = await mw(loc, text, next, ctx as any);\n if (res == null && !nextCalled) {\n return dispatch(i + 1);\n }\n return res;\n } catch (e) {\n if (e instanceof HttpException) {\n // this HttpException should throw up directly\n throw e;\n }\n this.logger.warn(`Middleware at index ${i} threw an error: ${e}`);\n return dispatch(i + 1);\n }\n };\n return dispatch(0);\n };\n\n for (const loc of this.buildFallbackChain(locale)) {\n const result = await tryLocale(loc);\n if (result != null) {\n return result;\n }\n }\n return undefined;\n }\n\n getExactLocale(locale: string) {\n const input = (locale ?? '').trim();\n if (!input) return this.defaultLocale;\n\n if (this.locales.has(input)) return input;\n\n // \u5C0F\u5199\u5316\u6BD4\u8F83\uFF0C\u4FDD\u7559\u539F\u5927\u5C0F\u5199\n const entries = Array.from(this.locales).map((l) => ({\n orig: l,\n lower: l.toLowerCase(),\n }));\n const lower = input.toLowerCase();\n\n // 1) \u7CBE\u786E\u5339\u914D\uFF08\u5927\u5C0F\u5199\u4E0D\u654F\u611F\uFF09\n const exact = entries.find((e) => e.lower === lower);\n if (exact) return exact.orig;\n\n // 2) \u6309 '-' \u62C6\u5206\uFF0C\u4F9D\u6B21\u5C1D\u8BD5\u53BB\u6389\u6700\u53F3\u8FB9\u7684\u6BB5\n // zh-Hans-CN \u2192 zh-Hans \u2192 zh\n const parts = lower.split('-');\n while (parts.length > 1) {\n parts.pop();\n const candidate = parts.join('-');\n const hit = entries.find((e) => e.lower === candidate);\n if (hit) return hit.orig;\n }\n\n // 3) \u515C\u5E95\n return this.defaultLocale;\n }\n\n async getExactLocaleFromRequest(ctx: ExecutionContext) {\n const locale = await this.resolver(ctx, this.moduleRef);\n return this.getExactLocale(locale);\n }\n\n async translateString(\n locale: string,\n text: string,\n ctx?: ExecutionContext,\n ): Promise<string> {\n if (!text) return text;\n\n locale = this.getExactLocale(locale);\n\n const pieces = parseI18n(text);\n if (!pieces.some((p) => p.type === 'ph')) {\n return pieces\n .map((p) => (p.type === 'raw' ? p.value : `#{${p.rawInner}}`))\n .join('');\n }\n\n const promises: Array<Promise<string | undefined | null>> = [];\n\n for (const p of pieces) {\n if (p.type === 'ph') {\n promises.push(this.applyMiddlewares(locale, p.key, ctx));\n }\n }\n\n const results = await Promise.all(promises);\n\n let out = '';\n let k = 0;\n for (const p of pieces) {\n if (p.type === 'raw') {\n out += p.value;\n } else {\n const r = results[k++];\n out += r == null ? `#{${p.rawInner}}` : r;\n }\n }\n return out;\n }\n\n async translate<T>(\n locale: string,\n obj: T,\n ctx?: ExecutionContext,\n ): Promise<T> {\n const visited = new WeakSet<object>();\n\n const isBuiltInObject = (v: any): boolean => {\n if (v == null || typeof v !== 'object') return false;\n if (\n v instanceof Date ||\n v instanceof RegExp ||\n v instanceof Map ||\n v instanceof Set ||\n v instanceof WeakMap ||\n v instanceof WeakSet ||\n v instanceof ArrayBuffer ||\n v instanceof DataView ||\n ArrayBuffer.isView(v) // TypedArray / Buffer\n )\n return true;\n\n const tag = Object.prototype.toString.call(v);\n switch (tag) {\n case '[object URL]':\n case '[object URLSearchParams]':\n case '[object Error]':\n case '[object Blob]':\n case '[object File]':\n case '[object FormData]':\n return true;\n default:\n return false;\n }\n };\n\n const translateObjectPreservingProto = async (value: any): Promise<any> => {\n const proto = Object.getPrototypeOf(value);\n const out = Object.create(proto);\n\n const keys = Reflect.ownKeys(value);\n\n await Promise.all(\n keys.map(async (key) => {\n const desc = Object.getOwnPropertyDescriptor(value, key as any);\n if (!desc) return;\n\n // \u6570\u636E\u5C5E\u6027\uFF1A\u5E76\u53D1\u9012\u5F52\u5176 value\uFF0C\u4FDD\u6301\u539F\u5C5E\u6027\u7279\u6027\n if ('value' in desc) {\n const newVal = await visit(desc.value);\n Object.defineProperty(out, key, { ...desc, value: newVal });\n return;\n }\n\n // \u8BBF\u95EE\u5668\u5C5E\u6027\uFF1A\u5148\u590D\u5236 getter/setter\uFF0C\u518D\u5C1D\u8BD5\u8BFB\u503C\u2192\u7FFB\u8BD1\u2192\u5199\u56DE\n Object.defineProperty(out, key, desc);\n\n // \u6CA1\u6709 getter \u5C31\u65E0\u9700\u5904\u7406\uFF1B\u6709 getter \u4F46\u629B\u9519\u4E5F\u5FFD\u7565\n let current: any = undefined;\n if (typeof desc.get === 'function') {\n try {\n current = desc.get.call(value);\n } catch {\n /* ignore */\n }\n }\n if (current === undefined) return;\n\n // \u9012\u5F52\u7FFB\u8BD1 getter \u8FD4\u56DE\u7684\u503C\uFF1B\u82E5\u6709 setter \u5219\u5199\u56DE\n try {\n const newVal = await visit(current);\n if (typeof desc.set === 'function') {\n try {\n desc.set.call(out, newVal);\n } catch {\n /* ignore */\n }\n }\n } catch {\n // \u7FFB\u8BD1\u5931\u8D25\u4E0D\u5F71\u54CD\u5176\u4ED6\u952E\n }\n }),\n );\n\n return out;\n };\n\n const isTranslatable = (\n v: any,\n ): { ok: false } | { ok: true; kind: 'string' | 'object' } => {\n // 1) \u6240\u6709 falsy \u539F\u6837\uFF08null/undefined/false/0/''/NaN\uFF09\n if (!v) return { ok: false };\n\n // 2) \u57FA\u672C\u7C7B\u578B\u8FC7\u6EE4\n const t = typeof v;\n if (\n t === 'number' ||\n t === 'bigint' ||\n t === 'symbol' ||\n t === 'function'\n ) {\n return { ok: false };\n }\n\n // 3) \u53EF\u7FFB\u8BD1\uFF1A\u5B57\u7B26\u4E32 or \u5BF9\u8C61\uFF08\u5BF9\u8C61\u518D\u7531\u540E\u7EED\u903B\u8F91\u51B3\u5B9A\u662F\u5426\u6DF1\u5165\uFF09\n if (t === 'string') return { ok: true, kind: 'string' };\n if (t === 'object') {\n return { ok: true, kind: 'object' };\n }\n\n // \u5176\u5B83\uFF08boolean \u7B49\u5DF2\u5305\u542B\u5728 falsy/\u57FA\u672C\u7C7B\u578B\u91CC\uFF09\n return { ok: false };\n };\n\n const visit = async (value: any): Promise<any> => {\n // 1) \u68C0\u67E5\u662F\u5426\u53EF\u7FFB\u8BD1\n const check = isTranslatable(value);\n\n // 2) \u4E0D\u53EF\u7FFB\u8BD1\u7684\u539F\u6837\u8FD4\u56DE\n if (!check.ok) {\n return value;\n }\n\n if (check.kind === 'string') {\n // 3) \u5B57\u7B26\u4E32\uFF1A\u7FFB\u8BD1\n return this.translateString(locale, value, ctx);\n }\n\n // 4) Promise\uFF1A\u4E0D\u9690\u5F0F\u5C55\u5F00\uFF08\u4FDD\u6301\u8BED\u4E49\uFF09\n if (value instanceof Promise) {\n return value.then((resolved) => visit(resolved));\n }\n\n // 5) \u5BF9\u8C61\u7C7B\uFF1A\u8FC7\u6EE4\u5185\u7F6E\u5BF9\u8C61\n if (typeof value === 'object') {\n if (!Array.isArray(value) && isBuiltInObject(value)) return value;\n\n // \u9632\u73AF\n if (visited.has(value)) return value;\n visited.add(value);\n\n // \u6570\u7EC4\uFF1A\u5143\u7D20\u7EA7\u9012\u5F52\n if (Array.isArray(value)) {\n const out = await Promise.all(value.map((v) => visit(v)));\n return out as any;\n }\n\n // \u5176\u4ED6\u5BF9\u8C61\uFF08\u542B\u7C7B\u5B9E\u4F8B/DTO\uFF09\uFF1A\u4FDD\u7559\u539F\u578B\u5E76\u9012\u5F52\u81EA\u6709\u5C5E\u6027\n return translateObjectPreservingProto(value);\n }\n\n // \u5176\u4F59\u7C7B\u578B\uFF08boolean \u7B49\uFF09\u539F\u6837\u8FD4\u56DE\n return value;\n };\n\n return visit(obj);\n }\n\n async translateRequest(ctx: ExecutionContext, obj: any): Promise<any> {\n const locale = await this.resolver(ctx, this.moduleRef);\n return this.translate(locale, obj, ctx);\n }\n}\n", "import { ConfigurableModuleBuilder } from '@nestjs/common';\nimport { I18nModuleOptions } from './i18n-module.options';\n\nexport const I18nResolverToken = Symbol('I18nResolverToken');\n\nconst { ConfigurableModuleClass, MODULE_OPTIONS_TOKEN } =\n new ConfigurableModuleBuilder<I18nModuleOptions>()\n // .setExtras({}, (def) => ({ ...def, global: true }))\n .build();\nexport const I18nModuleOptionsToken = MODULE_OPTIONS_TOKEN;\nexport { ConfigurableModuleClass as I18nModuleBase };\n", "// \u2014\u2014 \u89E3\u6790\u7ED3\u679C\u7ED3\u6784 \u2014\u2014 //\nexport type I18nPiece =\n | { type: 'raw'; value: string }\n | { type: 'ph'; rawInner: string; key: string };\n\n/**\n * \u6808\u5F0F\u89E3\u6790 #{ ... } \u5360\u4F4D\u3002\u652F\u6301\u5185\u90E8\u6210\u5BF9\u82B1\u62EC\u53F7\uFF0C\u5982 #{ foo {{ bar }} }\u3002\n * - \u672A\u95ED\u5408\u65F6\uFF1A\u628A\u4ECE\u4E0A\u6B21\u4F4D\u7F6E i \u5230\u7ED3\u5C3E\u6574\u4F53\u4F5C\u4E3A raw \u653E\u56DE\uFF08\u907F\u514D\u88AB\u62C6\u6210\u4E24\u6BB5\uFF09\n * - key = trim(rawInner)\n */\nexport const parseI18n = (text: string): I18nPiece[] => {\n const pieces: I18nPiece[] = [];\n if (!text) return pieces;\n\n let i = 0;\n const n = text.length;\n\n while (i < n) {\n const start = text.indexOf('#{', i);\n if (start === -1) {\n // \u6CA1\u6709\u66F4\u591A\u5360\u4F4D\u7B26\n if (i < n) pieces.push({ type: 'raw', value: text.slice(i) });\n break;\n }\n\n // \u5148\u5C1D\u8BD5\u5339\u914D\u8FD9\u4E2A\u5360\u4F4D\u7B26\u662F\u5426\u95ED\u5408\uFF08\u6B64\u65F6\u4E0D\u7ACB\u5373\u63A8\u5165\u524D\u5BFC raw\uFF09\n let j = start + 2; // \u6307\u5411 '#{' \u540E\u7B2C\u4E00\u4E2A\u5B57\u7B26\n let depth = 1;\n while (j < n && depth > 0) {\n const ch = text.charCodeAt(j);\n if (ch === 123 /* '{' */) depth++;\n else if (ch === 125 /* '}' */) depth--;\n j++;\n }\n\n if (depth !== 0) {\n // \u672A\u95ED\u5408\uFF1A\u628A\u4ECE i \u5230\u672B\u5C3E\u6574\u4F53\u5F53\u4F5C raw\uFF08\u5305\u542B\u524D\u5BFC + '#{' \u5C3E\u5DF4\uFF09\n pieces.push({ type: 'raw', value: text.slice(i) });\n break;\n }\n\n // \u5230\u8FD9\u91CC\u8BF4\u660E\u5360\u4F4D\u95ED\u5408\uFF1A\u5148\u63A8\u5165\u524D\u5BFC raw\uFF0C\u518D\u63A8\u5360\u4F4D\u7247\u6BB5\n if (start > i) {\n pieces.push({ type: 'raw', value: text.slice(i, start) });\n }\n\n const rawInner = text.slice(start + 2, j - 1);\n const key = rawInner.trim();\n pieces.push({ type: 'ph', rawInner, key });\n\n i = j; // \u7EE7\u7EED\u5411\u540E\u626B\u63CF\n }\n\n return pieces;\n};\n", "import { Global, Module } from '@nestjs/common';\nimport { I18nModuleBase } from './i18n-token';\nimport { I18nService } from './i18n.service';\nimport { LocalePipe } from './locale.pipe';\n\n@Global()\n@Module({\n providers: [I18nService, LocalePipe],\n exports: [I18nService, LocalePipe],\n})\nexport class I18nModule extends I18nModuleBase {}\n", "import {\n ArgumentMetadata,\n createParamDecorator,\n ExecutionContext,\n Inject,\n Injectable,\n PipeTransform,\n} from '@nestjs/common';\nimport { I18nService } from './i18n.service';\nimport { createResolver, ResolverDual } from '../resolver';\nimport { ModuleRef } from '@nestjs/core';\n\ntype LocaleContext = {\n ctx: ExecutionContext;\n resolver?: ResolverDual;\n};\n\n@Injectable()\nexport class LocalePipe implements PipeTransform {\n constructor(\n @Inject(I18nService) private i18nService: I18nService,\n @Inject(ModuleRef) private moduleRef: ModuleRef,\n ) {}\n\n async transform(ctx: LocaleContext, metadata: ArgumentMetadata) {\n const resolver = ctx.resolver;\n if (resolver) {\n const _resolver = createResolver(resolver);\n const locale = await _resolver(ctx.ctx, this.moduleRef);\n return this.i18nService.getExactLocale(locale);\n } else {\n return this.i18nService.getExactLocaleFromRequest(ctx.ctx);\n }\n }\n}\n\nconst _dec = createParamDecorator((resolver: ResolverDual | undefined, ctx) => {\n return { ctx, resolver };\n});\n\nexport const PutLocale = (resolver?: ResolverDual) =>\n _dec(resolver, LocalePipe);\n", "import { I18nModuleOptions } from './i18n-module.options';\nimport { ApiFromResolver } from '../resolver';\nimport { MergeClassOrMethodDecorators } from '../merge';\nimport { UseInterceptors } from '@nestjs/common';\nimport { I18nInterceptor } from './i18n.interceptor';\n\nexport const createI18nDecorator = (options: I18nModuleOptions) => {\n return () =>\n MergeClassOrMethodDecorators([\n UseInterceptors(I18nInterceptor),\n ApiFromResolver(options.resolver, {\n description: 'Locale for internationalization',\n required: false,\n default: options.defaultLocale ?? options.locales[0],\n enum: options.locales,\n }),\n ]);\n};\n", "import {\n CallHandler,\n ExecutionContext,\n HttpException,\n Inject,\n Injectable,\n NestInterceptor,\n} from '@nestjs/common';\nimport { from, throwError } from 'rxjs';\nimport { catchError, mergeMap } from 'rxjs/operators';\nimport { I18nService } from './i18n.service';\n\n@Injectable()\nexport class I18nInterceptor implements NestInterceptor {\n constructor(@Inject(I18nService) private readonly i18nService: I18nService) {}\n\n intercept(context: ExecutionContext, next: CallHandler) {\n return next.handle().pipe(\n // \u6210\u529F\u8DEF\u5F84\uFF1A\u628A\u54CD\u5E94\u4F53\u4EA4\u7ED9 i18n \u505A\u5F02\u6B65\u7FFB\u8BD1\n mergeMap((data) => this.i18nService.translateRequest(context, data)),\n // \u9519\u8BEF\u8DEF\u5F84\uFF1A\u82E5\u662F HttpException\uFF0C\u628A\u5176 response \u7FFB\u8BD1\u540E\u518D\u629B\n catchError((err) => {\n if (err instanceof HttpException) {\n const status = err.getStatus();\n const resp = err.getResponse();\n return from(this.i18nService.translateRequest(context, resp)).pipe(\n mergeMap((translated) =>\n throwError(\n () => new HttpException(translated, status, { cause: err }),\n ),\n ),\n );\n }\n return throwError(() => err);\n }),\n );\n }\n}\n", "import { I18nModuleOptions } from './i18n-module.options';\nimport { createI18nDecorator } from './i18n-decorator';\nimport { I18nModule } from './i18n.module';\nimport { ResolverDual } from '../resolver';\n\nexport const createI18n = (\n options: Omit<I18nModuleOptions, 'resolver'> & { resolver?: ResolverDual },\n) => {\n if (!options.resolver) {\n options.resolver = {\n paramType: 'header',\n paramName: 'x-client-language',\n };\n }\n return {\n UseI18n: createI18nDecorator(options as I18nModuleOptions),\n I18nModule: I18nModule.register(options as I18nModuleOptions),\n };\n};\n", "import { I18nMiddleware } from '../i18n-middleware.type';\nimport { Awaitable } from '../../utility/awaitable';\nimport { ExecutionContext } from '@nestjs/common';\n\nexport type I18nDictionary = Record<string, Record<string, string>>;\n\ntype MatchType = 'exact' | 'hierarchy' | 'startsWith';\n\nexport const I18nLookupMiddleware = (\n dict:\n | I18nDictionary\n | ((\n locale: string,\n key: string,\n ctx?: ExecutionContext,\n ) => Awaitable<I18nDictionary>),\n options?: { matchType?: MatchType },\n): I18nMiddleware => {\n const matchType: MatchType = options?.matchType ?? 'exact';\n const dictFactory = typeof dict === 'function' ? dict : () => dict;\n\n // \u57FA\u4E8E locales \u5217\u8868\u505A\u201C\u7CBE\u786E\u2192\u5C42\u7EA7\u56DE\u9000(zh-Hans-CN\u2192zh-Hans\u2192zh)\u201D\u7684\u6700\u957F\u5339\u914D\n const pickBestByHierarchy = (\n input: string,\n locales: string[],\n ): string | undefined => {\n if (!input) return undefined;\n const entries = locales.map((l) => ({ orig: l, lower: l.toLowerCase() }));\n const lower = input.toLowerCase();\n\n // \u7CBE\u786E\u5339\u914D\uFF08\u5927\u5C0F\u5199\u4E0D\u654F\u611F\uFF09\n const exact = entries.find((e) => e.lower === lower);\n if (exact) return exact.orig;\n\n // \u9010\u7EA7\u56DE\u9000\uFF1Azh-Hans-CN -> zh-Hans -> zh\n const parts = lower.split('-');\n while (parts.length > 1) {\n parts.pop();\n const candidate = parts.join('-');\n const hit = entries.find((e) => e.lower === candidate);\n if (hit) return hit.orig;\n }\n return undefined;\n };\n\n return async (locale, key, next, ctx) => {\n const dictResolved = await dictFactory(locale, key, ctx);\n\n let dictionary = dictResolved[locale];\n\n if (!dictionary) {\n if (matchType === 'hierarchy') {\n const best = pickBestByHierarchy(locale, Object.keys(dictResolved));\n if (best) dictionary = dictResolved[best];\n } else if (matchType === 'startsWith') {\n const keys = Object.keys(dictResolved).filter((k) =>\n locale.startsWith(k),\n );\n if (keys.length) {\n const best = keys.reduce((a, b) => (b.length > a.length ? b : a));\n dictionary = dictResolved[best];\n }\n }\n }\n\n // \u547D\u4E2D\u5224\u65AD\uFF1A\u5141\u8BB8\u7A7A\u5B57\u7B26\u4E32 ''\uFF1B\u4EC5 null/undefined \u89C6\u4E3A\u672A\u547D\u4E2D\n if (dictionary && Object.prototype.hasOwnProperty.call(dictionary, key)) {\n const val = dictionary[key];\n if (val != null) {\n return val;\n }\n }\n\n return next();\n };\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["ApiProperty", "ApiProperty", "ApiHeader", "ApiHeader", "Inject", "Scope", "Inject", "Inject", "ModuleRef", "REQUEST", "Inject", "Scope", "ModuleRef", "REQUEST", "HttpException", "Inject", "Injectable", "ModuleRef", "HttpException", "Injectable", "Inject", "ModuleRef", "Module", "createParamDecorator", "Inject", "Injectable", "ModuleRef", "Injectable", "Inject", "ModuleRef", "createParamDecorator", "Module", "HttpException", "Inject", "Injectable", "HttpException", "Injectable", "Inject"]
|
|
7
7
|
}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { ArgumentMetadata, ExecutionContext, PipeTransform } from '@nestjs/common';
|
|
2
2
|
import { I18nService } from './i18n.service';
|
|
3
3
|
import { ResolverDual } from '../resolver';
|
|
4
|
+
import { ModuleRef } from '@nestjs/core';
|
|
4
5
|
type LocaleContext = {
|
|
5
6
|
ctx: ExecutionContext;
|
|
6
7
|
resolver?: ResolverDual;
|
|
7
8
|
};
|
|
8
9
|
export declare class LocalePipe implements PipeTransform {
|
|
9
10
|
private i18nService;
|
|
10
|
-
|
|
11
|
+
private moduleRef;
|
|
12
|
+
constructor(i18nService: I18nService, moduleRef: ModuleRef);
|
|
11
13
|
transform(ctx: LocaleContext, metadata: ArgumentMetadata): Promise<string>;
|
|
12
14
|
}
|
|
13
15
|
export declare const PutLocale: (resolver?: ResolverDual) => ParameterDecorator;
|
package/dist/src/resolver.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export interface ResolverStatic {
|
|
|
6
6
|
paramType: 'header' | 'query';
|
|
7
7
|
paramName: string;
|
|
8
8
|
}
|
|
9
|
-
export type ResolverDynamic = (ctx: ExecutionContext, ref
|
|
9
|
+
export type ResolverDynamic = (ctx: ExecutionContext, ref: ModuleRef) => Awaitable<string>;
|
|
10
10
|
export type ResolverDual = ResolverStatic | ResolverDynamic;
|
|
11
11
|
export declare const createResolver: (_options: ResolverDual) => ResolverDynamic;
|
|
12
12
|
export declare const ApiFromResolver: (_options: ResolverDual, extras?: ApiHeaderOptions | ApiQueryOptions) => ClassDecorator & MethodDecorator;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nesties",
|
|
3
3
|
"description": "Nest.js utilities",
|
|
4
|
-
"version": "1.1.
|
|
4
|
+
"version": "1.1.9",
|
|
5
5
|
"main": "dist/index.cjs",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
},
|
|
25
25
|
"repository": {
|
|
26
26
|
"type": "git",
|
|
27
|
-
"url": "https://github.com/purerosefallen/nesties.git"
|
|
27
|
+
"url": "git+https://github.com/purerosefallen/nesties.git"
|
|
28
28
|
},
|
|
29
29
|
"author": "Nanahira <nanahira@momobako.com>",
|
|
30
30
|
"license": "MIT",
|