plutin 1.5.0 → 1.5.2
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 +48 -25
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +23 -16
- package/dist/index.d.ts +23 -16
- package/dist/index.mjs +46 -25
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -741,31 +741,31 @@ function Controller({ method, path, middlewares = [] }) {
|
|
|
741
741
|
}
|
|
742
742
|
__name(Controller, "Controller");
|
|
743
743
|
|
|
744
|
-
// src/core/entities/unique-
|
|
745
|
-
import {
|
|
746
|
-
var
|
|
744
|
+
// src/core/entities/unique-object-id.ts
|
|
745
|
+
import { ObjectId } from "bson";
|
|
746
|
+
var UniqueObjectUniqueId = class {
|
|
747
747
|
static {
|
|
748
|
-
__name(this, "
|
|
748
|
+
__name(this, "UniqueObjectUniqueId");
|
|
749
749
|
}
|
|
750
750
|
value;
|
|
751
751
|
constructor(value) {
|
|
752
|
-
this.value =
|
|
752
|
+
this.value = new ObjectId(value);
|
|
753
753
|
}
|
|
754
754
|
toString() {
|
|
755
|
-
return this.value;
|
|
755
|
+
return this.value.toString();
|
|
756
756
|
}
|
|
757
757
|
toValue() {
|
|
758
|
-
return this.value;
|
|
758
|
+
return this.value.toString();
|
|
759
759
|
}
|
|
760
760
|
equals(id) {
|
|
761
761
|
return id.toValue() === this.toValue();
|
|
762
762
|
}
|
|
763
763
|
};
|
|
764
764
|
|
|
765
|
-
// src/core/entities/entity.ts
|
|
766
|
-
var
|
|
765
|
+
// src/core/entities/entity-object.ts
|
|
766
|
+
var EntityObject = class {
|
|
767
767
|
static {
|
|
768
|
-
__name(this, "
|
|
768
|
+
__name(this, "EntityObject");
|
|
769
769
|
}
|
|
770
770
|
_id;
|
|
771
771
|
props;
|
|
@@ -788,7 +788,7 @@ var Entity = class {
|
|
|
788
788
|
this.props.updatedAt = /* @__PURE__ */ new Date();
|
|
789
789
|
}
|
|
790
790
|
constructor(props, id) {
|
|
791
|
-
this._id = id ?? new
|
|
791
|
+
this._id = id ?? new UniqueObjectUniqueId(id);
|
|
792
792
|
this.props = props;
|
|
793
793
|
}
|
|
794
794
|
equals(entity) {
|
|
@@ -802,38 +802,38 @@ var Entity = class {
|
|
|
802
802
|
}
|
|
803
803
|
};
|
|
804
804
|
|
|
805
|
-
// src/core/entities/aggregate-root.ts
|
|
806
|
-
var
|
|
805
|
+
// src/core/entities/aggregate-object-root.ts
|
|
806
|
+
var AggregateObjectRoot = class extends EntityObject {
|
|
807
807
|
static {
|
|
808
|
-
__name(this, "
|
|
808
|
+
__name(this, "AggregateObjectRoot");
|
|
809
809
|
}
|
|
810
810
|
};
|
|
811
811
|
|
|
812
|
-
// src/core/entities/
|
|
813
|
-
import {
|
|
814
|
-
var
|
|
812
|
+
// src/core/entities/unique-entity-id.ts
|
|
813
|
+
import { randomUUID } from "crypto";
|
|
814
|
+
var UniqueEntityId = class {
|
|
815
815
|
static {
|
|
816
|
-
__name(this, "
|
|
816
|
+
__name(this, "UniqueEntityId");
|
|
817
817
|
}
|
|
818
818
|
value;
|
|
819
819
|
constructor(value) {
|
|
820
|
-
this.value =
|
|
820
|
+
this.value = value ?? randomUUID();
|
|
821
821
|
}
|
|
822
822
|
toString() {
|
|
823
|
-
return this.value
|
|
823
|
+
return this.value;
|
|
824
824
|
}
|
|
825
825
|
toValue() {
|
|
826
|
-
return this.value
|
|
826
|
+
return this.value;
|
|
827
827
|
}
|
|
828
828
|
equals(id) {
|
|
829
829
|
return id.toValue() === this.toValue();
|
|
830
830
|
}
|
|
831
831
|
};
|
|
832
832
|
|
|
833
|
-
// src/core/entities/entity
|
|
834
|
-
var
|
|
833
|
+
// src/core/entities/entity.ts
|
|
834
|
+
var Entity = class {
|
|
835
835
|
static {
|
|
836
|
-
__name(this, "
|
|
836
|
+
__name(this, "Entity");
|
|
837
837
|
}
|
|
838
838
|
_id;
|
|
839
839
|
props;
|
|
@@ -843,8 +843,20 @@ var EntityObject = class {
|
|
|
843
843
|
set id(id) {
|
|
844
844
|
this._id = id;
|
|
845
845
|
}
|
|
846
|
+
get createdAt() {
|
|
847
|
+
return this.props.createdAt;
|
|
848
|
+
}
|
|
849
|
+
set createdAt(date) {
|
|
850
|
+
this.props.createdAt = date;
|
|
851
|
+
}
|
|
852
|
+
get updatedAt() {
|
|
853
|
+
return this.props.updatedAt;
|
|
854
|
+
}
|
|
855
|
+
touch() {
|
|
856
|
+
this.props.updatedAt = /* @__PURE__ */ new Date();
|
|
857
|
+
}
|
|
846
858
|
constructor(props, id) {
|
|
847
|
-
this._id = id ?? new
|
|
859
|
+
this._id = id ?? new UniqueEntityId(id);
|
|
848
860
|
this.props = props;
|
|
849
861
|
}
|
|
850
862
|
equals(entity) {
|
|
@@ -858,6 +870,13 @@ var EntityObject = class {
|
|
|
858
870
|
}
|
|
859
871
|
};
|
|
860
872
|
|
|
873
|
+
// src/core/entities/aggregate-root.ts
|
|
874
|
+
var AggregateRoot = class extends Entity {
|
|
875
|
+
static {
|
|
876
|
+
__name(this, "AggregateRoot");
|
|
877
|
+
}
|
|
878
|
+
};
|
|
879
|
+
|
|
861
880
|
// src/core/entities/value-object.ts
|
|
862
881
|
var ValueObject = class {
|
|
863
882
|
static {
|
|
@@ -1464,6 +1483,7 @@ var baseEnvSchema = z.object({
|
|
|
1464
1483
|
DISCORD_WEBHOOK_URL: z.string().optional()
|
|
1465
1484
|
});
|
|
1466
1485
|
export {
|
|
1486
|
+
AggregateObjectRoot,
|
|
1467
1487
|
AggregateRoot,
|
|
1468
1488
|
BaseController,
|
|
1469
1489
|
Controller,
|
|
@@ -1479,6 +1499,7 @@ export {
|
|
|
1479
1499
|
NotificationFactory,
|
|
1480
1500
|
SentryNotifier,
|
|
1481
1501
|
UniqueEntityId,
|
|
1502
|
+
UniqueObjectUniqueId,
|
|
1482
1503
|
ValueObject,
|
|
1483
1504
|
WatchedList,
|
|
1484
1505
|
baseEnvSchema,
|
package/dist/index.mjs.map
CHANGED
|
@@ -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/object-id.ts","../src/core/entities/entity-object.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","import { ObjectId } from 'bson'\n\nexport default class ObjectUniqueId {\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: ObjectUniqueId) {\n return id.toValue() === this.toValue()\n }\n}\n","import type { CommonDTO } from './common-dto'\nimport ObjectUniqueId from './object-id'\n\ntype PropsWithCommonDTO<Props> = Props & CommonDTO\n\nexport abstract class EntityObject<Props> {\n private _id: ObjectUniqueId\n protected props: PropsWithCommonDTO<Props>\n\n get id() {\n return this._id\n }\n\n set id(id: ObjectUniqueId) {\n this._id = id\n }\n\n protected constructor(props: PropsWithCommonDTO<Props>, id?: ObjectUniqueId) {\n this._id = id ?? new ObjectUniqueId(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","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","ObjectId","ObjectUniqueId","value","constructor","ObjectId","toString","toValue","equals","id","EntityObject","_id","props","id","ObjectUniqueId","equals","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 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(\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","createdAt","date","updatedAt","touch","Date","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"]}
|