@anatix/runtime 1.0.16 → 1.0.17
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/LICENSE.md
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Anatix Commercial License
|
|
2
|
+
|
|
3
|
+
Copyright (c) Anatix Team.
|
|
4
|
+
All rights reserved.
|
|
5
|
+
|
|
6
|
+
This software is proprietary and confidential.
|
|
7
|
+
|
|
8
|
+
## Grant of license
|
|
9
|
+
|
|
10
|
+
You are granted a limited, non-exclusive, non-transferable, revocable license to use this software only if:
|
|
11
|
+
|
|
12
|
+
1. You have a valid agreement with Anatix.
|
|
13
|
+
2. You use a valid Anatix license key.
|
|
14
|
+
3. You comply with all terms of your Anatix agreement.
|
|
15
|
+
|
|
16
|
+
## License key requirement
|
|
17
|
+
|
|
18
|
+
Use of this software requires a valid Anatix license key issued by Anatix.
|
|
19
|
+
If the license key is missing, invalid, expired, or used outside the allowed scope, usage is not authorized.
|
|
20
|
+
|
|
21
|
+
## Restrictions
|
|
22
|
+
|
|
23
|
+
Unless expressly permitted in writing by Anatix, you may not:
|
|
24
|
+
|
|
25
|
+
1. Redistribute, sublicense, sell, rent, or lease the software.
|
|
26
|
+
2. Reverse engineer, decompile, or disassemble the software, except where applicable law expressly allows it.
|
|
27
|
+
3. Remove or alter notices related to ownership, copyright, or licensing.
|
|
28
|
+
|
|
29
|
+
## Ownership
|
|
30
|
+
|
|
31
|
+
The software and all related intellectual property rights remain the exclusive property of Anatix and its licensors.
|
|
32
|
+
|
|
33
|
+
## Termination
|
|
34
|
+
|
|
35
|
+
This license terminates automatically if you breach its terms or if your Anatix agreement ends.
|
|
36
|
+
Upon termination, you must stop all use of the software.
|
|
37
|
+
|
|
38
|
+
## Warranty and liability
|
|
39
|
+
|
|
40
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, TO THE MAXIMUM EXTENT PERMITTED BY LAW.
|
|
41
|
+
ANATIX SHALL NOT BE LIABLE FOR ANY INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES.
|
|
42
|
+
|
|
43
|
+
## Contact
|
|
44
|
+
|
|
45
|
+
For commercial terms and key issuance, contact Anatix.
|
package/README.md
CHANGED
|
@@ -1,341 +1,369 @@
|
|
|
1
|
-
# @anatix/runtime
|
|
2
|
-
|
|
3
|
-
> Runtime infrastructure
|
|
4
|
-
|
|
5
|
-
[](https://www.npmjs.com/package/@anatix/runtime)
|
|
6
|
-
[](https://www.npmjs.com/package/@anatix/runtime)
|
|
6
|
+
[](./LICENSE.md)
|
|
7
|
+
|
|
8
|
+
## Installation
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
npm install @anatix/runtime
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Optional but commonly needed in consumers:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npm install @nestjs/common @nestjs/core @nestjs/axios typeorm reflect-metadata rxjs axios
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Compatibility
|
|
21
|
+
|
|
22
|
+
- Node.js: `>=18.0.0 <25.0.0`
|
|
23
|
+
- npm: `>=9.0.0`
|
|
24
|
+
- NestJS: `11.x`
|
|
25
|
+
- TypeORM: `0.3.x`
|
|
26
|
+
|
|
27
|
+
## What this library provides
|
|
28
|
+
|
|
29
|
+
- JWT and RBAC guards (`guards`)
|
|
30
|
+
- Inbox/Outbox building blocks (`envelope`)
|
|
31
|
+
- Event bus service with RabbitMQ or Kafka adapters (`event-bus`)
|
|
32
|
+
- Structured logging contracts and helper (`logger`)
|
|
33
|
+
- HTTP proxy helpers with retry and timeout (`proxy`)
|
|
34
|
+
- Security abstractions and default adapters (`security`)
|
|
35
|
+
- TypeORM naming strategy (`naming`)
|
|
36
|
+
- Generic service and repository helpers (`service`, `repository`)
|
|
37
|
+
- Result/Either functional helpers (`result`)
|
|
38
|
+
- Common DTOs (`dtos`)
|
|
39
|
+
- Health and Prometheus metrics helpers (`health`, `monitoring`)
|
|
40
|
+
- License key validation module (`license`)
|
|
41
|
+
- Global exception filter (`decorators`)
|
|
42
|
+
|
|
43
|
+
## Quick Start
|
|
44
|
+
|
|
45
|
+
### 1) Configure runtime modules and tokens
|
|
46
|
+
|
|
47
|
+
```ts
|
|
48
|
+
import { Module } from '@nestjs/common';
|
|
49
|
+
import {
|
|
50
|
+
EventBusModule,
|
|
51
|
+
EVENT_BUS_CONFIG,
|
|
52
|
+
type EventBusConfig,
|
|
53
|
+
} from '@anatix/runtime/event-bus';
|
|
54
|
+
import { SecurityModule } from '@anatix/runtime/security';
|
|
55
|
+
import {
|
|
56
|
+
JWT_VERIFY_CONFIG_TOKEN,
|
|
57
|
+
RBAC_POLICY_TOKEN,
|
|
58
|
+
type JwtVerifyConfig,
|
|
59
|
+
type RbacPolicy,
|
|
60
|
+
} from '@anatix/runtime/guards';
|
|
61
|
+
|
|
62
|
+
class AppRbacPolicy implements RbacPolicy<{ permissions?: string[] }> {
|
|
63
|
+
can(user: { permissions?: string[] }, requiredPerms: string[]): boolean {
|
|
64
|
+
const permissions = user.permissions ?? [];
|
|
65
|
+
return requiredPerms.every((perm) => permissions.includes(perm));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const jwtConfig: JwtVerifyConfig = {
|
|
70
|
+
algorithm: 'HS256',
|
|
71
|
+
secret: process.env.AUTH_JWT_SECRET,
|
|
72
|
+
issuer: process.env.AUTH_JWT_ISSUER,
|
|
73
|
+
audience: process.env.AUTH_JWT_AUDIENCE,
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
const eventBusConfig: EventBusConfig = {
|
|
77
|
+
connection: {
|
|
78
|
+
type: 'rabbitmq',
|
|
79
|
+
serviceName: 'users-service',
|
|
80
|
+
rabbitmq: {
|
|
81
|
+
url: 'amqp://localhost',
|
|
82
|
+
exchange: 'anatix-event-bus',
|
|
83
|
+
prefetch: 5,
|
|
84
|
+
},
|
|
85
|
+
retry: {
|
|
86
|
+
maxAttempts: 20,
|
|
87
|
+
initialDelayMs: 500,
|
|
88
|
+
maxDelayMs: 10000,
|
|
89
|
+
jitterMs: 250,
|
|
90
|
+
healthCheckIntervalMs: 5000,
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
@Module({
|
|
96
|
+
imports: [
|
|
97
|
+
EventBusModule,
|
|
98
|
+
SecurityModule.forRoot({
|
|
99
|
+
hashSaltRounds: 12,
|
|
100
|
+
encryptionKey: process.env.ENCRYPTION_KEY,
|
|
101
|
+
}),
|
|
102
|
+
],
|
|
103
|
+
providers: [
|
|
104
|
+
{ provide: JWT_VERIFY_CONFIG_TOKEN, useValue: jwtConfig },
|
|
105
|
+
{ provide: RBAC_POLICY_TOKEN, useClass: AppRbacPolicy },
|
|
106
|
+
{ provide: EVENT_BUS_CONFIG, useValue: eventBusConfig },
|
|
107
|
+
],
|
|
108
|
+
})
|
|
109
|
+
export class AppModule {}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### 2) Protect routes with guards and decorators
|
|
113
|
+
|
|
114
|
+
```ts
|
|
115
|
+
import { Controller, Get, UseGuards } from '@nestjs/common';
|
|
116
|
+
import {
|
|
117
|
+
JwtAuthGuard,
|
|
118
|
+
PermissionsGuard,
|
|
119
|
+
Permissions,
|
|
120
|
+
Public,
|
|
121
|
+
} from '@anatix/runtime/guards';
|
|
122
|
+
|
|
123
|
+
@Controller('users')
|
|
124
|
+
@UseGuards(JwtAuthGuard, PermissionsGuard)
|
|
125
|
+
export class UsersController {
|
|
126
|
+
@Get()
|
|
127
|
+
@Permissions('users:User:list')
|
|
128
|
+
listUsers() {
|
|
129
|
+
return [];
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
@Get('ping')
|
|
133
|
+
@Public()
|
|
134
|
+
ping() {
|
|
135
|
+
return { ok: true };
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### 3) Publish and subscribe with EventBusService
|
|
141
|
+
|
|
142
|
+
```ts
|
|
143
|
+
import { Injectable, OnModuleInit } from '@nestjs/common';
|
|
144
|
+
import { EventBusService } from '@anatix/runtime/event-bus';
|
|
145
|
+
|
|
146
|
+
@Injectable()
|
|
147
|
+
export class UserEventsService implements OnModuleInit {
|
|
148
|
+
constructor(private readonly eventBus: EventBusService) {}
|
|
149
|
+
|
|
150
|
+
async onModuleInit(): Promise<void> {
|
|
151
|
+
await this.eventBus.on('user.created', async (envelope) => {
|
|
152
|
+
console.log('received', envelope.data);
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
async publishUserCreated(userId: string): Promise<void> {
|
|
157
|
+
await this.eventBus.publish('user.created', { userId });
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### 4) Use Inbox/Outbox transaction helper
|
|
163
|
+
|
|
164
|
+
```ts
|
|
165
|
+
import { DataSource } from 'typeorm';
|
|
166
|
+
import {
|
|
167
|
+
withInboxOutbox,
|
|
168
|
+
ensureMeta,
|
|
169
|
+
OutboxRepo,
|
|
170
|
+
InboxSchema,
|
|
171
|
+
OutboxSchema,
|
|
172
|
+
} from '@anatix/runtime/envelope';
|
|
173
|
+
|
|
174
|
+
// Register InboxSchema and OutboxSchema in your TypeORM entities.
|
|
175
|
+
const dataSource = new DataSource({
|
|
176
|
+
// ...
|
|
177
|
+
entities: [InboxSchema, OutboxSchema],
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
await withInboxOutbox(
|
|
181
|
+
dataSource,
|
|
182
|
+
'user.created',
|
|
183
|
+
ensureMeta(),
|
|
184
|
+
{ userId: 'u_1' },
|
|
185
|
+
async (manager) => {
|
|
186
|
+
// business write logic
|
|
187
|
+
await manager.query('SELECT 1');
|
|
188
|
+
},
|
|
189
|
+
async (manager) => {
|
|
190
|
+
// stage an outbox event in the same transaction
|
|
191
|
+
await OutboxRepo.enqueue(manager, {
|
|
192
|
+
topic: 'user.audit.created',
|
|
193
|
+
payload: { userId: 'u_1' },
|
|
194
|
+
meta: ensureMeta(),
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
);
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### 5) Enable Anatix license key validation
|
|
201
|
+
|
|
202
|
+
```ts
|
|
203
|
+
import { Module } from '@nestjs/common';
|
|
204
|
+
import {
|
|
205
|
+
AnatixLicenseModule,
|
|
206
|
+
AnatixLicenseService,
|
|
207
|
+
} from '@anatix/runtime/license';
|
|
208
|
+
|
|
209
|
+
@Module({
|
|
210
|
+
imports: [
|
|
211
|
+
AnatixLicenseModule.forRoot({
|
|
212
|
+
key: process.env.ANATIX_LICENSE_KEY,
|
|
213
|
+
publicKey: process.env.ANATIX_LICENSE_PUBLIC_KEY?.replace(/\\n/g, '\n'),
|
|
214
|
+
expectedIssuer: 'anatix',
|
|
215
|
+
expectedAudience: '@anatix/runtime',
|
|
216
|
+
required: true,
|
|
217
|
+
failMode: 'throw',
|
|
218
|
+
}),
|
|
219
|
+
],
|
|
220
|
+
})
|
|
221
|
+
export class RuntimeLicenseModule {
|
|
222
|
+
constructor(private readonly licenseService: AnatixLicenseService) {
|
|
223
|
+
// throws if invalid (when required=true and failMode='throw')
|
|
224
|
+
this.licenseService.assertValid();
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
## Useful Helpers
|
|
230
|
+
|
|
231
|
+
### Service helpers
|
|
232
|
+
|
|
233
|
+
Import from `@anatix/runtime/service`:
|
|
234
|
+
|
|
235
|
+
- `withTransaction`, `withOptionalTransaction`
|
|
236
|
+
- `withIdempotency`, `checkIdempotency`
|
|
237
|
+
- `withCacheReadThrough`, `withCacheWriteThrough`, `invalidateCache`
|
|
238
|
+
- `withRetry`, `withRetryIf`
|
|
239
|
+
- `withTimeout`, `withOptionalTimeout`
|
|
240
|
+
- `withRateLimit`, `withCircuitBreaker`
|
|
241
|
+
- `enrichFields`, `projectFields`, `createProjectionResolver`
|
|
242
|
+
|
|
243
|
+
### Repository helpers
|
|
244
|
+
|
|
245
|
+
Import from `@anatix/runtime/repository`:
|
|
246
|
+
|
|
247
|
+
- `withRetry` (repository-focused transient error retry)
|
|
248
|
+
- `applyScope`, `createScope` (tenant scoping)
|
|
249
|
+
- `applyLock`, `checkOptimisticLock`
|
|
250
|
+
- `bulkInsert`, `bulkUpdate`, `bulkDelete`, `bulkUpsert`
|
|
251
|
+
- `encodeCursor`, `decodeCursor`, `applyCursorOrder`, `applyCursorWhere`
|
|
252
|
+
|
|
253
|
+
### Result helpers
|
|
254
|
+
|
|
255
|
+
Import from `@anatix/runtime/result`:
|
|
256
|
+
|
|
257
|
+
- `Ok`, `Err`, `isOk`, `isErr`
|
|
258
|
+
- `map`, `mapErr`, `andThen`
|
|
259
|
+
- `unwrap`, `unwrapOr`
|
|
260
|
+
- `tryCatch`, `tryCatchAsync`
|
|
261
|
+
|
|
262
|
+
### DTO helpers
|
|
263
|
+
|
|
264
|
+
Import from `@anatix/runtime/dtos`:
|
|
265
|
+
|
|
266
|
+
- `PaginatedResponseDto`, `createOffsetPaginatedResponse`, `createCursorPaginatedResponse`
|
|
267
|
+
- `ErrorResponseDto`, `createErrorResponse`, `createValidationErrorResponse`
|
|
268
|
+
|
|
269
|
+
## Health and Metrics
|
|
270
|
+
|
|
271
|
+
```ts
|
|
272
|
+
import { Controller, Get, Res } from '@nestjs/common';
|
|
273
|
+
import type { Response } from 'express';
|
|
274
|
+
import { HealthService } from '@anatix/runtime/health';
|
|
275
|
+
import { PrometheusService } from '@anatix/runtime/monitoring';
|
|
276
|
+
|
|
277
|
+
@Controller()
|
|
278
|
+
export class OpsController {
|
|
279
|
+
constructor(
|
|
280
|
+
private readonly health: HealthService,
|
|
281
|
+
private readonly metrics: PrometheusService
|
|
282
|
+
) {}
|
|
283
|
+
|
|
284
|
+
@Get('health')
|
|
285
|
+
async healthcheck() {
|
|
286
|
+
return this.health.check();
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
@Get('metrics')
|
|
290
|
+
async getMetrics(@Res() res: Response) {
|
|
291
|
+
res.setHeader('Content-Type', this.metrics.register.contentType);
|
|
292
|
+
res.send(await this.metrics.getMetrics());
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
## Error Handling Filter
|
|
298
|
+
|
|
299
|
+
```ts
|
|
300
|
+
import { NestFactory } from '@nestjs/core';
|
|
301
|
+
import { GlobalExceptionFilter } from '@anatix/runtime/decorators';
|
|
302
|
+
|
|
303
|
+
async function bootstrap() {
|
|
304
|
+
const app = await NestFactory.create(AppModule);
|
|
305
|
+
app.useGlobalFilters(
|
|
306
|
+
new GlobalExceptionFilter({
|
|
307
|
+
isDevelopment: process.env.NODE_ENV !== 'production',
|
|
308
|
+
logErrors: true,
|
|
309
|
+
})
|
|
310
|
+
);
|
|
311
|
+
await app.listen(3000);
|
|
312
|
+
}
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
## Import Paths
|
|
316
|
+
|
|
317
|
+
Available public entrypoints:
|
|
318
|
+
|
|
319
|
+
- `@anatix/runtime`
|
|
320
|
+
- `@anatix/runtime/contracts`
|
|
321
|
+
- `@anatix/runtime/decorators`
|
|
322
|
+
- `@anatix/runtime/dtos`
|
|
323
|
+
- `@anatix/runtime/envelope`
|
|
324
|
+
- `@anatix/runtime/event-bus`
|
|
325
|
+
- `@anatix/runtime/guards`
|
|
326
|
+
- `@anatix/runtime/health`
|
|
327
|
+
- `@anatix/runtime/license`
|
|
328
|
+
- `@anatix/runtime/logger`
|
|
329
|
+
- `@anatix/runtime/monitoring`
|
|
330
|
+
- `@anatix/runtime/naming`
|
|
331
|
+
- `@anatix/runtime/proxy`
|
|
332
|
+
- `@anatix/runtime/repository`
|
|
333
|
+
- `@anatix/runtime/result`
|
|
334
|
+
- `@anatix/runtime/security`
|
|
335
|
+
- `@anatix/runtime/service`
|
|
336
|
+
- `@anatix/runtime/utils`
|
|
337
|
+
|
|
338
|
+
Note on `withRetry` name collisions:
|
|
339
|
+
|
|
340
|
+
- Root exports expose aliases:
|
|
341
|
+
- `serviceWithRetry`
|
|
342
|
+
- `repositoryWithRetry`
|
|
343
|
+
- `utilsRunWithRetry`
|
|
344
|
+
- Subpath imports are usually clearer for retry helpers.
|
|
345
|
+
|
|
346
|
+
## Scripts (library development)
|
|
347
|
+
|
|
348
|
+
```bash
|
|
349
|
+
npm run clean
|
|
350
|
+
npm run build
|
|
351
|
+
npm run dev
|
|
352
|
+
npm run type-check
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
## Contribution
|
|
356
|
+
|
|
357
|
+
This package is maintained by the Anatix team.
|
|
358
|
+
|
|
359
|
+
## License
|
|
360
|
+
|
|
361
|
+
Anatix Commercial License.
|
|
362
|
+
|
|
363
|
+
See `LICENSE.md`.
|
|
364
|
+
|
|
365
|
+
## Links
|
|
366
|
+
|
|
367
|
+
- NPM: https://www.npmjs.com/package/@anatix/runtime
|
|
368
|
+
- Repository: https://github.com/anatix/anatix-runtime
|
|
369
|
+
- Issues: https://github.com/anatix/anatix-runtime/issues
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prometheus.service.d.ts","sourceRoot":"","sources":["../../src/monitoring/prometheus.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,QAAQ,
|
|
1
|
+
{"version":3,"file":"prometheus.service.d.ts","sourceRoot":"","sources":["../../src/monitoring/prometheus.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,QAAQ,EAAyB,MAAM,aAAa,CAAC;AAElF,qBACa,iBAAiB;IAC5B,SAAgB,QAAQ,EAAE,QAAQ,CAAC;IAGnC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAU;IAC5C,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAU;IAChD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAU;IAC7C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAU;IAG9C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAY;IAChD,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAY;;IAyDpD,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAI/D,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAKlF,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO;IAIhE,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAKtD,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ;IAKxD,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ;IAKxD,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;CAGpC"}
|
|
@@ -22,6 +22,9 @@ let PrometheusService = class PrometheusService {
|
|
|
22
22
|
eventBusMessageDuration;
|
|
23
23
|
constructor() {
|
|
24
24
|
this.register = new prom_client_1.Registry();
|
|
25
|
+
if (process.env.NODE_ENV !== 'test') {
|
|
26
|
+
(0, prom_client_1.collectDefaultMetrics)({ register: this.register });
|
|
27
|
+
}
|
|
25
28
|
this.httpRequestsTotal = new prom_client_1.Counter({
|
|
26
29
|
name: 'http_requests_total',
|
|
27
30
|
help: 'Total HTTP requests',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prometheus.service.js","sourceRoot":"","sources":["../../src/monitoring/prometheus.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,
|
|
1
|
+
{"version":3,"file":"prometheus.service.js","sourceRoot":"","sources":["../../src/monitoring/prometheus.service.ts"],"names":[],"mappings":"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"}
|