Config: New config and store classes to replace the mongo method
This commit is contained in:
		
							parent
							
								
									7c0d9c0193
								
							
						
					
					
						commit
						c06527c073
					
				
							
								
								
									
										139
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										139
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| @ -13,6 +13,9 @@ | ||||
| 				"@types/mongoose-autopopulate": "^0.10.1", | ||||
| 				"@types/mongoose-lean-virtuals": "^0.5.1", | ||||
| 				"@types/node": "^14.14.25", | ||||
| 				"ajv": "^8.5.0", | ||||
| 				"dot-prop": "^6.0.1", | ||||
| 				"env-paths": "^2.2.1", | ||||
| 				"jsonwebtoken": "^8.5.1", | ||||
| 				"missing-native-js-functions": "^1.2.2", | ||||
| 				"mongodb": "^3.6.6", | ||||
| @ -76,6 +79,21 @@ | ||||
| 			"resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.25.tgz", | ||||
| 			"integrity": "sha512-EPpXLOVqDvisVxtlbvzfyqSsFeQxltFbluZNRndIb8tr9KiBnYNLzrc1N3pyKUCww2RNrfHDViqDWWE1LCJQtQ==" | ||||
| 		}, | ||||
| 		"node_modules/ajv": { | ||||
| 			"version": "8.5.0", | ||||
| 			"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.5.0.tgz", | ||||
| 			"integrity": "sha512-Y2l399Tt1AguU3BPRP9Fn4eN+Or+StUGWCUpbnFyXSo8NZ9S4uj+AG2pjs5apK+ZMOwYOz1+a+VKvKH7CudXgQ==", | ||||
| 			"dependencies": { | ||||
| 				"fast-deep-equal": "^3.1.1", | ||||
| 				"json-schema-traverse": "^1.0.0", | ||||
| 				"require-from-string": "^2.0.2", | ||||
| 				"uri-js": "^4.2.2" | ||||
| 			}, | ||||
| 			"funding": { | ||||
| 				"type": "github", | ||||
| 				"url": "https://github.com/sponsors/epoberezkin" | ||||
| 			} | ||||
| 		}, | ||||
| 		"node_modules/bl": { | ||||
| 			"version": "2.2.1", | ||||
| 			"resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", | ||||
| @ -116,6 +134,20 @@ | ||||
| 				"node": ">=0.10" | ||||
| 			} | ||||
| 		}, | ||||
| 		"node_modules/dot-prop": { | ||||
| 			"version": "6.0.1", | ||||
| 			"resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", | ||||
| 			"integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", | ||||
| 			"dependencies": { | ||||
| 				"is-obj": "^2.0.0" | ||||
| 			}, | ||||
| 			"engines": { | ||||
| 				"node": ">=10" | ||||
| 			}, | ||||
| 			"funding": { | ||||
| 				"url": "https://github.com/sponsors/sindresorhus" | ||||
| 			} | ||||
| 		}, | ||||
| 		"node_modules/ecdsa-sig-formatter": { | ||||
| 			"version": "1.0.11", | ||||
| 			"resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", | ||||
| @ -124,16 +156,42 @@ | ||||
| 				"safe-buffer": "^5.0.1" | ||||
| 			} | ||||
| 		}, | ||||
| 		"node_modules/env-paths": { | ||||
| 			"version": "2.2.1", | ||||
| 			"resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", | ||||
| 			"integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", | ||||
| 			"engines": { | ||||
| 				"node": ">=6" | ||||
| 			} | ||||
| 		}, | ||||
| 		"node_modules/fast-deep-equal": { | ||||
| 			"version": "3.1.3", | ||||
| 			"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", | ||||
| 			"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" | ||||
| 		}, | ||||
| 		"node_modules/inherits": { | ||||
| 			"version": "2.0.4", | ||||
| 			"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", | ||||
| 			"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" | ||||
| 		}, | ||||
| 		"node_modules/is-obj": { | ||||
| 			"version": "2.0.0", | ||||
| 			"resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", | ||||
| 			"integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", | ||||
| 			"engines": { | ||||
| 				"node": ">=8" | ||||
| 			} | ||||
| 		}, | ||||
| 		"node_modules/isarray": { | ||||
| 			"version": "1.0.0", | ||||
| 			"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", | ||||
| 			"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" | ||||
| 		}, | ||||
| 		"node_modules/json-schema-traverse": { | ||||
| 			"version": "1.0.0", | ||||
| 			"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", | ||||
| 			"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" | ||||
| 		}, | ||||
| 		"node_modules/jsonwebtoken": { | ||||
| 			"version": "8.5.1", | ||||
| 			"resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", | ||||
| @ -352,6 +410,14 @@ | ||||
| 			"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", | ||||
| 			"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" | ||||
| 		}, | ||||
| 		"node_modules/punycode": { | ||||
| 			"version": "2.1.1", | ||||
| 			"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", | ||||
| 			"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", | ||||
| 			"engines": { | ||||
| 				"node": ">=6" | ||||
| 			} | ||||
| 		}, | ||||
| 		"node_modules/readable-stream": { | ||||
| 			"version": "2.3.7", | ||||
| 			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", | ||||
| @ -385,6 +451,14 @@ | ||||
| 				"semver": "^5.1.0" | ||||
| 			} | ||||
| 		}, | ||||
| 		"node_modules/require-from-string": { | ||||
| 			"version": "2.0.2", | ||||
| 			"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", | ||||
| 			"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", | ||||
| 			"engines": { | ||||
| 				"node": ">=0.10.0" | ||||
| 			} | ||||
| 		}, | ||||
| 		"node_modules/resolve-from": { | ||||
| 			"version": "2.0.0", | ||||
| 			"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", | ||||
| @ -462,6 +536,14 @@ | ||||
| 				"node": ">=4.2.0" | ||||
| 			} | ||||
| 		}, | ||||
| 		"node_modules/uri-js": { | ||||
| 			"version": "4.4.1", | ||||
| 			"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", | ||||
| 			"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", | ||||
| 			"dependencies": { | ||||
| 				"punycode": "^2.1.0" | ||||
| 			} | ||||
| 		}, | ||||
| 		"node_modules/util-deprecate": { | ||||
| 			"version": "1.0.2", | ||||
| 			"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", | ||||
| @ -524,6 +606,17 @@ | ||||
| 			"resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.25.tgz", | ||||
| 			"integrity": "sha512-EPpXLOVqDvisVxtlbvzfyqSsFeQxltFbluZNRndIb8tr9KiBnYNLzrc1N3pyKUCww2RNrfHDViqDWWE1LCJQtQ==" | ||||
| 		}, | ||||
| 		"ajv": { | ||||
| 			"version": "8.5.0", | ||||
| 			"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.5.0.tgz", | ||||
| 			"integrity": "sha512-Y2l399Tt1AguU3BPRP9Fn4eN+Or+StUGWCUpbnFyXSo8NZ9S4uj+AG2pjs5apK+ZMOwYOz1+a+VKvKH7CudXgQ==", | ||||
| 			"requires": { | ||||
| 				"fast-deep-equal": "^3.1.1", | ||||
| 				"json-schema-traverse": "^1.0.0", | ||||
| 				"require-from-string": "^2.0.2", | ||||
| 				"uri-js": "^4.2.2" | ||||
| 			} | ||||
| 		}, | ||||
| 		"bl": { | ||||
| 			"version": "2.2.1", | ||||
| 			"resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", | ||||
| @ -558,6 +651,14 @@ | ||||
| 			"resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", | ||||
| 			"integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==" | ||||
| 		}, | ||||
| 		"dot-prop": { | ||||
| 			"version": "6.0.1", | ||||
| 			"resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", | ||||
| 			"integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", | ||||
| 			"requires": { | ||||
| 				"is-obj": "^2.0.0" | ||||
| 			} | ||||
| 		}, | ||||
| 		"ecdsa-sig-formatter": { | ||||
| 			"version": "1.0.11", | ||||
| 			"resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", | ||||
| @ -566,16 +667,36 @@ | ||||
| 				"safe-buffer": "^5.0.1" | ||||
| 			} | ||||
| 		}, | ||||
| 		"env-paths": { | ||||
| 			"version": "2.2.1", | ||||
| 			"resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", | ||||
| 			"integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" | ||||
| 		}, | ||||
| 		"fast-deep-equal": { | ||||
| 			"version": "3.1.3", | ||||
| 			"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", | ||||
| 			"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" | ||||
| 		}, | ||||
| 		"inherits": { | ||||
| 			"version": "2.0.4", | ||||
| 			"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", | ||||
| 			"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" | ||||
| 		}, | ||||
| 		"is-obj": { | ||||
| 			"version": "2.0.0", | ||||
| 			"resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", | ||||
| 			"integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" | ||||
| 		}, | ||||
| 		"isarray": { | ||||
| 			"version": "1.0.0", | ||||
| 			"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", | ||||
| 			"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" | ||||
| 		}, | ||||
| 		"json-schema-traverse": { | ||||
| 			"version": "1.0.0", | ||||
| 			"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", | ||||
| 			"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" | ||||
| 		}, | ||||
| 		"jsonwebtoken": { | ||||
| 			"version": "8.5.1", | ||||
| 			"resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", | ||||
| @ -772,6 +893,11 @@ | ||||
| 			"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", | ||||
| 			"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" | ||||
| 		}, | ||||
| 		"punycode": { | ||||
| 			"version": "2.1.1", | ||||
| 			"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", | ||||
| 			"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" | ||||
| 		}, | ||||
| 		"readable-stream": { | ||||
| 			"version": "2.3.7", | ||||
| 			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", | ||||
| @ -807,6 +933,11 @@ | ||||
| 				"semver": "^5.1.0" | ||||
| 			} | ||||
| 		}, | ||||
| 		"require-from-string": { | ||||
| 			"version": "2.0.2", | ||||
| 			"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", | ||||
| 			"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" | ||||
| 		}, | ||||
| 		"resolve-from": { | ||||
| 			"version": "2.0.0", | ||||
| 			"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", | ||||
| @ -870,6 +1001,14 @@ | ||||
| 			"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.3.tgz", | ||||
| 			"integrity": "sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==" | ||||
| 		}, | ||||
| 		"uri-js": { | ||||
| 			"version": "4.4.1", | ||||
| 			"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", | ||||
| 			"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", | ||||
| 			"requires": { | ||||
| 				"punycode": "^2.1.0" | ||||
| 			} | ||||
| 		}, | ||||
| 		"util-deprecate": { | ||||
| 			"version": "1.0.2", | ||||
| 			"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", | ||||
|  | ||||
| @ -30,6 +30,9 @@ | ||||
| 		"@types/mongoose-autopopulate": "^0.10.1", | ||||
| 		"@types/mongoose-lean-virtuals": "^0.5.1", | ||||
| 		"@types/node": "^14.14.25", | ||||
| 		"ajv": "^8.5.0", | ||||
| 		"dot-prop": "^6.0.1", | ||||
| 		"env-paths": "^2.2.1", | ||||
| 		"jsonwebtoken": "^8.5.1", | ||||
| 		"missing-native-js-functions": "^1.2.2", | ||||
| 		"mongodb": "^3.6.6", | ||||
|  | ||||
| @ -1,38 +1,113 @@ | ||||
| import { Schema, model, Types, Document } from "mongoose"; | ||||
| import "missing-native-js-functions"; | ||||
| import db, { MongooseCache } from "./Database"; | ||||
| import envPaths from "env-paths"; | ||||
| import path from "path"; | ||||
| import { JSONSchemaType, ValidateFunction } from "ajv" | ||||
| import fs from 'fs' | ||||
| import dotProp from "dot-prop"; | ||||
| 
 | ||||
| var Config = new MongooseCache(db.collection("config"), [], { onlyEvents: false }); | ||||
| 
 | ||||
| export default { | ||||
| 	init: async function init(defaultOpts: any = DefaultOptions) { | ||||
| 		await Config.init(); | ||||
| 		return this.setAll(Config.data.merge(defaultOpts)); | ||||
| 	}, | ||||
| 	getAll: function get() { | ||||
| 		return <DefaultOptions>Config.data; | ||||
| 	}, | ||||
| 	setAll: function set(val: any) { | ||||
| 		return db.collection("config").updateOne({}, { $set: val }, { upsert: true }); | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| export const DefaultOptions = { | ||||
| 	api: {}, | ||||
| 	gateway: {}, | ||||
| 	voice: {}, | ||||
| }; | ||||
| 
 | ||||
| export interface DefaultOptions extends Document { | ||||
| 	api?: any; | ||||
| 	gateway?: any; | ||||
| 	voice?: any; | ||||
| interface Options<T> { | ||||
| 	path: string; | ||||
| 	schemaValidator: ValidateFunction; | ||||
| 	schema: JSONSchemaType<T>; | ||||
| } | ||||
| 
 | ||||
| export const ConfigSchema = new Schema({ | ||||
| 	api: Object, | ||||
| 	gateway: Object, | ||||
| 	voice: Object, | ||||
| }); | ||||
| type Deserialize<T> = (text: string) => T; | ||||
| 
 | ||||
| function getConfigPath(name: string, configFileName: string, extension: string): string { | ||||
| 	const configEnvPath = envPaths(name, { suffix: "" }).config; | ||||
| 	const configPath = path.resolve(configEnvPath, `${configFileName}${extension}`) | ||||
| 	return configPath | ||||
| } | ||||
| 
 | ||||
| class Store<T extends Record<string, any> = Record<string, unknown>> implements Iterable<[keyof T, T[keyof T]]>{ | ||||
| 	readonly path: string; | ||||
| 	readonly validator: ValidateFunction; | ||||
| 	readonly schema: string; | ||||
| 
 | ||||
| 	constructor(path: string, validator: ValidateFunction, schema: JSONSchemaType<T>) { | ||||
| 		this.validator = validator; | ||||
| 		if (fs.existsSync(path)) { | ||||
| 			this.path = path | ||||
| 		} else { | ||||
| 			this._ensureDirectory() | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	private readonly _deserialize: Deserialize<T> = value => JSON.parse(value); | ||||
| 
 | ||||
| 	private _ensureDirectory(): void { | ||||
| 		fs.mkdirSync(path.dirname(this.path), { recursive: true }) | ||||
| 	} | ||||
| 
 | ||||
| 	protected _validate(data: T | unknown): void { | ||||
| 		const valid = this.validator(data); | ||||
| 		if (valid || !this.validator.errors) { | ||||
| 			return; | ||||
| 		} | ||||
| 
 | ||||
| 		const errors = this.validator.errors.map(({ instancePath, message = '' }) => `\`${instancePath.slice(1)}\` ${message}`); | ||||
| 		throw new Error("The configuration schema was violated!: " + errors.join('; ')) | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| 	*[Symbol.iterator](): IterableIterator<[keyof T, T[keyof T]]> { | ||||
| 		for (const [key, value] of Object.entries(this.store)) { | ||||
| 			yield [key, value] | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	public get store(): T { | ||||
| 		try { | ||||
| 			const data = fs.readFileSync(this.path).toString(); | ||||
| 			const deserializedData = this._deserialize(data); | ||||
| 			this._validate(deserializedData); | ||||
| 			return Object.assign(Object.create(null), deserializedData); | ||||
| 		} catch (error) { | ||||
| 			if (error == 'ENOENT') { | ||||
| 				this._ensureDirectory(); | ||||
| 				throw new Error("Critical, config store does not exist, the base directory has been created, copy the necessary config files to the directory"); | ||||
| 			} | ||||
| 
 | ||||
| 			throw error; | ||||
| 		} | ||||
| 
 | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| class Config<T extends Record<string, any> = Record<string, unknown>> extends Store<T> implements Iterable<[keyof T, T[keyof T]]> { | ||||
| 	constructor(options: Readonly<Partial<Options<T>>>) { | ||||
| 		super(options.path!, options.schemaValidator!, options.schema!); | ||||
| 
 | ||||
| 		this._validate(this.store); | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| 	public get<Key extends keyof T>(key: Key): T[Key]; | ||||
| 	public get<Key extends keyof T>(key: Key, defaultValue: Required<T>[Key]): Required<T>[Key]; | ||||
| 	public get<Key extends string, Value = unknown>(key: Exclude<Key, keyof T>, defaultValue?: Value): Value; | ||||
| 	public get(key: string, defaultValue?: unknown): unknown { | ||||
| 		return this._get(key, defaultValue); | ||||
| 	} | ||||
| 
 | ||||
| 	public getAll(): unknown { | ||||
| 		return this.store as unknown; | ||||
| 	} | ||||
| 
 | ||||
| 	private _has<Key extends keyof T>(key: Key | string): boolean { | ||||
| 		return dotProp.has(this.store, key as string); | ||||
| 	} | ||||
| 
 | ||||
| 	private _get<Key extends keyof T>(key: Key): T[Key] | undefined; | ||||
| 	private _get<Key extends keyof T, Default = unknown>(key: Key, defaultValue: Default): T[Key] | Default; | ||||
| 	private _get<Key extends keyof T, Default = unknown>(key: Key | string, defaultValue?: Default): Default | undefined { | ||||
| 		if (!this._has(key)) { | ||||
| 			throw new Error("Tried to acess a non existant property in the config"); | ||||
| 		} | ||||
| 
 | ||||
| 		return dotProp.get<T[Key] | undefined>(this.store, key as string, defaultValue as T[Key]); | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| export default Config; | ||||
| 
 | ||||
| export const ConfigModel = model<DefaultOptions>("Config", ConfigSchema, "config"); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Diego Magdaleno
						Diego Magdaleno