plutin 1.4.0 → 1.5.1

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
@@ -442,12 +442,14 @@ var require_cli_options = __commonJS({
442
442
  // src/index.ts
443
443
  var src_exports = {};
444
444
  __export(src_exports, {
445
+ AggregateObjectRoot: () => AggregateObjectRoot,
445
446
  AggregateRoot: () => AggregateRoot,
446
447
  BaseController: () => BaseController,
447
448
  Controller: () => Controller,
448
449
  DependencyContainer: () => DependencyContainer,
449
450
  DiscordNotifier: () => DiscordNotifier,
450
451
  Entity: () => Entity,
452
+ EntityObject: () => EntityObject,
451
453
  ExpressAdapter: () => ExpressAdapter,
452
454
  FastifyAdapter: () => FastifyAdapter,
453
455
  GlobalErrorHandler: () => GlobalErrorHandler,
@@ -456,6 +458,7 @@ __export(src_exports, {
456
458
  NotificationFactory: () => NotificationFactory,
457
459
  SentryNotifier: () => SentryNotifier,
458
460
  UniqueEntityId: () => UniqueEntityId,
461
+ UniqueObjectUniqueId: () => UniqueObjectUniqueId,
459
462
  ValueObject: () => ValueObject,
460
463
  WatchedList: () => WatchedList,
461
464
  baseEnvSchema: () => baseEnvSchema,
@@ -786,6 +789,62 @@ function Controller({ method, path, middlewares = [] }) {
786
789
  }
787
790
  __name(Controller, "Controller");
788
791
 
792
+ // src/core/entities/unique-object-id.ts
793
+ var import_bson = require("bson");
794
+ var UniqueObjectUniqueId = class {
795
+ static {
796
+ __name(this, "UniqueObjectUniqueId");
797
+ }
798
+ value;
799
+ constructor(value) {
800
+ this.value = new import_bson.ObjectId(value);
801
+ }
802
+ toString() {
803
+ return this.value.toString();
804
+ }
805
+ toValue() {
806
+ return this.value.toString();
807
+ }
808
+ equals(id) {
809
+ return id.toValue() === this.toValue();
810
+ }
811
+ };
812
+
813
+ // src/core/entities/entity-object.ts
814
+ var EntityObject = class {
815
+ static {
816
+ __name(this, "EntityObject");
817
+ }
818
+ _id;
819
+ props;
820
+ get id() {
821
+ return this._id;
822
+ }
823
+ set id(id) {
824
+ this._id = id;
825
+ }
826
+ constructor(props, id) {
827
+ this._id = id ?? new UniqueObjectUniqueId(id);
828
+ this.props = props;
829
+ }
830
+ equals(entity) {
831
+ if (entity === this) {
832
+ return true;
833
+ }
834
+ if (entity.id === this._id) {
835
+ return true;
836
+ }
837
+ return false;
838
+ }
839
+ };
840
+
841
+ // src/core/entities/aggregate-object-root.ts
842
+ var AggregateObjectRoot = class extends EntityObject {
843
+ static {
844
+ __name(this, "AggregateObjectRoot");
845
+ }
846
+ };
847
+
789
848
  // src/core/entities/unique-entity-id.ts
790
849
  var import_node_crypto = require("crypto");
791
850
  var UniqueEntityId = class {
@@ -1461,12 +1520,14 @@ var baseEnvSchema = import_zod.z.object({
1461
1520
  });
1462
1521
  // Annotate the CommonJS export names for ESM import in node:
1463
1522
  0 && (module.exports = {
1523
+ AggregateObjectRoot,
1464
1524
  AggregateRoot,
1465
1525
  BaseController,
1466
1526
  Controller,
1467
1527
  DependencyContainer,
1468
1528
  DiscordNotifier,
1469
1529
  Entity,
1530
+ EntityObject,
1470
1531
  ExpressAdapter,
1471
1532
  FastifyAdapter,
1472
1533
  GlobalErrorHandler,
@@ -1475,6 +1536,7 @@ var baseEnvSchema = import_zod.z.object({
1475
1536
  NotificationFactory,
1476
1537
  SentryNotifier,
1477
1538
  UniqueEntityId,
1539
+ UniqueObjectUniqueId,
1478
1540
  ValueObject,
1479
1541
  WatchedList,
1480
1542
  baseEnvSchema,
@@ -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/decorators/dependency-container.ts","../src/core/configs/global-error-handler.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/http/base-controller.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/logger/index.ts","../src/infra/adapters/http/response-error-code.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","../src/infra/env/index.ts","../node_modules/dotenv/config.js"],"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 configs\nexport * from './core/configs/global-error-handler'\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/replace'\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/http'\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\nexport * from './infra/env'\nexport * from './infra/logger'\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 injectMetadata: Record<number, string> =\n Reflect.getOwnMetadata('inject:params', target) || {}\n\n const paramCount = Object.keys(injectMetadata).length\n\n const params = Array.from({ length: paramCount }, (_, index) => {\n const token = injectMetadata[index]\n if (!token) {\n throw new Error(\n `Missing @Inject token for parameter index ${index} in ${target.name}`\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","import { DependencyContainer } from '../../core/decorators/dependency-container'\nimport type { IErrorNotifier } from '../../core/http/error-notifier'\n\nexport class GlobalErrorHandler {\n protected readonly errorNotifier: IErrorNotifier\n\n constructor(readonly env: Record<string, any>) {\n this.errorNotifier = DependencyContainer.resolveToken('IErrorNotifier')\n }\n\n register() {\n process.on('uncaughtException', (err) => {\n this.errorNotifier.notify(err, { env: this.env.ENVIRONMENT })\n process.exit(1)\n })\n\n process.on('unhandledRejection', (reason) => {\n if (reason instanceof Error) {\n this.errorNotifier.notify(reason, { env: this.env.ENVIRONMENT })\n } else {\n this.errorNotifier.notify(new Error(String(reason)), {\n env: this.env.ENVIRONMENT,\n })\n }\n\n process.exit(1)\n })\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 { 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'\n\nimport { IErrorNotifier } from './error-notifier'\n\nimport 'reflect-metadata'\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 { BaseController } from '../../core/http/base-controller'\nimport { MiddlewareFunction } from '../../infra/adapters/validators/zod/zod-validator'\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 { IHttp } from '../../../core/http/http'\nimport { logger } from '../../logger'\n\nimport { ErrorResponseCode } from './response-error-code'\nimport { validateControllerMetadata } from './validate-controller-metadata'\n\nexport 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 logger.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 { bold } from 'kleur'\n\nexport const logger = {\n info: (...args: any[]) => {\n console.info(bold().blue(`[INFO] `), ...args)\n },\n\n log: (...args: any[]) => {\n console.log(bold().grey(`[LOG] `), ...args)\n },\n\n warn: (...args: any[]) => {\n console.warn(bold().yellow(`[WARN] `), ...args)\n },\n\n error: (...args: any[]) => {\n console.error(bold().red(`[ERROR] `), ...args)\n },\n}\n","export enum ErrorResponseCode {\n NO_CONTENT_BODY = 'B001',\n NO_CONTENT_ERROR = 'B002',\n}\n","import { BaseController } from '../../../core/http/base-controller'\nimport type { MethodType } from '../../../core/http/http'\n\nimport 'reflect-metadata'\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 { 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 { logger } from '../../logger'\n\nimport { ErrorResponseCode } from './response-error-code'\nimport { validateControllerMetadata } from './validate-controller-metadata'\n\nexport 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 logger.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'\nimport { logger } from '../../logger'\n\nexport class NotificationErrorInMemory implements IErrorNotifier {\n public errors: any[] = []\n\n async notify(error: Error, context?: ContextError): Promise<void> {\n logger.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'\n\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 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?.test ?? 'console'),\n development: this.defineProvider(definitions?.development ?? 'console'),\n staging: this.defineProvider(definitions?.staging ?? 'discord'),\n production: this.defineProvider(definitions?.production ?? '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'\n\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'\n\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","import { z } from 'zod'\n\nimport 'dotenv/config'\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","(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"],"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","DependencyContainer","registry","Map","singletons","register","token","myClass","options","set","type","singleton","registerValue","value","resolve","target","injectMetadata","Reflect","getOwnMetadata","paramCount","Object","keys","length","params","Array","from","_","index","Error","name","resolveToken","registration","get","has","instance","Inject","_propertyKey","parameterIndex","constructor","existingInjectedParams","defineMetadata","GlobalErrorHandler","errorNotifier","constructor","env","DependencyContainer","resolveToken","register","process","on","err","notify","ENVIRONMENT","exit","reason","Error","String","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","import_reflect_metadata","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","logger","info","args","console","bold","blue","log","grey","warn","yellow","error","red","ErrorResponseCode","import_reflect_metadata","validateControllerMetadata","controller","metadata","Reflect","getMetadata","constructor","Error","name","ExpressAdapter","instance","server","constructor","env","express","use","cors","json","limit","urlencoded","extended","disable","registerRoute","controllerClass","metadata","validateControllerMetadata","method","path","request","response","requestData","body","params","headers","query","output","execute","status","code","data","ErrorResponseCode","NO_CONTENT_BODY","err","error","failure","ENVIRONMENT","url","NO_CONTENT_ERROR","startServer","port","Promise","resolve","listen","logger","log","closeServer","reject","close","import_cors","FastifyAdapter","instance","constructor","env","fastify","bodyLimit","querystringParser","str","qs","parse","register","cors","registerRoute","controllerClass","metadata","validateControllerMetadata","method","path","request","reply","requestData","body","params","headers","query","output","execute","status","code","send","data","ErrorResponseCode","NO_CONTENT_BODY","err","error","failure","ENVIRONMENT","url","NO_CONTENT_ERROR","startServer","port","listen","NODE_ENV","logger","log","closeServer","close","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","logger","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","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"]}
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/decorators/dependency-container.ts","../src/core/configs/global-error-handler.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/http/base-controller.ts","../src/core/decorators/controller-http-decorator.ts","../src/core/entities/unique-object-id.ts","../src/core/entities/entity-object.ts","../src/core/entities/aggregate-object-root.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/logger/index.ts","../src/infra/adapters/http/response-error-code.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","../src/infra/env/index.ts","../node_modules/dotenv/config.js"],"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 configs\nexport * from './core/configs/global-error-handler'\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-object-root'\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/entity-object'\nexport * from './core/entities/optional'\nexport * from './core/entities/replace'\nexport * from './core/entities/unique-entity-id'\nexport * from './core/entities/unique-object-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/http'\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\nexport * from './infra/env'\nexport * from './infra/logger'\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 injectMetadata: Record<number, string> =\n Reflect.getOwnMetadata('inject:params', target) || {}\n\n const paramCount = Object.keys(injectMetadata).length\n\n const params = Array.from({ length: paramCount }, (_, index) => {\n const token = injectMetadata[index]\n if (!token) {\n throw new Error(\n `Missing @Inject token for parameter index ${index} in ${target.name}`\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","import { DependencyContainer } from '../../core/decorators/dependency-container'\nimport type { IErrorNotifier } from '../../core/http/error-notifier'\n\nexport class GlobalErrorHandler {\n protected readonly errorNotifier: IErrorNotifier\n\n constructor(readonly env: Record<string, any>) {\n this.errorNotifier = DependencyContainer.resolveToken('IErrorNotifier')\n }\n\n register() {\n process.on('uncaughtException', (err) => {\n this.errorNotifier.notify(err, { env: this.env.ENVIRONMENT })\n process.exit(1)\n })\n\n process.on('unhandledRejection', (reason) => {\n if (reason instanceof Error) {\n this.errorNotifier.notify(reason, { env: this.env.ENVIRONMENT })\n } else {\n this.errorNotifier.notify(new Error(String(reason)), {\n env: this.env.ENVIRONMENT,\n })\n }\n\n process.exit(1)\n })\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 { 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'\n\nimport { IErrorNotifier } from './error-notifier'\n\nimport 'reflect-metadata'\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 { BaseController } from '../../core/http/base-controller'\nimport { MiddlewareFunction } from '../../infra/adapters/validators/zod/zod-validator'\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 { ObjectId } from 'bson'\n\nexport class UniqueObjectUniqueId {\n private value: ObjectId\n\n constructor(value?: string) {\n this.value = new ObjectId(value)\n }\n\n toString() {\n return this.value.toString()\n }\n\n toValue() {\n return this.value.toString()\n }\n\n public equals(id: UniqueObjectUniqueId) {\n return id.toValue() === this.toValue()\n }\n}\n","import type { CommonDTO } from './common-dto'\nimport { UniqueObjectUniqueId } from './unique-object-id'\n\ntype PropsWithCommonDTO<Props> = Props & CommonDTO\n\nexport abstract class EntityObject<Props> {\n private _id: UniqueObjectUniqueId\n protected props: PropsWithCommonDTO<Props>\n\n get id() {\n return this._id\n }\n\n set id(id: UniqueObjectUniqueId) {\n this._id = id\n }\n\n protected constructor(\n props: PropsWithCommonDTO<Props>,\n id?: UniqueObjectUniqueId\n ) {\n this._id = id ?? new UniqueObjectUniqueId(id)\n this.props = props\n }\n\n public equals(entity: EntityObject<Props>) {\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 { EntityObject } from './entity-object'\n\nexport abstract class AggregateObjectRoot<Props> extends EntityObject<Props> {}\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 { IHttp } from '../../../core/http/http'\nimport { logger } from '../../logger'\n\nimport { ErrorResponseCode } from './response-error-code'\nimport { validateControllerMetadata } from './validate-controller-metadata'\n\nexport 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 logger.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 { bold } from 'kleur'\n\nexport const logger = {\n info: (...args: any[]) => {\n console.info(bold().blue(`[INFO] `), ...args)\n },\n\n log: (...args: any[]) => {\n console.log(bold().grey(`[LOG] `), ...args)\n },\n\n warn: (...args: any[]) => {\n console.warn(bold().yellow(`[WARN] `), ...args)\n },\n\n error: (...args: any[]) => {\n console.error(bold().red(`[ERROR] `), ...args)\n },\n}\n","export enum ErrorResponseCode {\n NO_CONTENT_BODY = 'B001',\n NO_CONTENT_ERROR = 'B002',\n}\n","import { BaseController } from '../../../core/http/base-controller'\nimport type { MethodType } from '../../../core/http/http'\n\nimport 'reflect-metadata'\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 { 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 { logger } from '../../logger'\n\nimport { ErrorResponseCode } from './response-error-code'\nimport { validateControllerMetadata } from './validate-controller-metadata'\n\nexport 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 logger.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'\nimport { logger } from '../../logger'\n\nexport class NotificationErrorInMemory implements IErrorNotifier {\n public errors: any[] = []\n\n async notify(error: Error, context?: ContextError): Promise<void> {\n logger.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'\n\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 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?.test ?? 'console'),\n development: this.defineProvider(definitions?.development ?? 'console'),\n staging: this.defineProvider(definitions?.staging ?? 'discord'),\n production: this.defineProvider(definitions?.production ?? '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'\n\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'\n\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","import { z } from 'zod'\n\nimport 'dotenv/config'\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","(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"],"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","DependencyContainer","registry","Map","singletons","register","token","myClass","options","set","type","singleton","registerValue","value","resolve","target","injectMetadata","Reflect","getOwnMetadata","paramCount","Object","keys","length","params","Array","from","_","index","Error","name","resolveToken","registration","get","has","instance","Inject","_propertyKey","parameterIndex","constructor","existingInjectedParams","defineMetadata","GlobalErrorHandler","errorNotifier","constructor","env","DependencyContainer","resolveToken","register","process","on","err","notify","ENVIRONMENT","exit","reason","Error","String","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","import_reflect_metadata","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","UniqueObjectUniqueId","value","constructor","ObjectId","toString","toValue","equals","id","EntityObject","_id","props","id","UniqueObjectUniqueId","equals","entity","AggregateObjectRoot","EntityObject","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","logger","info","args","console","bold","blue","log","grey","warn","yellow","error","red","ErrorResponseCode","import_reflect_metadata","validateControllerMetadata","controller","metadata","Reflect","getMetadata","constructor","Error","name","ExpressAdapter","instance","server","constructor","env","express","use","cors","json","limit","urlencoded","extended","disable","registerRoute","controllerClass","metadata","validateControllerMetadata","method","path","request","response","requestData","body","params","headers","query","output","execute","status","code","data","ErrorResponseCode","NO_CONTENT_BODY","err","error","failure","ENVIRONMENT","url","NO_CONTENT_ERROR","startServer","port","Promise","resolve","listen","logger","log","closeServer","reject","close","import_cors","FastifyAdapter","instance","constructor","env","fastify","bodyLimit","querystringParser","str","qs","parse","register","cors","registerRoute","controllerClass","metadata","validateControllerMetadata","method","path","request","reply","requestData","body","params","headers","query","output","execute","status","code","send","data","ErrorResponseCode","NO_CONTENT_BODY","err","error","failure","ENVIRONMENT","url","NO_CONTENT_ERROR","startServer","port","listen","NODE_ENV","logger","log","closeServer","close","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","logger","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","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
@@ -107,6 +107,27 @@ type CreateCommonDTO = {
107
107
  updatedAt?: Date | null;
108
108
  };
109
109
 
110
+ declare class UniqueObjectUniqueId {
111
+ private value;
112
+ constructor(value?: string);
113
+ toString(): string;
114
+ toValue(): string;
115
+ equals(id: UniqueObjectUniqueId): boolean;
116
+ }
117
+
118
+ type PropsWithCommonDTO$1<Props> = Props & CommonDTO;
119
+ declare abstract class EntityObject<Props> {
120
+ private _id;
121
+ protected props: PropsWithCommonDTO$1<Props>;
122
+ get id(): UniqueObjectUniqueId;
123
+ set id(id: UniqueObjectUniqueId);
124
+ protected constructor(props: PropsWithCommonDTO$1<Props>, id?: UniqueObjectUniqueId);
125
+ equals(entity: EntityObject<Props>): boolean;
126
+ }
127
+
128
+ declare abstract class AggregateObjectRoot<Props> extends EntityObject<Props> {
129
+ }
130
+
110
131
  declare class UniqueEntityId {
111
132
  private value;
112
133
  constructor(value?: string);
@@ -296,4 +317,4 @@ declare const logger: {
296
317
  error: (...args: any[]) => void;
297
318
  };
298
319
 
299
- export { AggregateRoot, BaseController, CommonDTO, ContextError, Controller, CreateCommonDTO, DependencyContainer, DiscordNotifier, DtoResponsePagination, Entity, ExpressAdapter, FastifyAdapter, GlobalErrorHandler, ICheckDB, IErrorNotifier, IHealthCheck, IHttp, Inject, MethodType, MiddlewareFunction, NotPagination, NotificationErrorInMemory, NotificationFactory, Optional, Pagination, Replace, Request, RequestHttp, Response, SentryNotifier, UniqueEntityId, ValueObject, WatchedList, ZodSchema, baseEnvSchema, getTakeAndSkip, logger, zodValidator };
320
+ export { AggregateObjectRoot, AggregateRoot, BaseController, CommonDTO, ContextError, Controller, CreateCommonDTO, DependencyContainer, DiscordNotifier, DtoResponsePagination, Entity, EntityObject, ExpressAdapter, FastifyAdapter, GlobalErrorHandler, ICheckDB, IErrorNotifier, IHealthCheck, IHttp, Inject, MethodType, MiddlewareFunction, NotPagination, NotificationErrorInMemory, NotificationFactory, Optional, Pagination, Replace, Request, RequestHttp, Response, SentryNotifier, UniqueEntityId, UniqueObjectUniqueId, ValueObject, WatchedList, ZodSchema, baseEnvSchema, getTakeAndSkip, logger, zodValidator };
package/dist/index.d.ts CHANGED
@@ -107,6 +107,27 @@ type CreateCommonDTO = {
107
107
  updatedAt?: Date | null;
108
108
  };
109
109
 
110
+ declare class UniqueObjectUniqueId {
111
+ private value;
112
+ constructor(value?: string);
113
+ toString(): string;
114
+ toValue(): string;
115
+ equals(id: UniqueObjectUniqueId): boolean;
116
+ }
117
+
118
+ type PropsWithCommonDTO$1<Props> = Props & CommonDTO;
119
+ declare abstract class EntityObject<Props> {
120
+ private _id;
121
+ protected props: PropsWithCommonDTO$1<Props>;
122
+ get id(): UniqueObjectUniqueId;
123
+ set id(id: UniqueObjectUniqueId);
124
+ protected constructor(props: PropsWithCommonDTO$1<Props>, id?: UniqueObjectUniqueId);
125
+ equals(entity: EntityObject<Props>): boolean;
126
+ }
127
+
128
+ declare abstract class AggregateObjectRoot<Props> extends EntityObject<Props> {
129
+ }
130
+
110
131
  declare class UniqueEntityId {
111
132
  private value;
112
133
  constructor(value?: string);
@@ -296,4 +317,4 @@ declare const logger: {
296
317
  error: (...args: any[]) => void;
297
318
  };
298
319
 
299
- export { AggregateRoot, BaseController, CommonDTO, ContextError, Controller, CreateCommonDTO, DependencyContainer, DiscordNotifier, DtoResponsePagination, Entity, ExpressAdapter, FastifyAdapter, GlobalErrorHandler, ICheckDB, IErrorNotifier, IHealthCheck, IHttp, Inject, MethodType, MiddlewareFunction, NotPagination, NotificationErrorInMemory, NotificationFactory, Optional, Pagination, Replace, Request, RequestHttp, Response, SentryNotifier, UniqueEntityId, ValueObject, WatchedList, ZodSchema, baseEnvSchema, getTakeAndSkip, logger, zodValidator };
320
+ export { AggregateObjectRoot, AggregateRoot, BaseController, CommonDTO, ContextError, Controller, CreateCommonDTO, DependencyContainer, DiscordNotifier, DtoResponsePagination, Entity, EntityObject, ExpressAdapter, FastifyAdapter, GlobalErrorHandler, ICheckDB, IErrorNotifier, IHealthCheck, IHttp, Inject, MethodType, MiddlewareFunction, NotPagination, NotificationErrorInMemory, NotificationFactory, Optional, Pagination, Replace, Request, RequestHttp, Response, SentryNotifier, UniqueEntityId, UniqueObjectUniqueId, ValueObject, WatchedList, ZodSchema, baseEnvSchema, getTakeAndSkip, logger, zodValidator };
package/dist/index.mjs CHANGED
@@ -741,6 +741,62 @@ function Controller({ method, path, middlewares = [] }) {
741
741
  }
742
742
  __name(Controller, "Controller");
743
743
 
744
+ // src/core/entities/unique-object-id.ts
745
+ import { ObjectId } from "bson";
746
+ var UniqueObjectUniqueId = class {
747
+ static {
748
+ __name(this, "UniqueObjectUniqueId");
749
+ }
750
+ value;
751
+ constructor(value) {
752
+ this.value = new ObjectId(value);
753
+ }
754
+ toString() {
755
+ return this.value.toString();
756
+ }
757
+ toValue() {
758
+ return this.value.toString();
759
+ }
760
+ equals(id) {
761
+ return id.toValue() === this.toValue();
762
+ }
763
+ };
764
+
765
+ // src/core/entities/entity-object.ts
766
+ var EntityObject = class {
767
+ static {
768
+ __name(this, "EntityObject");
769
+ }
770
+ _id;
771
+ props;
772
+ get id() {
773
+ return this._id;
774
+ }
775
+ set id(id) {
776
+ this._id = id;
777
+ }
778
+ constructor(props, id) {
779
+ this._id = id ?? new UniqueObjectUniqueId(id);
780
+ this.props = props;
781
+ }
782
+ equals(entity) {
783
+ if (entity === this) {
784
+ return true;
785
+ }
786
+ if (entity.id === this._id) {
787
+ return true;
788
+ }
789
+ return false;
790
+ }
791
+ };
792
+
793
+ // src/core/entities/aggregate-object-root.ts
794
+ var AggregateObjectRoot = class extends EntityObject {
795
+ static {
796
+ __name(this, "AggregateObjectRoot");
797
+ }
798
+ };
799
+
744
800
  // src/core/entities/unique-entity-id.ts
745
801
  import { randomUUID } from "crypto";
746
802
  var UniqueEntityId = class {
@@ -1415,12 +1471,14 @@ var baseEnvSchema = z.object({
1415
1471
  DISCORD_WEBHOOK_URL: z.string().optional()
1416
1472
  });
1417
1473
  export {
1474
+ AggregateObjectRoot,
1418
1475
  AggregateRoot,
1419
1476
  BaseController,
1420
1477
  Controller,
1421
1478
  DependencyContainer,
1422
1479
  DiscordNotifier,
1423
1480
  Entity,
1481
+ EntityObject,
1424
1482
  ExpressAdapter,
1425
1483
  FastifyAdapter,
1426
1484
  GlobalErrorHandler,
@@ -1429,6 +1487,7 @@ export {
1429
1487
  NotificationFactory,
1430
1488
  SentryNotifier,
1431
1489
  UniqueEntityId,
1490
+ UniqueObjectUniqueId,
1432
1491
  ValueObject,
1433
1492
  WatchedList,
1434
1493
  baseEnvSchema,
@@ -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/core/decorators/dependency-container.ts","../src/core/configs/global-error-handler.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/http/base-controller.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/logger/index.ts","../src/infra/adapters/http/response-error-code.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","../src/infra/env/index.ts","../node_modules/dotenv/config.js"],"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","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 injectMetadata: Record<number, string> =\n Reflect.getOwnMetadata('inject:params', target) || {}\n\n const paramCount = Object.keys(injectMetadata).length\n\n const params = Array.from({ length: paramCount }, (_, index) => {\n const token = injectMetadata[index]\n if (!token) {\n throw new Error(\n `Missing @Inject token for parameter index ${index} in ${target.name}`\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","import { DependencyContainer } from '../../core/decorators/dependency-container'\nimport type { IErrorNotifier } from '../../core/http/error-notifier'\n\nexport class GlobalErrorHandler {\n protected readonly errorNotifier: IErrorNotifier\n\n constructor(readonly env: Record<string, any>) {\n this.errorNotifier = DependencyContainer.resolveToken('IErrorNotifier')\n }\n\n register() {\n process.on('uncaughtException', (err) => {\n this.errorNotifier.notify(err, { env: this.env.ENVIRONMENT })\n process.exit(1)\n })\n\n process.on('unhandledRejection', (reason) => {\n if (reason instanceof Error) {\n this.errorNotifier.notify(reason, { env: this.env.ENVIRONMENT })\n } else {\n this.errorNotifier.notify(new Error(String(reason)), {\n env: this.env.ENVIRONMENT,\n })\n }\n\n process.exit(1)\n })\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 { 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'\n\nimport { IErrorNotifier } from './error-notifier'\n\nimport 'reflect-metadata'\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 { BaseController } from '../../core/http/base-controller'\nimport { MiddlewareFunction } from '../../infra/adapters/validators/zod/zod-validator'\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 { IHttp } from '../../../core/http/http'\nimport { logger } from '../../logger'\n\nimport { ErrorResponseCode } from './response-error-code'\nimport { validateControllerMetadata } from './validate-controller-metadata'\n\nexport 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 logger.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 { bold } from 'kleur'\n\nexport const logger = {\n info: (...args: any[]) => {\n console.info(bold().blue(`[INFO] `), ...args)\n },\n\n log: (...args: any[]) => {\n console.log(bold().grey(`[LOG] `), ...args)\n },\n\n warn: (...args: any[]) => {\n console.warn(bold().yellow(`[WARN] `), ...args)\n },\n\n error: (...args: any[]) => {\n console.error(bold().red(`[ERROR] `), ...args)\n },\n}\n","export enum ErrorResponseCode {\n NO_CONTENT_BODY = 'B001',\n NO_CONTENT_ERROR = 'B002',\n}\n","import { BaseController } from '../../../core/http/base-controller'\nimport type { MethodType } from '../../../core/http/http'\n\nimport 'reflect-metadata'\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 { 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 { logger } from '../../logger'\n\nimport { ErrorResponseCode } from './response-error-code'\nimport { validateControllerMetadata } from './validate-controller-metadata'\n\nexport 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 logger.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'\nimport { logger } from '../../logger'\n\nexport class NotificationErrorInMemory implements IErrorNotifier {\n public errors: any[] = []\n\n async notify(error: Error, context?: ContextError): Promise<void> {\n logger.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'\n\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 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?.test ?? 'console'),\n development: this.defineProvider(definitions?.development ?? 'console'),\n staging: this.defineProvider(definitions?.staging ?? 'discord'),\n production: this.defineProvider(definitions?.production ?? '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'\n\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'\n\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","import { z } from 'zod'\n\nimport 'dotenv/config'\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","(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"],"mappings":"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","names":["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","module","exports","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","module","exports","re","module","exports","optionMatcher","args","reduce","acc","cur","matches","match","DependencyContainer","registry","Map","singletons","register","token","myClass","options","set","type","singleton","registerValue","value","resolve","target","injectMetadata","Reflect","getOwnMetadata","paramCount","Object","keys","length","params","Array","from","_","index","Error","name","resolveToken","registration","get","has","instance","Inject","_propertyKey","parameterIndex","constructor","existingInjectedParams","defineMetadata","GlobalErrorHandler","errorNotifier","constructor","env","DependencyContainer","resolveToken","register","process","on","err","notify","ENVIRONMENT","exit","reason","Error","String","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","randomUUID","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","cors","express","bold","logger","info","args","console","blue","log","grey","warn","yellow","error","red","ErrorResponseCode","validateControllerMetadata","controller","metadata","Reflect","getMetadata","constructor","Error","name","ExpressAdapter","instance","server","constructor","env","express","use","cors","json","limit","urlencoded","extended","disable","registerRoute","controllerClass","metadata","validateControllerMetadata","method","path","request","response","requestData","body","params","headers","query","output","execute","status","code","data","ErrorResponseCode","NO_CONTENT_BODY","err","error","failure","ENVIRONMENT","url","NO_CONTENT_ERROR","startServer","port","Promise","resolve","listen","logger","log","closeServer","reject","close","cors","fastify","qs","FastifyAdapter","instance","constructor","env","fastify","bodyLimit","querystringParser","str","qs","parse","register","cors","registerRoute","controllerClass","metadata","validateControllerMetadata","method","path","request","reply","requestData","body","params","headers","query","output","execute","status","code","send","data","ErrorResponseCode","NO_CONTENT_BODY","err","error","failure","ENVIRONMENT","url","NO_CONTENT_ERROR","startServer","port","listen","NODE_ENV","logger","log","closeServer","close","MessageBuilder","Webhook","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","logger","push","message","Sentry","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","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","z","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/core/decorators/dependency-container.ts","../src/core/configs/global-error-handler.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/http/base-controller.ts","../src/core/decorators/controller-http-decorator.ts","../src/core/entities/unique-object-id.ts","../src/core/entities/entity-object.ts","../src/core/entities/aggregate-object-root.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/logger/index.ts","../src/infra/adapters/http/response-error-code.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","../src/infra/env/index.ts","../node_modules/dotenv/config.js"],"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","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 injectMetadata: Record<number, string> =\n Reflect.getOwnMetadata('inject:params', target) || {}\n\n const paramCount = Object.keys(injectMetadata).length\n\n const params = Array.from({ length: paramCount }, (_, index) => {\n const token = injectMetadata[index]\n if (!token) {\n throw new Error(\n `Missing @Inject token for parameter index ${index} in ${target.name}`\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","import { DependencyContainer } from '../../core/decorators/dependency-container'\nimport type { IErrorNotifier } from '../../core/http/error-notifier'\n\nexport class GlobalErrorHandler {\n protected readonly errorNotifier: IErrorNotifier\n\n constructor(readonly env: Record<string, any>) {\n this.errorNotifier = DependencyContainer.resolveToken('IErrorNotifier')\n }\n\n register() {\n process.on('uncaughtException', (err) => {\n this.errorNotifier.notify(err, { env: this.env.ENVIRONMENT })\n process.exit(1)\n })\n\n process.on('unhandledRejection', (reason) => {\n if (reason instanceof Error) {\n this.errorNotifier.notify(reason, { env: this.env.ENVIRONMENT })\n } else {\n this.errorNotifier.notify(new Error(String(reason)), {\n env: this.env.ENVIRONMENT,\n })\n }\n\n process.exit(1)\n })\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 { 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'\n\nimport { IErrorNotifier } from './error-notifier'\n\nimport 'reflect-metadata'\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 { BaseController } from '../../core/http/base-controller'\nimport { MiddlewareFunction } from '../../infra/adapters/validators/zod/zod-validator'\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 { ObjectId } from 'bson'\n\nexport class UniqueObjectUniqueId {\n private value: ObjectId\n\n constructor(value?: string) {\n this.value = new ObjectId(value)\n }\n\n toString() {\n return this.value.toString()\n }\n\n toValue() {\n return this.value.toString()\n }\n\n public equals(id: UniqueObjectUniqueId) {\n return id.toValue() === this.toValue()\n }\n}\n","import type { CommonDTO } from './common-dto'\nimport { UniqueObjectUniqueId } from './unique-object-id'\n\ntype PropsWithCommonDTO<Props> = Props & CommonDTO\n\nexport abstract class EntityObject<Props> {\n private _id: UniqueObjectUniqueId\n protected props: PropsWithCommonDTO<Props>\n\n get id() {\n return this._id\n }\n\n set id(id: UniqueObjectUniqueId) {\n this._id = id\n }\n\n protected constructor(\n props: PropsWithCommonDTO<Props>,\n id?: UniqueObjectUniqueId\n ) {\n this._id = id ?? new UniqueObjectUniqueId(id)\n this.props = props\n }\n\n public equals(entity: EntityObject<Props>) {\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 { EntityObject } from './entity-object'\n\nexport abstract class AggregateObjectRoot<Props> extends EntityObject<Props> {}\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 { IHttp } from '../../../core/http/http'\nimport { logger } from '../../logger'\n\nimport { ErrorResponseCode } from './response-error-code'\nimport { validateControllerMetadata } from './validate-controller-metadata'\n\nexport 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 logger.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 { bold } from 'kleur'\n\nexport const logger = {\n info: (...args: any[]) => {\n console.info(bold().blue(`[INFO] `), ...args)\n },\n\n log: (...args: any[]) => {\n console.log(bold().grey(`[LOG] `), ...args)\n },\n\n warn: (...args: any[]) => {\n console.warn(bold().yellow(`[WARN] `), ...args)\n },\n\n error: (...args: any[]) => {\n console.error(bold().red(`[ERROR] `), ...args)\n },\n}\n","export enum ErrorResponseCode {\n NO_CONTENT_BODY = 'B001',\n NO_CONTENT_ERROR = 'B002',\n}\n","import { BaseController } from '../../../core/http/base-controller'\nimport type { MethodType } from '../../../core/http/http'\n\nimport 'reflect-metadata'\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 { 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 { logger } from '../../logger'\n\nimport { ErrorResponseCode } from './response-error-code'\nimport { validateControllerMetadata } from './validate-controller-metadata'\n\nexport 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 logger.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'\nimport { logger } from '../../logger'\n\nexport class NotificationErrorInMemory implements IErrorNotifier {\n public errors: any[] = []\n\n async notify(error: Error, context?: ContextError): Promise<void> {\n logger.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'\n\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 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?.test ?? 'console'),\n development: this.defineProvider(definitions?.development ?? 'console'),\n staging: this.defineProvider(definitions?.staging ?? 'discord'),\n production: this.defineProvider(definitions?.production ?? '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'\n\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'\n\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","import { z } from 'zod'\n\nimport 'dotenv/config'\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","(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"],"mappings":"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","names":["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","module","exports","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","module","exports","re","module","exports","optionMatcher","args","reduce","acc","cur","matches","match","DependencyContainer","registry","Map","singletons","register","token","myClass","options","set","type","singleton","registerValue","value","resolve","target","injectMetadata","Reflect","getOwnMetadata","paramCount","Object","keys","length","params","Array","from","_","index","Error","name","resolveToken","registration","get","has","instance","Inject","_propertyKey","parameterIndex","constructor","existingInjectedParams","defineMetadata","GlobalErrorHandler","errorNotifier","constructor","env","DependencyContainer","resolveToken","register","process","on","err","notify","ENVIRONMENT","exit","reason","Error","String","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","ObjectId","UniqueObjectUniqueId","value","constructor","ObjectId","toString","toValue","equals","id","EntityObject","_id","props","id","UniqueObjectUniqueId","equals","entity","AggregateObjectRoot","EntityObject","randomUUID","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","cors","express","bold","logger","info","args","console","blue","log","grey","warn","yellow","error","red","ErrorResponseCode","validateControllerMetadata","controller","metadata","Reflect","getMetadata","constructor","Error","name","ExpressAdapter","instance","server","constructor","env","express","use","cors","json","limit","urlencoded","extended","disable","registerRoute","controllerClass","metadata","validateControllerMetadata","method","path","request","response","requestData","body","params","headers","query","output","execute","status","code","data","ErrorResponseCode","NO_CONTENT_BODY","err","error","failure","ENVIRONMENT","url","NO_CONTENT_ERROR","startServer","port","Promise","resolve","listen","logger","log","closeServer","reject","close","cors","fastify","qs","FastifyAdapter","instance","constructor","env","fastify","bodyLimit","querystringParser","str","qs","parse","register","cors","registerRoute","controllerClass","metadata","validateControllerMetadata","method","path","request","reply","requestData","body","params","headers","query","output","execute","status","code","send","data","ErrorResponseCode","NO_CONTENT_BODY","err","error","failure","ENVIRONMENT","url","NO_CONTENT_ERROR","startServer","port","listen","NODE_ENV","logger","log","closeServer","close","MessageBuilder","Webhook","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","logger","push","message","Sentry","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","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","z","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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "plutin",
3
- "version": "1.4.0",
3
+ "version": "1.5.1",
4
4
  "description": "Plutin lib",
5
5
  "private": false,
6
6
  "publishConfig": {
@@ -65,6 +65,7 @@
65
65
  "dependencies": {
66
66
  "@fastify/cors": "11.0.1",
67
67
  "@sentry/node": "9.13.0",
68
+ "bson": "6.10.3",
68
69
  "cors": "2.8.5",
69
70
  "discord-webhook-node": "1.1.8",
70
71
  "express": "5.1.0",