UNPKG

13.9 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const tslib_1 = require("tslib");
4const fs = tslib_1.__importStar(require("fs-extra"));
5const path = tslib_1.__importStar(require("path"));
6const rxjs_1 = require("rxjs");
7const operators_1 = require("rxjs/operators");
8const seamless_immutable_1 = tslib_1.__importDefault(require("seamless-immutable"));
9const watchConfig$ = (file) => rxjs_1.Observable.create((observer) => {
10 // import('chokidar').FSWatcher
11 // tslint:disable-next-line no-any
12 let watcher;
13 let closed = false;
14 Promise.resolve().then(() => tslib_1.__importStar(require('chokidar'))).then((chokidar) => {
15 if (!closed) {
16 watcher = chokidar.watch(file, { ignoreInitial: false });
17 watcher.on('add', () => {
18 observer.next('change');
19 });
20 watcher.on('change', () => {
21 observer.next('change');
22 });
23 watcher.on('error', (error) => {
24 observer.error(error);
25 });
26 watcher.on('unlink', () => {
27 observer.error(new Error('Configuration file deleted.'));
28 });
29 }
30 })
31 .catch((error) => observer.error(error));
32 return () => {
33 closed = true;
34 if (watcher !== undefined) {
35 watcher.close();
36 }
37 };
38});
39class Config {
40 constructor({ name: configName, defaultConfig, schema, configPath, }) {
41 this.configPath = path.resolve(configPath, `${configName}.json`);
42 this.defaultConfig = defaultConfig;
43 this.schema = schema;
44 this.config$ = rxjs_1.defer(async () => this.getConfig()).pipe(operators_1.switchMap((config) => watchConfig$(this.configPath).pipe(operators_1.mergeScan((prevConfig) => rxjs_1.defer(async () => this.getConfig({ config: prevConfig })), config, 1))), operators_1.distinctUntilChanged());
45 }
46 async update({ config }) {
47 await this.validate(config);
48 await fs.ensureDir(path.dirname(this.configPath));
49 await fs.writeFile(this.configPath, JSON.stringify(config));
50 return config;
51 }
52 async getConfig({ config = this.defaultConfig } = {}) {
53 let contents;
54 try {
55 contents = await fs.readFile(this.configPath, 'utf8');
56 }
57 catch (error) {
58 if (error.code === 'ENOENT') {
59 return this.update({ config });
60 }
61 throw error;
62 }
63 const currentConfig = JSON.parse(contents);
64 await this.validate(currentConfig);
65 if (config !== undefined) {
66 // tslint:disable-next-line no-any
67 return seamless_immutable_1.default.merge(config, currentConfig, {
68 deep: true,
69 });
70 }
71 return currentConfig;
72 }
73 async validate(config) {
74 const validateConfig = await this.getValidateConfig();
75 const isValid = validateConfig(config);
76 if (!isValid) {
77 const error = new Error('Invalid config');
78 // tslint:disable-next-line no-object-mutation no-any
79 error.errors = validateConfig.errors;
80 throw error;
81 }
82 }
83 // Promise<import('ajv').ValidateFunction>
84 // tslint:disable-next-line no-any
85 async getValidateConfig() {
86 if (this.mutableValidateConfig !== undefined) {
87 return this.mutableValidateConfig;
88 }
89 const ajv = await Promise.resolve().then(() => tslib_1.__importStar(require('ajv')));
90 // tslint:disable-next-line no-any
91 const validateConfig = new ajv.default().compile(this.schema);
92 this.mutableValidateConfig = validateConfig;
93 return validateConfig;
94 }
95}
96exports.Config = Config;
97
98//# sourceMappingURL=data:application/json;charset=utf8;base64,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QyxNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3RELE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1osTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUMxQyxxREFBcUQ7WUFDcEQsS0FBYSxDQUFDLE1BQU0sR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDO1lBQzlDLE1BQU0sS0FBSyxDQUFDO1NBQ2I7SUFDSCxDQUFDO0lBRUQsMENBQTBDO0lBQzFDLGtDQUFrQztJQUMxQixLQUFLLENBQUMsaUJBQWlCO1FBQzdCLElBQUksSUFBSSxDQUFDLHFCQUFxQixLQUFLLFNBQVMsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztTQUNuQztRQUVELE1BQU0sR0FBRyxHQUFHLGdFQUFhLEtBQUssR0FBQyxDQUFDO1FBQ2hDLGtDQUFrQztRQUNsQyxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxjQUFjLENBQUM7UUFFNUMsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQztDQUNGO0FBN0ZELHdCQTZGQyIsImZpbGUiOiJuZW8tb25lLXNlcnZlci1wbHVnaW4vc3JjL0NvbmZpZy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBkZWZlciwgT2JzZXJ2YWJsZSwgT2JzZXJ2ZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtZXJnZVNjYW4sIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCBTZWFtbGVzc0ltbXV0YWJsZSBmcm9tICdzZWFtbGVzcy1pbW11dGFibGUnO1xuXG50eXBlIEV2ZW50ID0gJ2NoYW5nZSc7XG5cbmNvbnN0IHdhdGNoQ29uZmlnJCA9IChmaWxlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEV2ZW50PiA9PlxuICBPYnNlcnZhYmxlLmNyZWF0ZSgob2JzZXJ2ZXI6IE9ic2VydmVyPHN0cmluZz4pID0+IHtcbiAgICAvLyBpbXBvcnQoJ2Nob2tpZGFyJykuRlNXYXRjaGVyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueVxuICAgIGxldCB3YXRjaGVyOiBhbnkgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGNsb3NlZCA9IGZhbHNlO1xuICAgIGltcG9ydCgnY2hva2lkYXInKVxuICAgICAgLnRoZW4oKGNob2tpZGFyKSA9PiB7XG4gICAgICAgIGlmICghY2xvc2VkKSB7XG4gICAgICAgICAgd2F0Y2hlciA9IGNob2tpZGFyLndhdGNoKGZpbGUsIHsgaWdub3JlSW5pdGlhbDogZmFsc2UgfSk7XG4gICAgICAgICAgd2F0Y2hlci5vbignYWRkJywgKCkgPT4ge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCgnY2hhbmdlJyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgd2F0Y2hlci5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCgnY2hhbmdlJyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgd2F0Y2hlci5vbignZXJyb3InLCAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgd2F0Y2hlci5vbigndW5saW5rJywgKCkgPT4ge1xuICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IobmV3IEVycm9yKCdDb25maWd1cmF0aW9uIGZpbGUgZGVsZXRlZC4nKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiBvYnNlcnZlci5lcnJvcihlcnJvcikpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNsb3NlZCA9IHRydWU7XG4gICAgICBpZiAod2F0Y2hlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHdhdGNoZXIuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9KTtcblxuZXhwb3J0IGNsYXNzIENvbmZpZzxUQ29uZmlnIGV4dGVuZHMgb2JqZWN0PiB7XG4gIHB1YmxpYyByZWFkb25seSBjb25maWckOiBPYnNlcnZhYmxlPFRDb25maWc+O1xuICBwdWJsaWMgcmVhZG9ubHkgY29uZmlnUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRDb25maWc6IFRDb25maWc7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1hbnlcbiAgcHJpdmF0ZSByZWFkb25seSBzY2hlbWE6IGFueTtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueVxuICBwcml2YXRlIG11dGFibGVWYWxpZGF0ZUNvbmZpZzogYW55O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih7XG4gICAgbmFtZTogY29uZmlnTmFtZSxcbiAgICBkZWZhdWx0Q29uZmlnLFxuICAgIHNjaGVtYSxcbiAgICBjb25maWdQYXRoLFxuICB9OiB7XG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGRlZmF1bHRDb25maWc6IFRDb25maWc7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueVxuICAgIHJlYWRvbmx5IHNjaGVtYTogYW55O1xuICAgIHJlYWRvbmx5IGNvbmZpZ1BhdGg6IHN0cmluZztcbiAgfSkge1xuICAgIHRoaXMuY29uZmlnUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWdQYXRoLCBgJHtjb25maWdOYW1lfS5qc29uYCk7XG4gICAgdGhpcy5kZWZhdWx0Q29uZmlnID0gZGVmYXVsdENvbmZpZztcbiAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICB0aGlzLmNvbmZpZyQgPSBkZWZlcihhc3luYyAoKSA9PiB0aGlzLmdldENvbmZpZygpKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKChjb25maWcpID0+XG4gICAgICAgIHdhdGNoQ29uZmlnJCh0aGlzLmNvbmZpZ1BhdGgpLnBpcGUoXG4gICAgICAgICAgbWVyZ2VTY2FuKChwcmV2Q29uZmlnKSA9PiBkZWZlcihhc3luYyAoKSA9PiB0aGlzLmdldENvbmZpZyh7IGNvbmZpZzogcHJldkNvbmZpZyB9KSksIGNvbmZpZywgMSksXG4gICAgICAgICksXG4gICAgICApLFxuXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgdXBkYXRlKHsgY29uZmlnIH06IHsgcmVhZG9ubHkgY29uZmlnOiBUQ29uZmlnIH0pOiBQcm9taXNlPFRDb25maWc+IHtcbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlKGNvbmZpZyk7XG4gICAgYXdhaXQgZnMuZW5zdXJlRGlyKHBhdGguZGlybmFtZSh0aGlzLmNvbmZpZ1BhdGgpKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUodGhpcy5jb25maWdQYXRoLCBKU09OLnN0cmluZ2lmeShjb25maWcpKTtcblxuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldENvbmZpZyh7IGNvbmZpZyA9IHRoaXMuZGVmYXVsdENvbmZpZyB9OiB7IHJlYWRvbmx5IGNvbmZpZz86IFRDb25maWcgfSA9IHt9KTogUHJvbWlzZTxUQ29uZmlnPiB7XG4gICAgbGV0IGNvbnRlbnRzO1xuICAgIHRyeSB7XG4gICAgICBjb250ZW50cyA9IGF3YWl0IGZzLnJlYWRGaWxlKHRoaXMuY29uZmlnUGF0aCwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZSh7IGNvbmZpZyB9KTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudENvbmZpZyA9IEpTT04ucGFyc2UoY29udGVudHMpO1xuICAgIGF3YWl0IHRoaXMudmFsaWRhdGUoY3VycmVudENvbmZpZyk7XG5cbiAgICBpZiAoY29uZmlnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1hbnlcbiAgICAgIHJldHVybiAoU2VhbWxlc3NJbW11dGFibGUgYXMgYW55KS5tZXJnZShjb25maWcsIGN1cnJlbnRDb25maWcsIHtcbiAgICAgICAgZGVlcDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50Q29uZmlnO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZShjb25maWc6IFRDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2YWxpZGF0ZUNvbmZpZyA9IGF3YWl0IHRoaXMuZ2V0VmFsaWRhdGVDb25maWcoKTtcbiAgICBjb25zdCBpc1ZhbGlkID0gdmFsaWRhdGVDb25maWcoY29uZmlnKTtcbiAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdJbnZhbGlkIGNvbmZpZycpO1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLW9iamVjdC1tdXRhdGlvbiBuby1hbnlcbiAgICAgIChlcnJvciBhcyBhbnkpLmVycm9ycyA9IHZhbGlkYXRlQ29uZmlnLmVycm9ycztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8vIFByb21pc2U8aW1wb3J0KCdhanYnKS5WYWxpZGF0ZUZ1bmN0aW9uPlxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tYW55XG4gIHByaXZhdGUgYXN5bmMgZ2V0VmFsaWRhdGVDb25maWcoKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAodGhpcy5tdXRhYmxlVmFsaWRhdGVDb25maWcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMubXV0YWJsZVZhbGlkYXRlQ29uZmlnO1xuICAgIH1cblxuICAgIGNvbnN0IGFqdiA9IGF3YWl0IGltcG9ydCgnYWp2Jyk7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueVxuICAgIGNvbnN0IHZhbGlkYXRlQ29uZmlnID0gbmV3IGFqdi5kZWZhdWx0KCkuY29tcGlsZSh0aGlzLnNjaGVtYSk7XG4gICAgdGhpcy5tdXRhYmxlVmFsaWRhdGVDb25maWcgPSB2YWxpZGF0ZUNvbmZpZztcblxuICAgIHJldHVybiB2YWxpZGF0ZUNvbmZpZztcbiAgfVxufVxuIl19