1 | ;
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const tslib_1 = require("tslib");
|
4 | const fs = tslib_1.__importStar(require("fs-extra"));
|
5 | const path = tslib_1.__importStar(require("path"));
|
6 | const rxjs_1 = require("rxjs");
|
7 | const operators_1 = require("rxjs/operators");
|
8 | const seamless_immutable_1 = tslib_1.__importDefault(require("seamless-immutable"));
|
9 | const 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 | });
|
39 | class 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 | }
|
96 | exports.Config = Config;
|
97 |
|
98 | //# sourceMappingURL=data:application/json;charset=utf8;base64,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QyxNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3RELE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1osTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUMxQyxxREFBcUQ7WUFDcEQsS0FBYSxDQUFDLE1BQU0sR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDO1lBQzlDLE1BQU0sS0FBSyxDQUFDO1NBQ2I7SUFDSCxDQUFDO0lBRUQsMENBQTBDO0lBQzFDLGtDQUFrQztJQUMxQixLQUFLLENBQUMsaUJBQWlCO1FBQzdCLElBQUksSUFBSSxDQUFDLHFCQUFxQixLQUFLLFNBQVMsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztTQUNuQztRQUVELE1BQU0sR0FBRyxHQUFHLGdFQUFhLEtBQUssR0FBQyxDQUFDO1FBQ2hDLGtDQUFrQztRQUNsQyxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxjQUFjLENBQUM7UUFFNUMsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQztDQUNGO0FBN0ZELHdCQTZGQyIsImZpbGUiOiJuZW8tb25lLXNlcnZlci1wbHVnaW4vc3JjL0NvbmZpZy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBkZWZlciwgT2JzZXJ2YWJsZSwgT2JzZXJ2ZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtZXJnZVNjYW4sIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCBTZWFtbGVzc0ltbXV0YWJsZSBmcm9tICdzZWFtbGVzcy1pbW11dGFibGUnO1xuXG50eXBlIEV2ZW50ID0gJ2NoYW5nZSc7XG5cbmNvbnN0IHdhdGNoQ29uZmlnJCA9IChmaWxlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEV2ZW50PiA9PlxuICBPYnNlcnZhYmxlLmNyZWF0ZSgob2JzZXJ2ZXI6IE9ic2VydmVyPHN0cmluZz4pID0+IHtcbiAgICAvLyBpbXBvcnQoJ2Nob2tpZGFyJykuRlNXYXRjaGVyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueVxuICAgIGxldCB3YXRjaGVyOiBhbnkgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGNsb3NlZCA9IGZhbHNlO1xuICAgIGltcG9ydCgnY2hva2lkYXInKVxuICAgICAgLnRoZW4oKGNob2tpZGFyKSA9PiB7XG4gICAgICAgIGlmICghY2xvc2VkKSB7XG4gICAgICAgICAgd2F0Y2hlciA9IGNob2tpZGFyLndhdGNoKGZpbGUsIHsgaWdub3JlSW5pdGlhbDogZmFsc2UgfSk7XG4gICAgICAgICAgd2F0Y2hlci5vbignYWRkJywgKCkgPT4ge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCgnY2hhbmdlJyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgd2F0Y2hlci5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCgnY2hhbmdlJyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgd2F0Y2hlci5vbignZXJyb3InLCAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgd2F0Y2hlci5vbigndW5saW5rJywgKCkgPT4ge1xuICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IobmV3IEVycm9yKCdDb25maWd1cmF0aW9uIGZpbGUgZGVsZXRlZC4nKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiBvYnNlcnZlci5lcnJvcihlcnJvcikpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNsb3NlZCA9IHRydWU7XG4gICAgICBpZiAod2F0Y2hlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHdhdGNoZXIuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9KTtcblxuZXhwb3J0IGNsYXNzIENvbmZpZzxUQ29uZmlnIGV4dGVuZHMgb2JqZWN0PiB7XG4gIHB1YmxpYyByZWFkb25seSBjb25maWckOiBPYnNlcnZhYmxlPFRDb25maWc+O1xuICBwdWJsaWMgcmVhZG9ubHkgY29uZmlnUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRDb25maWc6IFRDb25maWc7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1hbnlcbiAgcHJpdmF0ZSByZWFkb25seSBzY2hlbWE6IGFueTtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueVxuICBwcml2YXRlIG11dGFibGVWYWxpZGF0ZUNvbmZpZzogYW55O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih7XG4gICAgbmFtZTogY29uZmlnTmFtZSxcbiAgICBkZWZhdWx0Q29uZmlnLFxuICAgIHNjaGVtYSxcbiAgICBjb25maWdQYXRoLFxuICB9OiB7XG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGRlZmF1bHRDb25maWc6IFRDb25maWc7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueVxuICAgIHJlYWRvbmx5IHNjaGVtYTogYW55O1xuICAgIHJlYWRvbmx5IGNvbmZpZ1BhdGg6IHN0cmluZztcbiAgfSkge1xuICAgIHRoaXMuY29uZmlnUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWdQYXRoLCBgJHtjb25maWdOYW1lfS5qc29uYCk7XG4gICAgdGhpcy5kZWZhdWx0Q29uZmlnID0gZGVmYXVsdENvbmZpZztcbiAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICB0aGlzLmNvbmZpZyQgPSBkZWZlcihhc3luYyAoKSA9PiB0aGlzLmdldENvbmZpZygpKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKChjb25maWcpID0+XG4gICAgICAgIHdhdGNoQ29uZmlnJCh0aGlzLmNvbmZpZ1BhdGgpLnBpcGUoXG4gICAgICAgICAgbWVyZ2VTY2FuKChwcmV2Q29uZmlnKSA9PiBkZWZlcihhc3luYyAoKSA9PiB0aGlzLmdldENvbmZpZyh7IGNvbmZpZzogcHJldkNvbmZpZyB9KSksIGNvbmZpZywgMSksXG4gICAgICAgICksXG4gICAgICApLFxuXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgdXBkYXRlKHsgY29uZmlnIH06IHsgcmVhZG9ubHkgY29uZmlnOiBUQ29uZmlnIH0pOiBQcm9taXNlPFRDb25maWc+IHtcbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlKGNvbmZpZyk7XG4gICAgYXdhaXQgZnMuZW5zdXJlRGlyKHBhdGguZGlybmFtZSh0aGlzLmNvbmZpZ1BhdGgpKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUodGhpcy5jb25maWdQYXRoLCBKU09OLnN0cmluZ2lmeShjb25maWcpKTtcblxuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldENvbmZpZyh7IGNvbmZpZyA9IHRoaXMuZGVmYXVsdENvbmZpZyB9OiB7IHJlYWRvbmx5IGNvbmZpZz86IFRDb25maWcgfSA9IHt9KTogUHJvbWlzZTxUQ29uZmlnPiB7XG4gICAgbGV0IGNvbnRlbnRzO1xuICAgIHRyeSB7XG4gICAgICBjb250ZW50cyA9IGF3YWl0IGZzLnJlYWRGaWxlKHRoaXMuY29uZmlnUGF0aCwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZSh7IGNvbmZpZyB9KTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudENvbmZpZyA9IEpTT04ucGFyc2UoY29udGVudHMpO1xuICAgIGF3YWl0IHRoaXMudmFsaWRhdGUoY3VycmVudENvbmZpZyk7XG5cbiAgICBpZiAoY29uZmlnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1hbnlcbiAgICAgIHJldHVybiAoU2VhbWxlc3NJbW11dGFibGUgYXMgYW55KS5tZXJnZShjb25maWcsIGN1cnJlbnRDb25maWcsIHtcbiAgICAgICAgZGVlcDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50Q29uZmlnO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZShjb25maWc6IFRDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2YWxpZGF0ZUNvbmZpZyA9IGF3YWl0IHRoaXMuZ2V0VmFsaWRhdGVDb25maWcoKTtcbiAgICBjb25zdCBpc1ZhbGlkID0gdmFsaWRhdGVDb25maWcoY29uZmlnKTtcbiAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdJbnZhbGlkIGNvbmZpZycpO1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLW9iamVjdC1tdXRhdGlvbiBuby1hbnlcbiAgICAgIChlcnJvciBhcyBhbnkpLmVycm9ycyA9IHZhbGlkYXRlQ29uZmlnLmVycm9ycztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8vIFByb21pc2U8aW1wb3J0KCdhanYnKS5WYWxpZGF0ZUZ1bmN0aW9uPlxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tYW55XG4gIHByaXZhdGUgYXN5bmMgZ2V0VmFsaWRhdGVDb25maWcoKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAodGhpcy5tdXRhYmxlVmFsaWRhdGVDb25maWcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMubXV0YWJsZVZhbGlkYXRlQ29uZmlnO1xuICAgIH1cblxuICAgIGNvbnN0IGFqdiA9IGF3YWl0IGltcG9ydCgnYWp2Jyk7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueVxuICAgIGNvbnN0IHZhbGlkYXRlQ29uZmlnID0gbmV3IGFqdi5kZWZhdWx0KCkuY29tcGlsZSh0aGlzLnNjaGVtYSk7XG4gICAgdGhpcy5tdXRhYmxlVmFsaWRhdGVDb25maWcgPSB2YWxpZGF0ZUNvbmZpZztcblxuICAgIHJldHVybiB2YWxpZGF0ZUNvbmZpZztcbiAgfVxufVxuIl19
|