@dismissible/nestjs-api 1.0.3-alpha.cdc64a4.0 → 2.0.2-alpha.99ffc23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +23 -15
  2. package/bin/dismissible-storage-setup.js +4 -0
  3. package/config/.env.development.yaml +16 -1
  4. package/config/.env.yaml +22 -2
  5. package/package.json +12 -11
  6. package/src/app.module.d.ts +4 -0
  7. package/src/app.module.js +10 -2
  8. package/src/app.module.js.map +1 -1
  9. package/src/app.setup.js +9 -40
  10. package/src/app.setup.js.map +1 -1
  11. package/src/config/config.module.js +0 -1
  12. package/src/config/config.module.js.map +1 -1
  13. package/src/config/default-app.config.d.ts +2 -0
  14. package/src/config/default-app.config.js +7 -0
  15. package/src/config/default-app.config.js.map +1 -1
  16. package/src/cors/cors.config.js +2 -1
  17. package/src/cors/cors.config.js.map +1 -1
  18. package/src/cors/cors.factory.d.ts +2 -0
  19. package/src/cors/cors.factory.js +29 -0
  20. package/src/cors/cors.factory.js.map +1 -0
  21. package/src/cors/index.d.ts +1 -0
  22. package/src/cors/index.js +1 -0
  23. package/src/cors/index.js.map +1 -1
  24. package/src/dismissible-nest-factory.d.ts +4 -0
  25. package/src/dismissible-nest-factory.js.map +1 -1
  26. package/src/helmet/helmet.factory.d.ts +2 -0
  27. package/src/helmet/helmet.factory.js +29 -0
  28. package/src/helmet/helmet.factory.js.map +1 -0
  29. package/src/helmet/index.d.ts +1 -0
  30. package/src/helmet/index.js +1 -0
  31. package/src/helmet/index.js.map +1 -1
  32. package/src/storage/storage.config.js +0 -8
  33. package/src/storage/storage.config.js.map +1 -1
  34. package/src/swagger/swagger.factory.d.ts +1 -2
  35. package/src/swagger/swagger.factory.js +10 -1
  36. package/src/swagger/swagger.factory.js.map +1 -1
  37. package/src/validation/index.d.ts +1 -0
  38. package/src/validation/index.js +1 -0
  39. package/src/validation/index.js.map +1 -1
  40. package/src/validation/validation.factory.d.ts +2 -0
  41. package/src/validation/validation.factory.js +19 -0
  42. package/src/validation/validation.factory.js.map +1 -0
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  <p align="center">
2
- <a href="https://dismissible.io" target="_blank"><img src="../docs/images/dismissible_logo.png" width="120" alt="Dismissible" /></a>
2
+ <a href="https://dismissible.io" target="_blank"><img src="https://raw.githubusercontent.com/DismissibleIo/dismissible-api/main/docs/images/dismissible_logo.png" width="120" alt="Dismissible" /></a>
3
3
  </p>
4
4
 
5
5
  <p align="center">Never Show The Same Thing Twice!</p>
@@ -126,7 +126,7 @@ Enable Swagger documentation by setting `DISMISSIBLE_SWAGGER_ENABLED=true` and v
126
126
  | ------------------------------- | ------------------------------------------------------------------------- | ---------- |
127
127
  | `DISMISSIBLE_PORT` | Port the API listens on | `3001` |
128
128
  | `DISMISSIBLE_STORAGE_TYPE` | Storage backend type eg. `postgres`, `dynamodb`, `memory` | `postgres` |
129
- | `DISMISSIBLE_RUN_STORAGE_SETUP` | Run database migrations on startup. Each storage type will have their own | `false` |
129
+ | `DISMISSIBLE_STORAGE_RUN_SETUP` | Run database migrations on startup. Each storage type will have their own | `false` |
130
130
 
131
131
  ### Storage Settings
132
132
 
@@ -177,16 +177,20 @@ When enabled, Swagger documentation is published to the path specified by `DISMI
177
177
 
178
178
  You can secure your API with any OIDC-compliant provider (Auth0, Okta, Keycloak, etc.). This ensures that no one can fill your dismissible service with junk.
179
179
 
180
- | Variable | Description | Default |
181
- | ------------------------------------------ | ------------------------------------ | --------------------- |
182
- | `DISMISSIBLE_JWT_AUTH_ENABLED` | Enable JWT authentication | `false` |
183
- | `DISMISSIBLE_JWT_AUTH_WELL_KNOWN_URL` | OIDC discovery URL | _required_ if enabled |
184
- | `DISMISSIBLE_JWT_AUTH_ISSUER` | Expected JWT issuer | _-_ |
185
- | `DISMISSIBLE_JWT_AUTH_AUDIENCE` | Expected JWT audience | _-_ |
186
- | `DISMISSIBLE_JWT_AUTH_ALGORITHMS` | Allowed algorithms (comma-separated) | `RS256` |
187
- | `DISMISSIBLE_JWT_AUTH_JWKS_CACHE_DURATION` | JWKS cache duration (ms) | `600000` |
188
- | `DISMISSIBLE_JWT_AUTH_REQUEST_TIMEOUT` | Request timeout (ms) | `30000` |
189
- | `DISMISSIBLE_JWT_AUTH_PRIORITY` | Hook priority (lower runs first) | `-100` |
180
+ | Variable | Description | Default |
181
+ | ------------------------------------------ | ------------------------------------------- | --------------------- |
182
+ | `DISMISSIBLE_JWT_AUTH_ENABLED` | Enable JWT authentication | `false` |
183
+ | `DISMISSIBLE_JWT_AUTH_WELL_KNOWN_URL` | OIDC discovery URL | _required_ if enabled |
184
+ | `DISMISSIBLE_JWT_AUTH_ISSUER` | Expected JWT issuer | _-_ |
185
+ | `DISMISSIBLE_JWT_AUTH_AUDIENCE` | Expected JWT audience | _-_ |
186
+ | `DISMISSIBLE_JWT_AUTH_ALGORITHMS` | Allowed algorithms (comma-separated) | `RS256` |
187
+ | `DISMISSIBLE_JWT_AUTH_JWKS_CACHE_DURATION` | JWKS cache duration (ms) | `600000` |
188
+ | `DISMISSIBLE_JWT_AUTH_REQUEST_TIMEOUT` | Request timeout (ms) | `30000` |
189
+ | `DISMISSIBLE_JWT_AUTH_PRIORITY` | Hook priority (lower runs first) | `-100` |
190
+ | `DISMISSIBLE_JWT_AUTH_MATCH_USER_ID` | Enable user ID matching | `true` |
191
+ | `DISMISSIBLE_JWT_AUTH_USER_ID_CLAIM` | JWT claim key for user ID matching | `sub` |
192
+ | `DISMISSIBLE_JWT_AUTH_USER_ID_MATCH_TYPE` | Match method: `exact`, `substring`, `regex` | `exact` |
193
+ | `DISMISSIBLE_JWT_AUTH_USER_ID_MATCH_REGEX` | Regex pattern (required if type=regex) | _-_ |
190
194
 
191
195
  ### CORS Settings
192
196
 
@@ -197,8 +201,8 @@ Cross-Origin Resource Sharing (CORS) controls which domains can access your API
197
201
 
198
202
  | Variable | Description | Default |
199
203
  | ---------------------------------- | ---------------------------------- | ----------------------------------------- |
200
- | `DISMISSIBLE_CORS_ENABLED` | Enable CORS | `true` |
201
- | `DISMISSIBLE_CORS_ORIGINS` | Allowed origins (comma-separated) | `http://localhost:3000` |
204
+ | `DISMISSIBLE_CORS_ENABLED` | Enable CORS | `false` |
205
+ | `DISMISSIBLE_CORS_ORIGINS` | Allowed origins (comma-separated) | `` |
202
206
  | `DISMISSIBLE_CORS_METHODS` | Allowed HTTP methods | `GET,POST,DELETE,OPTIONS` |
203
207
  | `DISMISSIBLE_CORS_ALLOWED_HEADERS` | Allowed headers | `Content-Type,Authorization,x-request-id` |
204
208
  | `DISMISSIBLE_CORS_CREDENTIALS` | Allow credentials | `true` |
@@ -283,6 +287,10 @@ jwtAuth:
283
287
  jwksCacheDuration: ${DISMISSIBLE_JWT_AUTH_JWKS_CACHE_DURATION:-600000}
284
288
  requestTimeout: ${DISMISSIBLE_JWT_AUTH_REQUEST_TIMEOUT:-30000}
285
289
  priority: ${DISMISSIBLE_JWT_AUTH_PRIORITY:--100}
290
+ matchUserId: ${DISMISSIBLE_JWT_AUTH_MATCH_USER_ID:-true}
291
+ userIdClaim: ${DISMISSIBLE_JWT_AUTH_USER_ID_CLAIM:-sub}
292
+ userIdMatchType: ${DISMISSIBLE_JWT_AUTH_USER_ID_MATCH_TYPE:-exact}
293
+ userIdMatchRegex: ${DISMISSIBLE_JWT_AUTH_USER_ID_MATCH_REGEX:-}
286
294
 
287
295
  validation:
288
296
  disableErrorMessages: ${DISMISSIBLE_VALIDATION_DISABLE_ERROR_MESSAGES:-true}
@@ -418,7 +426,7 @@ The fastest way to get started:
418
426
  # PostgreSQL (default)
419
427
  docker run -p 3001:3001 \
420
428
  -e DISMISSIBLE_STORAGE_TYPE=postgres \
421
- -e DISMISSIBLE_RUN_STORAGE_SETUP=true \
429
+ -e DISMISSIBLE_STORAGE_RUN_SETUP=true \
422
430
  -e DISMISSIBLE_STORAGE_POSTGRES_CONNECTION_STRING="postgresql://user:password@host:5432/dismissible" \
423
431
  dismissibleio/dismissible-api:latest
424
432
 
@@ -12,6 +12,10 @@ switch (storageType) {
12
12
  console.log('Running DynamoDB storage setup...');
13
13
  execSync('npm run storage:setup:dynamodb', { stdio: 'inherit' });
14
14
  break;
15
+ case 'memory':
16
+ console.log('No setup required for In Memory storage...');
17
+ process.exit(0);
18
+ break;
15
19
  default:
16
20
  if (storageType) {
17
21
  console.log(`Warning: Unknown storage type '${storageType}'. Skipping storage setup.`);
@@ -9,7 +9,12 @@ helmet:
9
9
  enabled: false
10
10
 
11
11
  cors:
12
- enabled: false
12
+ enabled: true
13
+ origins: http://localhost:5173
14
+ methods: GET,POST,DELETE,OPTIONS
15
+ allowedHeaders: Content-Type,Authorization,x-request-id
16
+ credentials: true
17
+ maxAge: 86400
13
18
 
14
19
  storage:
15
20
  # postgres | dynamodb | memory
@@ -26,6 +31,16 @@ storage:
26
31
  jwtAuth:
27
32
  enabled: false
28
33
 
34
+ rateLimiter:
35
+ enabled: true
36
+ points: ${DISMISSIBLE_RATE_LIMITER_POINTS:-10000}
37
+ duration: ${DISMISSIBLE_RATE_LIMITER_DURATION:-1}
38
+ blockDuration: ${DISMISSIBLE_RATE_LIMITER_BLOCK_DURATION:-1}
39
+ keyType: ${DISMISSIBLE_RATE_LIMITER_KEY_TYPE:-ip,origin,referrer}
40
+ keyMode: ${DISMISSIBLE_RATE_LIMITER_KEY_MODE:-any}
41
+ ignoredKeys: ${DISMISSIBLE_RATE_LIMITER_IGNORED_KEYS:-}
42
+ priority: ${DISMISSIBLE_RATE_LIMITER_PRIORITY:--101}
43
+
29
44
  validation:
30
45
  disableErrorMessages: false
31
46
  whitelist: false
package/config/.env.yaml CHANGED
@@ -39,11 +39,31 @@ jwtAuth:
39
39
  wellKnownUrl: ${DISMISSIBLE_JWT_AUTH_WELL_KNOWN_URL:-}
40
40
  issuer: ${DISMISSIBLE_JWT_AUTH_ISSUER:-}
41
41
  audience: ${DISMISSIBLE_JWT_AUTH_AUDIENCE:-}
42
- algorithms:
43
- - ${DISMISSIBLE_JWT_AUTH_ALGORITHMS:-RS256}
42
+ algorithms: ${DISMISSIBLE_JWT_AUTH_ALGORITHMS:-RS256}
44
43
  jwksCacheDuration: ${DISMISSIBLE_JWT_AUTH_JWKS_CACHE_DURATION:-600000}
45
44
  requestTimeout: ${DISMISSIBLE_JWT_AUTH_REQUEST_TIMEOUT:-30000}
46
45
  priority: ${DISMISSIBLE_JWT_AUTH_PRIORITY:--100}
46
+ matchUserId: ${DISMISSIBLE_JWT_AUTH_MATCH_USER_ID:-true}
47
+ userIdMatchType: ${DISMISSIBLE_JWT_AUTH_USER_ID_MATCH_TYPE:-exact}
48
+ userIdMatchRegex: ${DISMISSIBLE_JWT_AUTH_USER_ID_MATCH_REGEX:-}
49
+ userIdClaim: ${DISMISSIBLE_JWT_AUTH_USER_ID_CLAIM:-sub}
50
+
51
+ rateLimiter:
52
+ enabled: ${DISMISSIBLE_RATE_LIMITER_ENABLED:-false}
53
+ # Number of requests allowed per duration window
54
+ points: ${DISMISSIBLE_RATE_LIMITER_POINTS:-10000}
55
+ # Time window in seconds for rate limiting
56
+ duration: ${DISMISSIBLE_RATE_LIMITER_DURATION:-1}
57
+ # Optional: Duration in seconds to block requests after limit is exceeded (if not set, requests are allowed again after the duration window resets)
58
+ blockDuration: ${DISMISSIBLE_RATE_LIMITER_BLOCK_DURATION:-}
59
+ # Key type(s) for rate limiting: 'ip' (by IP address), 'origin' (by Origin header), 'referrer' (by Referer header). Can be comma-separated to combine types (e.g., 'ip,origin')
60
+ keyType: ${DISMISSIBLE_RATE_LIMITER_KEY_TYPE:-ip,origin,referrer}
61
+ # Mode for combining key types: 'and' (combine all), 'or' (use first available), 'any' (check all independently)
62
+ keyMode: ${DISMISSIBLE_RATE_LIMITER_KEY_MODE:-any}
63
+ # Optional: Comma-separated keys to bypass rate limiting. Matching is exact after trim+lowercase. For Origin/Referer, the URL hostname is matched (e.g. "https://google.com/search" matches "google.com").
64
+ ignoredKeys: ${DISMISSIBLE_RATE_LIMITER_IGNORED_KEYS:-}
65
+ # Hook priority (lower numbers run first)
66
+ priority: ${DISMISSIBLE_RATE_LIMITER_PRIORITY:--101}
47
67
 
48
68
  validation:
49
69
  disableErrorMessages: ${DISMISSIBLE_VALIDATION_DISABLE_ERROR_MESSAGES:-true}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dismissible/nestjs-api",
3
- "version": "1.0.3-alpha.cdc64a4.0",
3
+ "version": "2.0.2-alpha.99ffc23.0",
4
4
  "description": "Dismissible API application",
5
5
  "main": "./src/index.js",
6
6
  "types": "./src/index.d.ts",
@@ -30,16 +30,17 @@
30
30
  "storage:setup:dynamodb": "npx dismissible-dynamodb-setup"
31
31
  },
32
32
  "dependencies": {
33
- "@dismissible/nestjs-core": "1.0.3-alpha.cdc64a4.0",
34
- "@dismissible/nestjs-item": "1.0.3-alpha.cdc64a4.0",
35
- "@dismissible/nestjs-jwt-auth-hook": "1.0.3-alpha.cdc64a4.0",
36
- "@dismissible/nestjs-storage": "1.0.3-alpha.cdc64a4.0",
37
- "@dismissible/nestjs-postgres-storage": "1.0.3-alpha.cdc64a4.0",
38
- "@dismissible/nestjs-dynamodb-storage": "1.0.3-alpha.cdc64a4.0",
39
- "@dismissible/nestjs-logger": "1.0.3-alpha.cdc64a4.0",
40
- "@nestjs/common": "11.1.10",
41
- "@nestjs/core": "11.1.10",
42
- "@nestjs/platform-fastify": "11.1.10",
33
+ "@dismissible/nestjs-core": "2.0.2-alpha.99ffc23.0",
34
+ "@dismissible/nestjs-item": "2.0.2-alpha.99ffc23.0",
35
+ "@dismissible/nestjs-jwt-auth-hook": "2.0.2-alpha.99ffc23.0",
36
+ "@dismissible/nestjs-storage": "2.0.2-alpha.99ffc23.0",
37
+ "@dismissible/nestjs-postgres-storage": "2.0.2-alpha.99ffc23.0",
38
+ "@dismissible/nestjs-dynamodb-storage": "2.0.2-alpha.99ffc23.0",
39
+ "@dismissible/nestjs-logger": "2.0.2-alpha.99ffc23.0",
40
+ "@dismissible/nestjs-rate-limiter-hook": "2.0.1",
41
+ "@nestjs/common": "11.1.11",
42
+ "@nestjs/core": "11.1.11",
43
+ "@nestjs/platform-fastify": "11.1.11",
43
44
  "fastify": "5.6.2",
44
45
  "@fastify/helmet": "13.0.2",
45
46
  "@fastify/static": "8.3.0",
@@ -1,11 +1,15 @@
1
1
  import { DynamicModule, ModuleMetadata, Type } from '@nestjs/common';
2
+ import { IDismissibleLifecycleHook } from '@dismissible/nestjs-core';
2
3
  import { IDismissibleLogger } from '@dismissible/nestjs-logger';
3
4
  import { DefaultAppConfig } from './config/default-app.config';
5
+ import { StorageType } from './storage/storage.config';
4
6
  export type AppModuleOptions = {
5
7
  configPath?: string;
6
8
  schema?: new () => DefaultAppConfig;
7
9
  logger?: Type<IDismissibleLogger>;
8
10
  imports?: DynamicModule[];
11
+ hooks?: Type<IDismissibleLifecycleHook>[];
12
+ storage?: StorageType;
9
13
  };
10
14
  export declare class AppModule {
11
15
  static forRoot(options?: AppModuleOptions): {
package/src/app.module.js CHANGED
@@ -11,6 +11,8 @@ const path_1 = require("path");
11
11
  const nestjs_core_1 = require("@dismissible/nestjs-core");
12
12
  const dynamic_storage_module_1 = require("./storage/dynamic-storage.module");
13
13
  const nestjs_jwt_auth_hook_1 = require("@dismissible/nestjs-jwt-auth-hook");
14
+ const nestjs_rate_limiter_hook_1 = require("@dismissible/nestjs-rate-limiter-hook");
15
+ const class_transformer_1 = require("class-transformer");
14
16
  let AppModule = AppModule_1 = class AppModule {
15
17
  static forRoot(options) {
16
18
  return {
@@ -27,19 +29,25 @@ let AppModule = AppModule_1 = class AppModule {
27
29
  }),
28
30
  health_1.HealthModule,
29
31
  ...(options?.imports ?? []),
32
+ nestjs_rate_limiter_hook_1.RateLimiterHookModule.forRootAsync({
33
+ useFactory: (config) => {
34
+ return config.rateLimiter ?? (0, class_transformer_1.plainToClass)(nestjs_rate_limiter_hook_1.RateLimiterHookConfig, { enabled: false });
35
+ },
36
+ inject: [options?.schema ?? app_config_1.AppConfig],
37
+ }),
30
38
  nestjs_jwt_auth_hook_1.JwtAuthHookModule.forRootAsync({
31
39
  useFactory: (config) => config,
32
40
  inject: [nestjs_jwt_auth_hook_1.JwtAuthHookConfig],
33
41
  }),
34
42
  nestjs_core_1.DismissibleModule.forRoot({
35
43
  logger: options?.logger,
36
- hooks: [nestjs_jwt_auth_hook_1.JwtAuthHook],
44
+ hooks: [nestjs_jwt_auth_hook_1.JwtAuthHook, nestjs_rate_limiter_hook_1.RateLimiterHook, ...(options?.hooks ?? [])],
37
45
  storage: dynamic_storage_module_1.DynamicStorageModule.forRootAsync({
38
46
  // TODO: nestjs doesn't support optional dynamic modules.
39
47
  // So instead, we are just using the env vars to switch between modules.
40
48
  // This isn't ideal, but there's not a great option. I will look to see
41
49
  // if we can raise an issue similar to this: https://github.com/nestjs/nest/issues/9868
42
- storage: process.env.DISMISSIBLE_STORAGE_TYPE,
50
+ storage: options?.storage ?? process.env.DISMISSIBLE_STORAGE_TYPE,
43
51
  }),
44
52
  }),
45
53
  ],
@@ -1 +1 @@
1
- {"version":3,"file":"app.module.js","sourceRoot":"","sources":["../../../api/src/app.module.ts"],"names":[],"mappings":";;;;;AAAA,2CAA6E;AAC7E,qCAAwC;AACxC,qCAAwC;AACxC,oDAAgD;AAChD,+BAA4B;AAC5B,0DAA6D;AAG7D,6EAAwE;AACxE,4EAI2C;AAWpC,IAAM,SAAS,iBAAf,MAAM,SAAS;IACpB,MAAM,CAAC,OAAO,CAAC,OAA0B;QACvC,OAAO;YACL,MAAM,EAAE,WAAS;YACjB,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;SACnC,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,iBAAiB,CAAC,OAA0B;QACjD,OAAO;YACL,OAAO,EAAE;gBACP,qBAAY,CAAC,OAAO,CAAC;oBACnB,IAAI,EAAE,OAAO,EAAE,UAAU,IAAI,IAAA,WAAI,EAAC,SAAS,EAAE,WAAW,CAAC;oBACzD,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,sBAAS;iBACrC,CAAC;gBACF,qBAAY;gBACZ,GAAG,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;gBAC3B,wCAAiB,CAAC,YAAY,CAAC;oBAC7B,UAAU,EAAE,CAAC,MAAyB,EAAE,EAAE,CAAC,MAAM;oBACjD,MAAM,EAAE,CAAC,wCAAiB,CAAC;iBAC5B,CAAC;gBACF,+BAAiB,CAAC,OAAO,CAAC;oBACxB,MAAM,EAAE,OAAO,EAAE,MAAM;oBACvB,KAAK,EAAE,CAAC,kCAAW,CAAC;oBACpB,OAAO,EAAE,6CAAoB,CAAC,YAAY,CAAC;wBACzC,yDAAyD;wBACzD,0EAA0E;wBAC1E,yEAAyE;wBACzE,yFAAyF;wBACzF,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAuC;qBAC7D,CAAC;iBACH,CAAC;aACH;SACF,CAAC;IACJ,CAAC;CACF,CAAA;AAnCY,8BAAS;oBAAT,SAAS;IADrB,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,SAAS,CAmCrB"}
1
+ {"version":3,"file":"app.module.js","sourceRoot":"","sources":["../../../api/src/app.module.ts"],"names":[],"mappings":";;;;;AAAA,2CAA6E;AAC7E,qCAAwC;AACxC,qCAAwC;AACxC,oDAAgD;AAChD,+BAA4B;AAC5B,0DAAwF;AAGxF,6EAAwE;AACxE,4EAI2C;AAE3C,oFAI+C;AAC/C,yDAAiD;AAY1C,IAAM,SAAS,iBAAf,MAAM,SAAS;IACpB,MAAM,CAAC,OAAO,CAAC,OAA0B;QACvC,OAAO;YACL,MAAM,EAAE,WAAS;YACjB,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;SACnC,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,iBAAiB,CAAC,OAA0B;QACjD,OAAO;YACL,OAAO,EAAE;gBACP,qBAAY,CAAC,OAAO,CAAC;oBACnB,IAAI,EAAE,OAAO,EAAE,UAAU,IAAI,IAAA,WAAI,EAAC,SAAS,EAAE,WAAW,CAAC;oBACzD,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,sBAAS;iBACrC,CAAC;gBACF,qBAAY;gBACZ,GAAG,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;gBAC3B,gDAAqB,CAAC,YAAY,CAAC;oBACjC,UAAU,EAAE,CAAC,MAAwB,EAAE,EAAE;wBACvC,OAAO,MAAM,CAAC,WAAW,IAAI,IAAA,gCAAY,EAAC,gDAAqB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;oBACvF,CAAC;oBACD,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,IAAI,sBAAS,CAAC;iBACvC,CAAC;gBACF,wCAAiB,CAAC,YAAY,CAAC;oBAC7B,UAAU,EAAE,CAAC,MAAyB,EAAE,EAAE,CAAC,MAAM;oBACjD,MAAM,EAAE,CAAC,wCAAiB,CAAC;iBAC5B,CAAC;gBACF,+BAAiB,CAAC,OAAO,CAAC;oBACxB,MAAM,EAAE,OAAO,EAAE,MAAM;oBACvB,KAAK,EAAE,CAAC,kCAAW,EAAE,0CAAe,EAAE,GAAG,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;oBAChE,OAAO,EAAE,6CAAoB,CAAC,YAAY,CAAC;wBACzC,yDAAyD;wBACzD,0EAA0E;wBAC1E,yEAAyE;wBACzE,yFAAyF;wBACzF,OAAO,EAAE,OAAO,EAAE,OAAO,IAAK,OAAO,CAAC,GAAG,CAAC,wBAAwC;qBACnF,CAAC;iBACH,CAAC;aACH;SACF,CAAC;IACJ,CAAC;CACF,CAAA;AAzCY,8BAAS;oBAAT,SAAS;IADrB,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,SAAS,CAyCrB"}
package/src/app.setup.js CHANGED
@@ -1,49 +1,18 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.configureApp = configureApp;
4
- const tslib_1 = require("tslib");
5
- const common_1 = require("@nestjs/common");
6
- const helmet_1 = tslib_1.__importDefault(require("@fastify/helmet"));
7
4
  const swagger_1 = require("./swagger");
8
5
  const cors_1 = require("./cors");
9
- const helmet_2 = require("./helmet");
6
+ const helmet_1 = require("./helmet");
10
7
  const validation_1 = require("./validation");
8
+ const nestjs_logger_1 = require("@dismissible/nestjs-logger");
11
9
  async function configureApp(app) {
12
- const fastifyApp = app;
13
- const helmetConfig = app.get(helmet_2.HelmetConfig);
14
- if (helmetConfig.enabled) {
15
- await fastifyApp.register(helmet_1.default, {
16
- contentSecurityPolicy: helmetConfig.contentSecurityPolicy ?? true,
17
- crossOriginEmbedderPolicy: helmetConfig.crossOriginEmbedderPolicy ?? true,
18
- hsts: {
19
- maxAge: helmetConfig.hstsMaxAge ?? 31536000,
20
- includeSubDomains: helmetConfig.hstsIncludeSubDomains ?? true,
21
- preload: helmetConfig.hstsPreload ?? false,
22
- },
23
- });
24
- }
25
- const corsConfig = app.get(cors_1.CorsConfig);
26
- if (corsConfig.enabled) {
27
- app.enableCors({
28
- origin: corsConfig.origins ?? ['http://localhost:3001', 'http://localhost:5173'],
29
- methods: corsConfig.methods ?? ['GET', 'POST', 'DELETE', 'OPTIONS'],
30
- allowedHeaders: corsConfig.allowedHeaders ?? [
31
- 'Content-Type',
32
- 'Authorization',
33
- 'x-request-id',
34
- ],
35
- credentials: corsConfig.credentials ?? true,
36
- maxAge: corsConfig.maxAge ?? 86400,
37
- });
38
- }
39
- const validationConfig = app.get(validation_1.ValidationConfig);
40
- app.useGlobalPipes(new common_1.ValidationPipe({
41
- whitelist: validationConfig.whitelist ?? true,
42
- forbidNonWhitelisted: validationConfig.forbidNonWhitelisted ?? true,
43
- transform: validationConfig.transform ?? true,
44
- disableErrorMessages: validationConfig.disableErrorMessages ?? true,
45
- }));
46
- const swaggerConfig = app.get(swagger_1.SwaggerConfig);
47
- (0, swagger_1.configureAppWithSwagger)(app, swaggerConfig);
10
+ const logger = app.get(nestjs_logger_1.DISMISSIBLE_LOGGER);
11
+ logger.setContext('AppSetup');
12
+ logger.info('Configuring application');
13
+ await (0, helmet_1.configureAppWithHelmet)(app);
14
+ (0, cors_1.configureAppWithCors)(app);
15
+ (0, validation_1.configureAppWithValidation)(app);
16
+ (0, swagger_1.configureAppWithSwagger)(app);
48
17
  }
49
18
  //# sourceMappingURL=app.setup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"app.setup.js","sourceRoot":"","sources":["../../../api/src/app.setup.ts"],"names":[],"mappings":";;AAQA,oCA2CC;;AAnDD,2CAAkE;AAElE,qEAA4C;AAC5C,uCAAmE;AACnE,iCAAoC;AACpC,qCAAwC;AACxC,6CAAgD;AAEzC,KAAK,UAAU,YAAY,CAAC,GAAqB;IACtD,MAAM,UAAU,GAAG,GAA6B,CAAC;IAEjD,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,qBAAY,CAAC,CAAC;IAC3C,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;QACzB,MAAM,UAAU,CAAC,QAAQ,CAAC,gBAAa,EAAE;YACvC,qBAAqB,EAAE,YAAY,CAAC,qBAAqB,IAAI,IAAI;YACjE,yBAAyB,EAAE,YAAY,CAAC,yBAAyB,IAAI,IAAI;YACzE,IAAI,EAAE;gBACJ,MAAM,EAAE,YAAY,CAAC,UAAU,IAAI,QAAQ;gBAC3C,iBAAiB,EAAE,YAAY,CAAC,qBAAqB,IAAI,IAAI;gBAC7D,OAAO,EAAE,YAAY,CAAC,WAAW,IAAI,KAAK;aAC3C;SACF,CAAC,CAAC;IACL,CAAC;IAED,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC,iBAAU,CAAC,CAAC;IACvC,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;QACvB,GAAG,CAAC,UAAU,CAAC;YACb,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,uBAAuB,EAAE,uBAAuB,CAAC;YAChF,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC;YACnE,cAAc,EAAE,UAAU,CAAC,cAAc,IAAI;gBAC3C,cAAc;gBACd,eAAe;gBACf,cAAc;aACf;YACD,WAAW,EAAE,UAAU,CAAC,WAAW,IAAI,IAAI;YAC3C,MAAM,EAAE,UAAU,CAAC,MAAM,IAAI,KAAK;SACnC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,gBAAgB,GAAG,GAAG,CAAC,GAAG,CAAC,6BAAgB,CAAC,CAAC;IACnD,GAAG,CAAC,cAAc,CAChB,IAAI,uBAAc,CAAC;QACjB,SAAS,EAAE,gBAAgB,CAAC,SAAS,IAAI,IAAI;QAC7C,oBAAoB,EAAE,gBAAgB,CAAC,oBAAoB,IAAI,IAAI;QACnE,SAAS,EAAE,gBAAgB,CAAC,SAAS,IAAI,IAAI;QAC7C,oBAAoB,EAAE,gBAAgB,CAAC,oBAAoB,IAAI,IAAI;KACpE,CAAC,CACH,CAAC;IAEF,MAAM,aAAa,GAAG,GAAG,CAAC,GAAG,CAAC,uBAAa,CAAC,CAAC;IAC7C,IAAA,iCAAuB,EAAC,GAAG,EAAE,aAAa,CAAC,CAAC;AAC9C,CAAC"}
1
+ {"version":3,"file":"app.setup.js","sourceRoot":"","sources":["../../../api/src/app.setup.ts"],"names":[],"mappings":";;AAOA,oCASC;AAfD,uCAAoD;AACpD,iCAA8C;AAC9C,qCAAkD;AAClD,6CAA0D;AAC1D,8DAAoF;AAE7E,KAAK,UAAU,YAAY,CAAC,GAAqB;IACtD,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAqB,kCAAkB,CAAC,CAAC;IAC/D,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAC9B,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAEvC,MAAM,IAAA,+BAAsB,EAAC,GAAG,CAAC,CAAC;IAClC,IAAA,2BAAoB,EAAC,GAAG,CAAC,CAAC;IAC1B,IAAA,uCAA0B,EAAC,GAAG,CAAC,CAAC;IAChC,IAAA,iCAAuB,EAAC,GAAG,CAAC,CAAC;AAC/B,CAAC"}
@@ -22,7 +22,6 @@ let ConfigModule = ConfigModule_1 = class ConfigModule {
22
22
  schema: options.schema,
23
23
  load: [
24
24
  (0, nest_typed_config_1.fileLoader)({
25
- basename: process.env.NODE_ENV ? '.env' : `.env.${process.env.NODE_ENV}`,
26
25
  searchFrom: configPath,
27
26
  ignoreEnvironmentVariableSubstitution: ignoreEnvSubstitution,
28
27
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"config.module.js","sourceRoot":"","sources":["../../../../api/src/config/config.module.ts"],"names":[],"mappings":";;;;;AAAA,2CAA+D;AAC/D,yDAAkE;AAClE,+BAA4B;AAqBrB,IAAM,YAAY,oBAAlB,MAAM,YAAY;IACvB;;;;OAIG;IACH,MAAM,CAAC,OAAO,CAAmB,OAAgC;QAC/D,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,IAAI,IAAA,WAAI,EAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QACnE,MAAM,qBAAqB,GAAG,OAAO,CAAC,qCAAqC,IAAI,KAAK,CAAC;QAErF,OAAO;YACL,MAAM,EAAE,cAAY;YACpB,OAAO,EAAE;gBACP,qCAAiB,CAAC,OAAO,CAAC;oBACxB,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,IAAI,EAAE;wBACJ,IAAA,8BAAU,EAAC;4BACT,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE;4BACxE,UAAU,EAAE,UAAU;4BACtB,qCAAqC,EAAE,qBAAqB;yBAC7D,CAAC;qBACH;iBACF,CAAC;aACH;YACD,OAAO,EAAE,CAAC,qCAAiB,CAAC;SAC7B,CAAC;IACJ,CAAC;CACF,CAAA;AA3BY,oCAAY;uBAAZ,YAAY;IAFxB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,YAAY,CA2BxB"}
1
+ {"version":3,"file":"config.module.js","sourceRoot":"","sources":["../../../../api/src/config/config.module.ts"],"names":[],"mappings":";;;;;AAAA,2CAA+D;AAC/D,yDAAkE;AAClE,+BAA4B;AAqBrB,IAAM,YAAY,oBAAlB,MAAM,YAAY;IACvB;;;;OAIG;IACH,MAAM,CAAC,OAAO,CAAmB,OAAgC;QAC/D,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,IAAI,IAAA,WAAI,EAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QACnE,MAAM,qBAAqB,GAAG,OAAO,CAAC,qCAAqC,IAAI,KAAK,CAAC;QAErF,OAAO;YACL,MAAM,EAAE,cAAY;YACpB,OAAO,EAAE;gBACP,qCAAiB,CAAC,OAAO,CAAC;oBACxB,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,IAAI,EAAE;wBACJ,IAAA,8BAAU,EAAC;4BACT,UAAU,EAAE,UAAU;4BACtB,qCAAqC,EAAE,qBAAqB;yBAC7D,CAAC;qBACH;iBACF,CAAC;aACH;YACD,OAAO,EAAE,CAAC,qCAAiB,CAAC;SAC7B,CAAC;IACJ,CAAC;CACF,CAAA;AA1BY,oCAAY;uBAAZ,YAAY;IAFxB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,YAAY,CA0BxB"}
@@ -2,8 +2,10 @@ import { ServerConfig } from '../server/server.config';
2
2
  import { CorsConfig } from '../cors';
3
3
  import { HelmetConfig } from '../helmet';
4
4
  import { ValidationConfig } from '../validation';
5
+ import { RateLimiterHookConfig } from '@dismissible/nestjs-rate-limiter-hook';
5
6
  export declare class DefaultAppConfig {
6
7
  readonly server: ServerConfig;
8
+ readonly rateLimiter?: RateLimiterHookConfig;
7
9
  readonly cors: CorsConfig;
8
10
  readonly helmet: HelmetConfig;
9
11
  readonly validation: ValidationConfig;
@@ -8,6 +8,7 @@ const server_config_1 = require("../server/server.config");
8
8
  const cors_1 = require("../cors");
9
9
  const helmet_1 = require("../helmet");
10
10
  const validation_1 = require("../validation");
11
+ const nestjs_rate_limiter_hook_1 = require("@dismissible/nestjs-rate-limiter-hook");
11
12
  class DefaultAppConfig {
12
13
  }
13
14
  exports.DefaultAppConfig = DefaultAppConfig;
@@ -16,6 +17,12 @@ tslib_1.__decorate([
16
17
  (0, class_transformer_1.Type)(() => server_config_1.ServerConfig),
17
18
  tslib_1.__metadata("design:type", server_config_1.ServerConfig)
18
19
  ], DefaultAppConfig.prototype, "server", void 0);
20
+ tslib_1.__decorate([
21
+ (0, class_validator_1.IsOptional)(),
22
+ (0, class_validator_1.ValidateNested)(),
23
+ (0, class_transformer_1.Type)(() => nestjs_rate_limiter_hook_1.RateLimiterHookConfig),
24
+ tslib_1.__metadata("design:type", nestjs_rate_limiter_hook_1.RateLimiterHookConfig)
25
+ ], DefaultAppConfig.prototype, "rateLimiter", void 0);
19
26
  tslib_1.__decorate([
20
27
  (0, class_validator_1.ValidateNested)(),
21
28
  (0, class_transformer_1.Type)(() => cors_1.CorsConfig),
@@ -1 +1 @@
1
- {"version":3,"file":"default-app.config.js","sourceRoot":"","sources":["../../../../api/src/config/default-app.config.ts"],"names":[],"mappings":";;;;AAAA,qDAAiD;AACjD,yDAAyC;AACzC,2DAAuD;AACvD,kCAAqC;AACrC,sCAAyC;AACzC,8CAAiD;AAEjD,MAAa,gBAAgB;CAgB5B;AAhBD,4CAgBC;AAbiB;IAFf,IAAA,gCAAc,GAAE;IAChB,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,4BAAY,CAAC;sCACA,4BAAY;gDAAC;AAItB;IAFf,IAAA,gCAAc,GAAE;IAChB,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,iBAAU,CAAC;sCACA,iBAAU;8CAAC;AAIlB;IAFf,IAAA,gCAAc,GAAE;IAChB,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,qBAAY,CAAC;sCACA,qBAAY;gDAAC;AAItB;IAFf,IAAA,gCAAc,GAAE;IAChB,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,6BAAgB,CAAC;sCACA,6BAAgB;oDAAC"}
1
+ {"version":3,"file":"default-app.config.js","sourceRoot":"","sources":["../../../../api/src/config/default-app.config.ts"],"names":[],"mappings":";;;;AAAA,qDAA6D;AAC7D,yDAAyC;AACzC,2DAAuD;AACvD,kCAAqC;AACrC,sCAAyC;AACzC,8CAAiD;AACjD,oFAA8E;AAE9E,MAAa,gBAAgB;CAqB5B;AArBD,4CAqBC;AAlBiB;IAFf,IAAA,gCAAc,GAAE;IAChB,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,4BAAY,CAAC;sCACA,4BAAY;gDAAC;AAKtB;IAHf,IAAA,4BAAU,GAAE;IACZ,IAAA,gCAAc,GAAE;IAChB,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,gDAAqB,CAAC;sCACJ,gDAAqB;qDAAC;AAIpC;IAFf,IAAA,gCAAc,GAAE;IAChB,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,iBAAU,CAAC;sCACA,iBAAU;8CAAC;AAIlB;IAFf,IAAA,gCAAc,GAAE;IAChB,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,qBAAY,CAAC;sCACA,qBAAY;gDAAC;AAItB;IAFf,IAAA,gCAAc,GAAE;IAChB,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,6BAAgB,CAAC;sCACA,6BAAgB;oDAAC"}
@@ -14,9 +14,10 @@ tslib_1.__decorate([
14
14
  tslib_1.__metadata("design:type", Boolean)
15
15
  ], CorsConfig.prototype, "enabled", void 0);
16
16
  tslib_1.__decorate([
17
+ (0, class_validator_1.ValidateIf)((o) => o.enabled === true),
17
18
  (0, class_validator_1.IsArray)(),
19
+ (0, class_validator_1.ArrayNotEmpty)({ message: 'origins must not be empty when CORS is enabled' }),
18
20
  (0, class_validator_1.IsString)({ each: true }),
19
- (0, class_validator_1.IsOptional)(),
20
21
  (0, nestjs_validation_1.TransformCommaSeparated)(),
21
22
  tslib_1.__metadata("design:type", Array)
22
23
  ], CorsConfig.prototype, "origins", void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"cors.config.js","sourceRoot":"","sources":["../../../../api/src/cors/cors.config.ts"],"names":[],"mappings":";;;;AAAA,qDAAqF;AACrF,yDAAyC;AACzC,sEAA2F;AAE3F,MAAa,UAAU;CAgCtB;AAhCD,gCAgCC;AA7BiB;IAFf,IAAA,2BAAS,GAAE;IACX,IAAA,oCAAgB,GAAE;;2CACe;AAMlB;IAJf,IAAA,yBAAO,GAAE;IACT,IAAA,0BAAQ,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACxB,IAAA,4BAAU,GAAE;IACZ,IAAA,2CAAuB,GAAE;;2CACS;AAMnB;IAJf,IAAA,yBAAO,GAAE;IACT,IAAA,0BAAQ,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACxB,IAAA,4BAAU,GAAE;IACZ,IAAA,2CAAuB,GAAE;;2CACS;AAMnB;IAJf,IAAA,yBAAO,GAAE;IACT,IAAA,0BAAQ,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACxB,IAAA,4BAAU,GAAE;IACZ,IAAA,2CAAuB,GAAE;;kDACgB;AAK1B;IAHf,IAAA,2BAAS,GAAE;IACX,IAAA,4BAAU,GAAE;IACZ,IAAA,oCAAgB,GAAE;;+CACmB;AAKtB;IAHf,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC;;0CACa"}
1
+ {"version":3,"file":"cors.config.js","sourceRoot":"","sources":["../../../../api/src/cors/cors.config.ts"],"names":[],"mappings":";;;;AAAA,qDAQyB;AACzB,yDAAyC;AACzC,sEAA2F;AAE3F,MAAa,UAAU;CAiCtB;AAjCD,gCAiCC;AA9BiB;IAFf,IAAA,2BAAS,GAAE;IACX,IAAA,oCAAgB,GAAE;;2CACe;AAOlB;IALf,IAAA,4BAAU,EAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC;IACrC,IAAA,yBAAO,GAAE;IACT,IAAA,+BAAa,EAAC,EAAE,OAAO,EAAE,gDAAgD,EAAE,CAAC;IAC5E,IAAA,0BAAQ,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACxB,IAAA,2CAAuB,GAAE;;2CACS;AAMnB;IAJf,IAAA,yBAAO,GAAE;IACT,IAAA,0BAAQ,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACxB,IAAA,4BAAU,GAAE;IACZ,IAAA,2CAAuB,GAAE;;2CACS;AAMnB;IAJf,IAAA,yBAAO,GAAE;IACT,IAAA,0BAAQ,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACxB,IAAA,4BAAU,GAAE;IACZ,IAAA,2CAAuB,GAAE;;kDACgB;AAK1B;IAHf,IAAA,2BAAS,GAAE;IACX,IAAA,4BAAU,GAAE;IACZ,IAAA,oCAAgB,GAAE;;+CACmB;AAKtB;IAHf,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC;;0CACa"}
@@ -0,0 +1,2 @@
1
+ import { INestApplication } from '@nestjs/common';
2
+ export declare function configureAppWithCors(app: INestApplication): void;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.configureAppWithCors = configureAppWithCors;
4
+ const cors_config_1 = require("./cors.config");
5
+ const nestjs_logger_1 = require("@dismissible/nestjs-logger");
6
+ function configureAppWithCors(app) {
7
+ const logger = app.get(nestjs_logger_1.DISMISSIBLE_LOGGER);
8
+ logger.setContext('CORS');
9
+ const corsConfig = app.get(cors_config_1.CorsConfig);
10
+ if (corsConfig.enabled) {
11
+ // origins is guaranteed to be non-empty when enabled via @ValidateIf + @ArrayNotEmpty
12
+ app.enableCors({
13
+ origin: corsConfig.origins,
14
+ methods: corsConfig.methods ?? ['GET', 'POST', 'DELETE', 'OPTIONS'],
15
+ allowedHeaders: corsConfig.allowedHeaders ?? [
16
+ 'Content-Type',
17
+ 'Authorization',
18
+ 'x-request-id',
19
+ ],
20
+ credentials: corsConfig.credentials ?? true,
21
+ maxAge: corsConfig.maxAge ?? 86400,
22
+ });
23
+ logger.info('CORS is enabled', { corsConfig });
24
+ }
25
+ else {
26
+ logger.info('CORS is disabled');
27
+ }
28
+ }
29
+ //# sourceMappingURL=cors.factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cors.factory.js","sourceRoot":"","sources":["../../../../api/src/cors/cors.factory.ts"],"names":[],"mappings":";;AAIA,oDAsBC;AAzBD,+CAA2C;AAC3C,8DAAoF;AAEpF,SAAgB,oBAAoB,CAAC,GAAqB;IACxD,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAqB,kCAAkB,CAAC,CAAC;IAC/D,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC1B,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC,wBAAU,CAAC,CAAC;IAEvC,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;QACvB,sFAAsF;QACtF,GAAG,CAAC,UAAU,CAAC;YACb,MAAM,EAAE,UAAU,CAAC,OAAQ;YAC3B,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC;YACnE,cAAc,EAAE,UAAU,CAAC,cAAc,IAAI;gBAC3C,cAAc;gBACd,eAAe;gBACf,cAAc;aACf;YACD,WAAW,EAAE,UAAU,CAAC,WAAW,IAAI,IAAI;YAC3C,MAAM,EAAE,UAAU,CAAC,MAAM,IAAI,KAAK;SACnC,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;IACjD,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAClC,CAAC;AACH,CAAC"}
@@ -1 +1,2 @@
1
1
  export * from './cors.config';
2
+ export * from './cors.factory';
package/src/cors/index.js CHANGED
@@ -2,4 +2,5 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
4
  tslib_1.__exportStar(require("./cors.config"), exports);
5
+ tslib_1.__exportStar(require("./cors.factory"), exports);
5
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../api/src/cors/index.ts"],"names":[],"mappings":";;;AAAA,wDAA8B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../api/src/cors/index.ts"],"names":[],"mappings":";;;AAAA,wDAA8B;AAC9B,yDAA+B"}
@@ -2,6 +2,8 @@ import { INestApplication } from '@nestjs/common';
2
2
  import { DefaultAppConfig } from './config/default-app.config';
3
3
  import { IDismissibleLogger } from '@dismissible/nestjs-logger';
4
4
  import { Type, DynamicModule } from '@nestjs/common';
5
+ import { IDismissibleLifecycleHook } from '@dismissible/nestjs-hooks';
6
+ import { StorageType } from './storage/storage.config';
5
7
  export interface IDismissibleNestApplication {
6
8
  getNestApplication(): INestApplication;
7
9
  start(): Promise<void>;
@@ -11,6 +13,8 @@ export interface IDismissibleNestFactoryOptions {
11
13
  schema?: new () => DefaultAppConfig;
12
14
  logger?: Type<IDismissibleLogger>;
13
15
  imports?: DynamicModule[];
16
+ hooks?: Type<IDismissibleLifecycleHook>[];
17
+ storage?: StorageType;
14
18
  }
15
19
  export declare class DismissibleNestFactory {
16
20
  static create(options?: IDismissibleNestFactoryOptions): Promise<IDismissibleNestApplication>;
@@ -1 +1 @@
1
- {"version":3,"file":"dismissible-nest-factory.js","sourceRoot":"","sources":["../../../api/src/dismissible-nest-factory.ts"],"names":[],"mappings":";;;AACA,uCAA2C;AAC3C,+DAAkF;AAClF,6CAAyC;AACzC,0DAAsD;AACtD,2CAA2C;AAiB3C,MAAM,0BAA0B;IAC9B,YAA6B,GAA2B;QAA3B,QAAG,GAAH,GAAG,CAAwB;IAAG,CAAC;IAE5D,KAAK,CAAC,KAAK;QACT,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,4BAAY,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,IAAI,IAAI,CAAC;QACvC,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,kDAAkD,IAAI,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,kBAAkB;QAChB,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;CACF;AAED,MAAa,sBAAsB;IACjC,MAAM,CAAC,KAAK,CAAC,MAAM,CACjB,OAAwC;QAExC,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAClC,sBAAS,CAAC,OAAO,CAAC,OAAO,CAAC,EAC1B,IAAI,iCAAc,CAAC;YACjB,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO;SAC9B,CAAC,CACH,CAAC;QACF,MAAM,IAAA,wBAAY,EAAC,GAAG,CAAC,CAAC;QAExB,OAAO,IAAI,0BAA0B,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;CACF;AAdD,wDAcC"}
1
+ {"version":3,"file":"dismissible-nest-factory.js","sourceRoot":"","sources":["../../../api/src/dismissible-nest-factory.ts"],"names":[],"mappings":";;;AACA,uCAA2C;AAC3C,+DAAkF;AAClF,6CAAyC;AACzC,0DAAsD;AACtD,2CAA2C;AAqB3C,MAAM,0BAA0B;IAC9B,YAA6B,GAA2B;QAA3B,QAAG,GAAH,GAAG,CAAwB;IAAG,CAAC;IAE5D,KAAK,CAAC,KAAK;QACT,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,4BAAY,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,IAAI,IAAI,CAAC;QACvC,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,kDAAkD,IAAI,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,kBAAkB;QAChB,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;CACF;AAED,MAAa,sBAAsB;IACjC,MAAM,CAAC,KAAK,CAAC,MAAM,CACjB,OAAwC;QAExC,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAClC,sBAAS,CAAC,OAAO,CAAC,OAAO,CAAC,EAC1B,IAAI,iCAAc,CAAC;YACjB,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO;SAC9B,CAAC,CACH,CAAC;QACF,MAAM,IAAA,wBAAY,EAAC,GAAG,CAAC,CAAC;QAExB,OAAO,IAAI,0BAA0B,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;CACF;AAdD,wDAcC"}
@@ -0,0 +1,2 @@
1
+ import { INestApplication } from '@nestjs/common';
2
+ export declare function configureAppWithHelmet(app: INestApplication): Promise<void>;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.configureAppWithHelmet = configureAppWithHelmet;
4
+ const tslib_1 = require("tslib");
5
+ const helmet_1 = tslib_1.__importDefault(require("@fastify/helmet"));
6
+ const helmet_config_1 = require("./helmet.config");
7
+ const nestjs_logger_1 = require("@dismissible/nestjs-logger");
8
+ async function configureAppWithHelmet(app) {
9
+ const logger = app.get(nestjs_logger_1.DISMISSIBLE_LOGGER);
10
+ logger.setContext('Helmet');
11
+ const helmetConfig = app.get(helmet_config_1.HelmetConfig);
12
+ if (helmetConfig.enabled) {
13
+ const fastifyApp = app;
14
+ await fastifyApp.register(helmet_1.default, {
15
+ contentSecurityPolicy: helmetConfig.contentSecurityPolicy ?? true,
16
+ crossOriginEmbedderPolicy: helmetConfig.crossOriginEmbedderPolicy ?? true,
17
+ hsts: {
18
+ maxAge: helmetConfig.hstsMaxAge ?? 31536000,
19
+ includeSubDomains: helmetConfig.hstsIncludeSubDomains ?? true,
20
+ preload: helmetConfig.hstsPreload ?? false,
21
+ },
22
+ });
23
+ logger.info('Helmet is enabled', { helmetConfig });
24
+ }
25
+ else {
26
+ logger.info('Helmet is disabled');
27
+ }
28
+ }
29
+ //# sourceMappingURL=helmet.factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helmet.factory.js","sourceRoot":"","sources":["../../../../api/src/helmet/helmet.factory.ts"],"names":[],"mappings":";;AAMA,wDAoBC;;AAxBD,qEAA4C;AAC5C,mDAA+C;AAC/C,8DAAoF;AAE7E,KAAK,UAAU,sBAAsB,CAAC,GAAqB;IAChE,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAqB,kCAAkB,CAAC,CAAC;IAC/D,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC5B,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,4BAAY,CAAC,CAAC;IAE3C,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,GAA6B,CAAC;QACjD,MAAM,UAAU,CAAC,QAAQ,CAAC,gBAAa,EAAE;YACvC,qBAAqB,EAAE,YAAY,CAAC,qBAAqB,IAAI,IAAI;YACjE,yBAAyB,EAAE,YAAY,CAAC,yBAAyB,IAAI,IAAI;YACzE,IAAI,EAAE;gBACJ,MAAM,EAAE,YAAY,CAAC,UAAU,IAAI,QAAQ;gBAC3C,iBAAiB,EAAE,YAAY,CAAC,qBAAqB,IAAI,IAAI;gBAC7D,OAAO,EAAE,YAAY,CAAC,WAAW,IAAI,KAAK;aAC3C;SACF,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;IACrD,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACpC,CAAC;AACH,CAAC"}
@@ -1 +1,2 @@
1
1
  export * from './helmet.config';
2
+ export * from './helmet.factory';
@@ -2,4 +2,5 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
4
  tslib_1.__exportStar(require("./helmet.config"), exports);
5
+ tslib_1.__exportStar(require("./helmet.factory"), exports);
5
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../api/src/helmet/index.ts"],"names":[],"mappings":";;;AAAA,0DAAgC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../api/src/helmet/index.ts"],"names":[],"mappings":";;;AAAA,0DAAgC;AAChC,2DAAiC"}
@@ -18,14 +18,6 @@ exports.StorageConfig = StorageConfig;
18
18
  tslib_1.__decorate([
19
19
  (0, class_validator_1.IsDefined)(),
20
20
  (0, class_validator_1.IsEnum)(StorageType),
21
- (0, class_transformer_1.Transform)(({ value }) => {
22
- if (!value)
23
- return value;
24
- if (Object.values(StorageType).includes(value)) {
25
- return value;
26
- }
27
- return StorageType[value] || value;
28
- }),
29
21
  tslib_1.__metadata("design:type", String)
30
22
  ], StorageConfig.prototype, "type", void 0);
31
23
  tslib_1.__decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"storage.config.js","sourceRoot":"","sources":["../../../../api/src/storage/storage.config.ts"],"names":[],"mappings":";;;;AAAA,qDAAgF;AAChF,yDAAoD;AACpD,kFAA6E;AAC7E,kFAA6E;AAE7E,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,gCAAiB,CAAA;IACjB,oCAAqB,CAAA;IACrB,oCAAqB,CAAA;AACvB,CAAC,EAJW,WAAW,2BAAX,WAAW,QAItB;AAED,MAAa,aAAa;CAuBzB;AAvBD,sCAuBC;AAbiB;IATf,IAAA,2BAAS,GAAE;IACX,IAAA,wBAAM,EAAC,WAAW,CAAC;IACnB,IAAA,6BAAS,EAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;QACvB,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QACzB,IAAI,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAoB,CAAC,EAAE,CAAC;YAC9D,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,WAAW,CAAC,KAAiC,CAAC,IAAI,KAAK,CAAC;IACjE,CAAC,CAAC;;2CACiC;AAMnB;IAJf,IAAA,4BAAU,EAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,QAAQ,CAAC;IAClD,IAAA,2BAAS,GAAE;IACX,IAAA,gCAAc,GAAE;IAChB,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,+CAAqB,CAAC;sCACP,+CAAqB;+CAAC;AAMjC;IAJf,IAAA,4BAAU,EAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,QAAQ,CAAC;IAClD,IAAA,2BAAS,GAAE;IACX,IAAA,gCAAc,GAAE;IAChB,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,+CAAqB,CAAC;sCACP,+CAAqB;+CAAC"}
1
+ {"version":3,"file":"storage.config.js","sourceRoot":"","sources":["../../../../api/src/storage/storage.config.ts"],"names":[],"mappings":";;;;AAAA,qDAAgF;AAChF,yDAAyC;AACzC,kFAA6E;AAC7E,kFAA6E;AAE7E,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,gCAAiB,CAAA;IACjB,oCAAqB,CAAA;IACrB,oCAAqB,CAAA;AACvB,CAAC,EAJW,WAAW,2BAAX,WAAW,QAItB;AAED,MAAa,aAAa;CAgBzB;AAhBD,sCAgBC;AAbiB;IAFf,IAAA,2BAAS,GAAE;IACX,IAAA,wBAAM,EAAC,WAAW,CAAC;;2CACe;AAMnB;IAJf,IAAA,4BAAU,EAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,QAAQ,CAAC;IAClD,IAAA,2BAAS,GAAE;IACX,IAAA,gCAAc,GAAE;IAChB,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,+CAAqB,CAAC;sCACP,+CAAqB;+CAAC;AAMjC;IAJf,IAAA,4BAAU,EAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,QAAQ,CAAC;IAClD,IAAA,2BAAS,GAAE;IACX,IAAA,gCAAc,GAAE;IAChB,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,+CAAqB,CAAC;sCACP,+CAAqB;+CAAC"}
@@ -1,3 +1,2 @@
1
1
  import { INestApplication } from '@nestjs/common';
2
- import { SwaggerConfig } from './swagger.config';
3
- export declare function configureAppWithSwagger(app: INestApplication, swaggerConfig: SwaggerConfig): void;
2
+ export declare function configureAppWithSwagger(app: INestApplication): void;
@@ -2,11 +2,17 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.configureAppWithSwagger = configureAppWithSwagger;
4
4
  const swagger_1 = require("@nestjs/swagger");
5
+ const swagger_config_1 = require("./swagger.config");
6
+ const nestjs_logger_1 = require("@dismissible/nestjs-logger");
5
7
  const swaggerDocumentOptions = {
6
8
  operationIdFactory: (_controllerKey, methodKey) => methodKey,
7
9
  };
8
- function configureAppWithSwagger(app, swaggerConfig) {
10
+ function configureAppWithSwagger(app) {
11
+ const logger = app.get(nestjs_logger_1.DISMISSIBLE_LOGGER);
12
+ logger.setContext('Swagger');
13
+ const swaggerConfig = app.get(swagger_config_1.SwaggerConfig);
9
14
  if (swaggerConfig.enabled) {
15
+ logger.info('Swagger is enabled', { swaggerConfig });
10
16
  const { path = 'docs' } = swaggerConfig;
11
17
  const config = new swagger_1.DocumentBuilder()
12
18
  .setTitle('Dismissible')
@@ -18,5 +24,8 @@ function configureAppWithSwagger(app, swaggerConfig) {
18
24
  useGlobalPrefix: true,
19
25
  });
20
26
  }
27
+ else {
28
+ logger.info('Swagger is disabled');
29
+ }
21
30
  }
22
31
  //# sourceMappingURL=swagger.factory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"swagger.factory.js","sourceRoot":"","sources":["../../../../api/src/swagger/swagger.factory.ts"],"names":[],"mappings":";;AAQA,0DAeC;AAtBD,6CAAyF;AAGzF,MAAM,sBAAsB,GAA2B;IACrD,kBAAkB,EAAE,CAAC,cAAsB,EAAE,SAAiB,EAAE,EAAE,CAAC,SAAS;CAC7E,CAAC;AAEF,SAAgB,uBAAuB,CAAC,GAAqB,EAAE,aAA4B;IACzF,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;QAC1B,MAAM,EAAE,IAAI,GAAG,MAAM,EAAE,GAAG,aAAa,CAAC;QAExC,MAAM,MAAM,GAAG,IAAI,yBAAe,EAAE;aACjC,QAAQ,CAAC,aAAa,CAAC;aACvB,cAAc,CAAC,8CAA8C,CAAC;aAC9D,UAAU,CAAC,KAAK,CAAC;aACjB,KAAK,EAAE,CAAC;QAEX,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,uBAAa,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,sBAAsB,CAAC,CAAC;QAChG,uBAAa,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,eAAe,EAAE;YAC9C,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"swagger.factory.js","sourceRoot":"","sources":["../../../../api/src/swagger/swagger.factory.ts"],"names":[],"mappings":";;AASA,0DAsBC;AA9BD,6CAAyF;AACzF,qDAAiD;AACjD,8DAAoF;AAEpF,MAAM,sBAAsB,GAA2B;IACrD,kBAAkB,EAAE,CAAC,cAAsB,EAAE,SAAiB,EAAE,EAAE,CAAC,SAAS;CAC7E,CAAC;AAEF,SAAgB,uBAAuB,CAAC,GAAqB;IAC3D,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAqB,kCAAkB,CAAC,CAAC;IAC/D,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAC7B,MAAM,aAAa,GAAG,GAAG,CAAC,GAAG,CAAC,8BAAa,CAAC,CAAC;IAE7C,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC;QACrD,MAAM,EAAE,IAAI,GAAG,MAAM,EAAE,GAAG,aAAa,CAAC;QAExC,MAAM,MAAM,GAAG,IAAI,yBAAe,EAAE;aACjC,QAAQ,CAAC,aAAa,CAAC;aACvB,cAAc,CAAC,8CAA8C,CAAC;aAC9D,UAAU,CAAC,KAAK,CAAC;aACjB,KAAK,EAAE,CAAC;QAEX,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,uBAAa,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,sBAAsB,CAAC,CAAC;QAChG,uBAAa,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,eAAe,EAAE;YAC9C,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACrC,CAAC;AACH,CAAC"}
@@ -1 +1,2 @@
1
1
  export * from './validation.config';
2
+ export * from './validation.factory';
@@ -2,4 +2,5 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
4
  tslib_1.__exportStar(require("./validation.config"), exports);
5
+ tslib_1.__exportStar(require("./validation.factory"), exports);
5
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../api/src/validation/index.ts"],"names":[],"mappings":";;;AAAA,8DAAoC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../api/src/validation/index.ts"],"names":[],"mappings":";;;AAAA,8DAAoC;AACpC,+DAAqC"}
@@ -0,0 +1,2 @@
1
+ import { INestApplication } from '@nestjs/common';
2
+ export declare function configureAppWithValidation(app: INestApplication): void;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.configureAppWithValidation = configureAppWithValidation;
4
+ const common_1 = require("@nestjs/common");
5
+ const validation_config_1 = require("./validation.config");
6
+ const nestjs_logger_1 = require("@dismissible/nestjs-logger");
7
+ function configureAppWithValidation(app) {
8
+ const logger = app.get(nestjs_logger_1.DISMISSIBLE_LOGGER);
9
+ logger.setContext('Validation');
10
+ const validationConfig = app.get(validation_config_1.ValidationConfig);
11
+ logger.info('Registering ValidationPipe', { validationConfig });
12
+ app.useGlobalPipes(new common_1.ValidationPipe({
13
+ whitelist: validationConfig.whitelist ?? true,
14
+ forbidNonWhitelisted: validationConfig.forbidNonWhitelisted ?? true,
15
+ transform: validationConfig.transform ?? true,
16
+ disableErrorMessages: validationConfig.disableErrorMessages ?? true,
17
+ }));
18
+ }
19
+ //# sourceMappingURL=validation.factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.factory.js","sourceRoot":"","sources":["../../../../api/src/validation/validation.factory.ts"],"names":[],"mappings":";;AAIA,gEAcC;AAlBD,2CAAkE;AAClE,2DAAuD;AACvD,8DAAoF;AAEpF,SAAgB,0BAA0B,CAAC,GAAqB;IAC9D,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAqB,kCAAkB,CAAC,CAAC;IAC/D,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IAChC,MAAM,gBAAgB,GAAG,GAAG,CAAC,GAAG,CAAC,oCAAgB,CAAC,CAAC;IAEnD,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAChE,GAAG,CAAC,cAAc,CAChB,IAAI,uBAAc,CAAC;QACjB,SAAS,EAAE,gBAAgB,CAAC,SAAS,IAAI,IAAI;QAC7C,oBAAoB,EAAE,gBAAgB,CAAC,oBAAoB,IAAI,IAAI;QACnE,SAAS,EAAE,gBAAgB,CAAC,SAAS,IAAI,IAAI;QAC7C,oBAAoB,EAAE,gBAAgB,CAAC,oBAAoB,IAAI,IAAI;KACpE,CAAC,CACH,CAAC;AACJ,CAAC"}