@decaf-ts/for-nest 0.0.4 → 0.0.5

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 (71) hide show
  1. package/dist/for-nest.cjs +573 -6
  2. package/dist/for-nest.esm.cjs +549 -6
  3. package/lib/esm/factory/NestBootstraper.d.ts +214 -0
  4. package/lib/esm/factory/NestBootstraper.js +269 -0
  5. package/lib/esm/factory/errors/cors.d.ts +4 -0
  6. package/lib/esm/factory/errors/cors.js +7 -0
  7. package/lib/esm/factory/errors/index.d.ts +1 -0
  8. package/lib/esm/factory/errors/index.js +2 -0
  9. package/lib/esm/factory/exceptions/AuthorizationExceptionFilter.d.ts +9 -0
  10. package/lib/esm/factory/exceptions/AuthorizationExceptionFilter.js +35 -0
  11. package/lib/esm/factory/exceptions/ConflictExceptionFilter.d.ts +9 -0
  12. package/lib/esm/factory/exceptions/ConflictExceptionFilter.js +35 -0
  13. package/lib/esm/factory/exceptions/GlobalExceptionFilter.d.ts +4 -0
  14. package/lib/esm/factory/exceptions/GlobalExceptionFilter.js +35 -0
  15. package/lib/esm/factory/exceptions/HttpExceptionFilter.d.ts +4 -0
  16. package/lib/esm/factory/exceptions/HttpExceptionFilter.js +27 -0
  17. package/lib/esm/factory/exceptions/HttpResponseError.d.ts +14 -0
  18. package/lib/esm/factory/exceptions/HttpResponseError.js +19 -0
  19. package/lib/esm/factory/exceptions/NotFoundExceptionFilter.d.ts +9 -0
  20. package/lib/esm/factory/exceptions/NotFoundExceptionFilter.js +35 -0
  21. package/lib/esm/factory/exceptions/ValidationExceptionFilter.d.ts +9 -0
  22. package/lib/esm/factory/exceptions/ValidationExceptionFilter.js +35 -0
  23. package/lib/esm/factory/exceptions/index.d.ts +6 -0
  24. package/lib/esm/factory/exceptions/index.js +7 -0
  25. package/lib/esm/factory/index.d.ts +4 -0
  26. package/lib/esm/factory/index.js +5 -0
  27. package/lib/esm/factory/openapi/SwaggerBuilder.d.ts +9 -0
  28. package/lib/esm/factory/openapi/SwaggerBuilder.js +42 -0
  29. package/lib/esm/factory/openapi/SwaggerCustomUI.d.ts +24 -0
  30. package/lib/esm/factory/openapi/SwaggerCustomUI.js +55 -0
  31. package/lib/esm/factory/openapi/constants.d.ts +16 -0
  32. package/lib/esm/factory/openapi/constants.js +19 -0
  33. package/lib/esm/factory/openapi/index.d.ts +1 -0
  34. package/lib/esm/factory/openapi/index.js +2 -0
  35. package/lib/esm/index.d.ts +2 -1
  36. package/lib/esm/index.js +3 -2
  37. package/lib/factory/NestBootstraper.cjs +273 -0
  38. package/lib/factory/NestBootstraper.d.ts +214 -0
  39. package/lib/factory/errors/cors.cjs +11 -0
  40. package/lib/factory/errors/cors.d.ts +4 -0
  41. package/lib/factory/errors/index.cjs +18 -0
  42. package/lib/factory/errors/index.d.ts +1 -0
  43. package/lib/factory/exceptions/AuthorizationExceptionFilter.cjs +39 -0
  44. package/lib/factory/exceptions/AuthorizationExceptionFilter.d.ts +9 -0
  45. package/lib/factory/exceptions/ConflictExceptionFilter.cjs +39 -0
  46. package/lib/factory/exceptions/ConflictExceptionFilter.d.ts +9 -0
  47. package/lib/factory/exceptions/GlobalExceptionFilter.cjs +38 -0
  48. package/lib/factory/exceptions/GlobalExceptionFilter.d.ts +4 -0
  49. package/lib/factory/exceptions/HttpExceptionFilter.cjs +30 -0
  50. package/lib/factory/exceptions/HttpExceptionFilter.d.ts +4 -0
  51. package/lib/factory/exceptions/HttpResponseError.cjs +23 -0
  52. package/lib/factory/exceptions/HttpResponseError.d.ts +14 -0
  53. package/lib/factory/exceptions/NotFoundExceptionFilter.cjs +39 -0
  54. package/lib/factory/exceptions/NotFoundExceptionFilter.d.ts +9 -0
  55. package/lib/factory/exceptions/ValidationExceptionFilter.cjs +39 -0
  56. package/lib/factory/exceptions/ValidationExceptionFilter.d.ts +9 -0
  57. package/lib/factory/exceptions/index.cjs +23 -0
  58. package/lib/factory/exceptions/index.d.ts +6 -0
  59. package/lib/factory/index.cjs +21 -0
  60. package/lib/factory/index.d.ts +4 -0
  61. package/lib/factory/openapi/SwaggerBuilder.cjs +46 -0
  62. package/lib/factory/openapi/SwaggerBuilder.d.ts +9 -0
  63. package/lib/factory/openapi/SwaggerCustomUI.cjs +92 -0
  64. package/lib/factory/openapi/SwaggerCustomUI.d.ts +24 -0
  65. package/lib/factory/openapi/constants.cjs +22 -0
  66. package/lib/factory/openapi/constants.d.ts +16 -0
  67. package/lib/factory/openapi/index.cjs +18 -0
  68. package/lib/factory/openapi/index.d.ts +1 -0
  69. package/lib/index.cjs +3 -2
  70. package/lib/index.d.ts +2 -1
  71. package/package.json +1 -1
@@ -0,0 +1,273 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NestBootstraper = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const exceptions_1 = require("./exceptions/index.cjs");
6
+ const openapi_1 = require("./openapi/index.cjs");
7
+ const errors_1 = require("./errors/index.cjs");
8
+ /**
9
+ * @description
10
+ * A fluent, static bootstrap class for initializing and configuring a NestJS application.
11
+ *
12
+ * @summary
13
+ * The `NestBootstraper` class provides a chainable API for configuring
14
+ * a NestJS application instance. It includes built-in methods for enabling
15
+ * CORS, Helmet security, Swagger documentation, global pipes, filters,
16
+ * interceptors, and starting the server.
17
+ *
18
+ * This class promotes consistency and reduces repetitive setup code
19
+ * across multiple NestJS projects.
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * import { NestFactory } from "@nestjs/core";
24
+ * import { AppModule } from "./app.module";
25
+ * import { MyLogger } from "./MyLogger";
26
+ * import { NestBootstraper } from "@decaf-ts/for-nest";
27
+ *
28
+ * async function bootstrap() {
29
+ * const app = await NestFactory.create(AppModule);
30
+ *
31
+ * await NestBootstraper
32
+ * .initialize(app)
33
+ * .enableLogger(new MyLogger())
34
+ * .enableCors(["http://localhost:4200"])
35
+ * .useHelmet()
36
+ * .setupSwagger({
37
+ * title: "OpenAPI by TradeMark™",
38
+ * description: "TradeMark™ API documentation",
39
+ * version: "1.0.0",
40
+ * path: "api",
41
+ * persistAuthorization: true,
42
+ * topbarBgColor: "#2C3E50",
43
+ * topbarIconPath: "/assets/logo.svg",
44
+ * faviconPath: "/assets/favicon.ico"
45
+ * })
46
+ * .useGlobalFilters()
47
+ * .useGlobalPipes(...)
48
+ * .useGlobalInterceptors(...)
49
+ * .start(3000);
50
+ * }
51
+ *
52
+ * bootstrap();
53
+ * ```
54
+ * @class
55
+ */
56
+ class NestBootstraper {
57
+ /**
58
+ * @description
59
+ * Returns the current logger instance, creating a default one if not set.
60
+ *
61
+ * @summary
62
+ * Ensures that a valid `Logger` instance is always available
63
+ * for logging bootstrap-related messages.
64
+ *
65
+ * @return {Logger} The active logger instance.
66
+ */
67
+ static get logger() {
68
+ if (!this._logger) {
69
+ // fallback
70
+ this._logger = new common_1.Logger("NestBootstrap");
71
+ }
72
+ return this._logger;
73
+ }
74
+ /**
75
+ * @description
76
+ * Initializes the bootstrapper with a given NestJS application.
77
+ *
78
+ * @summary
79
+ * Binds the provided NestJS app instance to the bootstrapper, enabling
80
+ * chained configuration methods.
81
+ *
82
+ * @param {INestApplication} app - The NestJS application instance to initialize.
83
+ * @return {typeof NestBootstraper} Returns the class for chaining configuration methods.
84
+ */
85
+ static initialize(app) {
86
+ this.app = app;
87
+ return this;
88
+ }
89
+ /**
90
+ * @description
91
+ * Enables or replaces the global logger for the NestJS application.
92
+ *
93
+ * @summary
94
+ * If a custom logger is provided, it replaces the default logger. Otherwise,
95
+ * a new logger named `"NestBootstrap"` is used. This logger is also registered
96
+ * with the NestJS application.
97
+ *
98
+ * @param {Logger} [customLogger] - Optional custom logger instance.
99
+ * @return {typeof NestBootstraper} Returns the class for chaining.
100
+ */
101
+ static enableLogger(customLogger) {
102
+ this._logger = customLogger || new common_1.Logger("NestBootstrap");
103
+ this.app.useLogger(this._logger);
104
+ return this;
105
+ }
106
+ /**
107
+ * @description
108
+ * Enables Cross-Origin Resource Sharing (CORS) for the application.
109
+ *
110
+ * @summary
111
+ * Allows defining either a wildcard origin (`"*"`) or a list of allowed origins.
112
+ * Automatically accepts local development requests and those without origin headers.
113
+ * Throws a `CorsError` for unauthorized origins.
114
+ *
115
+ * @param {'*' | string[]} [origins=[]] - List of allowed origins or `"*"` to allow all.
116
+ * @param {string[]} [allowMethods=['GET', 'POST', 'PUT', 'DELETE']] - Allowed HTTP methods.
117
+ * @return {typeof NestBootstraper} Returns the class for chaining configuration.
118
+ *
119
+ */
120
+ static enableCors(origins = [], allowMethods = ["GET", "POST", "PUT", "DELETE"]) {
121
+ const allowedOrigins = origins === "*" ? "*" : origins.map((o) => o.trim().toLowerCase());
122
+ const corsOptions = {
123
+ origin: (origin, callback) => {
124
+ // Allow request without origin...
125
+ if (!origin)
126
+ return callback(null, true);
127
+ if (allowedOrigins === "*" ||
128
+ (Array.isArray(allowedOrigins) &&
129
+ allowedOrigins.includes(origin.toLowerCase()))) {
130
+ return callback(null, true);
131
+ }
132
+ callback(new errors_1.CorsError(`Origin ${origin} not allowed`));
133
+ },
134
+ credentials: true,
135
+ methods: allowMethods.join(","),
136
+ };
137
+ this.app.enableCors(corsOptions);
138
+ return this;
139
+ }
140
+ /**
141
+ * @description
142
+ * Applies the Helmet middleware for enhanced security.
143
+ *
144
+ * @summary
145
+ * Dynamically loads the `helmet` package if available and registers it
146
+ * as middleware to improve HTTP header security. If not installed, logs a warning
147
+ * and continues execution without throwing errors.
148
+ *
149
+ * @param {Record<string, any>} [options] - Optional configuration passed to Helmet.
150
+ * @return {typeof NestBootstraper} Returns the class for chaining configuration.
151
+ */
152
+ static useHelmet(options) {
153
+ try {
154
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
155
+ const helmet = require("helmet"); // Dynamic import to avoid hard dependency
156
+ this.app.use(helmet(options));
157
+ this.logger.log("Helmet middleware enabled successfully.");
158
+ }
159
+ catch (e) {
160
+ this.logger.warn("Helmet not installed. Skipping middleware.");
161
+ }
162
+ return this;
163
+ }
164
+ /**
165
+ * @description
166
+ * Configures and initializes Swagger UI for API documentation.
167
+ *
168
+ * @summary
169
+ * Uses the `SwaggerBuilder` utility to configure API documentation
170
+ * with detailed customization for title, version, paths, and colors.
171
+ * Swagger is automatically exposed at the configured path.
172
+ *
173
+ * @param {SwaggerSetupOptions} options - Swagger configuration options.
174
+ * @return {typeof NestBootstraper} Returns the class for chaining configuration.
175
+ */
176
+ static setupSwagger(options) {
177
+ const swagger = new openapi_1.SwaggerBuilder(this.app, {
178
+ title: options.title,
179
+ description: options.description,
180
+ version: options.version,
181
+ path: options.path || "api",
182
+ persistAuthorization: options.persistAuthorization ?? true,
183
+ assetsPath: options.assetsPath,
184
+ faviconFilePath: options.faviconPath,
185
+ topbarIconFilePath: options.topbarIconPath,
186
+ topbarBgColor: options.topbarBgColor,
187
+ });
188
+ swagger.setupSwagger();
189
+ return this;
190
+ }
191
+ /**
192
+ * @description
193
+ * Registers one or more global validation pipes.
194
+ *
195
+ * @summary
196
+ * Enables request payload validation and transformation globally across
197
+ * the entire NestJS application. Multiple pipes can be chained together
198
+ * for modular input validation.
199
+ *
200
+ * @param {...PipeTransform[]} pipes - Pipe instances to register globally.
201
+ * @return {typeof NestBootstraper} Returns the class for chaining.
202
+ */
203
+ static useGlobalPipes(...pipes) {
204
+ if (pipes.length > 0)
205
+ this.app.useGlobalPipes(...pipes);
206
+ return this;
207
+ }
208
+ /**
209
+ * @description
210
+ * Registers one or more global exception filters.
211
+ *
212
+ * @summary
213
+ * If no filters are provided, it automatically registers a default
214
+ * set of standard exception filters for common error types like
215
+ * `HttpException`, `ValidationException`, `ConflictException`, and others.
216
+ *
217
+ * @param {...ExceptionFilter[]} filters - Optional filters to apply globally.
218
+ * @return {typeof NestBootstraper} Returns the class for chaining configuration.
219
+ */
220
+ static useGlobalFilters(...filters) {
221
+ const defaultFilters = [
222
+ new exceptions_1.HttpExceptionFilter(),
223
+ new exceptions_1.ValidationExceptionFilter(),
224
+ new exceptions_1.NotFoundExceptionFilter(),
225
+ new exceptions_1.ConflictExceptionFilter(),
226
+ new exceptions_1.AuthorizationExceptionFilter(),
227
+ new exceptions_1.GlobalExceptionFilter(),
228
+ ];
229
+ this.app.useGlobalFilters(...(filters.length > 0 ? filters : defaultFilters));
230
+ return this;
231
+ }
232
+ /**
233
+ * @description
234
+ * Registers global interceptors for request and response transformation.
235
+ *
236
+ * @summary
237
+ * Interceptors allow advanced request/response manipulation such as
238
+ * serialization, logging, or transformation. Multiple interceptors
239
+ * can be added for modular configuration.
240
+ *
241
+ * @param {...NestInterceptor[]} interceptors - Interceptor instances to register.
242
+ * @return {typeof NestBootstraper} Returns the class for chaining configuration.
243
+ */
244
+ static useGlobalInterceptors(...interceptors) {
245
+ if (interceptors.length > 0)
246
+ this.app.useGlobalInterceptors(...interceptors);
247
+ return this;
248
+ }
249
+ /**
250
+ * @description
251
+ * Starts the NestJS application and binds it to the given port and host.
252
+ *
253
+ * @summary
254
+ * Listens on the specified port and optionally a host. Once started,
255
+ * logs the application URL for easy access. The startup process resolves
256
+ * once the application is successfully running.
257
+ *
258
+ * @param {number} [port=3000] - Port number to listen on.
259
+ * @param {string} [host] - Optional host or IP address to bind to.
260
+ * @param {boolean} [log=true] - Whether to log the application URL upon startup.
261
+ * @return {Promise<void>} Resolves once the application starts successfully.
262
+ */
263
+ static async start(port = Number(process.env.PORT) || 3000, host = undefined, log = true) {
264
+ this.app.listen(port, host).then(async () => {
265
+ if (log) {
266
+ const url = await this.app.getUrl();
267
+ this.logger.log(`🚀 Application is running at: ${url}`);
268
+ }
269
+ });
270
+ }
271
+ }
272
+ exports.NestBootstraper = NestBootstraper;
273
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmVzdEJvb3RzdHJhcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ZhY3RvcnkvTmVzdEJvb3RzdHJhcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQU13QjtBQUN4Qix1REFPc0I7QUFDdEIsaURBQTJDO0FBRTNDLCtDQUFxQztBQWlDckM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0NHO0FBQ0gsTUFBYSxlQUFlO0lBSTFCOzs7Ozs7Ozs7T0FTRztJQUNLLE1BQU0sS0FBSyxNQUFNO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsV0FBVztZQUNYLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxlQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNILE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBcUI7UUFDckMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNILE1BQU0sQ0FBQyxZQUFZLENBQUMsWUFBcUI7UUFDdkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxZQUFZLElBQUksSUFBSSxlQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSCxNQUFNLENBQUMsVUFBVSxDQUNmLFVBQTBCLEVBQUUsRUFDNUIsZUFBeUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUM7UUFF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QUFDLEdBQUcsQ0FBQyxpQ0FBaUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUMxRCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFsUEQsMENBa1BDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRXhjZXB0aW9uRmlsdGVyLFxuICBJTmVzdEFwcGxpY2F0aW9uLFxuICBMb2dnZXIsXG4gIE5lc3RJbnRlcmNlcHRvcixcbiAgUGlwZVRyYW5zZm9ybSxcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQge1xuICBBdXRob3JpemF0aW9uRXhjZXB0aW9uRmlsdGVyLFxuICBDb25mbGljdEV4Y2VwdGlvbkZpbHRlcixcbiAgR2xvYmFsRXhjZXB0aW9uRmlsdGVyLFxuICBIdHRwRXhjZXB0aW9uRmlsdGVyLFxuICBOb3RGb3VuZEV4Y2VwdGlvbkZpbHRlcixcbiAgVmFsaWRhdGlvbkV4Y2VwdGlvbkZpbHRlcixcbn0gZnJvbSBcIi4vZXhjZXB0aW9uc1wiO1xuaW1wb3J0IHsgU3dhZ2dlckJ1aWxkZXIgfSBmcm9tIFwiLi9vcGVuYXBpXCI7XG5pbXBvcnQgeyBDb3JzT3B0aW9ucyB9IGZyb20gXCJAbmVzdGpzL2NvbW1vbi9pbnRlcmZhY2VzL2V4dGVybmFsL2NvcnMtb3B0aW9ucy5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IENvcnNFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogRGVmaW5lcyBhbGwgY3VzdG9taXphYmxlIHBhcmFtZXRlcnMgZm9yIFN3YWdnZXIgc2V0dXAuXG4gKlxuICogQHN1bW1hcnlcbiAqIFRoaXMgaW50ZXJmYWNlIGFsbG93cyBkZXZlbG9wZXJzIHRvIGN1c3RvbWl6ZSBob3cgU3dhZ2dlciBVSSBpcyBjb25maWd1cmVkXG4gKiB3aXRoaW4gdGhlIE5lc3RKUyBhcHBsaWNhdGlvbi4gSXQgaW5jbHVkZXMgcGFyYW1ldGVycyBmb3IgdGl0bGVzLCBwYXRocyxcbiAqIGNvbG9yIHNjaGVtZXMsIGFuZCBhc3NldCBwYXRocyB0byB0YWlsb3IgdGhlIEFQSSBkb2N1bWVudGF0aW9uIGV4cGVyaWVuY2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlIC0gVGl0bGUgZGlzcGxheWVkIGluIFN3YWdnZXIgVUkuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb24gLSBEZXNjcmlwdGlvbiBzaG93biBiZWxvdyB0aGUgdGl0bGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIEFQSSB2ZXJzaW9uIGRpc3BsYXllZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF0gLSBPcHRpb25hbCBwYXRoIHdoZXJlIFN3YWdnZXIgd2lsbCBiZSBhdmFpbGFibGUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwZXJzaXN0QXV0aG9yaXphdGlvbl0gLSBXaGV0aGVyIGF1dGhvcml6YXRpb24gdG9rZW5zIHBlcnNpc3QgYWNyb3NzIHJlbG9hZHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Fzc2V0c1BhdGhdIC0gUGF0aCB0byBjdXN0b20gYXNzZXRzIGZvciBTd2FnZ2VyIFVJLlxuICogQHBhcmFtIHtzdHJpbmd9IFt0b3BiYXJCZ0NvbG9yXSAtIEN1c3RvbSBiYWNrZ3JvdW5kIGNvbG9yIGZvciB0aGUgU3dhZ2dlciB0b3AgYmFyLlxuICogQHBhcmFtIHtzdHJpbmd9IFt0b3BiYXJJY29uUGF0aF0gLSBQYXRoIHRvIGEgY3VzdG9tIGljb24gZGlzcGxheWVkIGluIHRoZSB0b3AgYmFyLlxuICogQHBhcmFtIHtzdHJpbmd9IFtmYXZpY29uUGF0aF0gLSBQYXRoIHRvIGEgY3VzdG9tIGZhdmljb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3dhZ2dlclNldHVwT3B0aW9ucyB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcbiAgcGF0aD86IHN0cmluZztcbiAgcGVyc2lzdEF1dGhvcml6YXRpb24/OiBib29sZWFuO1xuICBhc3NldHNQYXRoPzogc3RyaW5nO1xuICB0b3BiYXJCZ0NvbG9yPzogc3RyaW5nO1xuICB0b3BiYXJJY29uUGF0aD86IHN0cmluZztcbiAgZmF2aWNvblBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBIGZsdWVudCwgc3RhdGljIGJvb3RzdHJhcCBjbGFzcyBmb3IgaW5pdGlhbGl6aW5nIGFuZCBjb25maWd1cmluZyBhIE5lc3RKUyBhcHBsaWNhdGlvbi5cbiAqXG4gKiBAc3VtbWFyeVxuICogVGhlIGBOZXN0Qm9vdHN0cmFwZXJgIGNsYXNzIHByb3ZpZGVzIGEgY2hhaW5hYmxlIEFQSSBmb3IgY29uZmlndXJpbmdcbiAqIGEgTmVzdEpTIGFwcGxpY2F0aW9uIGluc3RhbmNlLiBJdCBpbmNsdWRlcyBidWlsdC1pbiBtZXRob2RzIGZvciBlbmFibGluZ1xuICogQ09SUywgSGVsbWV0IHNlY3VyaXR5LCBTd2FnZ2VyIGRvY3VtZW50YXRpb24sIGdsb2JhbCBwaXBlcywgZmlsdGVycyxcbiAqIGludGVyY2VwdG9ycywgYW5kIHN0YXJ0aW5nIHRoZSBzZXJ2ZXIuXG4gKlxuICogVGhpcyBjbGFzcyBwcm9tb3RlcyBjb25zaXN0ZW5jeSBhbmQgcmVkdWNlcyByZXBldGl0aXZlIHNldHVwIGNvZGVcbiAqIGFjcm9zcyBtdWx0aXBsZSBOZXN0SlMgcHJvamVjdHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBOZXN0RmFjdG9yeSB9IGZyb20gXCJAbmVzdGpzL2NvcmVcIjtcbiAqIGltcG9ydCB7IEFwcE1vZHVsZSB9IGZyb20gXCIuL2FwcC5tb2R1bGVcIjtcbiAqIGltcG9ydCB7IE15TG9nZ2VyIH0gZnJvbSBcIi4vTXlMb2dnZXJcIjtcbiAqIGltcG9ydCB7IE5lc3RCb290c3RyYXBlciB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLW5lc3RcIjtcbiAqXG4gKiBhc3luYyBmdW5jdGlvbiBib290c3RyYXAoKSB7XG4gKiAgIGNvbnN0IGFwcCA9IGF3YWl0IE5lc3RGYWN0b3J5LmNyZWF0ZShBcHBNb2R1bGUpO1xuICpcbiAqICAgYXdhaXQgTmVzdEJvb3RzdHJhcGVyXG4gKiAgICAgLmluaXRpYWxpemUoYXBwKVxuICogICAgIC5lbmFibGVMb2dnZXIobmV3IE15TG9nZ2VyKCkpXG4gKiAgICAgLmVuYWJsZUNvcnMoW1wiaHR0cDovL2xvY2FsaG9zdDo0MjAwXCJdKVxuICogICAgIC51c2VIZWxtZXQoKVxuICogICAgIC5zZXR1cFN3YWdnZXIoe1xuICogICAgICAgdGl0bGU6IFwiT3BlbkFQSSBieSBUcmFkZU1hcmvihKJcIixcbiAqICAgICAgIGRlc2NyaXB0aW9uOiBcIlRyYWRlTWFya+KEoiBBUEkgZG9jdW1lbnRhdGlvblwiLFxuICogICAgICAgdmVyc2lvbjogXCIxLjAuMFwiLFxuICogICAgICAgcGF0aDogXCJhcGlcIixcbiAqICAgICAgIHBlcnNpc3RBdXRob3JpemF0aW9uOiB0cnVlLFxuICogICAgICAgdG9wYmFyQmdDb2xvcjogXCIjMkMzRTUwXCIsXG4gKiAgICAgICB0b3BiYXJJY29uUGF0aDogXCIvYXNzZXRzL2xvZ28uc3ZnXCIsXG4gKiAgICAgICBmYXZpY29uUGF0aDogXCIvYXNzZXRzL2Zhdmljb24uaWNvXCJcbiAqICAgICB9KVxuICogICAgIC51c2VHbG9iYWxGaWx0ZXJzKClcbiAqICAgICAudXNlR2xvYmFsUGlwZXMoLi4uKVxuICogICAgIC51c2VHbG9iYWxJbnRlcmNlcHRvcnMoLi4uKVxuICogICAgIC5zdGFydCgzMDAwKTtcbiAqIH1cbiAqXG4gKiBib290c3RyYXAoKTtcbiAqIGBgYFxuICogQGNsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBOZXN0Qm9vdHN0cmFwZXIge1xuICBwcml2YXRlIHN0YXRpYyBhcHA6IElOZXN0QXBwbGljYXRpb247XG4gIHByaXZhdGUgc3RhdGljIF9sb2dnZXI6IExvZ2dlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbG9nZ2VyIGluc3RhbmNlLCBjcmVhdGluZyBhIGRlZmF1bHQgb25lIGlmIG5vdCBzZXQuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEVuc3VyZXMgdGhhdCBhIHZhbGlkIGBMb2dnZXJgIGluc3RhbmNlIGlzIGFsd2F5cyBhdmFpbGFibGVcbiAgICogZm9yIGxvZ2dpbmcgYm9vdHN0cmFwLXJlbGF0ZWQgbWVzc2FnZXMuXG4gICAqXG4gICAqIEByZXR1cm4ge0xvZ2dlcn0gVGhlIGFjdGl2ZSBsb2dnZXIgaW5zdGFuY2UuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXQgbG9nZ2VyKCk6IExvZ2dlciB7XG4gICAgaWYgKCF0aGlzLl9sb2dnZXIpIHtcbiAgICAgIC8vIGZhbGxiYWNrXG4gICAgICB0aGlzLl9sb2dnZXIgPSBuZXcgTG9nZ2VyKFwiTmVzdEJvb3RzdHJhcFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2xvZ2dlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogSW5pdGlhbGl6ZXMgdGhlIGJvb3RzdHJhcHBlciB3aXRoIGEgZ2l2ZW4gTmVzdEpTIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBCaW5kcyB0aGUgcHJvdmlkZWQgTmVzdEpTIGFwcCBpbnN0YW5jZSB0byB0aGUgYm9vdHN0cmFwcGVyLCBlbmFibGluZ1xuICAgKiBjaGFpbmVkIGNvbmZpZ3VyYXRpb24gbWV0aG9kcy5cbiAgICpcbiAgICogQHBhcmFtIHtJTmVzdEFwcGxpY2F0aW9ufSBhcHAgLSBUaGUgTmVzdEpTIGFwcGxpY2F0aW9uIGluc3RhbmNlIHRvIGluaXRpYWxpemUuXG4gICAqIEByZXR1cm4ge3R5cGVvZiBOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZyBjb25maWd1cmF0aW9uIG1ldGhvZHMuXG4gICAqL1xuICBzdGF0aWMgaW5pdGlhbGl6ZShhcHA6IElOZXN0QXBwbGljYXRpb24pIHtcbiAgICB0aGlzLmFwcCA9IGFwcDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogRW5hYmxlcyBvciByZXBsYWNlcyB0aGUgZ2xvYmFsIGxvZ2dlciBmb3IgdGhlIE5lc3RKUyBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogSWYgYSBjdXN0b20gbG9nZ2VyIGlzIHByb3ZpZGVkLCBpdCByZXBsYWNlcyB0aGUgZGVmYXVsdCBsb2dnZXIuIE90aGVyd2lzZSxcbiAgICogYSBuZXcgbG9nZ2VyIG5hbWVkIGBcIk5lc3RCb290c3RyYXBcImAgaXMgdXNlZC4gVGhpcyBsb2dnZXIgaXMgYWxzbyByZWdpc3RlcmVkXG4gICAqIHdpdGggdGhlIE5lc3RKUyBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtMb2dnZXJ9IFtjdXN0b21Mb2dnZXJdIC0gT3B0aW9uYWwgY3VzdG9tIGxvZ2dlciBpbnN0YW5jZS5cbiAgICogQHJldHVybiB7dHlwZW9mIE5lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nLlxuICAgKi9cbiAgc3RhdGljIGVuYWJsZUxvZ2dlcihjdXN0b21Mb2dnZXI/OiBMb2dnZXIpIHtcbiAgICB0aGlzLl9sb2dnZXIgPSBjdXN0b21Mb2dnZXIgfHwgbmV3IExvZ2dlcihcIk5lc3RCb290c3RyYXBcIik7XG4gICAgdGhpcy5hcHAudXNlTG9nZ2VyKHRoaXMuX2xvZ2dlcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEVuYWJsZXMgQ3Jvc3MtT3JpZ2luIFJlc291cmNlIFNoYXJpbmcgKENPUlMpIGZvciB0aGUgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEFsbG93cyBkZWZpbmluZyBlaXRoZXIgYSB3aWxkY2FyZCBvcmlnaW4gKGBcIipcImApIG9yIGEgbGlzdCBvZiBhbGxvd2VkIG9yaWdpbnMuXG4gICAqIEF1dG9tYXRpY2FsbHkgYWNjZXB0cyBsb2NhbCBkZXZlbG9wbWVudCByZXF1ZXN0cyBhbmQgdGhvc2Ugd2l0aG91dCBvcmlnaW4gaGVhZGVycy5cbiAgICogVGhyb3dzIGEgYENvcnNFcnJvcmAgZm9yIHVuYXV0aG9yaXplZCBvcmlnaW5zLlxuICAgKlxuICAgKiBAcGFyYW0geycqJyB8IHN0cmluZ1tdfSBbb3JpZ2lucz1bXV0gLSBMaXN0IG9mIGFsbG93ZWQgb3JpZ2lucyBvciBgXCIqXCJgIHRvIGFsbG93IGFsbC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2FsbG93TWV0aG9kcz1bJ0dFVCcsICdQT1NUJywgJ1BVVCcsICdERUxFVEUnXV0gLSBBbGxvd2VkIEhUVFAgbWV0aG9kcy5cbiAgICogQHJldHVybiB7dHlwZW9mIE5lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqL1xuICBzdGF0aWMgZW5hYmxlQ29ycyhcbiAgICBvcmlnaW5zOiBcIipcIiB8IHN0cmluZ1tdID0gW10sXG4gICAgYWxsb3dNZXRob2RzOiBzdHJpbmdbXSA9IFtcIkdFVFwiLCBcIlBPU1RcIiwgXCJQVVRcIiwgXCJERUxFVEVcIl1cbiAgKSB7XG4gICAgY29uc3QgYWxsb3dlZE9yaWdpbnMgPVxuICAgICAgb3JpZ2lucyA9PT0gXCIqXCIgPyBcIipcIiA6IG9yaWdpbnMubWFwKChvKSA9PiBvLnRyaW0oKS50b0xvd2VyQ2FzZSgpKTtcblxuICAgIGNvbnN0IGNvcnNPcHRpb25zOiBDb3JzT3B0aW9ucyA9IHtcbiAgICAgIG9yaWdpbjogKG9yaWdpbiwgY2FsbGJhY2spID0+IHtcbiAgICAgICAgLy8gQWxsb3cgcmVxdWVzdCB3aXRob3V0IG9yaWdpbi4uLlxuICAgICAgICBpZiAoIW9yaWdpbikgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHRydWUpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBhbGxvd2VkT3JpZ2lucyA9PT0gXCIqXCIgfHxcbiAgICAgICAgICAoQXJyYXkuaXNBcnJheShhbGxvd2VkT3JpZ2lucykgJiZcbiAgICAgICAgICAgIGFsbG93ZWRPcmlnaW5zLmluY2x1ZGVzKG9yaWdpbi50b0xvd2VyQ2FzZSgpKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FsbGJhY2sobmV3IENvcnNFcnJvcihgT3JpZ2luICR7b3JpZ2lufSBub3QgYWxsb3dlZGApKTtcbiAgICAgIH0sXG4gICAgICBjcmVkZW50aWFsczogdHJ1ZSxcbiAgICAgIG1ldGhvZHM6IGFsbG93TWV0aG9kcy5qb2luKFwiLFwiKSxcbiAgICB9O1xuXG4gICAgdGhpcy5hcHAuZW5hYmxlQ29ycyhjb3JzT3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFwcGxpZXMgdGhlIEhlbG1ldCBtaWRkbGV3YXJlIGZvciBlbmhhbmNlZCBzZWN1cml0eS5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogRHluYW1pY2FsbHkgbG9hZHMgdGhlIGBoZWxtZXRgIHBhY2thZ2UgaWYgYXZhaWxhYmxlIGFuZCByZWdpc3RlcnMgaXRcbiAgICogYXMgbWlkZGxld2FyZSB0byBpbXByb3ZlIEhUVFAgaGVhZGVyIHNlY3VyaXR5LiBJZiBub3QgaW5zdGFsbGVkLCBsb2dzIGEgd2FybmluZ1xuICAgKiBhbmQgY29udGludWVzIGV4ZWN1dGlvbiB3aXRob3V0IHRocm93aW5nIGVycm9ycy5cbiAgICpcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbb3B0aW9uc10gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIHBhc3NlZCB0byBIZWxtZXQuXG4gICAqIEByZXR1cm4ge3R5cGVvZiBOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZyBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgc3RhdGljIHVzZUhlbG1ldChvcHRpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHRyeSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgICAgY29uc3QgaGVsbWV0ID0gcmVxdWlyZShcImhlbG1ldFwiKTsgLy8gRHluYW1pYyBpbXBvcnQgdG8gYXZvaWQgaGFyZCBkZXBlbmRlbmN5XG4gICAgICB0aGlzLmFwcC51c2UoaGVsbWV0KG9wdGlvbnMpKTtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhcIkhlbG1ldCBtaWRkbGV3YXJlIGVuYWJsZWQgc3VjY2Vzc2Z1bGx5LlwiKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJIZWxtZXQgbm90IGluc3RhbGxlZC4gU2tpcHBpbmcgbWlkZGxld2FyZS5cIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIENvbmZpZ3VyZXMgYW5kIGluaXRpYWxpemVzIFN3YWdnZXIgVUkgZm9yIEFQSSBkb2N1bWVudGF0aW9uLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBVc2VzIHRoZSBgU3dhZ2dlckJ1aWxkZXJgIHV0aWxpdHkgdG8gY29uZmlndXJlIEFQSSBkb2N1bWVudGF0aW9uXG4gICAqIHdpdGggZGV0YWlsZWQgY3VzdG9taXphdGlvbiBmb3IgdGl0bGUsIHZlcnNpb24sIHBhdGhzLCBhbmQgY29sb3JzLlxuICAgKiBTd2FnZ2VyIGlzIGF1dG9tYXRpY2FsbHkgZXhwb3NlZCBhdCB0aGUgY29uZmlndXJlZCBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0ge1N3YWdnZXJTZXR1cE9wdGlvbnN9IG9wdGlvbnMgLSBTd2FnZ2VyIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAgICogQHJldHVybiB7dHlwZW9mIE5lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBzdGF0aWMgc2V0dXBTd2FnZ2VyKG9wdGlvbnM6IFN3YWdnZXJTZXR1cE9wdGlvbnMpIHtcbiAgICBjb25zdCBzd2FnZ2VyID0gbmV3IFN3YWdnZXJCdWlsZGVyKHRoaXMuYXBwLCB7XG4gICAgICB0aXRsZTogb3B0aW9ucy50aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBvcHRpb25zLmRlc2NyaXB0aW9uLFxuICAgICAgdmVyc2lvbjogb3B0aW9ucy52ZXJzaW9uLFxuICAgICAgcGF0aDogb3B0aW9ucy5wYXRoIHx8IFwiYXBpXCIsXG4gICAgICBwZXJzaXN0QXV0aG9yaXphdGlvbjogb3B0aW9ucy5wZXJzaXN0QXV0aG9yaXphdGlvbiA/PyB0cnVlLFxuICAgICAgYXNzZXRzUGF0aDogb3B0aW9ucy5hc3NldHNQYXRoLFxuICAgICAgZmF2aWNvbkZpbGVQYXRoOiBvcHRpb25zLmZhdmljb25QYXRoLFxuICAgICAgdG9wYmFySWNvbkZpbGVQYXRoOiBvcHRpb25zLnRvcGJhckljb25QYXRoLFxuICAgICAgdG9wYmFyQmdDb2xvcjogb3B0aW9ucy50b3BiYXJCZ0NvbG9yLFxuICAgIH0pO1xuICAgIHN3YWdnZXIuc2V0dXBTd2FnZ2VyKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFJlZ2lzdGVycyBvbmUgb3IgbW9yZSBnbG9iYWwgdmFsaWRhdGlvbiBwaXBlcy5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogRW5hYmxlcyByZXF1ZXN0IHBheWxvYWQgdmFsaWRhdGlvbiBhbmQgdHJhbnNmb3JtYXRpb24gZ2xvYmFsbHkgYWNyb3NzXG4gICAqIHRoZSBlbnRpcmUgTmVzdEpTIGFwcGxpY2F0aW9uLiBNdWx0aXBsZSBwaXBlcyBjYW4gYmUgY2hhaW5lZCB0b2dldGhlclxuICAgKiBmb3IgbW9kdWxhciBpbnB1dCB2YWxpZGF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLlBpcGVUcmFuc2Zvcm1bXX0gcGlwZXMgLSBQaXBlIGluc3RhbmNlcyB0byByZWdpc3RlciBnbG9iYWxseS5cbiAgICogQHJldHVybiB7dHlwZW9mIE5lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nLlxuICAgKi9cbiAgc3RhdGljIHVzZUdsb2JhbFBpcGVzKC4uLnBpcGVzOiBQaXBlVHJhbnNmb3JtW10pIHtcbiAgICBpZiAocGlwZXMubGVuZ3RoID4gMCkgdGhpcy5hcHAudXNlR2xvYmFsUGlwZXMoLi4ucGlwZXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZWdpc3RlcnMgb25lIG9yIG1vcmUgZ2xvYmFsIGV4Y2VwdGlvbiBmaWx0ZXJzLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBJZiBubyBmaWx0ZXJzIGFyZSBwcm92aWRlZCwgaXQgYXV0b21hdGljYWxseSByZWdpc3RlcnMgYSBkZWZhdWx0XG4gICAqIHNldCBvZiBzdGFuZGFyZCBleGNlcHRpb24gZmlsdGVycyBmb3IgY29tbW9uIGVycm9yIHR5cGVzIGxpa2VcbiAgICogYEh0dHBFeGNlcHRpb25gLCBgVmFsaWRhdGlvbkV4Y2VwdGlvbmAsIGBDb25mbGljdEV4Y2VwdGlvbmAsIGFuZCBvdGhlcnMuXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uRXhjZXB0aW9uRmlsdGVyW119IGZpbHRlcnMgLSBPcHRpb25hbCBmaWx0ZXJzIHRvIGFwcGx5IGdsb2JhbGx5LlxuICAgKiBAcmV0dXJuIHt0eXBlb2YgTmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHN0YXRpYyB1c2VHbG9iYWxGaWx0ZXJzKC4uLmZpbHRlcnM6IGFueVtdKSB7XG4gICAgY29uc3QgZGVmYXVsdEZpbHRlcnMgPSBbXG4gICAgICBuZXcgSHR0cEV4Y2VwdGlvbkZpbHRlcigpLFxuICAgICAgbmV3IFZhbGlkYXRpb25FeGNlcHRpb25GaWx0ZXIoKSxcbiAgICAgIG5ldyBOb3RGb3VuZEV4Y2VwdGlvbkZpbHRlcigpLFxuICAgICAgbmV3IENvbmZsaWN0RXhjZXB0aW9uRmlsdGVyKCksXG4gICAgICBuZXcgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbkZpbHRlcigpLFxuICAgICAgbmV3IEdsb2JhbEV4Y2VwdGlvbkZpbHRlcigpLFxuICAgIF07XG5cbiAgICB0aGlzLmFwcC51c2VHbG9iYWxGaWx0ZXJzKFxuICAgICAgLi4uKGZpbHRlcnMubGVuZ3RoID4gMCA/IGZpbHRlcnMgOiBkZWZhdWx0RmlsdGVycylcbiAgICApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZWdpc3RlcnMgZ2xvYmFsIGludGVyY2VwdG9ycyBmb3IgcmVxdWVzdCBhbmQgcmVzcG9uc2UgdHJhbnNmb3JtYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEludGVyY2VwdG9ycyBhbGxvdyBhZHZhbmNlZCByZXF1ZXN0L3Jlc3BvbnNlIG1hbmlwdWxhdGlvbiBzdWNoIGFzXG4gICAqIHNlcmlhbGl6YXRpb24sIGxvZ2dpbmcsIG9yIHRyYW5zZm9ybWF0aW9uLiBNdWx0aXBsZSBpbnRlcmNlcHRvcnNcbiAgICogY2FuIGJlIGFkZGVkIGZvciBtb2R1bGFyIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uTmVzdEludGVyY2VwdG9yW119IGludGVyY2VwdG9ycyAtIEludGVyY2VwdG9yIGluc3RhbmNlcyB0byByZWdpc3Rlci5cbiAgICogQHJldHVybiB7dHlwZW9mIE5lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBzdGF0aWMgdXNlR2xvYmFsSW50ZXJjZXB0b3JzKC4uLmludGVyY2VwdG9yczogTmVzdEludGVyY2VwdG9yW10pIHtcbiAgICBpZiAoaW50ZXJjZXB0b3JzLmxlbmd0aCA+IDApXG4gICAgICB0aGlzLmFwcC51c2VHbG9iYWxJbnRlcmNlcHRvcnMoLi4uaW50ZXJjZXB0b3JzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU3RhcnRzIHRoZSBOZXN0SlMgYXBwbGljYXRpb24gYW5kIGJpbmRzIGl0IHRvIHRoZSBnaXZlbiBwb3J0IGFuZCBob3N0LlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBMaXN0ZW5zIG9uIHRoZSBzcGVjaWZpZWQgcG9ydCBhbmQgb3B0aW9uYWxseSBhIGhvc3QuIE9uY2Ugc3RhcnRlZCxcbiAgICogbG9ncyB0aGUgYXBwbGljYXRpb24gVVJMIGZvciBlYXN5IGFjY2Vzcy4gVGhlIHN0YXJ0dXAgcHJvY2VzcyByZXNvbHZlc1xuICAgKiBvbmNlIHRoZSBhcHBsaWNhdGlvbiBpcyBzdWNjZXNzZnVsbHkgcnVubmluZy5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtwb3J0PTMwMDBdIC0gUG9ydCBudW1iZXIgdG8gbGlzdGVuIG9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2hvc3RdIC0gT3B0aW9uYWwgaG9zdCBvciBJUCBhZGRyZXNzIHRvIGJpbmQgdG8uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2xvZz10cnVlXSAtIFdoZXRoZXIgdG8gbG9nIHRoZSBhcHBsaWNhdGlvbiBVUkwgdXBvbiBzdGFydHVwLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBvbmNlIHRoZSBhcHBsaWNhdGlvbiBzdGFydHMgc3VjY2Vzc2Z1bGx5LlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHN0YXJ0KFxuICAgIHBvcnQ6IG51bWJlciA9IE51bWJlcihwcm9jZXNzLmVudi5QT1JUKSB8fCAzMDAwLFxuICAgIGhvc3Q6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbiAgICBsb2c6IGJvb2xlYW4gPSB0cnVlXG4gICkge1xuICAgIHRoaXMuYXBwLmxpc3Rlbihwb3J0LCBob3N0IGFzIGFueSkudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICBpZiAobG9nKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGF3YWl0IHRoaXMuYXBwLmdldFVybCgpO1xuICAgICAgICB0aGlzLmxvZ2dlci5sb2coYPCfmoAgQXBwbGljYXRpb24gaXMgcnVubmluZyBhdDogJHt1cmx9YCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,214 @@
1
+ import { INestApplication, Logger, NestInterceptor, PipeTransform } from "@nestjs/common";
2
+ /**
3
+ * @description
4
+ * Defines all customizable parameters for Swagger setup.
5
+ *
6
+ * @summary
7
+ * This interface allows developers to customize how Swagger UI is configured
8
+ * within the NestJS application. It includes parameters for titles, paths,
9
+ * color schemes, and asset paths to tailor the API documentation experience.
10
+ *
11
+ * @param {string} title - Title displayed in Swagger UI.
12
+ * @param {string} description - Description shown below the title.
13
+ * @param {string} version - API version displayed in the documentation.
14
+ * @param {string} [path] - Optional path where Swagger will be available.
15
+ * @param {boolean} [persistAuthorization] - Whether authorization tokens persist across reloads.
16
+ * @param {string} [assetsPath] - Path to custom assets for Swagger UI.
17
+ * @param {string} [topbarBgColor] - Custom background color for the Swagger top bar.
18
+ * @param {string} [topbarIconPath] - Path to a custom icon displayed in the top bar.
19
+ * @param {string} [faviconPath] - Path to a custom favicon.
20
+ */
21
+ export interface SwaggerSetupOptions {
22
+ title: string;
23
+ description: string;
24
+ version: string;
25
+ path?: string;
26
+ persistAuthorization?: boolean;
27
+ assetsPath?: string;
28
+ topbarBgColor?: string;
29
+ topbarIconPath?: string;
30
+ faviconPath?: string;
31
+ }
32
+ /**
33
+ * @description
34
+ * A fluent, static bootstrap class for initializing and configuring a NestJS application.
35
+ *
36
+ * @summary
37
+ * The `NestBootstraper` class provides a chainable API for configuring
38
+ * a NestJS application instance. It includes built-in methods for enabling
39
+ * CORS, Helmet security, Swagger documentation, global pipes, filters,
40
+ * interceptors, and starting the server.
41
+ *
42
+ * This class promotes consistency and reduces repetitive setup code
43
+ * across multiple NestJS projects.
44
+ *
45
+ * @example
46
+ * ```ts
47
+ * import { NestFactory } from "@nestjs/core";
48
+ * import { AppModule } from "./app.module";
49
+ * import { MyLogger } from "./MyLogger";
50
+ * import { NestBootstraper } from "@decaf-ts/for-nest";
51
+ *
52
+ * async function bootstrap() {
53
+ * const app = await NestFactory.create(AppModule);
54
+ *
55
+ * await NestBootstraper
56
+ * .initialize(app)
57
+ * .enableLogger(new MyLogger())
58
+ * .enableCors(["http://localhost:4200"])
59
+ * .useHelmet()
60
+ * .setupSwagger({
61
+ * title: "OpenAPI by TradeMark™",
62
+ * description: "TradeMark™ API documentation",
63
+ * version: "1.0.0",
64
+ * path: "api",
65
+ * persistAuthorization: true,
66
+ * topbarBgColor: "#2C3E50",
67
+ * topbarIconPath: "/assets/logo.svg",
68
+ * faviconPath: "/assets/favicon.ico"
69
+ * })
70
+ * .useGlobalFilters()
71
+ * .useGlobalPipes(...)
72
+ * .useGlobalInterceptors(...)
73
+ * .start(3000);
74
+ * }
75
+ *
76
+ * bootstrap();
77
+ * ```
78
+ * @class
79
+ */
80
+ export declare class NestBootstraper {
81
+ private static app;
82
+ private static _logger;
83
+ /**
84
+ * @description
85
+ * Returns the current logger instance, creating a default one if not set.
86
+ *
87
+ * @summary
88
+ * Ensures that a valid `Logger` instance is always available
89
+ * for logging bootstrap-related messages.
90
+ *
91
+ * @return {Logger} The active logger instance.
92
+ */
93
+ private static get logger();
94
+ /**
95
+ * @description
96
+ * Initializes the bootstrapper with a given NestJS application.
97
+ *
98
+ * @summary
99
+ * Binds the provided NestJS app instance to the bootstrapper, enabling
100
+ * chained configuration methods.
101
+ *
102
+ * @param {INestApplication} app - The NestJS application instance to initialize.
103
+ * @return {typeof NestBootstraper} Returns the class for chaining configuration methods.
104
+ */
105
+ static initialize(app: INestApplication): typeof NestBootstraper;
106
+ /**
107
+ * @description
108
+ * Enables or replaces the global logger for the NestJS application.
109
+ *
110
+ * @summary
111
+ * If a custom logger is provided, it replaces the default logger. Otherwise,
112
+ * a new logger named `"NestBootstrap"` is used. This logger is also registered
113
+ * with the NestJS application.
114
+ *
115
+ * @param {Logger} [customLogger] - Optional custom logger instance.
116
+ * @return {typeof NestBootstraper} Returns the class for chaining.
117
+ */
118
+ static enableLogger(customLogger?: Logger): typeof NestBootstraper;
119
+ /**
120
+ * @description
121
+ * Enables Cross-Origin Resource Sharing (CORS) for the application.
122
+ *
123
+ * @summary
124
+ * Allows defining either a wildcard origin (`"*"`) or a list of allowed origins.
125
+ * Automatically accepts local development requests and those without origin headers.
126
+ * Throws a `CorsError` for unauthorized origins.
127
+ *
128
+ * @param {'*' | string[]} [origins=[]] - List of allowed origins or `"*"` to allow all.
129
+ * @param {string[]} [allowMethods=['GET', 'POST', 'PUT', 'DELETE']] - Allowed HTTP methods.
130
+ * @return {typeof NestBootstraper} Returns the class for chaining configuration.
131
+ *
132
+ */
133
+ static enableCors(origins?: "*" | string[], allowMethods?: string[]): typeof NestBootstraper;
134
+ /**
135
+ * @description
136
+ * Applies the Helmet middleware for enhanced security.
137
+ *
138
+ * @summary
139
+ * Dynamically loads the `helmet` package if available and registers it
140
+ * as middleware to improve HTTP header security. If not installed, logs a warning
141
+ * and continues execution without throwing errors.
142
+ *
143
+ * @param {Record<string, any>} [options] - Optional configuration passed to Helmet.
144
+ * @return {typeof NestBootstraper} Returns the class for chaining configuration.
145
+ */
146
+ static useHelmet(options?: Record<string, any>): typeof NestBootstraper;
147
+ /**
148
+ * @description
149
+ * Configures and initializes Swagger UI for API documentation.
150
+ *
151
+ * @summary
152
+ * Uses the `SwaggerBuilder` utility to configure API documentation
153
+ * with detailed customization for title, version, paths, and colors.
154
+ * Swagger is automatically exposed at the configured path.
155
+ *
156
+ * @param {SwaggerSetupOptions} options - Swagger configuration options.
157
+ * @return {typeof NestBootstraper} Returns the class for chaining configuration.
158
+ */
159
+ static setupSwagger(options: SwaggerSetupOptions): typeof NestBootstraper;
160
+ /**
161
+ * @description
162
+ * Registers one or more global validation pipes.
163
+ *
164
+ * @summary
165
+ * Enables request payload validation and transformation globally across
166
+ * the entire NestJS application. Multiple pipes can be chained together
167
+ * for modular input validation.
168
+ *
169
+ * @param {...PipeTransform[]} pipes - Pipe instances to register globally.
170
+ * @return {typeof NestBootstraper} Returns the class for chaining.
171
+ */
172
+ static useGlobalPipes(...pipes: PipeTransform[]): typeof NestBootstraper;
173
+ /**
174
+ * @description
175
+ * Registers one or more global exception filters.
176
+ *
177
+ * @summary
178
+ * If no filters are provided, it automatically registers a default
179
+ * set of standard exception filters for common error types like
180
+ * `HttpException`, `ValidationException`, `ConflictException`, and others.
181
+ *
182
+ * @param {...ExceptionFilter[]} filters - Optional filters to apply globally.
183
+ * @return {typeof NestBootstraper} Returns the class for chaining configuration.
184
+ */
185
+ static useGlobalFilters(...filters: any[]): typeof NestBootstraper;
186
+ /**
187
+ * @description
188
+ * Registers global interceptors for request and response transformation.
189
+ *
190
+ * @summary
191
+ * Interceptors allow advanced request/response manipulation such as
192
+ * serialization, logging, or transformation. Multiple interceptors
193
+ * can be added for modular configuration.
194
+ *
195
+ * @param {...NestInterceptor[]} interceptors - Interceptor instances to register.
196
+ * @return {typeof NestBootstraper} Returns the class for chaining configuration.
197
+ */
198
+ static useGlobalInterceptors(...interceptors: NestInterceptor[]): typeof NestBootstraper;
199
+ /**
200
+ * @description
201
+ * Starts the NestJS application and binds it to the given port and host.
202
+ *
203
+ * @summary
204
+ * Listens on the specified port and optionally a host. Once started,
205
+ * logs the application URL for easy access. The startup process resolves
206
+ * once the application is successfully running.
207
+ *
208
+ * @param {number} [port=3000] - Port number to listen on.
209
+ * @param {string} [host] - Optional host or IP address to bind to.
210
+ * @param {boolean} [log=true] - Whether to log the application URL upon startup.
211
+ * @return {Promise<void>} Resolves once the application starts successfully.
212
+ */
213
+ static start(port?: number, host?: string | undefined, log?: boolean): Promise<void>;
214
+ }
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CorsError = void 0;
4
+ const core_1 = require("@decaf-ts/core");
5
+ class CorsError extends core_1.ForbiddenError {
6
+ constructor(msg) {
7
+ super(msg, CorsError.name);
8
+ }
9
+ }
10
+ exports.CorsError = CorsError;
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9mYWN0b3J5L2Vycm9ycy9jb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUErRDtBQUUvRCxNQUFhLFNBQVUsU0FBUSxxQkFBYztJQUM1QyxZQUFZLEdBQW1CO1FBQzlCLEtBQUssQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUM7Q0FDRDtBQUpELDhCQUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb25uZWN0aW9uRXJyb3IsIEZvcmJpZGRlbkVycm9yfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuZXhwb3J0IGNsYXNzIENvcnNFcnJvciBleHRlbmRzIEZvcmJpZGRlbkVycm9yIHtcblx0Y29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuXHRcdHN1cGVyKG1zZywgQ29yc0Vycm9yLm5hbWUpO1xuXHR9XG59Il19
@@ -0,0 +1,4 @@
1
+ import { ForbiddenError } from "@decaf-ts/core";
2
+ export declare class CorsError extends ForbiddenError {
3
+ constructor(msg: string | Error);
4
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./cors.cjs"), exports);
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZmFjdG9yeS9lcnJvcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDZDQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2NvcnNcIjtcbiJdfQ==
@@ -0,0 +1 @@
1
+ export * from "./cors";
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.AuthorizationExceptionFilter = exports.AuthorizationError = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const HttpResponseError_1 = require("./HttpResponseError.cjs");
12
+ class AuthorizationError extends Error {
13
+ constructor(message = "Unauthorized") {
14
+ super(message);
15
+ this.name = "AuthorizationError";
16
+ this.status = 401;
17
+ this.code = "UNAUTHORIZED";
18
+ Object.setPrototypeOf(this, AuthorizationError.prototype);
19
+ }
20
+ }
21
+ exports.AuthorizationError = AuthorizationError;
22
+ let AuthorizationExceptionFilter = class AuthorizationExceptionFilter {
23
+ catch(exception, host) {
24
+ const ctx = host.switchToHttp();
25
+ const request = ctx.getRequest();
26
+ const response = ctx.getResponse();
27
+ const httpResponseError = new HttpResponseError_1.HttpResponseError(request, {
28
+ error: "UNAUTHORIZED",
29
+ status: common_1.HttpStatus.UNAUTHORIZED,
30
+ message: exception.message,
31
+ });
32
+ response.status(common_1.HttpStatus.UNAUTHORIZED).json(httpResponseError);
33
+ }
34
+ };
35
+ exports.AuthorizationExceptionFilter = AuthorizationExceptionFilter;
36
+ exports.AuthorizationExceptionFilter = AuthorizationExceptionFilter = __decorate([
37
+ (0, common_1.Catch)(AuthorizationError)
38
+ ], AuthorizationExceptionFilter);
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXV0aG9yaXphdGlvbkV4Y2VwdGlvbkZpbHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9mYWN0b3J5L2V4Y2VwdGlvbnMvQXV0aG9yaXphdGlvbkV4Y2VwdGlvbkZpbHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSwyQ0FBaUY7QUFFakYsK0RBQXNEO0FBRXRELE1BQWEsa0JBQW1CLFNBQVEsS0FBSztJQUl6QyxZQUFZLE9BQU8sR0FBRyxjQUFjO1FBQ2hDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsb0JBQW9CLENBQUM7UUFDakMsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFDbEIsSUFBSSxDQUFDLElBQUksR0FBRyxjQUFjLENBQUM7UUFDM0IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDOUQsQ0FBQztDQUNKO0FBWEQsZ0RBV0M7QUFHTSxJQUFNLDRCQUE0QixHQUFsQyxNQUFNLDRCQUE0QjtJQUNyQyxLQUFLLENBQUMsU0FBNkIsRUFBRSxJQUFtQjtRQUNwRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDaEMsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLFVBQVUsRUFBVyxDQUFDO1FBQzFDLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQVksQ0FBQztRQUU3QyxNQUFNLGlCQUFpQixHQUFHLElBQUkscUNBQWlCLENBQUMsT0FBTyxFQUFFO1lBQ3JELEtBQUssRUFBRSxjQUFjO1lBQ3JCLE1BQU0sRUFBRSxtQkFBVSxDQUFDLFlBQVk7WUFDL0IsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPO1NBQzdCLENBQUMsQ0FBQztRQUVILFFBQVEsQ0FBQyxNQUFNLENBQUMsbUJBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNyRSxDQUFDO0NBQ0osQ0FBQTtBQWRZLG9FQUE0Qjt1Q0FBNUIsNEJBQTRCO0lBRHhDLElBQUEsY0FBSyxFQUFDLGtCQUFrQixDQUFDO0dBQ2IsNEJBQTRCLENBY3hDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBcmd1bWVudHNIb3N0LCBDYXRjaCwgRXhjZXB0aW9uRmlsdGVyLCBIdHRwU3RhdHVzfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7UmVxdWVzdCwgUmVzcG9uc2V9IGZyb20gXCJleHByZXNzXCI7XG5pbXBvcnQge0h0dHBSZXNwb25zZUVycm9yfSBmcm9tIFwiLi9IdHRwUmVzcG9uc2VFcnJvclwiO1xuXG5leHBvcnQgY2xhc3MgQXV0aG9yaXphdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyO1xuICAgIHJlYWRvbmx5IGNvZGU6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UgPSBcIlVuYXV0aG9yaXplZFwiKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIkF1dGhvcml6YXRpb25FcnJvclwiO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IDQwMTtcbiAgICAgICAgdGhpcy5jb2RlID0gXCJVTkFVVEhPUklaRURcIjtcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIEF1dGhvcml6YXRpb25FcnJvci5wcm90b3R5cGUpO1xuICAgIH1cbn1cblxuQENhdGNoKEF1dGhvcml6YXRpb25FcnJvcilcbmV4cG9ydCBjbGFzcyBBdXRob3JpemF0aW9uRXhjZXB0aW9uRmlsdGVyIGltcGxlbWVudHMgRXhjZXB0aW9uRmlsdGVyIHtcbiAgICBjYXRjaChleGNlcHRpb246IEF1dGhvcml6YXRpb25FcnJvciwgaG9zdDogQXJndW1lbnRzSG9zdCkge1xuICAgICAgICBjb25zdCBjdHggPSBob3N0LnN3aXRjaFRvSHR0cCgpO1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gY3R4LmdldFJlcXVlc3Q8UmVxdWVzdD4oKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBjdHguZ2V0UmVzcG9uc2U8UmVzcG9uc2U+KCk7XG5cbiAgICAgICAgY29uc3QgaHR0cFJlc3BvbnNlRXJyb3IgPSBuZXcgSHR0cFJlc3BvbnNlRXJyb3IocmVxdWVzdCwge1xuICAgICAgICAgICAgZXJyb3I6IFwiVU5BVVRIT1JJWkVEXCIsXG4gICAgICAgICAgICBzdGF0dXM6IEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELFxuICAgICAgICAgICAgbWVzc2FnZTogZXhjZXB0aW9uLm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJlc3BvbnNlLnN0YXR1cyhIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCkuanNvbihodHRwUmVzcG9uc2VFcnJvcik7XG4gICAgfVxufVxuIl19
@@ -0,0 +1,9 @@
1
+ import { ArgumentsHost, ExceptionFilter } from "@nestjs/common";
2
+ export declare class AuthorizationError extends Error {
3
+ readonly status: number;
4
+ readonly code: string;
5
+ constructor(message?: string);
6
+ }
7
+ export declare class AuthorizationExceptionFilter implements ExceptionFilter {
8
+ catch(exception: AuthorizationError, host: ArgumentsHost): void;
9
+ }