plutin 1.1.3 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -450,6 +450,7 @@ __export(src_exports, {
450
450
  Entity: () => Entity,
451
451
  Inject: () => Inject,
452
452
  NotificationErrorInMemory: () => NotificationErrorInMemory,
453
+ NotificationFactory: () => NotificationFactory,
453
454
  SentryNotifier: () => SentryNotifier,
454
455
  UniqueEntityId: () => UniqueEntityId,
455
456
  ValueObject: () => ValueObject,
@@ -1080,6 +1081,34 @@ SentryNotifier = _ts_decorate2([
1080
1081
  ])
1081
1082
  ], SentryNotifier);
1082
1083
 
1084
+ // src/infra/adapters/notifications/notification-factory.ts
1085
+ var NotificationFactory = class {
1086
+ static {
1087
+ __name(this, "NotificationFactory");
1088
+ }
1089
+ static define(env, definitions) {
1090
+ const defaultDefinition = {
1091
+ test: this.defineProvider(definitions?.local ?? "console"),
1092
+ development: this.defineProvider(definitions?.local ?? "console"),
1093
+ staging: this.defineProvider(definitions?.local ?? "discord"),
1094
+ production: this.defineProvider(definitions?.local ?? "sentry")
1095
+ };
1096
+ return defaultDefinition[env];
1097
+ }
1098
+ static defineProvider(provider) {
1099
+ switch (provider) {
1100
+ case "console":
1101
+ return NotificationErrorInMemory;
1102
+ case "discord":
1103
+ return DiscordNotifier;
1104
+ case "sentry":
1105
+ return SentryNotifier;
1106
+ default:
1107
+ return NotificationErrorInMemory;
1108
+ }
1109
+ }
1110
+ };
1111
+
1083
1112
  // src/infra/adapters/validators/zod/zod-map-error.ts
1084
1113
  var ZodMapError = class {
1085
1114
  static {
@@ -1233,6 +1262,7 @@ var baseEnvSchema = import_zod.z.object({
1233
1262
  Entity,
1234
1263
  Inject,
1235
1264
  NotificationErrorInMemory,
1265
+ NotificationFactory,
1236
1266
  SentryNotifier,
1237
1267
  UniqueEntityId,
1238
1268
  ValueObject,
@@ -1 +1 @@
1
- {"version":3,"sources":["../node_modules/dotenv/package.json","../node_modules/dotenv/lib/main.js","../node_modules/dotenv/lib/env-options.js","../node_modules/dotenv/lib/cli-options.js","../src/index.ts","../src/core/http/base-controller.ts","../src/core/decorators/dependency-container.ts","../src/core/errors/api-common-error.ts","../src/core/errors/application-error.ts","../src/core/errors/conflict-error.ts","../src/core/errors/domain-error.ts","../src/core/errors/infra-error.ts","../src/core/errors/validation-error.ts","../src/core/decorators/controller-http-decorator.ts","../src/core/entities/unique-entity-id.ts","../src/core/entities/entity.ts","../src/core/entities/aggregate-root.ts","../src/core/entities/value-object.ts","../src/core/entities/watched-list.ts","../src/core/http/get-take-and-skip.ts","../src/infra/adapters/http/express-adapter.ts","../src/infra/adapters/http/validate-controller-metadata.ts","../src/infra/adapters/http/fastify-adapter.ts","../src/infra/adapters/notifications/discord.ts","../src/infra/adapters/notifications/in-memory.ts","../src/infra/adapters/notifications/sentry.ts","../src/infra/adapters/validators/zod/zod-map-error.ts","../src/infra/adapters/validators/zod/index.ts","../src/infra/adapters/validators/zod/zod-validator.ts","../node_modules/dotenv/config.js","../src/infra/env/index.ts"],"sourcesContent":["{\n \"name\": \"dotenv\",\n \"version\": \"16.5.0\",\n \"description\": \"Loads environment variables from .env file\",\n \"main\": \"lib/main.js\",\n \"types\": \"lib/main.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./lib/main.d.ts\",\n \"require\": \"./lib/main.js\",\n \"default\": \"./lib/main.js\"\n },\n \"./config\": \"./config.js\",\n \"./config.js\": \"./config.js\",\n \"./lib/env-options\": \"./lib/env-options.js\",\n \"./lib/env-options.js\": \"./lib/env-options.js\",\n \"./lib/cli-options\": \"./lib/cli-options.js\",\n \"./lib/cli-options.js\": \"./lib/cli-options.js\",\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"dts-check\": \"tsc --project tests/types/tsconfig.json\",\n \"lint\": \"standard\",\n \"pretest\": \"npm run lint && npm run dts-check\",\n \"test\": \"tap run --allow-empty-coverage --disable-coverage --timeout=60000\",\n \"test:coverage\": \"tap run --show-full-coverage --timeout=60000 --coverage-report=lcov\",\n \"prerelease\": \"npm test\",\n \"release\": \"standard-version\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git://github.com/motdotla/dotenv.git\"\n },\n \"homepage\": \"https://github.com/motdotla/dotenv#readme\",\n \"funding\": \"https://dotenvx.com\",\n \"keywords\": [\n \"dotenv\",\n \"env\",\n \".env\",\n \"environment\",\n \"variables\",\n \"config\",\n \"settings\"\n ],\n \"readmeFilename\": \"README.md\",\n \"license\": \"BSD-2-Clause\",\n \"devDependencies\": {\n \"@types/node\": \"^18.11.3\",\n \"decache\": \"^4.6.2\",\n \"sinon\": \"^14.0.1\",\n \"standard\": \"^17.0.0\",\n \"standard-version\": \"^9.5.0\",\n \"tap\": \"^19.2.0\",\n \"typescript\": \"^4.8.4\"\n },\n \"engines\": {\n \"node\": \">=12\"\n },\n \"browser\": {\n \"fs\": false\n }\n}\n","const fs = require('fs')\nconst path = require('path')\nconst os = require('os')\nconst crypto = require('crypto')\nconst packageJson = require('../package.json')\n\nconst version = packageJson.version\n\nconst LINE = /(?:^|^)\\s*(?:export\\s+)?([\\w.-]+)(?:\\s*=\\s*?|:\\s+?)(\\s*'(?:\\\\'|[^'])*'|\\s*\"(?:\\\\\"|[^\"])*\"|\\s*`(?:\\\\`|[^`])*`|[^#\\r\\n]+)?\\s*(?:#.*)?(?:$|$)/mg\n\n// Parse src into an Object\nfunction parse (src) {\n const obj = {}\n\n // Convert buffer to string\n let lines = src.toString()\n\n // Convert line breaks to same format\n lines = lines.replace(/\\r\\n?/mg, '\\n')\n\n let match\n while ((match = LINE.exec(lines)) != null) {\n const key = match[1]\n\n // Default undefined or null to empty string\n let value = (match[2] || '')\n\n // Remove whitespace\n value = value.trim()\n\n // Check if double quoted\n const maybeQuote = value[0]\n\n // Remove surrounding quotes\n value = value.replace(/^(['\"`])([\\s\\S]*)\\1$/mg, '$2')\n\n // Expand newlines if double quoted\n if (maybeQuote === '\"') {\n value = value.replace(/\\\\n/g, '\\n')\n value = value.replace(/\\\\r/g, '\\r')\n }\n\n // Add to object\n obj[key] = value\n }\n\n return obj\n}\n\nfunction _parseVault (options) {\n const vaultPath = _vaultPath(options)\n\n // Parse .env.vault\n const result = DotenvModule.configDotenv({ path: vaultPath })\n if (!result.parsed) {\n const err = new Error(`MISSING_DATA: Cannot parse ${vaultPath} for an unknown reason`)\n err.code = 'MISSING_DATA'\n throw err\n }\n\n // handle scenario for comma separated keys - for use with key rotation\n // example: DOTENV_KEY=\"dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=prod,dotenv://:key_7890@dotenvx.com/vault/.env.vault?environment=prod\"\n const keys = _dotenvKey(options).split(',')\n const length = keys.length\n\n let decrypted\n for (let i = 0; i < length; i++) {\n try {\n // Get full key\n const key = keys[i].trim()\n\n // Get instructions for decrypt\n const attrs = _instructions(result, key)\n\n // Decrypt\n decrypted = DotenvModule.decrypt(attrs.ciphertext, attrs.key)\n\n break\n } catch (error) {\n // last key\n if (i + 1 >= length) {\n throw error\n }\n // try next key\n }\n }\n\n // Parse decrypted .env string\n return DotenvModule.parse(decrypted)\n}\n\nfunction _warn (message) {\n console.log(`[dotenv@${version}][WARN] ${message}`)\n}\n\nfunction _debug (message) {\n console.log(`[dotenv@${version}][DEBUG] ${message}`)\n}\n\nfunction _dotenvKey (options) {\n // prioritize developer directly setting options.DOTENV_KEY\n if (options && options.DOTENV_KEY && options.DOTENV_KEY.length > 0) {\n return options.DOTENV_KEY\n }\n\n // secondary infra already contains a DOTENV_KEY environment variable\n if (process.env.DOTENV_KEY && process.env.DOTENV_KEY.length > 0) {\n return process.env.DOTENV_KEY\n }\n\n // fallback to empty string\n return ''\n}\n\nfunction _instructions (result, dotenvKey) {\n // Parse DOTENV_KEY. Format is a URI\n let uri\n try {\n uri = new URL(dotenvKey)\n } catch (error) {\n if (error.code === 'ERR_INVALID_URL') {\n const err = new Error('INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=development')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n }\n\n throw error\n }\n\n // Get decrypt key\n const key = uri.password\n if (!key) {\n const err = new Error('INVALID_DOTENV_KEY: Missing key part')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n }\n\n // Get environment\n const environment = uri.searchParams.get('environment')\n if (!environment) {\n const err = new Error('INVALID_DOTENV_KEY: Missing environment part')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n }\n\n // Get ciphertext payload\n const environmentKey = `DOTENV_VAULT_${environment.toUpperCase()}`\n const ciphertext = result.parsed[environmentKey] // DOTENV_VAULT_PRODUCTION\n if (!ciphertext) {\n const err = new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${environmentKey} in your .env.vault file.`)\n err.code = 'NOT_FOUND_DOTENV_ENVIRONMENT'\n throw err\n }\n\n return { ciphertext, key }\n}\n\nfunction _vaultPath (options) {\n let possibleVaultPath = null\n\n if (options && options.path && options.path.length > 0) {\n if (Array.isArray(options.path)) {\n for (const filepath of options.path) {\n if (fs.existsSync(filepath)) {\n possibleVaultPath = filepath.endsWith('.vault') ? filepath : `${filepath}.vault`\n }\n }\n } else {\n possibleVaultPath = options.path.endsWith('.vault') ? options.path : `${options.path}.vault`\n }\n } else {\n possibleVaultPath = path.resolve(process.cwd(), '.env.vault')\n }\n\n if (fs.existsSync(possibleVaultPath)) {\n return possibleVaultPath\n }\n\n return null\n}\n\nfunction _resolveHome (envPath) {\n return envPath[0] === '~' ? path.join(os.homedir(), envPath.slice(1)) : envPath\n}\n\nfunction _configVault (options) {\n const debug = Boolean(options && options.debug)\n if (debug) {\n _debug('Loading env from encrypted .env.vault')\n }\n\n const parsed = DotenvModule._parseVault(options)\n\n let processEnv = process.env\n if (options && options.processEnv != null) {\n processEnv = options.processEnv\n }\n\n DotenvModule.populate(processEnv, parsed, options)\n\n return { parsed }\n}\n\nfunction configDotenv (options) {\n const dotenvPath = path.resolve(process.cwd(), '.env')\n let encoding = 'utf8'\n const debug = Boolean(options && options.debug)\n\n if (options && options.encoding) {\n encoding = options.encoding\n } else {\n if (debug) {\n _debug('No encoding is specified. UTF-8 is used by default')\n }\n }\n\n let optionPaths = [dotenvPath] // default, look for .env\n if (options && options.path) {\n if (!Array.isArray(options.path)) {\n optionPaths = [_resolveHome(options.path)]\n } else {\n optionPaths = [] // reset default\n for (const filepath of options.path) {\n optionPaths.push(_resolveHome(filepath))\n }\n }\n }\n\n // Build the parsed data in a temporary object (because we need to return it). Once we have the final\n // parsed data, we will combine it with process.env (or options.processEnv if provided).\n let lastError\n const parsedAll = {}\n for (const path of optionPaths) {\n try {\n // Specifying an encoding returns a string instead of a buffer\n const parsed = DotenvModule.parse(fs.readFileSync(path, { encoding }))\n\n DotenvModule.populate(parsedAll, parsed, options)\n } catch (e) {\n if (debug) {\n _debug(`Failed to load ${path} ${e.message}`)\n }\n lastError = e\n }\n }\n\n let processEnv = process.env\n if (options && options.processEnv != null) {\n processEnv = options.processEnv\n }\n\n DotenvModule.populate(processEnv, parsedAll, options)\n\n if (lastError) {\n return { parsed: parsedAll, error: lastError }\n } else {\n return { parsed: parsedAll }\n }\n}\n\n// Populates process.env from .env file\nfunction config (options) {\n // fallback to original dotenv if DOTENV_KEY is not set\n if (_dotenvKey(options).length === 0) {\n return DotenvModule.configDotenv(options)\n }\n\n const vaultPath = _vaultPath(options)\n\n // dotenvKey exists but .env.vault file does not exist\n if (!vaultPath) {\n _warn(`You set DOTENV_KEY but you are missing a .env.vault file at ${vaultPath}. Did you forget to build it?`)\n\n return DotenvModule.configDotenv(options)\n }\n\n return DotenvModule._configVault(options)\n}\n\nfunction decrypt (encrypted, keyStr) {\n const key = Buffer.from(keyStr.slice(-64), 'hex')\n let ciphertext = Buffer.from(encrypted, 'base64')\n\n const nonce = ciphertext.subarray(0, 12)\n const authTag = ciphertext.subarray(-16)\n ciphertext = ciphertext.subarray(12, -16)\n\n try {\n const aesgcm = crypto.createDecipheriv('aes-256-gcm', key, nonce)\n aesgcm.setAuthTag(authTag)\n return `${aesgcm.update(ciphertext)}${aesgcm.final()}`\n } catch (error) {\n const isRange = error instanceof RangeError\n const invalidKeyLength = error.message === 'Invalid key length'\n const decryptionFailed = error.message === 'Unsupported state or unable to authenticate data'\n\n if (isRange || invalidKeyLength) {\n const err = new Error('INVALID_DOTENV_KEY: It must be 64 characters long (or more)')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n } else if (decryptionFailed) {\n const err = new Error('DECRYPTION_FAILED: Please check your DOTENV_KEY')\n err.code = 'DECRYPTION_FAILED'\n throw err\n } else {\n throw error\n }\n }\n}\n\n// Populate process.env with parsed values\nfunction populate (processEnv, parsed, options = {}) {\n const debug = Boolean(options && options.debug)\n const override = Boolean(options && options.override)\n\n if (typeof parsed !== 'object') {\n const err = new Error('OBJECT_REQUIRED: Please check the processEnv argument being passed to populate')\n err.code = 'OBJECT_REQUIRED'\n throw err\n }\n\n // Set process.env\n for (const key of Object.keys(parsed)) {\n if (Object.prototype.hasOwnProperty.call(processEnv, key)) {\n if (override === true) {\n processEnv[key] = parsed[key]\n }\n\n if (debug) {\n if (override === true) {\n _debug(`\"${key}\" is already defined and WAS overwritten`)\n } else {\n _debug(`\"${key}\" is already defined and was NOT overwritten`)\n }\n }\n } else {\n processEnv[key] = parsed[key]\n }\n }\n}\n\nconst DotenvModule = {\n configDotenv,\n _configVault,\n _parseVault,\n config,\n decrypt,\n parse,\n populate\n}\n\nmodule.exports.configDotenv = DotenvModule.configDotenv\nmodule.exports._configVault = DotenvModule._configVault\nmodule.exports._parseVault = DotenvModule._parseVault\nmodule.exports.config = DotenvModule.config\nmodule.exports.decrypt = DotenvModule.decrypt\nmodule.exports.parse = DotenvModule.parse\nmodule.exports.populate = DotenvModule.populate\n\nmodule.exports = DotenvModule\n","// ../config.js accepts options via environment variables\nconst options = {}\n\nif (process.env.DOTENV_CONFIG_ENCODING != null) {\n options.encoding = process.env.DOTENV_CONFIG_ENCODING\n}\n\nif (process.env.DOTENV_CONFIG_PATH != null) {\n options.path = process.env.DOTENV_CONFIG_PATH\n}\n\nif (process.env.DOTENV_CONFIG_DEBUG != null) {\n options.debug = process.env.DOTENV_CONFIG_DEBUG\n}\n\nif (process.env.DOTENV_CONFIG_OVERRIDE != null) {\n options.override = process.env.DOTENV_CONFIG_OVERRIDE\n}\n\nif (process.env.DOTENV_CONFIG_DOTENV_KEY != null) {\n options.DOTENV_KEY = process.env.DOTENV_CONFIG_DOTENV_KEY\n}\n\nmodule.exports = options\n","const re = /^dotenv_config_(encoding|path|debug|override|DOTENV_KEY)=(.+)$/\n\nmodule.exports = function optionMatcher (args) {\n return args.reduce(function (acc, cur) {\n const matches = cur.match(re)\n if (matches) {\n acc[matches[1]] = matches[2]\n }\n return acc\n }, {})\n}\n","// core decorators\nexport * from './core/decorators/controller-http-decorator'\nexport * from './core/decorators/dependency-container'\n\n// core entities\nexport * from './core/entities/aggregate-root'\nexport * from './core/entities/common-dto'\nexport * from './core/entities/domain-event'\nexport * from './core/entities/entity'\nexport * from './core/entities/optional'\nexport * from './core/entities/unique-entity-id'\nexport * from './core/entities/value-object'\nexport * from './core/entities/watched-list'\n\n// core errors\nexport * from './core/errors/application-error'\nexport * from './core/errors/conflict-error'\nexport * from './core/errors/domain-error'\nexport * from './core/errors/http-client-error'\nexport * from './core/errors/infra-error'\n\n// core http\nexport * from './core/http/base-controller'\nexport * from './core/http/dto-response'\nexport * from './core/http/error-notifier'\nexport * from './core/http/get-take-and-skip'\nexport * from './core/http/health-connections'\nexport * from './core/http/pagination'\nexport * from './core/http/validator'\n\n// infra adapters http\nexport * from './infra/adapters/http/express-adapter'\nexport * from './infra/adapters/http/fastify-adapter'\n\n// infra adapters notifications\nexport * from './infra/adapters/notifications/discord'\nexport * from './infra/adapters/notifications/in-memory'\nexport * from './infra/adapters/notifications/sentry'\n\n// infra adapters validations\nexport * from './infra/adapters/validators/zod/zod-validator'\n\n// infra common env\nexport * from './infra/env'\n","import 'reflect-metadata'\n\nimport { DependencyContainer } from '../../core/decorators/dependency-container'\nimport ApplicationError from '../../core/errors/application-error'\nimport ConflictError from '../../core/errors/conflict-error'\nimport DomainError from '../../core/errors/domain-error'\nimport InfraError from '../../core/errors/infra-error'\nimport ValidationError from '../../core/errors/validation-error'\nimport { MiddlewareFunction } from '../../infra/adapters/validators/zod/zod-validator'\nimport { IErrorNotifier } from './error-notifier'\n\ntype AnyObject = Record<string, any>\n\nexport type Request = {\n body: AnyObject\n params: AnyObject\n headers: AnyObject\n query: AnyObject\n}\n\nexport type Response = {\n code: number\n data: any\n}\n\nexport type ContextError = {\n env: string\n user?: {\n id?: string\n name?: string\n email?: string\n }\n request?: {\n method?: string\n requestId?: string\n url?: string\n headers?: any\n query?: any\n body?: any\n params?: any\n }\n}\n\nexport abstract class BaseController {\n protected readonly errorNotifier: IErrorNotifier\n\n abstract handle<T>(request: T | Request): Promise<Response>\n\n constructor() {\n this.errorNotifier = DependencyContainer.resolveToken('IErrorNotifier')\n }\n\n protected success<T>(dto?: T): Response {\n return {\n code: 200,\n data: { data: dto },\n }\n }\n\n protected noContent(): Response {\n return {\n code: 204,\n data: undefined,\n }\n }\n\n protected created<T>(dto?: T): Response {\n return {\n code: 201,\n data: dto ? { data: dto } : undefined,\n }\n }\n\n protected paginated<T>(dto?: T): Response {\n return {\n code: 200,\n data: dto,\n }\n }\n\n protected buildContextError(request: Request): ContextError {\n return {\n env: process.env.ENVIRONMENT as string,\n request: {\n body: request.body,\n headers: request.headers,\n params: request.params,\n query: request.query,\n },\n }\n }\n\n public async failure(error: Error, context: ContextError): Promise<Response> {\n if (error instanceof ConflictError) {\n return {\n code: error.props.code,\n data: {\n message: error.message,\n errorCode: error.props.errorCode,\n occurredAt: error.props.occurredAt,\n items: Array.isArray(error.conflictProps)\n ? error.conflictProps\n : [error.conflictProps],\n },\n }\n }\n\n if (\n error instanceof DomainError ||\n error instanceof ApplicationError ||\n error instanceof InfraError\n ) {\n return {\n code: error.props.code,\n data: {\n message: error.message,\n errorCode: error.props.errorCode,\n occurredAt: error.props.occurredAt,\n },\n }\n }\n\n if (error instanceof ValidationError) {\n return {\n code: error.props.code,\n data: {\n message: error.props.message,\n errorCode: error.props.errorCode,\n occurredAt: error.props.occurredAt,\n errors: error.props.errors,\n },\n }\n }\n\n if (process.env.SHOULD_NOTIFY_ERROR) {\n await this.errorNotifier.notify(error, context)\n }\n\n return {\n code: 500,\n data: {\n code: 500,\n message: 'Server failed. Contact the administrator!',\n },\n }\n }\n\n public async execute(request: Request): Promise<Response> {\n const routeMetadata = Reflect.getMetadata('route', this.constructor)\n\n if (!routeMetadata) {\n throw new InfraError('Route metadata not found.')\n }\n\n const middlewares: MiddlewareFunction[] = routeMetadata.middlewares || []\n\n let processedRequest = request\n\n if (middlewares.length) {\n for (const middleware of middlewares) {\n processedRequest = await middleware(processedRequest)\n }\n }\n\n return await this.handle(processedRequest)\n }\n}\n","import 'reflect-metadata'\n\ntype Class<T = any> = new (...args: any[]) => T\n\ntype Registration =\n | { type: 'class'; myClass: Class; singleton: boolean }\n | { type: 'value'; value: any }\n\nexport class DependencyContainer {\n static registry = new Map<string, Registration>()\n static singletons = new Map<string, any>()\n\n static register<T>(\n token: string,\n myClass: Class<T>,\n options: { singleton: boolean }\n ) {\n this.registry.set(token, {\n type: 'class',\n myClass,\n singleton: options.singleton,\n })\n }\n\n static registerValue<T>(token: string, value: T) {\n this.registry.set(token, { type: 'value', value })\n }\n\n static resolve<T>(target: Class<T>): T {\n const paramTypes = Reflect.getMetadata('design:paramtypes', target) || []\n\n const injectMetadata: Record<number, string> =\n Reflect.getOwnMetadata('inject:params', target) || {}\n\n const params = paramTypes.map((_: any, index: number) => {\n const token = injectMetadata[index]\n\n if (!token) {\n throw new Error(\n `Missing @Inject token for parameter index ${index} in ${target.name}`\n )\n }\n\n return this.resolveToken(token)\n })\n\n return new target(...params)\n }\n\n static resolveToken(token: string): any {\n const registration = this.registry.get(token)\n\n if (!registration) {\n throw new Error(\n `\"${token}\" not registered. Please register it in the container.`\n )\n }\n\n if (registration.type === 'value') {\n return registration.value\n }\n\n const { myClass, singleton } = registration\n\n if (singleton) {\n if (!this.singletons.has(token)) {\n const instance = this.resolve(myClass)\n this.singletons.set(token, instance)\n }\n return this.singletons.get(token)\n }\n\n return this.resolve(myClass)\n }\n}\n\nexport function Inject(token: string): ParameterDecorator {\n return (\n target: object,\n _propertyKey: string | symbol | undefined,\n parameterIndex: number\n ): void => {\n const constructor =\n typeof target === 'function' ? target : target.constructor\n\n const existingInjectedParams: Record<number, string> =\n Reflect.getOwnMetadata('inject:params', constructor) || {}\n\n existingInjectedParams[parameterIndex] = token\n\n Reflect.defineMetadata('inject:params', existingInjectedParams, constructor)\n }\n}\n","export type PropertiesError = {\n receivedValue?: any\n type: string\n message: string\n property: string | number | undefined\n propertyType?: string\n path?: string\n}\n\nexport type CommonError = {\n location: string\n propertyErrors?: PropertiesError[]\n}\n\nexport type ApiCommonError = {\n code: number\n occurredAt: Date\n message: string\n errorCode: string\n errors?: CommonError[]\n}\n\nexport enum ApiErrorEnum {\n DOMAIN = 'ERR001',\n APPLICATION = 'ERR002',\n INFRA = 'ERR003',\n HTTP_CLIENT = 'ERR004',\n VALIDATOR = 'ERR005',\n}\n","import { type ApiCommonError, ApiErrorEnum } from './api-common-error'\n\nexport default class ApplicationError extends Error {\n props: ApiCommonError\n\n constructor(message: string) {\n super(message)\n this.props = {\n code: 400,\n errorCode: ApiErrorEnum.APPLICATION,\n message,\n occurredAt: new Date(),\n }\n }\n}\n","import { type ApiCommonError, ApiErrorEnum } from './api-common-error'\n\ntype ConflictProps = { id: string; [key: string]: unknown }\n\nexport default class ConflictError<T extends ConflictProps> extends Error {\n props: ApiCommonError\n conflictProps: T | T[]\n\n constructor(conflictProps: T | T[]) {\n super('Resource already exists.')\n this.conflictProps = conflictProps\n this.props = {\n code: 409,\n errorCode: ApiErrorEnum.APPLICATION,\n message: this.message,\n occurredAt: new Date(),\n }\n }\n}\n","import { type ApiCommonError, ApiErrorEnum } from './api-common-error'\n\nexport default class DomainError extends Error {\n props: ApiCommonError\n\n constructor(message: string) {\n super(message)\n this.props = {\n code: 400,\n errorCode: ApiErrorEnum.DOMAIN,\n message,\n occurredAt: new Date(),\n }\n }\n}\n","import { type ApiCommonError, ApiErrorEnum } from './api-common-error'\n\nexport default class InfraError extends Error {\n props: ApiCommonError\n\n constructor(message: string) {\n super(message)\n this.props = {\n code: 400,\n errorCode: ApiErrorEnum.INFRA,\n message,\n occurredAt: new Date(),\n }\n }\n}\n","import {\n type ApiCommonError,\n ApiErrorEnum,\n type CommonError,\n} from './api-common-error'\n\nexport default class ValidationError extends Error {\n props: ApiCommonError\n\n constructor(errors: CommonError[]) {\n super('Validation Error')\n this.props = {\n code: 400,\n errorCode: ApiErrorEnum.VALIDATOR,\n message: 'Validation Error',\n occurredAt: new Date(),\n errors,\n }\n }\n}\n","import { MiddlewareFunction } from '../../infra/adapters/validators/zod/zod-validator'\nimport { BaseController } from '../http/base-controller'\nimport type { MethodType } from '../http/http'\n\ntype Props = {\n method: MethodType\n path: string\n middlewares?: MiddlewareFunction[]\n}\n\nexport function Controller({\n method,\n path,\n middlewares = [],\n}: Props): ClassDecorator {\n return (target: any) => {\n if (!(target.prototype instanceof BaseController)) {\n throw new Error(\n `The class ${target.name} should extends abstract class BaseController`\n )\n }\n\n Reflect.defineMetadata(\n 'route',\n { method, path: `/api/${path}`, middlewares },\n target\n )\n }\n}\n","import { randomUUID } from 'node:crypto'\n\nexport class UniqueEntityId {\n private value: string\n\n constructor(value?: string) {\n this.value = value ?? randomUUID()\n }\n\n toString() {\n return this.value\n }\n\n toValue() {\n return this.value\n }\n\n public equals(id: UniqueEntityId) {\n return id.toValue() === this.toValue()\n }\n}\n","import { CommonDTO } from './common-dto'\nimport { UniqueEntityId } from './unique-entity-id'\n\ntype PropsWithCommonDTO<Props> = Props & CommonDTO\n\nexport abstract class Entity<Props> {\n private _id: UniqueEntityId\n protected props: PropsWithCommonDTO<Props>\n\n get id() {\n return this._id\n }\n\n set id(id: UniqueEntityId) {\n this._id = id\n }\n\n get createdAt() {\n return this.props.createdAt\n }\n\n set createdAt(date: Date) {\n this.props.createdAt = date\n }\n\n get updatedAt(): Date | undefined | null {\n return this.props.updatedAt\n }\n\n public touch() {\n this.props.updatedAt = new Date()\n }\n\n protected constructor(props: PropsWithCommonDTO<Props>, id?: UniqueEntityId) {\n this._id = id ?? new UniqueEntityId(id)\n this.props = props\n }\n\n public equals(entity: Entity<any>) {\n if (entity === this) {\n return true\n }\n\n if (entity.id === this._id) {\n return true\n }\n\n return false\n }\n}\n","import { Entity } from './entity'\n\nexport abstract class AggregateRoot<Props> extends Entity<Props> {}\n","export abstract class ValueObject<Props> {\n protected props: Props\n\n protected constructor(props: Props) {\n this.props = props\n }\n}\n","export abstract class WatchedList<T> {\n public currentItems: T[]\n private initial: T[]\n private new: T[]\n private removed: T[]\n private updated: T[]\n\n constructor(initialItems?: T[]) {\n this.currentItems = initialItems || []\n this.initial = initialItems || []\n this.new = []\n this.removed = []\n this.updated = []\n }\n\n abstract compareItems(a: T, b: T): boolean\n\n public getItems(): T[] {\n return this.currentItems\n }\n\n public getNewItems(): T[] {\n return this.new\n }\n\n public getRemovedItems(): T[] {\n return this.removed\n }\n\n public getUpdatedItems(): T[] {\n return this.updated\n }\n\n public addUpdatedItem(item: T) {\n return this.updated.push(item)\n }\n\n private isCurrentItem(item: T): boolean {\n return (\n this.currentItems.filter((v: T) => this.compareItems(item, v)).length !==\n 0\n )\n }\n\n private isNewItem(item: T): boolean {\n return this.new.filter((v: T) => this.compareItems(item, v)).length !== 0\n }\n\n private isRemovedItem(item: T): boolean {\n return (\n this.removed.filter((v: T) => this.compareItems(item, v)).length !== 0\n )\n }\n\n private removeFromNew(item: T): void {\n this.new = this.new.filter((v) => !this.compareItems(v, item))\n }\n\n private removeFromCurrent(item: T): void {\n this.currentItems = this.currentItems.filter(\n (v) => !this.compareItems(item, v)\n )\n }\n\n private removeFromRemoved(item: T): void {\n this.removed = this.removed.filter((v) => !this.compareItems(item, v))\n }\n\n private wasAddedInitially(item: T): boolean {\n return (\n this.initial.filter((v: T) => this.compareItems(item, v)).length !== 0\n )\n }\n\n public exists(item: T): boolean {\n return this.isCurrentItem(item)\n }\n\n public add(item: T): void {\n if (this.isRemovedItem(item)) {\n this.removeFromRemoved(item)\n }\n\n if (!this.isNewItem(item) && !this.wasAddedInitially(item)) {\n this.new.push(item)\n }\n\n if (!this.isCurrentItem(item)) {\n this.currentItems.push(item)\n }\n }\n\n public remove(item: T): void {\n this.removeFromCurrent(item)\n\n if (this.isNewItem(item)) {\n this.removeFromNew(item)\n\n return\n }\n\n if (!this.isRemovedItem(item)) {\n this.removed.push(item)\n }\n }\n\n public update(items: T[]): void {\n const newItems = items.filter((a) => {\n return !this.getItems().some((b) => this.compareItems(a, b))\n })\n\n const removedItems = this.getItems().filter((a) => {\n return !items.some((b) => this.compareItems(a, b))\n })\n\n const updatedItems = items.filter(\n (item) =>\n !newItems.some(\n (a) =>\n this.compareItems(item, a) &&\n !removedItems.some((b) => this.compareItems(item, b))\n )\n )\n\n this.currentItems = items\n this.new = newItems\n this.removed = removedItems\n this.updated = updatedItems\n }\n}\n","export function getTakeAndSkip(size: string, page: string) {\n const take = size ? Number(size) : 20\n const skip = page ? Number(page) : 1\n\n return { take, skip }\n}\n","import cors from 'cors'\nimport express, { Express, Request, Response } from 'express'\n\nimport type { BaseController } from '../../../core/http/base-controller'\nimport type IHttp from '../../../core/http/http'\nimport { ErrorResponseCode } from './response-error-code'\nimport { validateControllerMetadata } from './validate-controller-metadata'\n\nexport default class ExpressAdapter implements IHttp {\n readonly instance: Express\n private server: any\n\n constructor(readonly env: Record<string, any>) {\n this.instance = express()\n this.instance.use(cors())\n this.instance.use(express.json({ limit: '10mb' }))\n this.instance.use(express.urlencoded({ limit: '10mb', extended: false }))\n this.instance.disable('x-powered-by')\n }\n\n registerRoute(controllerClass: BaseController): void {\n const { metadata } = validateControllerMetadata(controllerClass)\n\n this.instance[metadata.method](\n metadata.path,\n async (request: Request, response: Response) => {\n const requestData = {\n body: request.body,\n params: request.params,\n headers: request.headers,\n query: request.query,\n }\n\n try {\n const output = await controllerClass.execute(requestData)\n response\n .status(output.code || 204)\n .json(output.data || { code: ErrorResponseCode.NO_CONTENT_BODY })\n } catch (err: any) {\n const error = await controllerClass.failure(err, {\n env: this.env.ENVIRONMENT,\n request: {\n body: requestData.body,\n headers: requestData.headers,\n params: request.params,\n query: requestData.query,\n url: metadata.path,\n method: metadata.method,\n },\n })\n response.status(error.code).json(\n error.data || {\n error: ErrorResponseCode.NO_CONTENT_ERROR,\n }\n )\n }\n }\n )\n }\n\n async startServer(port: number): Promise<void> {\n return new Promise((resolve) => {\n this.server = this.instance.listen(port, () => {\n console.log(`🚀 Server is running on PORT ${port}`)\n resolve()\n })\n })\n }\n\n async closeServer(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (this.server) {\n this.server.close((err: any) => {\n if (err) return reject(err)\n resolve()\n })\n } else {\n resolve()\n }\n })\n }\n}\n","import 'reflect-metadata'\n\nimport { BaseController } from '../../../core/http/base-controller'\nimport type { MethodType } from '../../../core/http/http'\n\nexport function validateControllerMetadata(controller: BaseController) {\n const metadata = Reflect.getMetadata('route', controller.constructor) as {\n method: MethodType\n path: string\n }\n\n if (!metadata) {\n throw new Error(\n `Controller ${controller.constructor.name} not have metadata. Need to add decorator.`\n )\n }\n\n return {\n metadata,\n }\n}\n","import cors from '@fastify/cors'\nimport type IHttp from 'core/http/http'\nimport fastify, { FastifyInstance, FastifyReply, FastifyRequest } from 'fastify'\nimport qs from 'qs'\n\nimport { BaseController, Request } from '../../../core/http/base-controller'\nimport { ErrorResponseCode } from './response-error-code'\nimport { validateControllerMetadata } from './validate-controller-metadata'\n\nexport default class FastifyAdapter implements IHttp {\n readonly instance: FastifyInstance\n\n constructor(readonly env: Record<string, any>) {\n this.instance = fastify({\n bodyLimit: 10 * 1024 * 1024,\n querystringParser: (str) => qs.parse(str),\n })\n\n this.instance.register(cors)\n }\n\n registerRoute(controllerClass: BaseController): void {\n const { metadata } = validateControllerMetadata(controllerClass)\n\n this.instance[metadata.method](\n metadata.path,\n async (request: FastifyRequest, reply: FastifyReply) => {\n const requestData = {\n body: request.body,\n params: request.params,\n headers: request.headers,\n query: request.query,\n } as Request\n\n try {\n const output = await controllerClass.execute(requestData)\n return reply.status(output.code || 200).send(\n output.data || {\n code: ErrorResponseCode.NO_CONTENT_BODY,\n }\n )\n } catch (err: any) {\n const error = await controllerClass.failure(err, {\n env: this.env.ENVIRONMENT,\n request: {\n body: requestData.body,\n headers: requestData.headers,\n params: request.params,\n query: requestData.query,\n url: metadata.path,\n method: metadata.method,\n },\n })\n return reply.status(error.code || 200).send(\n error.data || {\n code: ErrorResponseCode.NO_CONTENT_ERROR,\n }\n )\n }\n }\n )\n }\n\n async startServer(port: number): Promise<void> {\n await this.instance.listen({ port })\n\n if (this.env.NODE_ENV !== 'test') {\n console.log(`🚀 Server is running on PORT ${port}`)\n }\n }\n\n async closeServer() {\n await this.instance.close()\n }\n}\n","import { Inject } from 'core/decorators/dependency-container'\nimport { MessageBuilder, Webhook } from 'discord-webhook-node'\n\nimport type { ContextError } from '../../../core/http/base-controller'\nimport type { IErrorNotifier } from '../../../core/http/error-notifier'\n\ntype DiscordOptions = {\n url: string\n env: string\n}\n\nexport class DiscordNotifier implements IErrorNotifier {\n private webhook: Webhook\n\n constructor(\n @Inject('DiscordConfig') private readonly options: DiscordOptions\n ) {\n this.webhook = new Webhook(this.options.url)\n }\n\n async notify(error: Error, context: ContextError): Promise<void> {\n const embed = new MessageBuilder()\n .setTitle('🚨 Error')\n .addField('Message', `\\`\\`\\`${error.message.slice(0, 300)}\\`\\`\\``)\n .addField(\n 'Route:',\n `\\`[${context?.request?.method}] ${context?.request?.url}\\``,\n true\n )\n .addField(\n 'Params:',\n '```json\\n' +\n JSON.stringify(context?.request?.params, null, 2) +\n '\\n```',\n true\n )\n .addField(\n 'Query:',\n '```json\\n' +\n JSON.stringify(context?.request?.query, null, 2) +\n '\\n```',\n true\n )\n .addField(\n 'Headers:',\n '```json\\n' +\n JSON.stringify(context?.request?.headers, null, 2) +\n '\\n```',\n true\n )\n .addField(\n 'Body:',\n '```json\\n' + JSON.stringify(context?.request?.body, null, 2) + '\\n```'\n )\n .addField(\n 'Stack Trace:',\n '```' + (error.stack || 'No stack provided').slice(0, 900) + '```'\n )\n .setFooter(`Env: ${this.options.env || 'development'}`)\n .setTimestamp()\n\n await this.webhook.send(embed)\n }\n}\n","import type { ContextError } from '../../../core/http/base-controller'\nimport type { IErrorNotifier } from '../../../core/http/error-notifier'\n\nexport class NotificationErrorInMemory implements IErrorNotifier {\n public errors: any[] = []\n\n async notify(error: Error, context?: ContextError): Promise<void> {\n console.log('NOTIFICATION ERROR: ', error)\n\n this.errors.push({\n error: error.message,\n context,\n })\n }\n}\n","import * as Sentry from '@sentry/node'\nimport type { ContextError } from 'core/http/base-controller'\n\nimport { Inject } from '../../../core/decorators/dependency-container'\nimport { IErrorNotifier } from '../../../core/http/error-notifier'\n\ntype SentryOptions = {\n dsn: string\n environment: string\n}\n\nexport class SentryNotifier implements IErrorNotifier {\n constructor(@Inject('SentryConfig') private readonly options: SentryOptions) {\n Sentry.init({\n dsn: this.options.dsn,\n environment: this.options.environment,\n attachStacktrace: true,\n tracesSampleRate: this.options.environment === 'production' ? 0.1 : 1.0,\n maxBreadcrumbs: 100,\n debug: this.options.environment !== 'production',\n })\n }\n\n async notify(error: Error, context: ContextError): Promise<void> {\n Sentry.withScope((scope) => {\n scope.setLevel('error')\n\n if (context?.env) scope.setTag('env', context.env)\n\n if (context?.user) {\n scope.setUser({\n id: context.user.id,\n username: context.user.name,\n email: context.user.email,\n })\n }\n\n if (context?.request) {\n const { body, query, params, headers, method, url, requestId } =\n context.request\n\n scope.setContext('http', {\n method,\n requestId,\n url,\n headers,\n query,\n body,\n params,\n })\n }\n\n Sentry.captureException(error)\n })\n }\n}\n","import type { ZodIssue } from 'zod'\n\nimport type {\n CommonError,\n PropertiesError,\n} from '../../../../core/errors/api-common-error'\n\ntype ZodError = ZodIssue & {\n expected: string\n received: string\n}\n\ntype ZodInvalidUnion = ZodError & {\n code: 'invalid_union'\n}\n\nexport default class ZodMapError {\n private static mapCommon(error: ZodError): PropertiesError {\n return {\n type: error.code,\n path: error.path.join('.'),\n property: error.path.pop(),\n propertyType: error.expected,\n receivedValue: error.received,\n message: error.message,\n }\n }\n\n private static mapInvalidUnion(error: ZodInvalidUnion): PropertiesError[] {\n const [errors] = error.unionErrors\n .flat()\n .map((err) => err.issues.map((item: any) => this.mapCommon(item)))\n\n return errors\n }\n\n private static mapInvalidType(error: ZodError): PropertiesError[] {\n return [this.mapCommon(error)]\n }\n\n private static mapErrorsFactory(error: ZodError): PropertiesError[] {\n if (error.code === 'invalid_union') {\n return this.mapInvalidUnion(error)\n }\n\n return this.mapInvalidType(error)\n }\n\n static mapErrors(errors: ZodIssue[][]) {\n const standardizedErrors = new Map<string | number, CommonError>()\n\n errors.flat().forEach((error) => {\n const keyError = standardizedErrors.get(error.path[0])\n\n if (keyError) {\n if (!keyError.propertyErrors) {\n keyError.propertyErrors = []\n }\n\n keyError.propertyErrors.push(\n ...this.mapErrorsFactory(error as ZodError)\n )\n\n return\n }\n\n standardizedErrors.set(error.path[0], {\n location: error.path[0],\n propertyErrors: Array.from([\n ...this.mapErrorsFactory(error as ZodError),\n ]),\n } as CommonError)\n })\n\n return Array.from(standardizedErrors, ([, arr]) => ({\n ...arr,\n })).flat()\n }\n}\n","import { ZodEffects, type ZodError, ZodObject } from 'zod'\n\nimport ValidationError from '../../../../core/errors/validation-error'\nimport IValidationHTTP, { RequestHttp } from '../../../../core/http/validator'\nimport ZodMapError from './zod-map-error'\nimport { zodValidator } from './zod-validator'\n\ntype SchemaDefinition = {\n headers: ZodObject<Record<string, any>>\n params: ZodObject<Record<string, any>>\n query: ZodObject<Record<string, any>>\n body:\n | ZodObject<Record<string, any>>\n | ZodEffects<ZodObject<Record<string, any>>>\n}\n\ntype ZodSchemaObject = ZodObject<SchemaDefinition>\n\nexport default class ZodValidator implements IValidationHTTP {\n constructor(private zodSchema: ZodSchemaObject) {}\n\n async validate<T>(requestHttp: RequestHttp): Promise<T> {\n const errors = []\n\n const {\n data: headersData = {},\n error: headersErrors = {} as ZodError<{ errors: ZodError[] }>,\n } = requestHttp.headers\n ? await this.zodSchema.shape.headers.safeParseAsync(requestHttp.headers, {\n path: ['headers'],\n })\n : {}\n\n if (headersErrors?.errors) {\n errors.push(headersErrors?.errors)\n }\n\n const {\n data: paramsData = {},\n error: paramsErrors = {} as ZodError<{ errors: ZodError[] }>,\n } = requestHttp.params\n ? await this.zodSchema.shape.params.safeParseAsync(requestHttp.params, {\n path: ['params'],\n })\n : {}\n\n if (paramsErrors?.errors) {\n errors.push(paramsErrors?.errors)\n }\n\n const {\n data: queryData = {},\n error: queryErrors = {} as ZodError<{ errors: ZodError[] }>,\n } = requestHttp.query\n ? await this.zodSchema.shape.query.safeParseAsync(requestHttp.query, {\n path: ['query'],\n })\n : {}\n\n if (queryErrors?.errors) {\n errors.push(queryErrors?.errors)\n }\n\n const {\n data: bodyData = {},\n error: bodyErrors = {} as ZodError<{ errors: ZodError[] }>,\n } = requestHttp.body\n ? await this.zodSchema.shape.body.safeParseAsync(requestHttp.body, {\n path: ['body'],\n })\n : {}\n\n if (bodyErrors?.errors) {\n errors.push(bodyErrors?.errors)\n }\n\n if (errors.length) {\n throw new ValidationError(ZodMapError.mapErrors(errors))\n }\n\n return {\n body: bodyData,\n headers: headersData,\n params: paramsData,\n query: queryData,\n } as T\n }\n}\n\nexport { zodValidator }\n","import { z } from 'zod'\n\nimport { Request } from '../../../../core/http/base-controller'\nimport ZodValidator from './index'\n\nexport type ZodSchema = z.ZodObject<{\n headers: z.ZodObject<Record<string, any>>\n params: z.ZodObject<Record<string, any>>\n query: z.ZodObject<Record<string, any>>\n body:\n | z.ZodObject<Record<string, any>>\n | z.ZodEffects<z.ZodObject<Record<string, any>>>\n}>\n\nexport type MiddlewareFunction = (request: Request) => Promise<Request>\n\nexport function zodValidator(schema: ZodSchema): MiddlewareFunction {\n return async (request: Request): Promise<Request> => {\n const validator = new ZodValidator(schema)\n const validatedRequest = await validator.validate<Request>(request)\n return validatedRequest\n }\n}\n","(function () {\n require('./lib/main').config(\n Object.assign(\n {},\n require('./lib/env-options'),\n require('./lib/cli-options')(process.argv)\n )\n )\n})()\n","import 'dotenv/config'\n\nimport { z } from 'zod'\n\nexport const baseEnvSchema = z.object({\n NODE_ENV: z.enum(['test', 'development', 'production']).default('production'),\n ENVIRONMENT: z\n .enum(['test', 'development', 'staging', 'production'])\n .default('development'),\n PORT: z.coerce.number().default(3333),\n SHOULD_NOTIFY_ERROR: z.coerce.boolean().default(true),\n SENTRY_DSN: z.string().optional(),\n DISCORD_WEBHOOK_URL: z.string().optional(),\n})\n"],"mappings":"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","names":["module","module","fs","require","path","os","crypto","packageJson","version","LINE","parse","src","obj","lines","toString","replace","match","exec","key","value","trim","maybeQuote","_parseVault","options","vaultPath","_vaultPath","result","DotenvModule","configDotenv","parsed","err","Error","code","keys","_dotenvKey","split","length","decrypted","i","attrs","_instructions","decrypt","ciphertext","error","_warn","message","console","log","_debug","DOTENV_KEY","process","env","dotenvKey","uri","URL","password","environment","searchParams","get","environmentKey","toUpperCase","possibleVaultPath","Array","isArray","filepath","existsSync","endsWith","resolve","cwd","_resolveHome","envPath","join","homedir","slice","_configVault","debug","Boolean","processEnv","populate","dotenvPath","encoding","optionPaths","push","lastError","parsedAll","readFileSync","e","config","encrypted","keyStr","Buffer","from","nonce","subarray","authTag","aesgcm","createDecipheriv","setAuthTag","update","final","isRange","RangeError","invalidKeyLength","decryptionFailed","override","Object","prototype","hasOwnProperty","call","exports","module","options","process","env","DOTENV_CONFIG_ENCODING","encoding","DOTENV_CONFIG_PATH","path","DOTENV_CONFIG_DEBUG","debug","DOTENV_CONFIG_OVERRIDE","override","DOTENV_CONFIG_DOTENV_KEY","DOTENV_KEY","exports","module","re","exports","optionMatcher","args","reduce","acc","cur","matches","match","import_reflect_metadata","DependencyContainer","registry","Map","singletons","register","token","myClass","options","set","type","singleton","registerValue","value","resolve","target","paramTypes","Reflect","getMetadata","injectMetadata","getOwnMetadata","params","map","_","index","Error","name","resolveToken","registration","get","has","instance","Inject","_propertyKey","parameterIndex","constructor","existingInjectedParams","defineMetadata","ApiErrorEnum","ApplicationError","Error","props","constructor","message","code","errorCode","ApiErrorEnum","APPLICATION","occurredAt","Date","ConflictError","Error","props","conflictProps","constructor","code","errorCode","ApiErrorEnum","APPLICATION","message","occurredAt","Date","DomainError","Error","props","constructor","message","code","errorCode","ApiErrorEnum","DOMAIN","occurredAt","Date","InfraError","Error","props","constructor","message","code","errorCode","ApiErrorEnum","INFRA","occurredAt","Date","ValidationError","Error","props","constructor","errors","code","errorCode","ApiErrorEnum","VALIDATOR","message","occurredAt","Date","BaseController","errorNotifier","constructor","DependencyContainer","resolveToken","success","dto","code","data","noContent","undefined","created","paginated","buildContextError","request","env","process","ENVIRONMENT","body","headers","params","query","failure","error","context","ConflictError","props","message","errorCode","occurredAt","items","Array","isArray","conflictProps","DomainError","ApplicationError","InfraError","ValidationError","errors","SHOULD_NOTIFY_ERROR","notify","execute","routeMetadata","Reflect","getMetadata","middlewares","processedRequest","length","middleware","handle","Controller","method","path","middlewares","target","prototype","BaseController","Error","name","Reflect","defineMetadata","UniqueEntityId","value","constructor","randomUUID","toString","toValue","equals","id","Entity","_id","props","id","createdAt","date","updatedAt","touch","Date","UniqueEntityId","equals","entity","AggregateRoot","Entity","ValueObject","props","WatchedList","currentItems","initial","new","removed","updated","constructor","initialItems","getItems","getNewItems","getRemovedItems","getUpdatedItems","addUpdatedItem","item","push","isCurrentItem","filter","v","compareItems","length","isNewItem","isRemovedItem","removeFromNew","removeFromCurrent","removeFromRemoved","wasAddedInitially","exists","add","remove","update","items","newItems","a","some","b","removedItems","updatedItems","getTakeAndSkip","size","page","take","Number","skip","import_reflect_metadata","import_cors","DiscordNotifier","webhook","constructor","options","Webhook","url","notify","error","context","embed","MessageBuilder","setTitle","addField","message","slice","request","method","JSON","stringify","params","query","headers","body","stack","setFooter","env","setTimestamp","send","NotificationErrorInMemory","errors","notify","error","context","console","log","push","message","SentryNotifier","constructor","options","Sentry","init","dsn","environment","attachStacktrace","tracesSampleRate","maxBreadcrumbs","debug","notify","error","context","withScope","scope","setLevel","env","setTag","user","setUser","id","username","name","email","request","body","query","params","headers","method","url","requestId","setContext","captureException","ZodMapError","mapCommon","error","type","code","path","join","property","pop","propertyType","expected","receivedValue","received","message","mapInvalidUnion","errors","unionErrors","flat","map","err","issues","item","mapInvalidType","mapErrorsFactory","mapErrors","standardizedErrors","Map","forEach","keyError","get","propertyErrors","push","set","location","Array","from","arr","ZodValidator","constructor","zodSchema","validate","requestHttp","errors","data","headersData","error","headersErrors","headers","shape","safeParseAsync","path","push","paramsData","paramsErrors","params","queryData","queryErrors","query","bodyData","bodyErrors","body","length","ValidationError","ZodMapError","mapErrors","zodValidator","schema","request","validator","ZodValidator","validatedRequest","validate","require","config","Object","assign","process","argv","baseEnvSchema","z","object","NODE_ENV","enum","default","ENVIRONMENT","PORT","coerce","number","SHOULD_NOTIFY_ERROR","boolean","SENTRY_DSN","string","optional","DISCORD_WEBHOOK_URL"]}
1
+ {"version":3,"sources":["../node_modules/dotenv/package.json","../node_modules/dotenv/lib/main.js","../node_modules/dotenv/lib/env-options.js","../node_modules/dotenv/lib/cli-options.js","../src/index.ts","../src/core/http/base-controller.ts","../src/core/decorators/dependency-container.ts","../src/core/errors/api-common-error.ts","../src/core/errors/application-error.ts","../src/core/errors/conflict-error.ts","../src/core/errors/domain-error.ts","../src/core/errors/infra-error.ts","../src/core/errors/validation-error.ts","../src/core/decorators/controller-http-decorator.ts","../src/core/entities/unique-entity-id.ts","../src/core/entities/entity.ts","../src/core/entities/aggregate-root.ts","../src/core/entities/value-object.ts","../src/core/entities/watched-list.ts","../src/core/http/get-take-and-skip.ts","../src/infra/adapters/http/express-adapter.ts","../src/infra/adapters/http/validate-controller-metadata.ts","../src/infra/adapters/http/fastify-adapter.ts","../src/infra/adapters/notifications/discord.ts","../src/infra/adapters/notifications/in-memory.ts","../src/infra/adapters/notifications/sentry.ts","../src/infra/adapters/notifications/notification-factory.ts","../src/infra/adapters/validators/zod/zod-map-error.ts","../src/infra/adapters/validators/zod/index.ts","../src/infra/adapters/validators/zod/zod-validator.ts","../node_modules/dotenv/config.js","../src/infra/env/index.ts"],"sourcesContent":["{\n \"name\": \"dotenv\",\n \"version\": \"16.5.0\",\n \"description\": \"Loads environment variables from .env file\",\n \"main\": \"lib/main.js\",\n \"types\": \"lib/main.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./lib/main.d.ts\",\n \"require\": \"./lib/main.js\",\n \"default\": \"./lib/main.js\"\n },\n \"./config\": \"./config.js\",\n \"./config.js\": \"./config.js\",\n \"./lib/env-options\": \"./lib/env-options.js\",\n \"./lib/env-options.js\": \"./lib/env-options.js\",\n \"./lib/cli-options\": \"./lib/cli-options.js\",\n \"./lib/cli-options.js\": \"./lib/cli-options.js\",\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"dts-check\": \"tsc --project tests/types/tsconfig.json\",\n \"lint\": \"standard\",\n \"pretest\": \"npm run lint && npm run dts-check\",\n \"test\": \"tap run --allow-empty-coverage --disable-coverage --timeout=60000\",\n \"test:coverage\": \"tap run --show-full-coverage --timeout=60000 --coverage-report=lcov\",\n \"prerelease\": \"npm test\",\n \"release\": \"standard-version\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git://github.com/motdotla/dotenv.git\"\n },\n \"homepage\": \"https://github.com/motdotla/dotenv#readme\",\n \"funding\": \"https://dotenvx.com\",\n \"keywords\": [\n \"dotenv\",\n \"env\",\n \".env\",\n \"environment\",\n \"variables\",\n \"config\",\n \"settings\"\n ],\n \"readmeFilename\": \"README.md\",\n \"license\": \"BSD-2-Clause\",\n \"devDependencies\": {\n \"@types/node\": \"^18.11.3\",\n \"decache\": \"^4.6.2\",\n \"sinon\": \"^14.0.1\",\n \"standard\": \"^17.0.0\",\n \"standard-version\": \"^9.5.0\",\n \"tap\": \"^19.2.0\",\n \"typescript\": \"^4.8.4\"\n },\n \"engines\": {\n \"node\": \">=12\"\n },\n \"browser\": {\n \"fs\": false\n }\n}\n","const fs = require('fs')\nconst path = require('path')\nconst os = require('os')\nconst crypto = require('crypto')\nconst packageJson = require('../package.json')\n\nconst version = packageJson.version\n\nconst LINE = /(?:^|^)\\s*(?:export\\s+)?([\\w.-]+)(?:\\s*=\\s*?|:\\s+?)(\\s*'(?:\\\\'|[^'])*'|\\s*\"(?:\\\\\"|[^\"])*\"|\\s*`(?:\\\\`|[^`])*`|[^#\\r\\n]+)?\\s*(?:#.*)?(?:$|$)/mg\n\n// Parse src into an Object\nfunction parse (src) {\n const obj = {}\n\n // Convert buffer to string\n let lines = src.toString()\n\n // Convert line breaks to same format\n lines = lines.replace(/\\r\\n?/mg, '\\n')\n\n let match\n while ((match = LINE.exec(lines)) != null) {\n const key = match[1]\n\n // Default undefined or null to empty string\n let value = (match[2] || '')\n\n // Remove whitespace\n value = value.trim()\n\n // Check if double quoted\n const maybeQuote = value[0]\n\n // Remove surrounding quotes\n value = value.replace(/^(['\"`])([\\s\\S]*)\\1$/mg, '$2')\n\n // Expand newlines if double quoted\n if (maybeQuote === '\"') {\n value = value.replace(/\\\\n/g, '\\n')\n value = value.replace(/\\\\r/g, '\\r')\n }\n\n // Add to object\n obj[key] = value\n }\n\n return obj\n}\n\nfunction _parseVault (options) {\n const vaultPath = _vaultPath(options)\n\n // Parse .env.vault\n const result = DotenvModule.configDotenv({ path: vaultPath })\n if (!result.parsed) {\n const err = new Error(`MISSING_DATA: Cannot parse ${vaultPath} for an unknown reason`)\n err.code = 'MISSING_DATA'\n throw err\n }\n\n // handle scenario for comma separated keys - for use with key rotation\n // example: DOTENV_KEY=\"dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=prod,dotenv://:key_7890@dotenvx.com/vault/.env.vault?environment=prod\"\n const keys = _dotenvKey(options).split(',')\n const length = keys.length\n\n let decrypted\n for (let i = 0; i < length; i++) {\n try {\n // Get full key\n const key = keys[i].trim()\n\n // Get instructions for decrypt\n const attrs = _instructions(result, key)\n\n // Decrypt\n decrypted = DotenvModule.decrypt(attrs.ciphertext, attrs.key)\n\n break\n } catch (error) {\n // last key\n if (i + 1 >= length) {\n throw error\n }\n // try next key\n }\n }\n\n // Parse decrypted .env string\n return DotenvModule.parse(decrypted)\n}\n\nfunction _warn (message) {\n console.log(`[dotenv@${version}][WARN] ${message}`)\n}\n\nfunction _debug (message) {\n console.log(`[dotenv@${version}][DEBUG] ${message}`)\n}\n\nfunction _dotenvKey (options) {\n // prioritize developer directly setting options.DOTENV_KEY\n if (options && options.DOTENV_KEY && options.DOTENV_KEY.length > 0) {\n return options.DOTENV_KEY\n }\n\n // secondary infra already contains a DOTENV_KEY environment variable\n if (process.env.DOTENV_KEY && process.env.DOTENV_KEY.length > 0) {\n return process.env.DOTENV_KEY\n }\n\n // fallback to empty string\n return ''\n}\n\nfunction _instructions (result, dotenvKey) {\n // Parse DOTENV_KEY. Format is a URI\n let uri\n try {\n uri = new URL(dotenvKey)\n } catch (error) {\n if (error.code === 'ERR_INVALID_URL') {\n const err = new Error('INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=development')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n }\n\n throw error\n }\n\n // Get decrypt key\n const key = uri.password\n if (!key) {\n const err = new Error('INVALID_DOTENV_KEY: Missing key part')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n }\n\n // Get environment\n const environment = uri.searchParams.get('environment')\n if (!environment) {\n const err = new Error('INVALID_DOTENV_KEY: Missing environment part')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n }\n\n // Get ciphertext payload\n const environmentKey = `DOTENV_VAULT_${environment.toUpperCase()}`\n const ciphertext = result.parsed[environmentKey] // DOTENV_VAULT_PRODUCTION\n if (!ciphertext) {\n const err = new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${environmentKey} in your .env.vault file.`)\n err.code = 'NOT_FOUND_DOTENV_ENVIRONMENT'\n throw err\n }\n\n return { ciphertext, key }\n}\n\nfunction _vaultPath (options) {\n let possibleVaultPath = null\n\n if (options && options.path && options.path.length > 0) {\n if (Array.isArray(options.path)) {\n for (const filepath of options.path) {\n if (fs.existsSync(filepath)) {\n possibleVaultPath = filepath.endsWith('.vault') ? filepath : `${filepath}.vault`\n }\n }\n } else {\n possibleVaultPath = options.path.endsWith('.vault') ? options.path : `${options.path}.vault`\n }\n } else {\n possibleVaultPath = path.resolve(process.cwd(), '.env.vault')\n }\n\n if (fs.existsSync(possibleVaultPath)) {\n return possibleVaultPath\n }\n\n return null\n}\n\nfunction _resolveHome (envPath) {\n return envPath[0] === '~' ? path.join(os.homedir(), envPath.slice(1)) : envPath\n}\n\nfunction _configVault (options) {\n const debug = Boolean(options && options.debug)\n if (debug) {\n _debug('Loading env from encrypted .env.vault')\n }\n\n const parsed = DotenvModule._parseVault(options)\n\n let processEnv = process.env\n if (options && options.processEnv != null) {\n processEnv = options.processEnv\n }\n\n DotenvModule.populate(processEnv, parsed, options)\n\n return { parsed }\n}\n\nfunction configDotenv (options) {\n const dotenvPath = path.resolve(process.cwd(), '.env')\n let encoding = 'utf8'\n const debug = Boolean(options && options.debug)\n\n if (options && options.encoding) {\n encoding = options.encoding\n } else {\n if (debug) {\n _debug('No encoding is specified. UTF-8 is used by default')\n }\n }\n\n let optionPaths = [dotenvPath] // default, look for .env\n if (options && options.path) {\n if (!Array.isArray(options.path)) {\n optionPaths = [_resolveHome(options.path)]\n } else {\n optionPaths = [] // reset default\n for (const filepath of options.path) {\n optionPaths.push(_resolveHome(filepath))\n }\n }\n }\n\n // Build the parsed data in a temporary object (because we need to return it). Once we have the final\n // parsed data, we will combine it with process.env (or options.processEnv if provided).\n let lastError\n const parsedAll = {}\n for (const path of optionPaths) {\n try {\n // Specifying an encoding returns a string instead of a buffer\n const parsed = DotenvModule.parse(fs.readFileSync(path, { encoding }))\n\n DotenvModule.populate(parsedAll, parsed, options)\n } catch (e) {\n if (debug) {\n _debug(`Failed to load ${path} ${e.message}`)\n }\n lastError = e\n }\n }\n\n let processEnv = process.env\n if (options && options.processEnv != null) {\n processEnv = options.processEnv\n }\n\n DotenvModule.populate(processEnv, parsedAll, options)\n\n if (lastError) {\n return { parsed: parsedAll, error: lastError }\n } else {\n return { parsed: parsedAll }\n }\n}\n\n// Populates process.env from .env file\nfunction config (options) {\n // fallback to original dotenv if DOTENV_KEY is not set\n if (_dotenvKey(options).length === 0) {\n return DotenvModule.configDotenv(options)\n }\n\n const vaultPath = _vaultPath(options)\n\n // dotenvKey exists but .env.vault file does not exist\n if (!vaultPath) {\n _warn(`You set DOTENV_KEY but you are missing a .env.vault file at ${vaultPath}. Did you forget to build it?`)\n\n return DotenvModule.configDotenv(options)\n }\n\n return DotenvModule._configVault(options)\n}\n\nfunction decrypt (encrypted, keyStr) {\n const key = Buffer.from(keyStr.slice(-64), 'hex')\n let ciphertext = Buffer.from(encrypted, 'base64')\n\n const nonce = ciphertext.subarray(0, 12)\n const authTag = ciphertext.subarray(-16)\n ciphertext = ciphertext.subarray(12, -16)\n\n try {\n const aesgcm = crypto.createDecipheriv('aes-256-gcm', key, nonce)\n aesgcm.setAuthTag(authTag)\n return `${aesgcm.update(ciphertext)}${aesgcm.final()}`\n } catch (error) {\n const isRange = error instanceof RangeError\n const invalidKeyLength = error.message === 'Invalid key length'\n const decryptionFailed = error.message === 'Unsupported state or unable to authenticate data'\n\n if (isRange || invalidKeyLength) {\n const err = new Error('INVALID_DOTENV_KEY: It must be 64 characters long (or more)')\n err.code = 'INVALID_DOTENV_KEY'\n throw err\n } else if (decryptionFailed) {\n const err = new Error('DECRYPTION_FAILED: Please check your DOTENV_KEY')\n err.code = 'DECRYPTION_FAILED'\n throw err\n } else {\n throw error\n }\n }\n}\n\n// Populate process.env with parsed values\nfunction populate (processEnv, parsed, options = {}) {\n const debug = Boolean(options && options.debug)\n const override = Boolean(options && options.override)\n\n if (typeof parsed !== 'object') {\n const err = new Error('OBJECT_REQUIRED: Please check the processEnv argument being passed to populate')\n err.code = 'OBJECT_REQUIRED'\n throw err\n }\n\n // Set process.env\n for (const key of Object.keys(parsed)) {\n if (Object.prototype.hasOwnProperty.call(processEnv, key)) {\n if (override === true) {\n processEnv[key] = parsed[key]\n }\n\n if (debug) {\n if (override === true) {\n _debug(`\"${key}\" is already defined and WAS overwritten`)\n } else {\n _debug(`\"${key}\" is already defined and was NOT overwritten`)\n }\n }\n } else {\n processEnv[key] = parsed[key]\n }\n }\n}\n\nconst DotenvModule = {\n configDotenv,\n _configVault,\n _parseVault,\n config,\n decrypt,\n parse,\n populate\n}\n\nmodule.exports.configDotenv = DotenvModule.configDotenv\nmodule.exports._configVault = DotenvModule._configVault\nmodule.exports._parseVault = DotenvModule._parseVault\nmodule.exports.config = DotenvModule.config\nmodule.exports.decrypt = DotenvModule.decrypt\nmodule.exports.parse = DotenvModule.parse\nmodule.exports.populate = DotenvModule.populate\n\nmodule.exports = DotenvModule\n","// ../config.js accepts options via environment variables\nconst options = {}\n\nif (process.env.DOTENV_CONFIG_ENCODING != null) {\n options.encoding = process.env.DOTENV_CONFIG_ENCODING\n}\n\nif (process.env.DOTENV_CONFIG_PATH != null) {\n options.path = process.env.DOTENV_CONFIG_PATH\n}\n\nif (process.env.DOTENV_CONFIG_DEBUG != null) {\n options.debug = process.env.DOTENV_CONFIG_DEBUG\n}\n\nif (process.env.DOTENV_CONFIG_OVERRIDE != null) {\n options.override = process.env.DOTENV_CONFIG_OVERRIDE\n}\n\nif (process.env.DOTENV_CONFIG_DOTENV_KEY != null) {\n options.DOTENV_KEY = process.env.DOTENV_CONFIG_DOTENV_KEY\n}\n\nmodule.exports = options\n","const re = /^dotenv_config_(encoding|path|debug|override|DOTENV_KEY)=(.+)$/\n\nmodule.exports = function optionMatcher (args) {\n return args.reduce(function (acc, cur) {\n const matches = cur.match(re)\n if (matches) {\n acc[matches[1]] = matches[2]\n }\n return acc\n }, {})\n}\n","// core decorators\nexport * from './core/decorators/controller-http-decorator'\nexport * from './core/decorators/dependency-container'\n\n// core entities\nexport * from './core/entities/aggregate-root'\nexport * from './core/entities/common-dto'\nexport * from './core/entities/domain-event'\nexport * from './core/entities/entity'\nexport * from './core/entities/optional'\nexport * from './core/entities/unique-entity-id'\nexport * from './core/entities/value-object'\nexport * from './core/entities/watched-list'\n\n// core errors\nexport * from './core/errors/application-error'\nexport * from './core/errors/conflict-error'\nexport * from './core/errors/domain-error'\nexport * from './core/errors/http-client-error'\nexport * from './core/errors/infra-error'\n\n// core http\nexport * from './core/http/base-controller'\nexport * from './core/http/dto-response'\nexport * from './core/http/error-notifier'\nexport * from './core/http/get-take-and-skip'\nexport * from './core/http/health-connections'\nexport * from './core/http/pagination'\nexport * from './core/http/validator'\n\n// infra adapters http\nexport * from './infra/adapters/http/express-adapter'\nexport * from './infra/adapters/http/fastify-adapter'\n\n// infra adapters notifications\nexport * from './infra/adapters/notifications/discord'\nexport * from './infra/adapters/notifications/in-memory'\nexport * from './infra/adapters/notifications/notification-factory'\nexport * from './infra/adapters/notifications/sentry'\n\n// infra adapters validations\nexport * from './infra/adapters/validators/zod/zod-validator'\n\n// infra common env\nexport * from './infra/env'\n","import 'reflect-metadata'\n\nimport { DependencyContainer } from '../../core/decorators/dependency-container'\nimport ApplicationError from '../../core/errors/application-error'\nimport ConflictError from '../../core/errors/conflict-error'\nimport DomainError from '../../core/errors/domain-error'\nimport InfraError from '../../core/errors/infra-error'\nimport ValidationError from '../../core/errors/validation-error'\nimport { MiddlewareFunction } from '../../infra/adapters/validators/zod/zod-validator'\nimport { IErrorNotifier } from './error-notifier'\n\ntype AnyObject = Record<string, any>\n\nexport type Request = {\n body: AnyObject\n params: AnyObject\n headers: AnyObject\n query: AnyObject\n}\n\nexport type Response = {\n code: number\n data: any\n}\n\nexport type ContextError = {\n env: string\n user?: {\n id?: string\n name?: string\n email?: string\n }\n request?: {\n method?: string\n requestId?: string\n url?: string\n headers?: any\n query?: any\n body?: any\n params?: any\n }\n}\n\nexport abstract class BaseController {\n protected readonly errorNotifier: IErrorNotifier\n\n abstract handle<T>(request: T | Request): Promise<Response>\n\n constructor() {\n this.errorNotifier = DependencyContainer.resolveToken('IErrorNotifier')\n }\n\n protected success<T>(dto?: T): Response {\n return {\n code: 200,\n data: { data: dto },\n }\n }\n\n protected noContent(): Response {\n return {\n code: 204,\n data: undefined,\n }\n }\n\n protected created<T>(dto?: T): Response {\n return {\n code: 201,\n data: dto ? { data: dto } : undefined,\n }\n }\n\n protected paginated<T>(dto?: T): Response {\n return {\n code: 200,\n data: dto,\n }\n }\n\n protected buildContextError(request: Request): ContextError {\n return {\n env: process.env.ENVIRONMENT as string,\n request: {\n body: request.body,\n headers: request.headers,\n params: request.params,\n query: request.query,\n },\n }\n }\n\n public async failure(error: Error, context: ContextError): Promise<Response> {\n if (error instanceof ConflictError) {\n return {\n code: error.props.code,\n data: {\n message: error.message,\n errorCode: error.props.errorCode,\n occurredAt: error.props.occurredAt,\n items: Array.isArray(error.conflictProps)\n ? error.conflictProps\n : [error.conflictProps],\n },\n }\n }\n\n if (\n error instanceof DomainError ||\n error instanceof ApplicationError ||\n error instanceof InfraError\n ) {\n return {\n code: error.props.code,\n data: {\n message: error.message,\n errorCode: error.props.errorCode,\n occurredAt: error.props.occurredAt,\n },\n }\n }\n\n if (error instanceof ValidationError) {\n return {\n code: error.props.code,\n data: {\n message: error.props.message,\n errorCode: error.props.errorCode,\n occurredAt: error.props.occurredAt,\n errors: error.props.errors,\n },\n }\n }\n\n if (process.env.SHOULD_NOTIFY_ERROR) {\n await this.errorNotifier.notify(error, context)\n }\n\n return {\n code: 500,\n data: {\n code: 500,\n message: 'Server failed. Contact the administrator!',\n },\n }\n }\n\n public async execute(request: Request): Promise<Response> {\n const routeMetadata = Reflect.getMetadata('route', this.constructor)\n\n if (!routeMetadata) {\n throw new InfraError('Route metadata not found.')\n }\n\n const middlewares: MiddlewareFunction[] = routeMetadata.middlewares || []\n\n let processedRequest = request\n\n if (middlewares.length) {\n for (const middleware of middlewares) {\n processedRequest = await middleware(processedRequest)\n }\n }\n\n return await this.handle(processedRequest)\n }\n}\n","import 'reflect-metadata'\n\ntype Class<T = any> = new (...args: any[]) => T\n\ntype Registration =\n | { type: 'class'; myClass: Class; singleton: boolean }\n | { type: 'value'; value: any }\n\nexport class DependencyContainer {\n static registry = new Map<string, Registration>()\n static singletons = new Map<string, any>()\n\n static register<T>(\n token: string,\n myClass: Class<T>,\n options: { singleton: boolean }\n ) {\n this.registry.set(token, {\n type: 'class',\n myClass,\n singleton: options.singleton,\n })\n }\n\n static registerValue<T>(token: string, value: T) {\n this.registry.set(token, { type: 'value', value })\n }\n\n static resolve<T>(target: Class<T>): T {\n const paramTypes = Reflect.getMetadata('design:paramtypes', target) || []\n\n const injectMetadata: Record<number, string> =\n Reflect.getOwnMetadata('inject:params', target) || {}\n\n const params = paramTypes.map((_: any, index: number) => {\n const token = injectMetadata[index]\n\n if (!token) {\n throw new Error(\n `Missing @Inject token for parameter index ${index} in ${target.name}`\n )\n }\n\n return this.resolveToken(token)\n })\n\n return new target(...params)\n }\n\n static resolveToken(token: string): any {\n const registration = this.registry.get(token)\n\n if (!registration) {\n throw new Error(\n `\"${token}\" not registered. Please register it in the container.`\n )\n }\n\n if (registration.type === 'value') {\n return registration.value\n }\n\n const { myClass, singleton } = registration\n\n if (singleton) {\n if (!this.singletons.has(token)) {\n const instance = this.resolve(myClass)\n this.singletons.set(token, instance)\n }\n return this.singletons.get(token)\n }\n\n return this.resolve(myClass)\n }\n}\n\nexport function Inject(token: string): ParameterDecorator {\n return (\n target: object,\n _propertyKey: string | symbol | undefined,\n parameterIndex: number\n ): void => {\n const constructor =\n typeof target === 'function' ? target : target.constructor\n\n const existingInjectedParams: Record<number, string> =\n Reflect.getOwnMetadata('inject:params', constructor) || {}\n\n existingInjectedParams[parameterIndex] = token\n\n Reflect.defineMetadata('inject:params', existingInjectedParams, constructor)\n }\n}\n","export type PropertiesError = {\n receivedValue?: any\n type: string\n message: string\n property: string | number | undefined\n propertyType?: string\n path?: string\n}\n\nexport type CommonError = {\n location: string\n propertyErrors?: PropertiesError[]\n}\n\nexport type ApiCommonError = {\n code: number\n occurredAt: Date\n message: string\n errorCode: string\n errors?: CommonError[]\n}\n\nexport enum ApiErrorEnum {\n DOMAIN = 'ERR001',\n APPLICATION = 'ERR002',\n INFRA = 'ERR003',\n HTTP_CLIENT = 'ERR004',\n VALIDATOR = 'ERR005',\n}\n","import { type ApiCommonError, ApiErrorEnum } from './api-common-error'\n\nexport default class ApplicationError extends Error {\n props: ApiCommonError\n\n constructor(message: string) {\n super(message)\n this.props = {\n code: 400,\n errorCode: ApiErrorEnum.APPLICATION,\n message,\n occurredAt: new Date(),\n }\n }\n}\n","import { type ApiCommonError, ApiErrorEnum } from './api-common-error'\n\ntype ConflictProps = { id: string; [key: string]: unknown }\n\nexport default class ConflictError<T extends ConflictProps> extends Error {\n props: ApiCommonError\n conflictProps: T | T[]\n\n constructor(conflictProps: T | T[]) {\n super('Resource already exists.')\n this.conflictProps = conflictProps\n this.props = {\n code: 409,\n errorCode: ApiErrorEnum.APPLICATION,\n message: this.message,\n occurredAt: new Date(),\n }\n }\n}\n","import { type ApiCommonError, ApiErrorEnum } from './api-common-error'\n\nexport default class DomainError extends Error {\n props: ApiCommonError\n\n constructor(message: string) {\n super(message)\n this.props = {\n code: 400,\n errorCode: ApiErrorEnum.DOMAIN,\n message,\n occurredAt: new Date(),\n }\n }\n}\n","import { type ApiCommonError, ApiErrorEnum } from './api-common-error'\n\nexport default class InfraError extends Error {\n props: ApiCommonError\n\n constructor(message: string) {\n super(message)\n this.props = {\n code: 400,\n errorCode: ApiErrorEnum.INFRA,\n message,\n occurredAt: new Date(),\n }\n }\n}\n","import {\n type ApiCommonError,\n ApiErrorEnum,\n type CommonError,\n} from './api-common-error'\n\nexport default class ValidationError extends Error {\n props: ApiCommonError\n\n constructor(errors: CommonError[]) {\n super('Validation Error')\n this.props = {\n code: 400,\n errorCode: ApiErrorEnum.VALIDATOR,\n message: 'Validation Error',\n occurredAt: new Date(),\n errors,\n }\n }\n}\n","import { MiddlewareFunction } from '../../infra/adapters/validators/zod/zod-validator'\nimport { BaseController } from '../http/base-controller'\nimport type { MethodType } from '../http/http'\n\ntype Props = {\n method: MethodType\n path: string\n middlewares?: MiddlewareFunction[]\n}\n\nexport function Controller({\n method,\n path,\n middlewares = [],\n}: Props): ClassDecorator {\n return (target: any) => {\n if (!(target.prototype instanceof BaseController)) {\n throw new Error(\n `The class ${target.name} should extends abstract class BaseController`\n )\n }\n\n Reflect.defineMetadata(\n 'route',\n { method, path: `/api/${path}`, middlewares },\n target\n )\n }\n}\n","import { randomUUID } from 'node:crypto'\n\nexport class UniqueEntityId {\n private value: string\n\n constructor(value?: string) {\n this.value = value ?? randomUUID()\n }\n\n toString() {\n return this.value\n }\n\n toValue() {\n return this.value\n }\n\n public equals(id: UniqueEntityId) {\n return id.toValue() === this.toValue()\n }\n}\n","import { CommonDTO } from './common-dto'\nimport { UniqueEntityId } from './unique-entity-id'\n\ntype PropsWithCommonDTO<Props> = Props & CommonDTO\n\nexport abstract class Entity<Props> {\n private _id: UniqueEntityId\n protected props: PropsWithCommonDTO<Props>\n\n get id() {\n return this._id\n }\n\n set id(id: UniqueEntityId) {\n this._id = id\n }\n\n get createdAt() {\n return this.props.createdAt\n }\n\n set createdAt(date: Date) {\n this.props.createdAt = date\n }\n\n get updatedAt(): Date | undefined | null {\n return this.props.updatedAt\n }\n\n public touch() {\n this.props.updatedAt = new Date()\n }\n\n protected constructor(props: PropsWithCommonDTO<Props>, id?: UniqueEntityId) {\n this._id = id ?? new UniqueEntityId(id)\n this.props = props\n }\n\n public equals(entity: Entity<any>) {\n if (entity === this) {\n return true\n }\n\n if (entity.id === this._id) {\n return true\n }\n\n return false\n }\n}\n","import { Entity } from './entity'\n\nexport abstract class AggregateRoot<Props> extends Entity<Props> {}\n","export abstract class ValueObject<Props> {\n protected props: Props\n\n protected constructor(props: Props) {\n this.props = props\n }\n}\n","export abstract class WatchedList<T> {\n public currentItems: T[]\n private initial: T[]\n private new: T[]\n private removed: T[]\n private updated: T[]\n\n constructor(initialItems?: T[]) {\n this.currentItems = initialItems || []\n this.initial = initialItems || []\n this.new = []\n this.removed = []\n this.updated = []\n }\n\n abstract compareItems(a: T, b: T): boolean\n\n public getItems(): T[] {\n return this.currentItems\n }\n\n public getNewItems(): T[] {\n return this.new\n }\n\n public getRemovedItems(): T[] {\n return this.removed\n }\n\n public getUpdatedItems(): T[] {\n return this.updated\n }\n\n public addUpdatedItem(item: T) {\n return this.updated.push(item)\n }\n\n private isCurrentItem(item: T): boolean {\n return (\n this.currentItems.filter((v: T) => this.compareItems(item, v)).length !==\n 0\n )\n }\n\n private isNewItem(item: T): boolean {\n return this.new.filter((v: T) => this.compareItems(item, v)).length !== 0\n }\n\n private isRemovedItem(item: T): boolean {\n return (\n this.removed.filter((v: T) => this.compareItems(item, v)).length !== 0\n )\n }\n\n private removeFromNew(item: T): void {\n this.new = this.new.filter((v) => !this.compareItems(v, item))\n }\n\n private removeFromCurrent(item: T): void {\n this.currentItems = this.currentItems.filter(\n (v) => !this.compareItems(item, v)\n )\n }\n\n private removeFromRemoved(item: T): void {\n this.removed = this.removed.filter((v) => !this.compareItems(item, v))\n }\n\n private wasAddedInitially(item: T): boolean {\n return (\n this.initial.filter((v: T) => this.compareItems(item, v)).length !== 0\n )\n }\n\n public exists(item: T): boolean {\n return this.isCurrentItem(item)\n }\n\n public add(item: T): void {\n if (this.isRemovedItem(item)) {\n this.removeFromRemoved(item)\n }\n\n if (!this.isNewItem(item) && !this.wasAddedInitially(item)) {\n this.new.push(item)\n }\n\n if (!this.isCurrentItem(item)) {\n this.currentItems.push(item)\n }\n }\n\n public remove(item: T): void {\n this.removeFromCurrent(item)\n\n if (this.isNewItem(item)) {\n this.removeFromNew(item)\n\n return\n }\n\n if (!this.isRemovedItem(item)) {\n this.removed.push(item)\n }\n }\n\n public update(items: T[]): void {\n const newItems = items.filter((a) => {\n return !this.getItems().some((b) => this.compareItems(a, b))\n })\n\n const removedItems = this.getItems().filter((a) => {\n return !items.some((b) => this.compareItems(a, b))\n })\n\n const updatedItems = items.filter(\n (item) =>\n !newItems.some(\n (a) =>\n this.compareItems(item, a) &&\n !removedItems.some((b) => this.compareItems(item, b))\n )\n )\n\n this.currentItems = items\n this.new = newItems\n this.removed = removedItems\n this.updated = updatedItems\n }\n}\n","export function getTakeAndSkip(size: string, page: string) {\n const take = size ? Number(size) : 20\n const skip = page ? Number(page) : 1\n\n return { take, skip }\n}\n","import cors from 'cors'\nimport express, { Express, Request, Response } from 'express'\n\nimport type { BaseController } from '../../../core/http/base-controller'\nimport type IHttp from '../../../core/http/http'\nimport { ErrorResponseCode } from './response-error-code'\nimport { validateControllerMetadata } from './validate-controller-metadata'\n\nexport default class ExpressAdapter implements IHttp {\n readonly instance: Express\n private server: any\n\n constructor(readonly env: Record<string, any>) {\n this.instance = express()\n this.instance.use(cors())\n this.instance.use(express.json({ limit: '10mb' }))\n this.instance.use(express.urlencoded({ limit: '10mb', extended: false }))\n this.instance.disable('x-powered-by')\n }\n\n registerRoute(controllerClass: BaseController): void {\n const { metadata } = validateControllerMetadata(controllerClass)\n\n this.instance[metadata.method](\n metadata.path,\n async (request: Request, response: Response) => {\n const requestData = {\n body: request.body,\n params: request.params,\n headers: request.headers,\n query: request.query,\n }\n\n try {\n const output = await controllerClass.execute(requestData)\n response\n .status(output.code || 204)\n .json(output.data || { code: ErrorResponseCode.NO_CONTENT_BODY })\n } catch (err: any) {\n const error = await controllerClass.failure(err, {\n env: this.env.ENVIRONMENT,\n request: {\n body: requestData.body,\n headers: requestData.headers,\n params: request.params,\n query: requestData.query,\n url: metadata.path,\n method: metadata.method,\n },\n })\n response.status(error.code).json(\n error.data || {\n error: ErrorResponseCode.NO_CONTENT_ERROR,\n }\n )\n }\n }\n )\n }\n\n async startServer(port: number): Promise<void> {\n return new Promise((resolve) => {\n this.server = this.instance.listen(port, () => {\n console.log(`🚀 Server is running on PORT ${port}`)\n resolve()\n })\n })\n }\n\n async closeServer(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (this.server) {\n this.server.close((err: any) => {\n if (err) return reject(err)\n resolve()\n })\n } else {\n resolve()\n }\n })\n }\n}\n","import 'reflect-metadata'\n\nimport { BaseController } from '../../../core/http/base-controller'\nimport type { MethodType } from '../../../core/http/http'\n\nexport function validateControllerMetadata(controller: BaseController) {\n const metadata = Reflect.getMetadata('route', controller.constructor) as {\n method: MethodType\n path: string\n }\n\n if (!metadata) {\n throw new Error(\n `Controller ${controller.constructor.name} not have metadata. Need to add decorator.`\n )\n }\n\n return {\n metadata,\n }\n}\n","import cors from '@fastify/cors'\nimport type IHttp from 'core/http/http'\nimport fastify, { FastifyInstance, FastifyReply, FastifyRequest } from 'fastify'\nimport qs from 'qs'\n\nimport { BaseController, Request } from '../../../core/http/base-controller'\nimport { ErrorResponseCode } from './response-error-code'\nimport { validateControllerMetadata } from './validate-controller-metadata'\n\nexport default class FastifyAdapter implements IHttp {\n readonly instance: FastifyInstance\n\n constructor(readonly env: Record<string, any>) {\n this.instance = fastify({\n bodyLimit: 10 * 1024 * 1024,\n querystringParser: (str) => qs.parse(str),\n })\n\n this.instance.register(cors)\n }\n\n registerRoute(controllerClass: BaseController): void {\n const { metadata } = validateControllerMetadata(controllerClass)\n\n this.instance[metadata.method](\n metadata.path,\n async (request: FastifyRequest, reply: FastifyReply) => {\n const requestData = {\n body: request.body,\n params: request.params,\n headers: request.headers,\n query: request.query,\n } as Request\n\n try {\n const output = await controllerClass.execute(requestData)\n return reply.status(output.code || 200).send(\n output.data || {\n code: ErrorResponseCode.NO_CONTENT_BODY,\n }\n )\n } catch (err: any) {\n const error = await controllerClass.failure(err, {\n env: this.env.ENVIRONMENT,\n request: {\n body: requestData.body,\n headers: requestData.headers,\n params: request.params,\n query: requestData.query,\n url: metadata.path,\n method: metadata.method,\n },\n })\n return reply.status(error.code || 200).send(\n error.data || {\n code: ErrorResponseCode.NO_CONTENT_ERROR,\n }\n )\n }\n }\n )\n }\n\n async startServer(port: number): Promise<void> {\n await this.instance.listen({ port })\n\n if (this.env.NODE_ENV !== 'test') {\n console.log(`🚀 Server is running on PORT ${port}`)\n }\n }\n\n async closeServer() {\n await this.instance.close()\n }\n}\n","import { Inject } from 'core/decorators/dependency-container'\nimport { MessageBuilder, Webhook } from 'discord-webhook-node'\n\nimport type { ContextError } from '../../../core/http/base-controller'\nimport type { IErrorNotifier } from '../../../core/http/error-notifier'\n\ntype DiscordOptions = {\n url: string\n env: string\n}\n\nexport class DiscordNotifier implements IErrorNotifier {\n private webhook: Webhook\n\n constructor(\n @Inject('DiscordConfig') private readonly options: DiscordOptions\n ) {\n this.webhook = new Webhook(this.options.url)\n }\n\n async notify(error: Error, context: ContextError): Promise<void> {\n const embed = new MessageBuilder()\n .setTitle('🚨 Error')\n .addField('Message', `\\`\\`\\`${error.message.slice(0, 300)}\\`\\`\\``)\n .addField(\n 'Route:',\n `\\`[${context?.request?.method}] ${context?.request?.url}\\``,\n true\n )\n .addField(\n 'Params:',\n '```json\\n' +\n JSON.stringify(context?.request?.params, null, 2) +\n '\\n```',\n true\n )\n .addField(\n 'Query:',\n '```json\\n' +\n JSON.stringify(context?.request?.query, null, 2) +\n '\\n```',\n true\n )\n .addField(\n 'Headers:',\n '```json\\n' +\n JSON.stringify(context?.request?.headers, null, 2) +\n '\\n```',\n true\n )\n .addField(\n 'Body:',\n '```json\\n' + JSON.stringify(context?.request?.body, null, 2) + '\\n```'\n )\n .addField(\n 'Stack Trace:',\n '```' + (error.stack || 'No stack provided').slice(0, 900) + '```'\n )\n .setFooter(`Env: ${this.options.env || 'development'}`)\n .setTimestamp()\n\n await this.webhook.send(embed)\n }\n}\n","import type { ContextError } from '../../../core/http/base-controller'\nimport type { IErrorNotifier } from '../../../core/http/error-notifier'\n\nexport class NotificationErrorInMemory implements IErrorNotifier {\n public errors: any[] = []\n\n async notify(error: Error, context?: ContextError): Promise<void> {\n console.log('NOTIFICATION ERROR: ', error)\n\n this.errors.push({\n error: error.message,\n context,\n })\n }\n}\n","import * as Sentry from '@sentry/node'\nimport type { ContextError } from 'core/http/base-controller'\n\nimport { Inject } from '../../../core/decorators/dependency-container'\nimport { IErrorNotifier } from '../../../core/http/error-notifier'\n\ntype SentryOptions = {\n dsn: string\n environment: string\n}\n\nexport class SentryNotifier implements IErrorNotifier {\n constructor(@Inject('SentryConfig') private readonly options: SentryOptions) {\n Sentry.init({\n dsn: this.options.dsn,\n environment: this.options.environment,\n attachStacktrace: true,\n tracesSampleRate: this.options.environment === 'production' ? 0.1 : 1.0,\n maxBreadcrumbs: 100,\n debug: this.options.environment !== 'production',\n })\n }\n\n async notify(error: Error, context: ContextError): Promise<void> {\n Sentry.withScope((scope) => {\n scope.setLevel('error')\n\n if (context?.env) scope.setTag('env', context.env)\n\n if (context?.user) {\n scope.setUser({\n id: context.user.id,\n username: context.user.name,\n email: context.user.email,\n })\n }\n\n if (context?.request) {\n const { body, query, params, headers, method, url, requestId } =\n context.request\n\n scope.setContext('http', {\n method,\n requestId,\n url,\n headers,\n query,\n body,\n params,\n })\n }\n\n Sentry.captureException(error)\n })\n }\n}\n","import type { z } from 'zod'\n\nimport type { baseEnvSchema } from '../../env'\nimport { DiscordNotifier } from './discord'\nimport { NotificationErrorInMemory } from './in-memory'\nimport { SentryNotifier } from './sentry'\n\ntype OptionsNotifications = 'console' | 'discord' | 'sentry'\ntype EnvironmentEnum = z.infer<typeof baseEnvSchema>['ENVIRONMENT']\n\ntype Props = {\n local?: OptionsNotifications\n test?: OptionsNotifications\n development?: OptionsNotifications\n staging?: OptionsNotifications\n production?: OptionsNotifications\n}\n\nexport class NotificationFactory {\n static define(env: EnvironmentEnum, definitions?: Props): any {\n const defaultDefinition = {\n test: this.defineProvider(definitions?.local ?? 'console'),\n development: this.defineProvider(definitions?.local ?? 'console'),\n staging: this.defineProvider(definitions?.local ?? 'discord'),\n production: this.defineProvider(definitions?.local ?? 'sentry'),\n }\n\n return defaultDefinition[env]\n }\n\n private static defineProvider(provider: OptionsNotifications) {\n switch (provider) {\n case 'console':\n return NotificationErrorInMemory\n case 'discord':\n return DiscordNotifier\n case 'sentry':\n return SentryNotifier\n default:\n return NotificationErrorInMemory\n }\n }\n}\n","import type { ZodIssue } from 'zod'\n\nimport type {\n CommonError,\n PropertiesError,\n} from '../../../../core/errors/api-common-error'\n\ntype ZodError = ZodIssue & {\n expected: string\n received: string\n}\n\ntype ZodInvalidUnion = ZodError & {\n code: 'invalid_union'\n}\n\nexport default class ZodMapError {\n private static mapCommon(error: ZodError): PropertiesError {\n return {\n type: error.code,\n path: error.path.join('.'),\n property: error.path.pop(),\n propertyType: error.expected,\n receivedValue: error.received,\n message: error.message,\n }\n }\n\n private static mapInvalidUnion(error: ZodInvalidUnion): PropertiesError[] {\n const [errors] = error.unionErrors\n .flat()\n .map((err) => err.issues.map((item: any) => this.mapCommon(item)))\n\n return errors\n }\n\n private static mapInvalidType(error: ZodError): PropertiesError[] {\n return [this.mapCommon(error)]\n }\n\n private static mapErrorsFactory(error: ZodError): PropertiesError[] {\n if (error.code === 'invalid_union') {\n return this.mapInvalidUnion(error)\n }\n\n return this.mapInvalidType(error)\n }\n\n static mapErrors(errors: ZodIssue[][]) {\n const standardizedErrors = new Map<string | number, CommonError>()\n\n errors.flat().forEach((error) => {\n const keyError = standardizedErrors.get(error.path[0])\n\n if (keyError) {\n if (!keyError.propertyErrors) {\n keyError.propertyErrors = []\n }\n\n keyError.propertyErrors.push(\n ...this.mapErrorsFactory(error as ZodError)\n )\n\n return\n }\n\n standardizedErrors.set(error.path[0], {\n location: error.path[0],\n propertyErrors: Array.from([\n ...this.mapErrorsFactory(error as ZodError),\n ]),\n } as CommonError)\n })\n\n return Array.from(standardizedErrors, ([, arr]) => ({\n ...arr,\n })).flat()\n }\n}\n","import { ZodEffects, type ZodError, ZodObject } from 'zod'\n\nimport ValidationError from '../../../../core/errors/validation-error'\nimport IValidationHTTP, { RequestHttp } from '../../../../core/http/validator'\nimport ZodMapError from './zod-map-error'\nimport { zodValidator } from './zod-validator'\n\ntype SchemaDefinition = {\n headers: ZodObject<Record<string, any>>\n params: ZodObject<Record<string, any>>\n query: ZodObject<Record<string, any>>\n body:\n | ZodObject<Record<string, any>>\n | ZodEffects<ZodObject<Record<string, any>>>\n}\n\ntype ZodSchemaObject = ZodObject<SchemaDefinition>\n\nexport default class ZodValidator implements IValidationHTTP {\n constructor(private zodSchema: ZodSchemaObject) {}\n\n async validate<T>(requestHttp: RequestHttp): Promise<T> {\n const errors = []\n\n const {\n data: headersData = {},\n error: headersErrors = {} as ZodError<{ errors: ZodError[] }>,\n } = requestHttp.headers\n ? await this.zodSchema.shape.headers.safeParseAsync(requestHttp.headers, {\n path: ['headers'],\n })\n : {}\n\n if (headersErrors?.errors) {\n errors.push(headersErrors?.errors)\n }\n\n const {\n data: paramsData = {},\n error: paramsErrors = {} as ZodError<{ errors: ZodError[] }>,\n } = requestHttp.params\n ? await this.zodSchema.shape.params.safeParseAsync(requestHttp.params, {\n path: ['params'],\n })\n : {}\n\n if (paramsErrors?.errors) {\n errors.push(paramsErrors?.errors)\n }\n\n const {\n data: queryData = {},\n error: queryErrors = {} as ZodError<{ errors: ZodError[] }>,\n } = requestHttp.query\n ? await this.zodSchema.shape.query.safeParseAsync(requestHttp.query, {\n path: ['query'],\n })\n : {}\n\n if (queryErrors?.errors) {\n errors.push(queryErrors?.errors)\n }\n\n const {\n data: bodyData = {},\n error: bodyErrors = {} as ZodError<{ errors: ZodError[] }>,\n } = requestHttp.body\n ? await this.zodSchema.shape.body.safeParseAsync(requestHttp.body, {\n path: ['body'],\n })\n : {}\n\n if (bodyErrors?.errors) {\n errors.push(bodyErrors?.errors)\n }\n\n if (errors.length) {\n throw new ValidationError(ZodMapError.mapErrors(errors))\n }\n\n return {\n body: bodyData,\n headers: headersData,\n params: paramsData,\n query: queryData,\n } as T\n }\n}\n\nexport { zodValidator }\n","import { z } from 'zod'\n\nimport { Request } from '../../../../core/http/base-controller'\nimport ZodValidator from './index'\n\nexport type ZodSchema = z.ZodObject<{\n headers: z.ZodObject<Record<string, any>>\n params: z.ZodObject<Record<string, any>>\n query: z.ZodObject<Record<string, any>>\n body:\n | z.ZodObject<Record<string, any>>\n | z.ZodEffects<z.ZodObject<Record<string, any>>>\n}>\n\nexport type MiddlewareFunction = (request: Request) => Promise<Request>\n\nexport function zodValidator(schema: ZodSchema): MiddlewareFunction {\n return async (request: Request): Promise<Request> => {\n const validator = new ZodValidator(schema)\n const validatedRequest = await validator.validate<Request>(request)\n return validatedRequest\n }\n}\n","(function () {\n require('./lib/main').config(\n Object.assign(\n {},\n require('./lib/env-options'),\n require('./lib/cli-options')(process.argv)\n )\n )\n})()\n","import 'dotenv/config'\n\nimport { z } from 'zod'\n\nexport const baseEnvSchema = z.object({\n NODE_ENV: z.enum(['test', 'development', 'production']).default('production'),\n ENVIRONMENT: z\n .enum(['test', 'development', 'staging', 'production'])\n .default('development'),\n PORT: z.coerce.number().default(3333),\n SHOULD_NOTIFY_ERROR: z.coerce.boolean().default(true),\n SENTRY_DSN: z.string().optional(),\n DISCORD_WEBHOOK_URL: z.string().optional(),\n})\n"],"mappings":"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","names":["module","module","fs","require","path","os","crypto","packageJson","version","LINE","parse","src","obj","lines","toString","replace","match","exec","key","value","trim","maybeQuote","_parseVault","options","vaultPath","_vaultPath","result","DotenvModule","configDotenv","parsed","err","Error","code","keys","_dotenvKey","split","length","decrypted","i","attrs","_instructions","decrypt","ciphertext","error","_warn","message","console","log","_debug","DOTENV_KEY","process","env","dotenvKey","uri","URL","password","environment","searchParams","get","environmentKey","toUpperCase","possibleVaultPath","Array","isArray","filepath","existsSync","endsWith","resolve","cwd","_resolveHome","envPath","join","homedir","slice","_configVault","debug","Boolean","processEnv","populate","dotenvPath","encoding","optionPaths","push","lastError","parsedAll","readFileSync","e","config","encrypted","keyStr","Buffer","from","nonce","subarray","authTag","aesgcm","createDecipheriv","setAuthTag","update","final","isRange","RangeError","invalidKeyLength","decryptionFailed","override","Object","prototype","hasOwnProperty","call","exports","module","options","process","env","DOTENV_CONFIG_ENCODING","encoding","DOTENV_CONFIG_PATH","path","DOTENV_CONFIG_DEBUG","debug","DOTENV_CONFIG_OVERRIDE","override","DOTENV_CONFIG_DOTENV_KEY","DOTENV_KEY","exports","module","re","exports","optionMatcher","args","reduce","acc","cur","matches","match","import_reflect_metadata","DependencyContainer","registry","Map","singletons","register","token","myClass","options","set","type","singleton","registerValue","value","resolve","target","paramTypes","Reflect","getMetadata","injectMetadata","getOwnMetadata","params","map","_","index","Error","name","resolveToken","registration","get","has","instance","Inject","_propertyKey","parameterIndex","constructor","existingInjectedParams","defineMetadata","ApiErrorEnum","ApplicationError","Error","props","constructor","message","code","errorCode","ApiErrorEnum","APPLICATION","occurredAt","Date","ConflictError","Error","props","conflictProps","constructor","code","errorCode","ApiErrorEnum","APPLICATION","message","occurredAt","Date","DomainError","Error","props","constructor","message","code","errorCode","ApiErrorEnum","DOMAIN","occurredAt","Date","InfraError","Error","props","constructor","message","code","errorCode","ApiErrorEnum","INFRA","occurredAt","Date","ValidationError","Error","props","constructor","errors","code","errorCode","ApiErrorEnum","VALIDATOR","message","occurredAt","Date","BaseController","errorNotifier","constructor","DependencyContainer","resolveToken","success","dto","code","data","noContent","undefined","created","paginated","buildContextError","request","env","process","ENVIRONMENT","body","headers","params","query","failure","error","context","ConflictError","props","message","errorCode","occurredAt","items","Array","isArray","conflictProps","DomainError","ApplicationError","InfraError","ValidationError","errors","SHOULD_NOTIFY_ERROR","notify","execute","routeMetadata","Reflect","getMetadata","middlewares","processedRequest","length","middleware","handle","Controller","method","path","middlewares","target","prototype","BaseController","Error","name","Reflect","defineMetadata","UniqueEntityId","value","constructor","randomUUID","toString","toValue","equals","id","Entity","_id","props","id","createdAt","date","updatedAt","touch","Date","UniqueEntityId","equals","entity","AggregateRoot","Entity","ValueObject","props","WatchedList","currentItems","initial","new","removed","updated","constructor","initialItems","getItems","getNewItems","getRemovedItems","getUpdatedItems","addUpdatedItem","item","push","isCurrentItem","filter","v","compareItems","length","isNewItem","isRemovedItem","removeFromNew","removeFromCurrent","removeFromRemoved","wasAddedInitially","exists","add","remove","update","items","newItems","a","some","b","removedItems","updatedItems","getTakeAndSkip","size","page","take","Number","skip","import_reflect_metadata","import_cors","DiscordNotifier","webhook","constructor","options","Webhook","url","notify","error","context","embed","MessageBuilder","setTitle","addField","message","slice","request","method","JSON","stringify","params","query","headers","body","stack","setFooter","env","setTimestamp","send","NotificationErrorInMemory","errors","notify","error","context","console","log","push","message","SentryNotifier","constructor","options","Sentry","init","dsn","environment","attachStacktrace","tracesSampleRate","maxBreadcrumbs","debug","notify","error","context","withScope","scope","setLevel","env","setTag","user","setUser","id","username","name","email","request","body","query","params","headers","method","url","requestId","setContext","captureException","NotificationFactory","define","env","definitions","defaultDefinition","test","defineProvider","local","development","staging","production","provider","NotificationErrorInMemory","DiscordNotifier","SentryNotifier","ZodMapError","mapCommon","error","type","code","path","join","property","pop","propertyType","expected","receivedValue","received","message","mapInvalidUnion","errors","unionErrors","flat","map","err","issues","item","mapInvalidType","mapErrorsFactory","mapErrors","standardizedErrors","Map","forEach","keyError","get","propertyErrors","push","set","location","Array","from","arr","ZodValidator","constructor","zodSchema","validate","requestHttp","errors","data","headersData","error","headersErrors","headers","shape","safeParseAsync","path","push","paramsData","paramsErrors","params","queryData","queryErrors","query","bodyData","bodyErrors","body","length","ValidationError","ZodMapError","mapErrors","zodValidator","schema","request","validator","ZodValidator","validatedRequest","validate","require","config","Object","assign","process","argv","baseEnvSchema","z","object","NODE_ENV","enum","default","ENVIRONMENT","PORT","coerce","number","SHOULD_NOTIFY_ERROR","boolean","SENTRY_DSN","string","optional","DISCORD_WEBHOOK_URL"]}
package/dist/index.d.cts CHANGED
@@ -15,6 +15,7 @@ export { NotPagination, Pagination } from './core/http/pagination.cjs';
15
15
  export { RequestHttp } from './core/http/validator.cjs';
16
16
  export { DiscordNotifier } from './infra/adapters/notifications/discord.cjs';
17
17
  export { NotificationErrorInMemory } from './infra/adapters/notifications/in-memory.cjs';
18
+ export { NotificationFactory } from './infra/adapters/notifications/notification-factory.cjs';
18
19
  export { SentryNotifier } from './infra/adapters/notifications/sentry.cjs';
19
20
  export { MiddlewareFunction, ZodSchema, zodValidator } from './infra/adapters/validators/zod/zod-validator.cjs';
20
21
  export { baseEnvSchema } from './infra/env/index.cjs';
package/dist/index.d.ts CHANGED
@@ -15,6 +15,7 @@ export { NotPagination, Pagination } from './core/http/pagination.js';
15
15
  export { RequestHttp } from './core/http/validator.js';
16
16
  export { DiscordNotifier } from './infra/adapters/notifications/discord.js';
17
17
  export { NotificationErrorInMemory } from './infra/adapters/notifications/in-memory.js';
18
+ export { NotificationFactory } from './infra/adapters/notifications/notification-factory.js';
18
19
  export { SentryNotifier } from './infra/adapters/notifications/sentry.js';
19
20
  export { MiddlewareFunction, ZodSchema, zodValidator } from './infra/adapters/validators/zod/zod-validator.js';
20
21
  export { baseEnvSchema } from './infra/env/index.js';
package/dist/index.js CHANGED
@@ -1040,6 +1040,34 @@ SentryNotifier = _ts_decorate2([
1040
1040
  ])
1041
1041
  ], SentryNotifier);
1042
1042
 
1043
+ // src/infra/adapters/notifications/notification-factory.ts
1044
+ var NotificationFactory = class {
1045
+ static {
1046
+ __name(this, "NotificationFactory");
1047
+ }
1048
+ static define(env, definitions) {
1049
+ const defaultDefinition = {
1050
+ test: this.defineProvider(definitions?.local ?? "console"),
1051
+ development: this.defineProvider(definitions?.local ?? "console"),
1052
+ staging: this.defineProvider(definitions?.local ?? "discord"),
1053
+ production: this.defineProvider(definitions?.local ?? "sentry")
1054
+ };
1055
+ return defaultDefinition[env];
1056
+ }
1057
+ static defineProvider(provider) {
1058
+ switch (provider) {
1059
+ case "console":
1060
+ return NotificationErrorInMemory;
1061
+ case "discord":
1062
+ return DiscordNotifier;
1063
+ case "sentry":
1064
+ return SentryNotifier;
1065
+ default:
1066
+ return NotificationErrorInMemory;
1067
+ }
1068
+ }
1069
+ };
1070
+
1043
1071
  // src/infra/adapters/validators/zod/zod-map-error.ts
1044
1072
  var ZodMapError = class {
1045
1073
  static {
@@ -1192,6 +1220,7 @@ export {
1192
1220
  Entity,
1193
1221
  Inject,
1194
1222
  NotificationErrorInMemory,
1223
+ NotificationFactory,
1195
1224
  SentryNotifier,
1196
1225
  UniqueEntityId,
1197
1226
  ValueObject,