1 |
|
2 | var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
3 | return new (P || (P = Promise))(function (resolve, reject) {
|
4 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
5 | function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
6 | function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
7 | step((generator = generator.apply(thisArg, _arguments || [])).next());
|
8 | });
|
9 | };
|
10 | Object.defineProperty(exports, "__esModule", { value: true });
|
11 | const fs = require("mz/fs");
|
12 | const path = require("path");
|
13 | const os = require("os");
|
14 | const archy = require("archy");
|
15 | const sass = require("node-sass");
|
16 | const mkdirp = require("mkdirp");
|
17 | const Contracts = require("./contracts");
|
18 | const bundler_1 = require("./bundler");
|
19 | const arguments_1 = require("./arguments");
|
20 | const DEFAULT_CONFIG_NAME = "scss-bundle.config.json";
|
21 | class Cli {
|
22 | constructor(ArgumentValues) {
|
23 | this.ArgumentValues = ArgumentValues;
|
24 | this.main(this.ArgumentValues);
|
25 | }
|
26 | main(argumentValues) {
|
27 | return __awaiter(this, void 0, void 0, function* () {
|
28 | let config;
|
29 | // Resolve config file path
|
30 | let fullConfigPath = path.resolve(argumentValues.config || DEFAULT_CONFIG_NAME);
|
31 | let verbosity = Contracts.Verbosity.Verbose;
|
32 | // Resolve config
|
33 | if (yield this.configExists(fullConfigPath)) {
|
34 | try {
|
35 | let readConfig = yield this.readConfigFile(fullConfigPath);
|
36 | verbosity = this.resolveVerbosity(argumentValues.verbosity || readConfig.verbosity);
|
37 | config = {
|
38 | Entry: argumentValues.entry || readConfig.entry,
|
39 | Destination: argumentValues.dest || readConfig.dest,
|
40 | Verbosity: verbosity
|
41 | };
|
42 | if (verbosity === Contracts.Verbosity.Verbose) {
|
43 | console.info("Using config file:", fullConfigPath);
|
44 | }
|
45 | }
|
46 | catch (err) {
|
47 | this.exitWithError(`[Error] Config file ${fullConfigPath} is not valid.`);
|
48 | return;
|
49 | }
|
50 | }
|
51 | else if (argumentValues.entry != null && argumentValues.dest != null) {
|
52 | verbosity = this.resolveVerbosity(argumentValues.verbosity);
|
53 | config = {
|
54 | Entry: argumentValues.entry,
|
55 | Destination: argumentValues.dest,
|
56 | Verbosity: verbosity
|
57 | };
|
58 | }
|
59 | else {
|
60 | this.exitWithError("[Error] Entry and destination arguments are missing and no config was found.");
|
61 | return;
|
62 | }
|
63 | if (config.Verbosity === Contracts.Verbosity.Verbose) {
|
64 | console.info("Using config:");
|
65 | console.info(JSON.stringify(config, null, 4));
|
66 | }
|
67 | this.Config = config;
|
68 | // Bundle the styles
|
69 | this.bundle();
|
70 | });
|
71 | }
|
72 | bundle() {
|
73 | return __awaiter(this, void 0, void 0, function* () {
|
74 | try {
|
75 | let bundleResult = yield bundler_1.Bundler.Bundle(this.Config.Entry);
|
76 | if (!bundleResult.found) {
|
77 | if (this.Config.Verbosity !== Contracts.Verbosity.None) {
|
78 | let resolvedPath = path.resolve(bundleResult.filePath);
|
79 | let errorMessage = `[Error] An error has occured${os.EOL}`;
|
80 | errorMessage += `Entry file was not found:${os.EOL}${bundleResult.filePath}${os.EOL}`;
|
81 | errorMessage += `Looked at (full path):${os.EOL}${resolvedPath}`;
|
82 | this.exitWithError(errorMessage);
|
83 | }
|
84 | }
|
85 | let archyData = this.getArchyData(bundleResult, path.dirname(this.Config.Entry));
|
86 | if (this.Config.Verbosity === Contracts.Verbosity.Verbose) {
|
87 | console.info(archy(archyData));
|
88 | }
|
89 | if (bundleResult.content == null) {
|
90 | if (this.Config.Verbosity !== Contracts.Verbosity.None) {
|
91 | this.exitWithError(`[Error] An error has occured${os.EOL}Concatenation result has no content.`);
|
92 | }
|
93 | return;
|
94 | }
|
95 | try {
|
96 | yield this.renderScss(bundleResult.content);
|
97 | }
|
98 | catch (scssError) {
|
99 | this.exitWithError(`[Error] There is an error in your styles:${os.EOL}${scssError}`);
|
100 | }
|
101 | // Ensure the directory exists
|
102 | mkdirp.sync(path.dirname(this.Config.Destination));
|
103 | yield fs.writeFile(this.Config.Destination, bundleResult.content);
|
104 | let fullPath = path.resolve(this.Config.Destination);
|
105 | if (this.Config.Verbosity === Contracts.Verbosity.Verbose) {
|
106 | console.info(`[Done] Bundled into:${os.EOL}${fullPath}`);
|
107 | }
|
108 | }
|
109 | catch (error) {
|
110 | if (this.Config.Verbosity !== Contracts.Verbosity.None) {
|
111 | this.exitWithError(`[Error] An error has occured${os.EOL}${error}`);
|
112 | }
|
113 | }
|
114 | });
|
115 | }
|
116 | renderScss(content) {
|
117 | return __awaiter(this, void 0, void 0, function* () {
|
118 | return new Promise((resolve, reject) => {
|
119 | sass.render({
|
120 | data: content
|
121 | }, (error, result) => {
|
122 | if (error == null) {
|
123 | resolve();
|
124 | }
|
125 | else {
|
126 | reject(`${error.message} on line (${error.line}, ${error.column})`);
|
127 | }
|
128 | });
|
129 | });
|
130 | });
|
131 | }
|
132 | getArchyData(bundleResult, sourceDirectory) {
|
133 | if (sourceDirectory == null) {
|
134 | sourceDirectory = process.cwd();
|
135 | }
|
136 | let archyData = {
|
137 | label: path.relative(sourceDirectory, bundleResult.filePath)
|
138 | };
|
139 | if (!bundleResult.found) {
|
140 | archyData.label += ` [NOT FOUND]`;
|
141 | }
|
142 | if (bundleResult.imports != null) {
|
143 | archyData.nodes = bundleResult.imports.map(x => {
|
144 | if (x != null) {
|
145 | return this.getArchyData(x, sourceDirectory);
|
146 | }
|
147 | return "";
|
148 | });
|
149 | }
|
150 | return archyData;
|
151 | }
|
152 | resolveVerbosity(verbosity) {
|
153 | // Convert given value to an appropriate Verbosity enum value.
|
154 | // 'as any as number' is used because TypeScript thinks
|
155 | // that we cast string to number, even though we get a number there
|
156 | return Contracts.Verbosity[verbosity];
|
157 | }
|
158 | configExists(fullPath) {
|
159 | return __awaiter(this, void 0, void 0, function* () {
|
160 | try {
|
161 | yield fs.access(fullPath, fs.constants.F_OK);
|
162 | return true;
|
163 | }
|
164 | catch (err) {
|
165 | return false;
|
166 | }
|
167 | });
|
168 | }
|
169 | readConfigFile(fullPath) {
|
170 | return __awaiter(this, void 0, void 0, function* () {
|
171 | let data = yield fs.readFile(fullPath, "utf8");
|
172 | return JSON.parse(data);
|
173 | });
|
174 | }
|
175 | exitWithError(message) {
|
176 | if (this.Config.Verbosity !== Contracts.Verbosity.None) {
|
177 | console.error(message);
|
178 | }
|
179 | process.exit(1);
|
180 | }
|
181 | }
|
182 | new Cli(arguments_1.argv);
|
183 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVuZGxlLWNsaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9idW5kbGUtY2xpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFDQSw0QkFBNEI7QUFDNUIsNkJBQTZCO0FBQzdCLHlCQUF5QjtBQUN6QiwrQkFBK0I7QUFFL0Isa0NBQWtDO0FBQ2xDLGlDQUFpQztBQUVqQyx5Q0FBeUM7QUFDekMsdUNBQWtEO0FBQ2xELDJDQUFtQztBQUVuQyxNQUFNLG1CQUFtQixHQUFHLHlCQUF5QixDQUFDO0FBRXREO0lBR0ksWUFBc0IsY0FBeUM7UUFBekMsbUJBQWMsR0FBZCxjQUFjLENBQTJCO1FBQzNELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFYSxJQUFJLENBQUMsY0FBeUM7O1lBQ3hELElBQUksTUFBd0IsQ0FBQztZQUU3QiwyQkFBMkI7WUFDM0IsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsTUFBTSxJQUFJLG1CQUFtQixDQUFDLENBQUM7WUFFaEYsSUFBSSxTQUFTLEdBQXdCLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDO1lBRWpFLGlCQUFpQjtZQUNqQixFQUFFLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLENBQUM7b0JBQ0QsSUFBSSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDO29CQUMzRCxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxTQUFTLElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUNwRixNQUFNLEdBQUc7d0JBQ0wsS0FBSyxFQUFFLGNBQWMsQ0FBQyxLQUFLLElBQUksVUFBVSxDQUFDLEtBQUs7d0JBQy9DLFdBQVcsRUFB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QUM7WUFDakIsQ0FBQztRQUNMLENBQUM7S0FBQTtJQUVhLGNBQWMsQ0FBQyxRQUFnQjs7WUFDekMsSUFBSSxJQUFJLEdBQUcsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUMvQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixDQUFDO0tBQUE7SUFFTyxhQUFhLENBQUMsT0FBZTtRQUNqQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDckQsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQixDQUFDO0NBQ0o7QUFFRCxJQUFJLEdBQUcsQ0FBQyxnQkFBSSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXHJcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJtei9mc1wiO1xyXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XHJcbmltcG9ydCAqIGFzIG9zIGZyb20gXCJvc1wiO1xyXG5pbXBvcnQgKiBhcyBhcmNoeSBmcm9tIFwiYXJjaHlcIjtcclxuXHJcbmltcG9ydCAqIGFzIHNhc3MgZnJvbSBcIm5vZGUtc2Fzc1wiO1xyXG5pbXBvcnQgKiBhcyBta2RpcnAgZnJvbSBcIm1rZGlycFwiO1xyXG5cclxuaW1wb3J0ICogYXMgQ29udHJhY3RzIGZyb20gXCIuL2NvbnRyYWN0c1wiO1xyXG5pbXBvcnQgeyBCdW5kbGVyLCBCdW5kbGVSZXN1bHQgfSBmcm9tIFwiLi9idW5kbGVyXCI7XHJcbmltcG9ydCB7IGFyZ3YgfSBmcm9tIFwiLi9hcmd1bWVudHNcIjtcclxuXHJcbmNvbnN0IERFRkFVTFRfQ09ORklHX05BTUUgPSBcInNjc3MtYnVuZGxlLmNvbmZpZy5qc29uXCI7XHJcblxyXG5jbGFzcyBDbGkge1xyXG4gICAgQ29uZmlnOiBDb250cmFjdHMuQ29uZmlnO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBBcmd1bWVudFZhbHVlczogQ29udHJhY3RzLkFyZ3VtZW50c1ZhbHVlcykge1xyXG4gICAgICAgIHRoaXMubWFpbih0aGlzLkFyZ3VtZW50VmFsdWVzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIG1haW4oYXJndW1lbnRWYWx1ZXM6IENvbnRyYWN0cy5Bcmd1bWVudHNWYWx1ZXMpIHtcclxuICAgICAgICBsZXQgY29uZmlnOiBDb250cmFjdHMuQ29uZmlnO1xyXG5cclxuICAgICAgICAvLyBSZXNvbHZlIGNvbmZpZyBmaWxlIHBhdGhcclxuICAgICAgICBsZXQgZnVsbENvbmZpZ1BhdGggPSBwYXRoLnJlc29sdmUoYXJndW1lbnRWYWx1ZXMuY29uZmlnIHx8IERFRkFVTFRfQ09ORklHX05BTUUpO1xyXG5cclxuICAgICAgICBsZXQgdmVyYm9zaXR5OiBDb250cmFjdHMuVmVyYm9zaXR5ID0gQ29udHJhY3RzLlZlcmJvc2l0eS5WZXJib3NlO1xyXG5cclxuICAgICAgICAvLyBSZXNvbHZlIGNvbmZpZ1xyXG4gICAgICAgIGlmIChhd2FpdCB0aGlzLmNvbmZpZ0V4aXN0cyhmdWxsQ29uZmlnUGF0aCkpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGxldCByZWFkQ29uZmlnID0gYXdhaXQgdGhpcy5yZWFkQ29uZmlnRmlsZShmdWxsQ29uZmlnUGF0aCk7XHJcbiAgICAgICAgICAgICAgICB2ZXJib3NpdHkgPSB0aGlzLnJlc29sdmVWZXJib3NpdHkoYXJndW1lbnRWYWx1ZXMudmVyYm9zaXR5IHx8IHJlYWRDb25maWcudmVyYm9zaXR5KTtcclxuICAgICAgICAgICAgICAgIGNvbmZpZyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBFbnRyeTogYXJndW1lbnRWYWx1ZXMuZW50cnkgfHwgcmVhZENvbmZpZy5lbnRyeSxcclxuICAgICAgICAgICAgICAgICAgICBEZXN0aW5hdGlvbjogYXJndW1lbnRWYWx1ZXMuZGVzdCB8fCByZWFkQ29uZmlnLmRlc3QsXHJcbiAgICAgICAgICAgICAgICAgICAgVmVyYm9zaXR5OiB2ZXJib3NpdHlcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHZlcmJvc2l0eSA9PT0gQ29udHJhY3RzLlZlcmJvc2l0eS5WZXJib3NlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKFwiVXNpbmcgY29uZmlnIGZpbGU6XCIsIGZ1bGxDb25maWdQYXRoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmV4aXRXaXRoRXJyb3IoYFtFcnJvcl0gQ29uZmlnIGZpbGUgJHtmdWxsQ29uZmlnUGF0aH0gaXMgbm90IHZhbGlkLmApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChhcmd1bWVudFZhbHVlcy5lbnRyeSAhPSBudWxsICYmIGFyZ3VtZW50VmFsdWVzLmRlc3QgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB2ZXJib3NpdHkgPSB0aGlzLnJlc29sdmVWZXJib3NpdHkoYXJndW1lbnRWYWx1ZXMudmVyYm9zaXR5KTtcclxuICAgICAgICAgICAgY29uZmlnID0ge1xyXG4gICAgICAgICAgICAgICAgRW50cnk6IGFyZ3VtZW50VmFsdWVzLmVudHJ5LFxyXG4gICAgICAgICAgICAgICAgRGVzdGluYXRpb246IGFyZ3VtZW50VmFsdWVzLmRlc3QsXHJcbiAgICAgICAgICAgICAgICBWZXJib3NpdHk6IHZlcmJvc2l0eVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXhpdFdpdGhFcnJvcihcIltFcnJvcl0gRW50cnkgYW5kIGRlc3RpbmF0aW9uIGFyZ3VtZW50cyBhcmUgbWlzc2luZyBhbmQgbm8gY29uZmlnIHdhcyBmb3VuZC5cIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjb25maWcuVmVyYm9zaXR5ID09PSBDb250cmFjdHMuVmVyYm9zaXR5LlZlcmJvc2UpIHtcclxuICAgICAgICAgICAgY29uc29sZS5pbmZvKFwiVXNpbmcgY29uZmlnOlwiKTtcclxuICAgICAgICAgICAgY29uc29sZS5pbmZvKEpTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgNCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5Db25maWcgPSBjb25maWc7XHJcblxyXG4gICAgICAgIC8vIEJ1bmRsZSB0aGUgc3R5bGVzXHJcbiAgICAgICAgdGhpcy5idW5kbGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIGJ1bmRsZSgpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgYnVuZGxlUmVzdWx0ID0gYXdhaXQgQnVuZGxlci5CdW5kbGUodGhpcy5Db25maWcuRW50cnkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFidW5kbGVSZXN1bHQuZm91bmQpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLkNvbmZpZy5WZXJib3NpdHkgIT09IENvbnRyYWN0cy5WZXJib3NpdHkuTm9uZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNvbHZlZFBhdGggPSBwYXRoLnJlc29sdmUoYnVuZGxlUmVzdWx0LmZpbGVQYXRoKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gYFtFcnJvcl0gQW4gZXJyb3IgaGFzIG9jY3VyZWQke29zLkVPTH1gO1xyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSArPSBgRW50cnkgZmlsZSB3YXMgbm90IGZvdW5kOiR7b3MuRU9MfSR7YnVuZGxlUmVzdWx0LmZpbGVQYXRofSR7b3MuRU9MfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlICs9IGBMb29rZWQgYXQgKGZ1bGwgcGF0aCk6JHtvcy5FT0x9JHtyZXNvbHZlZFBhdGh9YDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4aXRXaXRoRXJyb3IoZXJyb3JNZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGFyY2h5RGF0YSA9IHRoaXMuZ2V0QXJjaHlEYXRhKGJ1bmRsZVJlc3VsdCwgcGF0aC5kaXJuYW1lKHRoaXMuQ29uZmlnLkVudHJ5KSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLkNvbmZpZy5WZXJib3NpdHkgPT09IENvbnRyYWN0cy5WZXJib3NpdHkuVmVyYm9zZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKGFyY2h5KGFyY2h5RGF0YSkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoYnVuZGxlUmVzdWx0LmNvbnRlbnQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuQ29uZmlnLlZlcmJvc2l0eSAhPT0gQ29udHJhY3RzLlZlcmJvc2l0eS5Ob25lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leGl0V2l0aEVycm9yKGBbRXJyb3JdIEFuIGVycm9yIGhhcyBvY2N1cmVkJHtvcy5FT0x9Q29uY2F0ZW5hdGlvbiByZXN1bHQgaGFzIG5vIGNvbnRlbnQuYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVuZGVyU2NzcyhidW5kbGVSZXN1bHQuY29udGVudCk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKHNjc3NFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5leGl0V2l0aEVycm9yKGBbRXJyb3JdIFRoZXJlIGlzIGFuIGVycm9yIGluIHlvdXIgc3R5bGVzOiR7b3MuRU9MfSR7c2Nzc0Vycm9yfWApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBFbnN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHNcclxuICAgICAgICAgICAgbWtkaXJwLnN5bmMocGF0aC5kaXJuYW1lKHRoaXMuQ29uZmlnLkRlc3RpbmF0aW9uKSk7XHJcblxyXG4gICAgICAgICAgICBhd2FpdCBmcy53cml0ZUZpbGUodGhpcy5Db25maWcuRGVzdGluYXRpb24sIGJ1bmRsZVJlc3VsdC5jb250ZW50KTtcclxuXHJcbiAgICAgICAgICAgIGxldCBmdWxsUGF0aCA9IHBhdGgucmVzb2x2ZSh0aGlzLkNvbmZpZy5EZXN0aW5hdGlvbik7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLkNvbmZpZy5WZXJib3NpdHkgPT09IENvbnRyYWN0cy5WZXJib3NpdHkuVmVyYm9zZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKGBbRG9uZV0gQnVuZGxlZCBpbnRvOiR7b3MuRU9MfSR7ZnVsbFBhdGh9YCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5Db25maWcuVmVyYm9zaXR5ICE9PSBDb250cmFjdHMuVmVyYm9zaXR5Lk5vbmUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZXhpdFdpdGhFcnJvcihgW0Vycm9yXSBBbiBlcnJvciBoYXMgb2NjdXJlZCR7b3MuRU9MfSR7ZXJyb3J9YCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyByZW5kZXJTY3NzKGNvbnRlbnQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIHNhc3MucmVuZGVyKHtcclxuICAgICAgICAgICAgICAgIGRhdGE6IGNvbnRlbnRcclxuICAgICAgICAgICAgfSwgKGVycm9yLCByZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChlcnJvciA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoYCR7ZXJyb3IubWVzc2FnZX0gb24gbGluZSAoJHtlcnJvci5saW5lfSwgJHtlcnJvci5jb2x1bW59KWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEFyY2h5RGF0YShidW5kbGVSZXN1bHQ6IEJ1bmRsZVJlc3VsdCwgc291cmNlRGlyZWN0b3J5Pzogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHNvdXJjZURpcmVjdG9yeSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHNvdXJjZURpcmVjdG9yeSA9IHByb2Nlc3MuY3dkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBhcmNoeURhdGE6IGFyY2h5LkRhdGEgPSB7XHJcbiAgICAgICAgICAgIGxhYmVsOiBwYXRoLnJlbGF0aXZlKHNvdXJjZURpcmVjdG9yeSwgYnVuZGxlUmVzdWx0LmZpbGVQYXRoKVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmICghYnVuZGxlUmVzdWx0LmZvdW5kKSB7XHJcbiAgICAgICAgICAgIGFyY2h5RGF0YS5sYWJlbCArPSBgIFtOT1QgRk9VTkRdYDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChidW5kbGVSZXN1bHQuaW1wb3J0cyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGFyY2h5RGF0YS5ub2RlcyA9IGJ1bmRsZVJlc3VsdC5pbXBvcnRzLm1hcCh4ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh4ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRBcmNoeURhdGEoeCwgc291cmNlRGlyZWN0b3J5KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFyY2h5RGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlc29sdmVWZXJib3NpdHkodmVyYm9zaXR5OiBhbnkpIHtcclxuICAgICAgICAvLyBDb252ZXJ0IGdpdmVuIHZhbHVlIHRvIGFuIGFwcHJvcHJpYXRlIFZlcmJvc2l0eSBlbnVtIHZhbHVlLlxyXG4gICAgICAgIC8vICdhcyBhbnkgYXMgbnVtYmVyJyBpcyB1c2VkIGJlY2F1c2UgVHlwZVNjcmlwdCB0aGlua3NcclxuICAgICAgICAvLyAgdGhhdCB3ZSBjYXN0IHN0cmluZyB0byBudW1iZXIsIGV2ZW4gdGhvdWdoIHdlIGdldCBhIG51bWJlciB0aGVyZVxyXG4gICAgICAgIHJldHVybiBDb250cmFjdHMuVmVyYm9zaXR5W3ZlcmJvc2l0eV0gYXMgYW55IGFzIG51bWJlcjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIGNvbmZpZ0V4aXN0cyhmdWxsUGF0aDogc3RyaW5nKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgZnMuYWNjZXNzKGZ1bGxQYXRoLCBmcy5jb25zdGFudHMuRl9PSyk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgcmVhZENvbmZpZ0ZpbGUoZnVsbFBhdGg6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBmcy5yZWFkRmlsZShmdWxsUGF0aCwgXCJ1dGY4XCIpO1xyXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZXhpdFdpdGhFcnJvcihtZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAodGhpcy5Db25maWcuVmVyYm9zaXR5ICE9PSBDb250cmFjdHMuVmVyYm9zaXR5Lk5vbmUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xyXG4gICAgfVxyXG59XHJcblxyXG5uZXcgQ2xpKGFyZ3YpO1xyXG4iXX0= |
\ | No newline at end of file |