@nlabs/lex 1.48.7 → 1.49.1
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/.storybook/main.ts +9 -2
- package/.vscode/settings.json +1 -6
- package/README.md +249 -0
- package/eslint.config.mjs +24 -0
- package/examples/lex.config.js +18 -8
- package/examples/serverless-example/README.md +109 -0
- package/examples/serverless-example/dist/handlers/echo.js +15 -0
- package/examples/serverless-example/dist/handlers/graphql.js +137 -0
- package/examples/serverless-example/dist/handlers/hello.js +15 -0
- package/examples/serverless-example/dist/handlers/test.js +17 -0
- package/examples/serverless-example/dist/handlers/websocket.js +14 -0
- package/examples/serverless-example/lex.config.mjs +74 -0
- package/jest.config.mjs +13 -12
- package/{dist → lib}/LexConfig.d.ts +7 -6
- package/lib/LexConfig.js +268 -0
- package/lib/commands/ai/ai.js +303 -0
- package/{dist → lib}/commands/build/build.d.ts +3 -0
- package/lib/commands/build/build.js +494 -0
- package/{dist → lib}/commands/clean/clean.js +1 -1
- package/lib/commands/compile/compile.js +241 -0
- package/lib/commands/copy/copy.js +38 -0
- package/{dist → lib}/commands/create/create.js +1 -1
- package/{dist → lib}/commands/dev/dev.d.ts +2 -0
- package/lib/commands/dev/dev.js +286 -0
- package/{dist → lib}/commands/init/init.js +1 -1
- package/lib/commands/lint/lint.js +962 -0
- package/{dist → lib}/commands/migrate/migrate.js +1 -1
- package/lib/commands/publish/publish.js +104 -0
- package/lib/commands/serverless/serverless.d.ts +17 -0
- package/lib/commands/serverless/serverless.js +662 -0
- package/lib/commands/storybook/storybook.js +249 -0
- package/lib/commands/test/test.js +428 -0
- package/lib/commands/update/update.js +128 -0
- package/{dist → lib}/create/changelog.js +1 -1
- package/{dist → lib}/index.d.ts +1 -0
- package/{dist → lib}/index.js +2 -1
- package/lib/lex.js +73 -0
- package/lib/utils/aiService.d.ts +9 -0
- package/lib/utils/aiService.js +299 -0
- package/{dist → lib}/utils/app.d.ts +3 -0
- package/lib/utils/app.js +296 -0
- package/{dist → lib}/utils/file.d.ts +7 -3
- package/lib/utils/file.js +229 -0
- package/lib/utils/translations.d.ts +1 -0
- package/lib/utils/translations.js +74 -0
- package/package.json +60 -54
- package/postcss.config.js +5 -3
- package/tsconfig.build.json +2 -2
- package/webpack.config.js +229 -39
- package/dist/LexConfig.js +0 -287
- package/dist/commands/ai/ai.js +0 -303
- package/dist/commands/build/build.js +0 -404
- package/dist/commands/compile/compile.js +0 -234
- package/dist/commands/copy/copy.js +0 -38
- package/dist/commands/dev/dev.js +0 -74
- package/dist/commands/lint/lint.js +0 -993
- package/dist/commands/publish/publish.js +0 -104
- package/dist/commands/storybook/storybook.js +0 -249
- package/dist/commands/test/test.js +0 -429
- package/dist/commands/update/update.js +0 -132
- package/dist/lex.js +0 -70
- package/dist/utils/aiService.d.ts +0 -9
- package/dist/utils/aiService.js +0 -299
- package/dist/utils/app.js +0 -267
- package/dist/utils/file.js +0 -185
- package/emptyModule.js +0 -0
- package/eslint.config.js +0 -3
- /package/{dist → lib}/Button.stories.d.ts +0 -0
- /package/{dist → lib}/commands/ai/ai.d.ts +0 -0
- /package/{dist → lib}/commands/ai/index.d.ts +0 -0
- /package/{dist → lib}/commands/ai/index.js +0 -0
- /package/{dist → lib}/commands/clean/clean.d.ts +0 -0
- /package/{dist → lib}/commands/compile/compile.d.ts +0 -0
- /package/{dist → lib}/commands/config/config.d.ts +0 -0
- /package/{dist → lib}/commands/config/config.js +0 -0
- /package/{dist → lib}/commands/copy/copy.d.ts +0 -0
- /package/{dist → lib}/commands/create/create.d.ts +0 -0
- /package/{dist → lib}/commands/init/init.d.ts +0 -0
- /package/{dist → lib}/commands/link/link.d.ts +0 -0
- /package/{dist → lib}/commands/link/link.js +0 -0
- /package/{dist → lib}/commands/lint/autofix.d.ts +0 -0
- /package/{dist → lib}/commands/lint/lint.d.ts +0 -0
- /package/{dist → lib}/commands/migrate/migrate.d.ts +0 -0
- /package/{dist → lib}/commands/publish/publish.d.ts +0 -0
- /package/{dist → lib}/commands/storybook/storybook.d.ts +0 -0
- /package/{dist → lib}/commands/test/test.d.ts +0 -0
- /package/{dist → lib}/commands/update/update.d.ts +0 -0
- /package/{dist → lib}/commands/upgrade/upgrade.d.ts +0 -0
- /package/{dist → lib}/commands/upgrade/upgrade.js +0 -0
- /package/{dist → lib}/commands/versions/versions.d.ts +0 -0
- /package/{dist → lib}/commands/versions/versions.js +0 -0
- /package/{dist → lib}/create/changelog.d.ts +0 -0
- /package/{dist → lib}/lex.d.ts +0 -0
- /package/{dist → lib}/storybook/index.d.ts +0 -0
- /package/{dist → lib}/storybook/index.js +0 -0
- /package/{dist → lib}/test-react/index.d.ts +0 -0
- /package/{dist → lib}/test-react/index.js +0 -0
- /package/{dist → lib}/types.d.ts +0 -0
- /package/{dist → lib}/types.js +0 -0
- /package/{dist → lib}/utils/deepMerge.d.ts +0 -0
- /package/{dist → lib}/utils/deepMerge.js +0 -0
- /package/{dist → lib}/utils/log.d.ts +0 -0
- /package/{dist → lib}/utils/log.js +0 -0
- /package/{dist → lib}/utils/reactShim.d.ts +0 -0
- /package/{dist → lib}/utils/reactShim.js +0 -0
package/lib/utils/app.js
ADDED
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import boxen from "boxen";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { copyFile, existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from "fs";
|
|
4
|
+
import { sync as globSync } from "glob";
|
|
5
|
+
import isEmpty from "lodash/isEmpty.js";
|
|
6
|
+
import ora from "ora";
|
|
7
|
+
import { basename as pathBasename, join as pathJoin, relative as pathRelative, resolve as pathResolve } from "path";
|
|
8
|
+
import { rimrafSync } from "rimraf";
|
|
9
|
+
import { log } from "./log.js";
|
|
10
|
+
const cwd = process.cwd();
|
|
11
|
+
const getFilenames = (props) => {
|
|
12
|
+
const { callback, cliName, name, quiet, type, useTypescript } = props;
|
|
13
|
+
let nameCaps;
|
|
14
|
+
const itemTypes = ["stores", "views"];
|
|
15
|
+
if (!name) {
|
|
16
|
+
if (itemTypes.includes(type)) {
|
|
17
|
+
log(`
|
|
18
|
+
${cliName} Error: ${type} name is required. Please use 'lex -h' for options.`, "error", quiet);
|
|
19
|
+
return callback?.(1);
|
|
20
|
+
}
|
|
21
|
+
} else {
|
|
22
|
+
nameCaps = `${name.charAt(0).toUpperCase()}${name.substr(1)}`;
|
|
23
|
+
}
|
|
24
|
+
log(`${cliName} adding ${name} ${type}...`, "info", quiet);
|
|
25
|
+
let templatePath;
|
|
26
|
+
let templateExt;
|
|
27
|
+
let templateReact;
|
|
28
|
+
if (useTypescript) {
|
|
29
|
+
templatePath = "../../templates/typescript";
|
|
30
|
+
templateExt = ".ts";
|
|
31
|
+
templateReact = ".tsx";
|
|
32
|
+
} else {
|
|
33
|
+
templatePath = "../../templates/flow";
|
|
34
|
+
templateExt = ".js";
|
|
35
|
+
templateReact = ".js";
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
nameCaps,
|
|
39
|
+
templateExt,
|
|
40
|
+
templatePath,
|
|
41
|
+
templateReact
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
const createSpinner = (quiet = false) => {
|
|
45
|
+
if (quiet) {
|
|
46
|
+
return {
|
|
47
|
+
fail: () => {
|
|
48
|
+
},
|
|
49
|
+
start: () => {
|
|
50
|
+
},
|
|
51
|
+
succeed: () => {
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
return ora({ color: "yellow" });
|
|
56
|
+
};
|
|
57
|
+
const createProgressBar = (percentage) => {
|
|
58
|
+
const width = 20;
|
|
59
|
+
const filled = Math.round(percentage / 100 * width);
|
|
60
|
+
const empty = width - filled;
|
|
61
|
+
const filledBar = chalk.cyan("\u2588").repeat(filled);
|
|
62
|
+
const emptyBar = chalk.gray("\u2591").repeat(empty);
|
|
63
|
+
return filledBar + emptyBar;
|
|
64
|
+
};
|
|
65
|
+
const handleWebpackProgress = (output, spinner, quiet, emoji, action) => {
|
|
66
|
+
if (quiet) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const progressMatch = output.match(/\[webpack\.Progress\] (\d+)%/);
|
|
70
|
+
if (progressMatch) {
|
|
71
|
+
const progress = parseInt(progressMatch[1], 10);
|
|
72
|
+
const progressBar = createProgressBar(progress);
|
|
73
|
+
spinner.text = `${emoji} ${action}: ${progressBar} ${progress}%`;
|
|
74
|
+
} else if (output.includes("[webpack.Progress]")) {
|
|
75
|
+
const generalProgressMatch = output.match(/(\d+)%/);
|
|
76
|
+
if (generalProgressMatch) {
|
|
77
|
+
const progress = parseInt(generalProgressMatch[1], 10);
|
|
78
|
+
const progressBar = createProgressBar(progress);
|
|
79
|
+
spinner.text = `${emoji} ${action}: ${progressBar} ${progress}%`;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
const copyFiles = async (files, typeName, spinner, config) => {
|
|
84
|
+
const { outputFullPath, sourceFullPath } = config;
|
|
85
|
+
const items = files.map((fileName) => ({
|
|
86
|
+
from: fileName,
|
|
87
|
+
to: pathResolve(outputFullPath, pathRelative(sourceFullPath, fileName))
|
|
88
|
+
}));
|
|
89
|
+
try {
|
|
90
|
+
spinner.start(`Copying ${typeName} files...`);
|
|
91
|
+
await Promise.all(items.map(({ from, to }) => new Promise(
|
|
92
|
+
(resolve, reject) => {
|
|
93
|
+
mkdirSync(pathResolve(to, ".."), { recursive: true });
|
|
94
|
+
return copyFile(from, to, (copyError) => {
|
|
95
|
+
if (copyError) {
|
|
96
|
+
reject();
|
|
97
|
+
} else {
|
|
98
|
+
resolve(true);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
)));
|
|
103
|
+
spinner.succeed(`Successfully copied ${files.length} ${typeName} files!`);
|
|
104
|
+
} catch (error) {
|
|
105
|
+
spinner.fail(`Copying of ${typeName} files failed.`);
|
|
106
|
+
log(`Error: ${error.message}`, "error");
|
|
107
|
+
log(error, "error");
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
const copyConfiguredFiles = async (spinner, config, quiet) => {
|
|
111
|
+
const { copyFiles: copyFilesConfig, outputFullPath, sourceFullPath, sourcePath } = config;
|
|
112
|
+
if (!copyFilesConfig || copyFilesConfig.length === 0) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
try {
|
|
116
|
+
spinner.start("Copying configured files...");
|
|
117
|
+
let totalCopied = 0;
|
|
118
|
+
const baseDir = sourceFullPath || (sourcePath ? pathResolve(cwd, sourcePath) : cwd);
|
|
119
|
+
for (const pattern of copyFilesConfig) {
|
|
120
|
+
const resolvedPattern = pathResolve(baseDir, pattern);
|
|
121
|
+
const matchingFiles = globSync(resolvedPattern, {
|
|
122
|
+
absolute: true,
|
|
123
|
+
nodir: true
|
|
124
|
+
});
|
|
125
|
+
if (matchingFiles.length === 0) {
|
|
126
|
+
if (!quiet) {
|
|
127
|
+
log(`Warning: No files found matching pattern: ${pattern}`, "warn", quiet);
|
|
128
|
+
}
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
for (const sourceFile of matchingFiles) {
|
|
132
|
+
const relativePath = pathRelative(baseDir, sourceFile);
|
|
133
|
+
const destPath = pathResolve(outputFullPath, relativePath);
|
|
134
|
+
const destDir = pathResolve(destPath, "..");
|
|
135
|
+
mkdirSync(destDir, { recursive: true });
|
|
136
|
+
await new Promise((resolve, reject) => {
|
|
137
|
+
copyFile(sourceFile, destPath, (copyError) => {
|
|
138
|
+
if (copyError) {
|
|
139
|
+
reject(copyError);
|
|
140
|
+
} else {
|
|
141
|
+
resolve(true);
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
totalCopied++;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (totalCopied > 0) {
|
|
149
|
+
spinner.succeed(`Successfully copied ${totalCopied} configured files!`);
|
|
150
|
+
} else {
|
|
151
|
+
spinner.succeed("No configured files to copy");
|
|
152
|
+
}
|
|
153
|
+
} catch (error) {
|
|
154
|
+
spinner.fail("Failed to copy configured files");
|
|
155
|
+
log(`Error copying configured files: ${error.message}`, "error", quiet);
|
|
156
|
+
throw error;
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
const copyFileSync = (source, target) => {
|
|
160
|
+
let targetFile = target;
|
|
161
|
+
if (existsSync(target)) {
|
|
162
|
+
if (lstatSync(target).isDirectory()) {
|
|
163
|
+
targetFile = pathJoin(target, pathBasename(source));
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
writeFileSync(targetFile, readFileSync(source));
|
|
167
|
+
};
|
|
168
|
+
const copyFolderRecursiveSync = (source, target) => {
|
|
169
|
+
let files = [];
|
|
170
|
+
const targetFolder = pathJoin(target, pathBasename(source));
|
|
171
|
+
if (!existsSync(targetFolder)) {
|
|
172
|
+
mkdirSync(targetFolder);
|
|
173
|
+
}
|
|
174
|
+
if (lstatSync(source).isDirectory()) {
|
|
175
|
+
files = readdirSync(source);
|
|
176
|
+
files.forEach((file) => {
|
|
177
|
+
const curSource = pathJoin(source, file);
|
|
178
|
+
if (lstatSync(curSource).isDirectory()) {
|
|
179
|
+
copyFolderRecursiveSync(curSource, targetFolder);
|
|
180
|
+
} else {
|
|
181
|
+
copyFileSync(curSource, targetFolder);
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
const getPackageJson = (packagePath) => {
|
|
187
|
+
const formatPath = packagePath || `${process.cwd()}/package.json`;
|
|
188
|
+
const packageData = readFileSync(formatPath).toString();
|
|
189
|
+
return JSON.parse(packageData);
|
|
190
|
+
};
|
|
191
|
+
const getFilesByExt = (ext, config) => {
|
|
192
|
+
const { sourceFullPath } = config;
|
|
193
|
+
return globSync(`${sourceFullPath}/**/**${ext}`);
|
|
194
|
+
};
|
|
195
|
+
const removeConflictModules = (moduleList) => {
|
|
196
|
+
const updatedList = { ...moduleList };
|
|
197
|
+
Object.keys(updatedList).forEach((moduleName) => {
|
|
198
|
+
const regex = new RegExp("^(?!@types/).*?(jest|webpack).*$", "gi");
|
|
199
|
+
if (regex.test(moduleName)) {
|
|
200
|
+
delete updatedList[moduleName];
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
return updatedList;
|
|
204
|
+
};
|
|
205
|
+
const removeFiles = (fileName, isRelative = false) => new Promise((resolve, reject) => {
|
|
206
|
+
const filePath = isRelative ? pathResolve(cwd, fileName) : fileName;
|
|
207
|
+
try {
|
|
208
|
+
rimrafSync(filePath);
|
|
209
|
+
return resolve(null);
|
|
210
|
+
} catch (error) {
|
|
211
|
+
return reject(error);
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
const removeModules = () => new Promise(async (resolve, reject) => {
|
|
215
|
+
try {
|
|
216
|
+
await removeFiles("./node_modules", true);
|
|
217
|
+
await removeFiles("./yarn.lock", true);
|
|
218
|
+
await removeFiles("./package-lock.json", true);
|
|
219
|
+
resolve(null);
|
|
220
|
+
} catch (error) {
|
|
221
|
+
reject(error);
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
const setPackageJson = (json, packagePath) => {
|
|
225
|
+
if (!json) {
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
const formatPath = packagePath || `${process.cwd()}/package.json`;
|
|
229
|
+
writeFileSync(formatPath, JSON.stringify(json, null, 2));
|
|
230
|
+
};
|
|
231
|
+
const linkedModules = (startPath) => {
|
|
232
|
+
const workingPath = startPath || process.cwd();
|
|
233
|
+
let modulePath;
|
|
234
|
+
let prefix;
|
|
235
|
+
if (workingPath.includes("@")) {
|
|
236
|
+
prefix = `@${workingPath.split("@").pop()}`;
|
|
237
|
+
modulePath = workingPath;
|
|
238
|
+
} else {
|
|
239
|
+
modulePath = pathJoin(workingPath, "node_modules");
|
|
240
|
+
}
|
|
241
|
+
const foundPaths = globSync(`${modulePath}/*`);
|
|
242
|
+
return foundPaths.reduce((list, foundPath) => {
|
|
243
|
+
try {
|
|
244
|
+
const stats = lstatSync(foundPath);
|
|
245
|
+
if (stats.isDirectory()) {
|
|
246
|
+
const deepList = linkedModules(foundPath);
|
|
247
|
+
list.push(...deepList);
|
|
248
|
+
} else if (stats.isSymbolicLink()) {
|
|
249
|
+
const moduleNames = [prefix, pathBasename(foundPath)].filter((item) => !isEmpty(item));
|
|
250
|
+
list.push({ name: `${moduleNames.join("/")}`, path: foundPath });
|
|
251
|
+
}
|
|
252
|
+
return list;
|
|
253
|
+
} catch {
|
|
254
|
+
return list;
|
|
255
|
+
}
|
|
256
|
+
}, []);
|
|
257
|
+
};
|
|
258
|
+
const checkLinkedModules = () => {
|
|
259
|
+
const linked = linkedModules();
|
|
260
|
+
if (linked.length) {
|
|
261
|
+
const msgModule = linked.length > 1 ? "Modules" : "Module";
|
|
262
|
+
const linkedMsg = linked.reduce(
|
|
263
|
+
(msg, linkedModule) => `${msg}
|
|
264
|
+
* ${linkedModule.name}`,
|
|
265
|
+
`Linked ${msgModule}:`
|
|
266
|
+
);
|
|
267
|
+
log(boxen(linkedMsg, { dimBorder: true, padding: 1 }), "warn");
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
const updateTemplateName = (filePath, replace, replaceCaps) => {
|
|
271
|
+
let data = readFileSync(filePath, "utf8");
|
|
272
|
+
data = data.replace(/sample/g, replace);
|
|
273
|
+
data = data.replace(/Sample/g, replaceCaps);
|
|
274
|
+
writeFileSync(filePath, data, "utf8");
|
|
275
|
+
};
|
|
276
|
+
export {
|
|
277
|
+
checkLinkedModules,
|
|
278
|
+
copyConfiguredFiles,
|
|
279
|
+
copyFileSync,
|
|
280
|
+
copyFiles,
|
|
281
|
+
copyFolderRecursiveSync,
|
|
282
|
+
createProgressBar,
|
|
283
|
+
createSpinner,
|
|
284
|
+
cwd,
|
|
285
|
+
getFilenames,
|
|
286
|
+
getFilesByExt,
|
|
287
|
+
getPackageJson,
|
|
288
|
+
handleWebpackProgress,
|
|
289
|
+
linkedModules,
|
|
290
|
+
removeConflictModules,
|
|
291
|
+
removeFiles,
|
|
292
|
+
removeModules,
|
|
293
|
+
setPackageJson,
|
|
294
|
+
updateTemplateName
|
|
295
|
+
};
|
|
296
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3V0aWxzL2FwcC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cblxuaW1wb3J0IGJveGVuIGZyb20gJ2JveGVuJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQge2NvcHlGaWxlLCBleGlzdHNTeW5jLCBsc3RhdFN5bmMsIG1rZGlyU3luYywgcmVhZGRpclN5bmMsIHJlYWRGaWxlU3luYywgd3JpdGVGaWxlU3luY30gZnJvbSAnZnMnO1xuaW1wb3J0IHtzeW5jIGFzIGdsb2JTeW5jfSBmcm9tICdnbG9iJztcbmltcG9ydCBpc0VtcHR5IGZyb20gJ2xvZGFzaC9pc0VtcHR5LmpzJztcbmltcG9ydCBvcmEgZnJvbSAnb3JhJztcbmltcG9ydCB7YmFzZW5hbWUgYXMgcGF0aEJhc2VuYW1lLCBqb2luIGFzIHBhdGhKb2luLCByZWxhdGl2ZSBhcyBwYXRoUmVsYXRpdmUsIHJlc29sdmUgYXMgcGF0aFJlc29sdmV9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtyaW1yYWZTeW5jfSBmcm9tICdyaW1yYWYnO1xuXG5cbmltcG9ydCB7bG9nfSBmcm9tICcuL2xvZy5qcyc7XG5cbmltcG9ydCB0eXBlIHtMZXhDb25maWdUeXBlfSBmcm9tICcuLi9MZXhDb25maWcuanMnO1xuXG5cbmV4cG9ydCBjb25zdCBjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RmlsZW5hbWVzUHJvcHMge1xuICByZWFkb25seSBjYWxsYmFjaz86IChzdGF0dXM6IG51bWJlcikgPT4gdm9pZDtcbiAgcmVhZG9ubHkgY2xpTmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xuICByZWFkb25seSB0eXBlPzogc3RyaW5nO1xuICByZWFkb25seSB1c2VUeXBlc2NyaXB0PzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEZpbGVuYW1lc1Jlc3VsdCB7XG4gIG5hbWVDYXBzOiBzdHJpbmc7XG4gIHRlbXBsYXRlRXh0OiBzdHJpbmc7XG4gIHRlbXBsYXRlUGF0aDogc3RyaW5nO1xuICB0ZW1wbGF0ZVJlYWN0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRGaWxlbmFtZXMgPSAocHJvcHM6IEdldEZpbGVuYW1lc1Byb3BzKTogRmlsZW5hbWVzUmVzdWx0IHwgdm9pZCA9PiB7XG4gIGNvbnN0IHtjYWxsYmFjaywgY2xpTmFtZSwgbmFtZSwgcXVpZXQsIHR5cGUsIHVzZVR5cGVzY3JpcHR9ID0gcHJvcHM7XG5cbiAgbGV0IG5hbWVDYXBzOiBzdHJpbmc7XG4gIGNvbnN0IGl0ZW1UeXBlczogc3RyaW5nW10gPSBbJ3N0b3JlcycsICd2aWV3cyddO1xuXG4gIGlmKCFuYW1lKSB7XG4gICAgaWYoaXRlbVR5cGVzLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6ICR7dHlwZX0gbmFtZSBpcyByZXF1aXJlZC4gUGxlYXNlIHVzZSAnbGV4IC1oJyBmb3Igb3B0aW9ucy5gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICByZXR1cm4gY2FsbGJhY2s/LigxKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmFtZUNhcHMgPSBgJHtuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpfSR7bmFtZS5zdWJzdHIoMSl9YDtcbiAgfVxuXG4gIGxvZyhgJHtjbGlOYW1lfSBhZGRpbmcgJHtuYW1lfSAke3R5cGV9Li4uYCwgJ2luZm8nLCBxdWlldCk7XG5cbiAgbGV0IHRlbXBsYXRlUGF0aDogc3RyaW5nO1xuICBsZXQgdGVtcGxhdGVFeHQ6IHN0cmluZztcbiAgbGV0IHRlbXBsYXRlUmVhY3Q6IHN0cmluZztcblxuICBpZih1c2VUeXBlc2NyaXB0KSB7XG4gICAgdGVtcGxhdGVQYXRoID0gJy4uLy4uL3RlbXBsYXRlcy90eXBlc2NyaXB0JztcbiAgICB0ZW1wbGF0ZUV4dCA9ICcudHMnO1xuICAgIHRlbXBsYXRlUmVhY3QgPSAnLnRzeCc7XG4gIH0gZWxzZSB7XG4gICAgdGVtcGxhdGVQYXRoID0gJy4uLy4uL3RlbXBsYXRlcy9mbG93JztcbiAgICB0ZW1wbGF0ZUV4dCA9ICcuanMnO1xuICAgIHRlbXBsYXRlUmVhY3QgPSAnLmpzJztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmFtZUNhcHMsXG4gICAgdGVtcGxhdGVFeHQsXG4gICAgdGVtcGxhdGVQYXRoLFxuICAgIHRlbXBsYXRlUmVhY3RcbiAgfTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3Bpbm5lciB7XG4gIGZhaWw6ICh0ZXh0Pzogc3RyaW5nKSA9PiB2b2lkO1xuICBzdGFydDogKHRleHQ/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIHN1Y2NlZWQ6ICh0ZXh0Pzogc3RyaW5nKSA9PiB2b2lkO1xuICB0ZXh0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlU3Bpbm5lciA9IChxdWlldCA9IGZhbHNlKTogU3Bpbm5lciA9PiB7XG4gIGlmKHF1aWV0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZhaWw6ICgpID0+IHt9LFxuICAgICAgc3RhcnQ6ICgpID0+IHt9LFxuICAgICAgc3VjY2VlZDogKCkgPT4ge31cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG9yYSh7Y29sb3I6ICd5ZWxsb3cnfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlUHJvZ3Jlc3NCYXIgPSAocGVyY2VudGFnZTogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgY29uc3Qgd2lkdGggPSAyMDtcbiAgY29uc3QgZmlsbGVkID0gTWF0aC5yb3VuZCgocGVyY2VudGFnZSAvIDEwMCkgKiB3aWR0aCk7XG4gIGNvbnN0IGVtcHR5ID0gd2lkdGggLSBmaWxsZWQ7XG5cbiAgY29uc3QgZmlsbGVkQmFyID0gY2hhbGsuY3lhbignXHUyNTg4JykucmVwZWF0KGZpbGxlZCk7XG4gIGNvbnN0IGVtcHR5QmFyID0gY2hhbGsuZ3JheSgnXHUyNTkxJykucmVwZWF0KGVtcHR5KTtcblxuICByZXR1cm4gZmlsbGVkQmFyICsgZW1wdHlCYXI7XG59O1xuXG5leHBvcnQgY29uc3QgaGFuZGxlV2VicGFja1Byb2dyZXNzID0gKG91dHB1dDogc3RyaW5nLCBzcGlubmVyOiBTcGlubmVyLCBxdWlldDogYm9vbGVhbiwgZW1vamk6IHN0cmluZywgYWN0aW9uOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgaWYocXVpZXQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwcm9ncmVzc01hdGNoID0gb3V0cHV0Lm1hdGNoKC9cXFt3ZWJwYWNrXFwuUHJvZ3Jlc3NcXF0gKFxcZCspJS8pO1xuICBpZihwcm9ncmVzc01hdGNoKSB7XG4gICAgY29uc3QgcHJvZ3Jlc3MgPSBwYXJzZUludChwcm9ncmVzc01hdGNoWzFdLCAxMCk7XG4gICAgY29uc3QgcHJvZ3Jlc3NCYXIgPSBjcmVhdGVQcm9ncmVzc0Jhcihwcm9ncmVzcyk7XG4gICAgc3Bpbm5lci50ZXh0ID0gYCR7ZW1vaml9ICR7YWN0aW9ufTogJHtwcm9ncmVzc0Jhcn0gJHtwcm9ncmVzc30lYDtcbiAgfSBlbHNlIGlmKG91dHB1dC5pbmNsdWRlcygnW3dlYnBhY2suUHJvZ3Jlc3NdJykpIHtcbiAgICBjb25zdCBnZW5lcmFsUHJvZ3Jlc3NNYXRjaCA9IG91dHB1dC5tYXRjaCgvKFxcZCspJS8pO1xuICAgIGlmKGdlbmVyYWxQcm9ncmVzc01hdGNoKSB7XG4gICAgICBjb25zdCBwcm9ncmVzcyA9IHBhcnNlSW50KGdlbmVyYWxQcm9ncmVzc01hdGNoWzFdLCAxMCk7XG4gICAgICBjb25zdCBwcm9ncmVzc0JhciA9IGNyZWF0ZVByb2dyZXNzQmFyKHByb2dyZXNzKTtcbiAgICAgIHNwaW5uZXIudGV4dCA9IGAke2Vtb2ppfSAke2FjdGlvbn06ICR7cHJvZ3Jlc3NCYXJ9ICR7cHJvZ3Jlc3N9JWA7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgY29weUZpbGVzID0gYXN5bmMgKGZpbGVzOiBzdHJpbmdbXSwgdHlwZU5hbWU6IHN0cmluZywgc3Bpbm5lciwgY29uZmlnOiBMZXhDb25maWdUeXBlKSA9PiB7XG4gIGNvbnN0IHtvdXRwdXRGdWxsUGF0aCwgc291cmNlRnVsbFBhdGh9ID0gY29uZmlnO1xuICBjb25zdCBpdGVtcyA9IGZpbGVzLm1hcCgoZmlsZU5hbWU6IHN0cmluZykgPT4gKHtcbiAgICBmcm9tOiBmaWxlTmFtZSxcbiAgICB0bzogcGF0aFJlc29sdmUob3V0cHV0RnVsbFBhdGgsIHBhdGhSZWxhdGl2ZShzb3VyY2VGdWxsUGF0aCwgZmlsZU5hbWUpKVxuICB9KSk7XG5cbiAgdHJ5IHtcbiAgICBzcGlubmVyLnN0YXJ0KGBDb3B5aW5nICR7dHlwZU5hbWV9IGZpbGVzLi4uYCk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoaXRlbXMubWFwKCh7ZnJvbSwgdG99KSA9PiBuZXcgUHJvbWlzZShcbiAgICAgIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbWtkaXJTeW5jKHBhdGhSZXNvbHZlKHRvLCAnLi4nKSwge3JlY3Vyc2l2ZTogdHJ1ZX0pO1xuICAgICAgICByZXR1cm4gY29weUZpbGUoZnJvbSwgdG8sIChjb3B5RXJyb3IpID0+IHtcbiAgICAgICAgICBpZihjb3B5RXJyb3IpIHtcbiAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgKSkpO1xuICAgIHNwaW5uZXIuc3VjY2VlZChgU3VjY2Vzc2Z1bGx5IGNvcGllZCAke2ZpbGVzLmxlbmd0aH0gJHt0eXBlTmFtZX0gZmlsZXMhYCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgc3Bpbm5lci5mYWlsKGBDb3B5aW5nIG9mICR7dHlwZU5hbWV9IGZpbGVzIGZhaWxlZC5gKTtcbiAgICBsb2coYEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJyk7XG4gICAgbG9nKGVycm9yLCAnZXJyb3InKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGNvcHlDb25maWd1cmVkRmlsZXMgPSBhc3luYyAoc3Bpbm5lciwgY29uZmlnOiBMZXhDb25maWdUeXBlLCBxdWlldDogYm9vbGVhbikgPT4ge1xuICBjb25zdCB7Y29weUZpbGVzOiBjb3B5RmlsZXNDb25maWcsIG91dHB1dEZ1bGxQYXRoLCBzb3VyY2VGdWxsUGF0aCwgc291cmNlUGF0aH0gPSBjb25maWc7XG4gIGlmKCFjb3B5RmlsZXNDb25maWcgfHwgY29weUZpbGVzQ29uZmlnLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgc3Bpbm5lci5zdGFydCgnQ29weWluZyBjb25maWd1cmVkIGZpbGVzLi4uJyk7XG4gICAgbGV0IHRvdGFsQ29waWVkID0gMDtcblxuICAgIGNvbnN0IGJhc2VEaXIgPSBzb3VyY2VGdWxsUGF0aCB8fCAoc291cmNlUGF0aCA/IHBhdGhSZXNvbHZlKGN3ZCwgc291cmNlUGF0aCkgOiBjd2QpO1xuXG4gICAgZm9yKGNvbnN0IHBhdHRlcm4gb2YgY29weUZpbGVzQ29uZmlnKSB7XG4gICAgICBjb25zdCByZXNvbHZlZFBhdHRlcm4gPSBwYXRoUmVzb2x2ZShiYXNlRGlyLCBwYXR0ZXJuKTtcbiAgICAgIGNvbnN0IG1hdGNoaW5nRmlsZXMgPSBnbG9iU3luYyhyZXNvbHZlZFBhdHRlcm4sIHtcbiAgICAgICAgYWJzb2x1dGU6IHRydWUsXG4gICAgICAgIG5vZGlyOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIGlmKG1hdGNoaW5nRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGlmKCFxdWlldCkge1xuICAgICAgICAgIGxvZyhgV2FybmluZzogTm8gZmlsZXMgZm91bmQgbWF0Y2hpbmcgcGF0dGVybjogJHtwYXR0ZXJufWAsICd3YXJuJywgcXVpZXQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IoY29uc3Qgc291cmNlRmlsZSBvZiBtYXRjaGluZ0ZpbGVzKSB7XG4gICAgICAgIC8vIENhbGN1bGF0ZSByZWxhdGl2ZSBwYXRoIGZyb20gc291cmNlIGRpcmVjdG9yeVxuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoUmVsYXRpdmUoYmFzZURpciwgc291cmNlRmlsZSk7XG4gICAgICAgIC8vIERldGVybWluZSBkZXN0aW5hdGlvbiBwYXRoIGluIG91dHB1dCBkaXJlY3RvcnlcbiAgICAgICAgY29uc3QgZGVzdFBhdGggPSBwYXRoUmVzb2x2ZShvdXRwdXRGdWxsUGF0aCwgcmVsYXRpdmVQYXRoKTtcbiAgICAgICAgLy8gQ3JlYXRlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICAgIGNvbnN0IGRlc3REaXIgPSBwYXRoUmVzb2x2ZShkZXN0UGF0aCwgJy4uJyk7XG4gICAgICAgIG1rZGlyU3luYyhkZXN0RGlyLCB7cmVjdXJzaXZlOiB0cnVlfSk7XG5cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGNvcHlGaWxlKHNvdXJjZUZpbGUsIGRlc3RQYXRoLCAoY29weUVycm9yKSA9PiB7XG4gICAgICAgICAgICBpZihjb3B5RXJyb3IpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KGNvcHlFcnJvcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdG90YWxDb3BpZWQrKztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYodG90YWxDb3BpZWQgPiAwKSB7XG4gICAgICBzcGlubmVyLnN1Y2NlZWQoYFN1Y2Nlc3NmdWxseSBjb3BpZWQgJHt0b3RhbENvcGllZH0gY29uZmlndXJlZCBmaWxlcyFgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3Bpbm5lci5zdWNjZWVkKCdObyBjb25maWd1cmVkIGZpbGVzIHRvIGNvcHknKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgc3Bpbm5lci5mYWlsKCdGYWlsZWQgdG8gY29weSBjb25maWd1cmVkIGZpbGVzJyk7XG4gICAgbG9nKGBFcnJvciBjb3B5aW5nIGNvbmZpZ3VyZWQgZmlsZXM6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBjb3B5RmlsZVN5bmMgPSAoc291cmNlOiBzdHJpbmcsIHRhcmdldDogc3RyaW5nKSA9PiB7XG4gIGxldCB0YXJnZXRGaWxlOiBzdHJpbmcgPSB0YXJnZXQ7XG5cbiAgaWYoZXhpc3RzU3luYyh0YXJnZXQpKSB7XG4gICAgaWYobHN0YXRTeW5jKHRhcmdldCkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgdGFyZ2V0RmlsZSA9IHBhdGhKb2luKHRhcmdldCwgcGF0aEJhc2VuYW1lKHNvdXJjZSkpO1xuICAgIH1cbiAgfVxuXG4gIHdyaXRlRmlsZVN5bmModGFyZ2V0RmlsZSwgcmVhZEZpbGVTeW5jKHNvdXJjZSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNvcHlGb2xkZXJSZWN1cnNpdmVTeW5jID0gKHNvdXJjZTogc3RyaW5nLCB0YXJnZXQ6IHN0cmluZyk6IHZvaWQgPT4ge1xuICBsZXQgZmlsZXM6IHN0cmluZ1tdID0gW107XG5cbiAgY29uc3QgdGFyZ2V0Rm9sZGVyOiBzdHJpbmcgPSBwYXRoSm9pbih0YXJnZXQsIHBhdGhCYXNlbmFtZShzb3VyY2UpKTtcblxuICBpZighZXhpc3RzU3luYyh0YXJnZXRGb2xkZXIpKSB7XG4gICAgbWtkaXJTeW5jKHRhcmdldEZvbGRlcik7XG4gIH1cblxuICBpZihsc3RhdFN5bmMoc291cmNlKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgZmlsZXMgPSByZWFkZGlyU3luYyhzb3VyY2UpO1xuICAgIGZpbGVzLmZvckVhY2goKGZpbGU6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgY3VyU291cmNlOiBzdHJpbmcgPSBwYXRoSm9pbihzb3VyY2UsIGZpbGUpO1xuXG4gICAgICBpZihsc3RhdFN5bmMoY3VyU291cmNlKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGNvcHlGb2xkZXJSZWN1cnNpdmVTeW5jKGN1clNvdXJjZSwgdGFyZ2V0Rm9sZGVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvcHlGaWxlU3luYyhjdXJTb3VyY2UsIHRhcmdldEZvbGRlcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQYWNrYWdlSnNvbiA9IChwYWNrYWdlUGF0aD86IHN0cmluZykgPT4ge1xuICBjb25zdCBmb3JtYXRQYXRoOiBzdHJpbmcgPSBwYWNrYWdlUGF0aCB8fCBgJHtwcm9jZXNzLmN3ZCgpfS9wYWNrYWdlLmpzb25gO1xuXG4gIGNvbnN0IHBhY2thZ2VEYXRhOiBzdHJpbmcgPSByZWFkRmlsZVN5bmMoZm9ybWF0UGF0aCkudG9TdHJpbmcoKTtcbiAgcmV0dXJuIEpTT04ucGFyc2UocGFja2FnZURhdGEpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZpbGVzQnlFeHQgPSAoZXh0OiBzdHJpbmcsIGNvbmZpZzogTGV4Q29uZmlnVHlwZSk6IHN0cmluZ1tdID0+IHtcbiAgY29uc3Qge3NvdXJjZUZ1bGxQYXRofSA9IGNvbmZpZztcbiAgcmV0dXJuIGdsb2JTeW5jKGAke3NvdXJjZUZ1bGxQYXRofS8qKi8qKiR7ZXh0fWApO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbW92ZUNvbmZsaWN0TW9kdWxlcyA9IChtb2R1bGVMaXN0OiBvYmplY3QpID0+IHtcbiAgY29uc3QgdXBkYXRlZExpc3Q6IG9iamVjdCA9IHsuLi5tb2R1bGVMaXN0fTtcblxuICBPYmplY3Qua2V5cyh1cGRhdGVkTGlzdCkuZm9yRWFjaCgobW9kdWxlTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcmVnZXg6IFJlZ0V4cCA9IG5ldyBSZWdFeHAoJ14oPyFAdHlwZXMvKS4qPyhqZXN0fHdlYnBhY2spLiokJywgJ2dpJyk7XG4gICAgaWYocmVnZXgudGVzdChtb2R1bGVOYW1lKSkge1xuICAgICAgZGVsZXRlIHVwZGF0ZWRMaXN0W21vZHVsZU5hbWVdO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHVwZGF0ZWRMaXN0O1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbW92ZUZpbGVzID0gKGZpbGVOYW1lOiBzdHJpbmcsIGlzUmVsYXRpdmU6IGJvb2xlYW4gPSBmYWxzZSkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICBjb25zdCBmaWxlUGF0aDogc3RyaW5nID0gaXNSZWxhdGl2ZSA/IHBhdGhSZXNvbHZlKGN3ZCwgZmlsZU5hbWUpIDogZmlsZU5hbWU7XG4gIHRyeSB7XG4gICAgcmltcmFmU3luYyhmaWxlUGF0aCk7XG4gICAgcmV0dXJuIHJlc29sdmUobnVsbCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHJlamVjdChlcnJvcik7XG4gIH1cbn0pO1xuXG5leHBvcnQgY29uc3QgcmVtb3ZlTW9kdWxlcyA9ICgpID0+IG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBSZW1vdmUgbm9kZV9tb2R1bGVzXG4gICAgYXdhaXQgcmVtb3ZlRmlsZXMoJy4vbm9kZV9tb2R1bGVzJywgdHJ1ZSk7XG5cbiAgICAvLyBSZW1vdmUgeWFybiBsb2NrXG4gICAgYXdhaXQgcmVtb3ZlRmlsZXMoJy4veWFybi5sb2NrJywgdHJ1ZSk7XG5cbiAgICAvLyBSZW1vdmUgbnBtIGxvY2tcbiAgICBhd2FpdCByZW1vdmVGaWxlcygnLi9wYWNrYWdlLWxvY2suanNvbicsIHRydWUpO1xuXG4gICAgcmVzb2x2ZShudWxsKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZWplY3QoZXJyb3IpO1xuICB9XG59KTtcblxuZXhwb3J0IGNvbnN0IHNldFBhY2thZ2VKc29uID0gKGpzb24sIHBhY2thZ2VQYXRoPzogc3RyaW5nKSA9PiB7XG4gIGlmKCFqc29uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0UGF0aDogc3RyaW5nID0gcGFja2FnZVBhdGggfHwgYCR7cHJvY2Vzcy5jd2QoKX0vcGFja2FnZS5qc29uYDtcblxuICB3cml0ZUZpbGVTeW5jKGZvcm1hdFBhdGgsIEpTT04uc3RyaW5naWZ5KGpzb24sIG51bGwsIDIpKTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlua2VkTW9kdWxlVHlwZSB7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgbGlua2VkTW9kdWxlcyA9IChzdGFydFBhdGg/OiBzdHJpbmcpOiBMaW5rZWRNb2R1bGVUeXBlW10gPT4ge1xuICBjb25zdCB3b3JraW5nUGF0aDogc3RyaW5nID0gc3RhcnRQYXRoIHx8IHByb2Nlc3MuY3dkKCk7XG4gIGxldCBtb2R1bGVQYXRoOiBzdHJpbmc7XG4gIGxldCBwcmVmaXg6IHN0cmluZztcblxuICBpZih3b3JraW5nUGF0aC5pbmNsdWRlcygnQCcpKSB7XG4gICAgcHJlZml4ID0gYEAke3dvcmtpbmdQYXRoLnNwbGl0KCdAJykucG9wKCl9YDtcbiAgICBtb2R1bGVQYXRoID0gd29ya2luZ1BhdGg7XG4gIH0gZWxzZSB7XG4gICAgbW9kdWxlUGF0aCA9IHBhdGhKb2luKHdvcmtpbmdQYXRoLCAnbm9kZV9tb2R1bGVzJyk7XG4gIH1cblxuICBjb25zdCBmb3VuZFBhdGhzOiBzdHJpbmdbXSA9IGdsb2JTeW5jKGAke21vZHVsZVBhdGh9LypgKTtcbiAgcmV0dXJuIGZvdW5kUGF0aHMucmVkdWNlKChsaXN0OiBMaW5rZWRNb2R1bGVUeXBlW10sIGZvdW5kUGF0aDogc3RyaW5nKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXRzID0gbHN0YXRTeW5jKGZvdW5kUGF0aCk7XG5cbiAgICAgIGlmKHN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgY29uc3QgZGVlcExpc3Q6IExpbmtlZE1vZHVsZVR5cGVbXSA9IGxpbmtlZE1vZHVsZXMoZm91bmRQYXRoKTtcbiAgICAgICAgbGlzdC5wdXNoKC4uLmRlZXBMaXN0KTtcbiAgICAgIH0gZWxzZSBpZihzdGF0cy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICAgIGNvbnN0IG1vZHVsZU5hbWVzOiBzdHJpbmdbXSA9IChbcHJlZml4LCBwYXRoQmFzZW5hbWUoZm91bmRQYXRoKV0pLmZpbHRlcigoaXRlbTogc3RyaW5nKSA9PiAhaXNFbXB0eShpdGVtKSk7XG4gICAgICAgIGxpc3QucHVzaCh7bmFtZTogYCR7bW9kdWxlTmFtZXMuam9pbignLycpfWAsIHBhdGg6IGZvdW5kUGF0aH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbGlzdDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFNraXAgZmlsZXMgdGhhdCBkb24ndCBleGlzdCBvciBjYW4ndCBiZSBhY2Nlc3NlZFxuICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuICB9LCBbXSk7XG59O1xuXG5leHBvcnQgY29uc3QgY2hlY2tMaW5rZWRNb2R1bGVzID0gKCkgPT4ge1xuICBjb25zdCBsaW5rZWQgPSBsaW5rZWRNb2R1bGVzKCk7XG5cbiAgaWYobGlua2VkLmxlbmd0aCkge1xuICAgIGNvbnN0IG1zZ01vZHVsZTogc3RyaW5nID0gbGlua2VkLmxlbmd0aCA+IDEgPyAnTW9kdWxlcycgOiAnTW9kdWxlJztcbiAgICBjb25zdCBsaW5rZWRNc2c6IHN0cmluZyA9IGxpbmtlZC5yZWR1Y2UoXG4gICAgICAobXNnOiBzdHJpbmcsIGxpbmtlZE1vZHVsZTogTGlua2VkTW9kdWxlVHlwZSkgPT5cbiAgICAgICAgYCR7bXNnfVxcbiAqICR7bGlua2VkTW9kdWxlLm5hbWV9YCxcbiAgICAgIGBMaW5rZWQgJHttc2dNb2R1bGV9OmBcbiAgICApO1xuICAgIGxvZyhib3hlbihsaW5rZWRNc2csIHtkaW1Cb3JkZXI6IHRydWUsIHBhZGRpbmc6IDF9KSwgJ3dhcm4nKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZVRlbXBsYXRlTmFtZSA9IChmaWxlUGF0aDogc3RyaW5nLCByZXBsYWNlOiBzdHJpbmcsIHJlcGxhY2VDYXBzOiBzdHJpbmcpID0+IHtcbiAgbGV0IGRhdGE6IHN0cmluZyA9IHJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgZGF0YSA9IGRhdGEucmVwbGFjZSgvc2FtcGxlL2csIHJlcGxhY2UpO1xuICBkYXRhID0gZGF0YS5yZXBsYWNlKC9TYW1wbGUvZywgcmVwbGFjZUNhcHMpO1xuICB3cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBkYXRhLCAndXRmOCcpO1xufTsiXSwKICAibWFwcGluZ3MiOiAiQUFLQSxPQUFPLFdBQVc7QUFDbEIsT0FBTyxXQUFXO0FBQ2xCLFNBQVEsVUFBVSxZQUFZLFdBQVcsV0FBVyxhQUFhLGNBQWMscUJBQW9CO0FBQ25HLFNBQVEsUUFBUSxnQkFBZTtBQUMvQixPQUFPLGFBQWE7QUFDcEIsT0FBTyxTQUFTO0FBQ2hCLFNBQVEsWUFBWSxjQUFjLFFBQVEsVUFBVSxZQUFZLGNBQWMsV0FBVyxtQkFBa0I7QUFDM0csU0FBUSxrQkFBaUI7QUFHekIsU0FBUSxXQUFVO0FBS1gsTUFBTSxNQUFjLFFBQVEsSUFBSTtBQWtCaEMsTUFBTSxlQUFlLENBQUMsVUFBcUQ7QUFDaEYsUUFBTSxFQUFDLFVBQVUsU0FBUyxNQUFNLE9BQU8sTUFBTSxjQUFhLElBQUk7QUFFOUQsTUFBSTtBQUNKLFFBQU0sWUFBc0IsQ0FBQyxVQUFVLE9BQU87QUFFOUMsTUFBRyxDQUFDLE1BQU07QUFDUixRQUFHLFVBQVUsU0FBUyxJQUFJLEdBQUc7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
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
export declare
|
|
2
|
-
export declare
|
|
3
|
-
export declare
|
|
1
|
+
export declare const getDirName: () => string;
|
|
2
|
+
export declare const getFilePath: (relativePath: string) => string;
|
|
3
|
+
export declare const getLexPackageJsonPath: () => string;
|
|
4
4
|
export declare const relativeFilePath: (filename: string, dirPath?: string, backUp?: number) => string;
|
|
5
5
|
export declare const relativeNodePath: (filename: string, dirPath?: string, backUp?: number) => string;
|
|
6
6
|
export declare const getNodePath: (moduleName: string) => string;
|
|
7
7
|
export declare const resolveBinaryPath: (binaryName: string, packageName?: string) => string;
|
|
8
8
|
export declare const findTailwindCssPath: () => string;
|
|
9
|
+
export declare const resolveWebpackPaths: (currentDirname: string) => {
|
|
10
|
+
webpackPath: string;
|
|
11
|
+
webpackConfig: string;
|
|
12
|
+
};
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import findFileUp from "find-file-up";
|
|
2
|
+
import { existsSync, readFileSync } from "fs";
|
|
3
|
+
import { sync as globSync } from "glob";
|
|
4
|
+
import { resolve as pathResolve, dirname } from "path";
|
|
5
|
+
import { LexConfig } from "../LexConfig.js";
|
|
6
|
+
const getDirName = () => {
|
|
7
|
+
try {
|
|
8
|
+
return eval('new URL(".", import.meta.url).pathname');
|
|
9
|
+
} catch {
|
|
10
|
+
return process.cwd();
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
const getFilePath = (relativePath) => {
|
|
14
|
+
try {
|
|
15
|
+
return eval('require("url").fileURLToPath(new URL(relativePath, import.meta.url))');
|
|
16
|
+
} catch {
|
|
17
|
+
if (relativePath === "../../../package.json") {
|
|
18
|
+
return pathResolve(process.cwd(), "package.json");
|
|
19
|
+
}
|
|
20
|
+
return pathResolve(process.cwd(), relativePath);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
const getLexPackageJsonPath = () => {
|
|
24
|
+
const LEX_PACKAGE_NAME = "@nlabs/lex";
|
|
25
|
+
const lexInNodeModules = pathResolve(process.cwd(), "node_modules/@nlabs/lex/package.json");
|
|
26
|
+
if (existsSync(lexInNodeModules)) {
|
|
27
|
+
return lexInNodeModules;
|
|
28
|
+
}
|
|
29
|
+
let startDir;
|
|
30
|
+
if (process.env.LEX_ROOT) {
|
|
31
|
+
startDir = process.env.LEX_ROOT;
|
|
32
|
+
} else {
|
|
33
|
+
try {
|
|
34
|
+
startDir = eval('new URL(".", import.meta.url).pathname');
|
|
35
|
+
} catch {
|
|
36
|
+
try {
|
|
37
|
+
startDir = eval('__filename ? require("path").dirname(__filename) : null');
|
|
38
|
+
if (!startDir) {
|
|
39
|
+
throw new Error("__filename not available");
|
|
40
|
+
}
|
|
41
|
+
} catch {
|
|
42
|
+
try {
|
|
43
|
+
if (process.argv[1] && !process.argv[1].includes("node")) {
|
|
44
|
+
startDir = dirname(process.argv[1]);
|
|
45
|
+
} else {
|
|
46
|
+
throw new Error("process.argv[1] not suitable");
|
|
47
|
+
}
|
|
48
|
+
} catch {
|
|
49
|
+
startDir = process.cwd();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
let dir = startDir;
|
|
55
|
+
for (let i = 0; i < 8; i++) {
|
|
56
|
+
const pkgPath = pathResolve(dir, "package.json");
|
|
57
|
+
if (existsSync(pkgPath)) {
|
|
58
|
+
try {
|
|
59
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
|
|
60
|
+
if (pkg.name === LEX_PACKAGE_NAME) {
|
|
61
|
+
return pkgPath;
|
|
62
|
+
}
|
|
63
|
+
} catch {
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const parent = dirname(dir);
|
|
67
|
+
if (parent === dir) {
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
dir = parent;
|
|
71
|
+
}
|
|
72
|
+
return pathResolve(process.cwd(), "package.json");
|
|
73
|
+
};
|
|
74
|
+
const relativeFilePath = (filename, dirPath = "./", backUp = 0) => {
|
|
75
|
+
const nestDepth = 10;
|
|
76
|
+
if (backUp) {
|
|
77
|
+
const filePath = findFileUp.sync(filename, dirPath, nestDepth);
|
|
78
|
+
const previousPath = Array(backUp).fill(null).map(() => "../").join("");
|
|
79
|
+
return pathResolve(filePath, previousPath);
|
|
80
|
+
}
|
|
81
|
+
return findFileUp.sync(filename, dirPath, nestDepth);
|
|
82
|
+
};
|
|
83
|
+
const relativeNodePath = (filename, dirPath = "./", backUp = 0) => {
|
|
84
|
+
const nestDepth = 10;
|
|
85
|
+
const modulePath = `node_modules/${filename}`;
|
|
86
|
+
if (dirPath !== "./") {
|
|
87
|
+
const lexModulePath = pathResolve(dirPath, modulePath);
|
|
88
|
+
if (existsSync(lexModulePath)) {
|
|
89
|
+
return lexModulePath;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const projectPath = pathResolve(process.cwd(), modulePath);
|
|
93
|
+
if (existsSync(projectPath)) {
|
|
94
|
+
return projectPath;
|
|
95
|
+
}
|
|
96
|
+
if (backUp) {
|
|
97
|
+
const filePath = findFileUp.sync(modulePath, dirPath, nestDepth);
|
|
98
|
+
const previousPath = Array(nestDepth).fill(null).map(() => "../").join("");
|
|
99
|
+
return pathResolve(filePath, previousPath);
|
|
100
|
+
}
|
|
101
|
+
return findFileUp.sync(modulePath, dirPath, nestDepth) || `/node_modules/${filename}`;
|
|
102
|
+
};
|
|
103
|
+
const getNodePath = (moduleName) => {
|
|
104
|
+
const dirName = getDirName();
|
|
105
|
+
const modulePath = `node_modules/${moduleName}`;
|
|
106
|
+
const projectPath = pathResolve(process.cwd(), modulePath);
|
|
107
|
+
if (existsSync(projectPath)) {
|
|
108
|
+
return projectPath;
|
|
109
|
+
}
|
|
110
|
+
const repoPath = findFileUp.sync(modulePath, dirName);
|
|
111
|
+
if (repoPath && existsSync(repoPath)) {
|
|
112
|
+
return repoPath;
|
|
113
|
+
}
|
|
114
|
+
const localPath = findFileUp.sync(modulePath, "./", 10) || `./${modulePath}`;
|
|
115
|
+
return localPath;
|
|
116
|
+
};
|
|
117
|
+
const resolveBinaryPath = (binaryName, packageName) => {
|
|
118
|
+
const lexDir = LexConfig.getLexDir();
|
|
119
|
+
const lexBinPath = pathResolve(lexDir, `node_modules/.bin/${binaryName}`);
|
|
120
|
+
if (existsSync(lexBinPath)) {
|
|
121
|
+
return lexBinPath;
|
|
122
|
+
}
|
|
123
|
+
if (packageName) {
|
|
124
|
+
const lexPackageBinPath = pathResolve(lexDir, `node_modules/${packageName}/bin/${binaryName}`);
|
|
125
|
+
if (existsSync(lexPackageBinPath)) {
|
|
126
|
+
return lexPackageBinPath;
|
|
127
|
+
}
|
|
128
|
+
const lexPackageBinJsPath = pathResolve(lexDir, `node_modules/${packageName}/bin/${binaryName}.js`);
|
|
129
|
+
if (existsSync(lexPackageBinJsPath)) {
|
|
130
|
+
return lexPackageBinJsPath;
|
|
131
|
+
}
|
|
132
|
+
const lexPackageBinCjsPath = pathResolve(lexDir, `node_modules/${packageName}/bin/${binaryName}.cjs`);
|
|
133
|
+
if (existsSync(lexPackageBinCjsPath)) {
|
|
134
|
+
return lexPackageBinCjsPath;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const checkBinUp = (startDir2) => {
|
|
138
|
+
let checkDir = startDir2;
|
|
139
|
+
for (let i = 0; i < 5; i++) {
|
|
140
|
+
const monorepoBinPath = pathResolve(checkDir, `node_modules/.bin/${binaryName}`);
|
|
141
|
+
if (existsSync(monorepoBinPath)) {
|
|
142
|
+
return monorepoBinPath;
|
|
143
|
+
}
|
|
144
|
+
const parentDir = pathResolve(checkDir, "..");
|
|
145
|
+
if (parentDir === checkDir) {
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
checkDir = parentDir;
|
|
149
|
+
}
|
|
150
|
+
return "";
|
|
151
|
+
};
|
|
152
|
+
const fromCwd = checkBinUp(process.cwd());
|
|
153
|
+
if (fromCwd) {
|
|
154
|
+
return fromCwd;
|
|
155
|
+
}
|
|
156
|
+
const fromLex = checkBinUp(lexDir);
|
|
157
|
+
if (fromLex) {
|
|
158
|
+
return fromLex;
|
|
159
|
+
}
|
|
160
|
+
return "";
|
|
161
|
+
};
|
|
162
|
+
const findTailwindCssPath = () => {
|
|
163
|
+
const tailwindPatterns = ["**/tailwind.css"];
|
|
164
|
+
for (const pattern of tailwindPatterns) {
|
|
165
|
+
const files = globSync(pattern, {
|
|
166
|
+
cwd: process.cwd(),
|
|
167
|
+
ignore: ["**/node_modules/**", "**/dist/**", "**/build/**", "**/.storybook/**"]
|
|
168
|
+
});
|
|
169
|
+
if (files.length > 0) {
|
|
170
|
+
return pathResolve(process.cwd(), files[0]);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return "";
|
|
174
|
+
};
|
|
175
|
+
const resolveWebpackPaths = (currentDirname) => {
|
|
176
|
+
const possibleWebpackPaths = [
|
|
177
|
+
pathResolve(process.cwd(), "node_modules/webpack-cli/bin/cli.js"),
|
|
178
|
+
pathResolve(process.cwd(), "node_modules/.bin/webpack"),
|
|
179
|
+
pathResolve(process.cwd(), "node_modules/@nlabs/lex", "node_modules/webpack-cli/bin/cli.js"),
|
|
180
|
+
pathResolve(process.cwd(), "node_modules/@nlabs/lex", "node_modules/.bin/webpack"),
|
|
181
|
+
pathResolve(currentDirname, "node_modules/@nlabs/lex/node_modules/webpack-cli/bin/cli.js"),
|
|
182
|
+
pathResolve(currentDirname, "node_modules/@nlabs/lex/node_modules/.bin/webpack"),
|
|
183
|
+
pathResolve(process.env.LEX_HOME || "/node_modules/@nlabs/lex", "node_modules/webpack-cli/bin/cli.js"),
|
|
184
|
+
pathResolve(process.env.LEX_HOME || "/node_modules/@nlabs/lex", "node_modules/.bin/webpack")
|
|
185
|
+
];
|
|
186
|
+
let webpackPath = "";
|
|
187
|
+
for (const path of possibleWebpackPaths) {
|
|
188
|
+
if (existsSync(path)) {
|
|
189
|
+
webpackPath = path;
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
if (!webpackPath) {
|
|
194
|
+
webpackPath = "npx";
|
|
195
|
+
}
|
|
196
|
+
const possibleWebpackConfigPaths = [
|
|
197
|
+
pathResolve(process.cwd(), "webpack.config.js"),
|
|
198
|
+
pathResolve(process.cwd(), "webpack.config.ts"),
|
|
199
|
+
pathResolve(process.cwd(), "node_modules/@nlabs/lex/webpack.config.js"),
|
|
200
|
+
pathResolve(process.cwd(), "node_modules/@nlabs/lex/webpack.config.ts"),
|
|
201
|
+
pathResolve(currentDirname, "node_modules/@nlabs/lex/webpack.config.js"),
|
|
202
|
+
pathResolve(currentDirname, "node_modules/@nlabs/lex/webpack.config.ts"),
|
|
203
|
+
pathResolve(process.env.LEX_HOME || "/node_modules/@nlabs/lex", "webpack.config.js"),
|
|
204
|
+
pathResolve(process.env.LEX_HOME || "/node_modules/@nlabs/lex", "webpack.config.ts")
|
|
205
|
+
];
|
|
206
|
+
let webpackConfig = "";
|
|
207
|
+
for (const path of possibleWebpackConfigPaths) {
|
|
208
|
+
if (existsSync(path)) {
|
|
209
|
+
webpackConfig = path;
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
if (!webpackConfig) {
|
|
214
|
+
webpackConfig = pathResolve(currentDirname, "../../webpack.config.js");
|
|
215
|
+
}
|
|
216
|
+
return { webpackConfig, webpackPath };
|
|
217
|
+
};
|
|
218
|
+
export {
|
|
219
|
+
findTailwindCssPath,
|
|
220
|
+
getDirName,
|
|
221
|
+
getFilePath,
|
|
222
|
+
getLexPackageJsonPath,
|
|
223
|
+
getNodePath,
|
|
224
|
+
relativeFilePath,
|
|
225
|
+
relativeNodePath,
|
|
226
|
+
resolveBinaryPath,
|
|
227
|
+
resolveWebpackPaths
|
|
228
|
+
};
|
|
229
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3V0aWxzL2ZpbGUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQgZmluZEZpbGVVcCBmcm9tICdmaW5kLWZpbGUtdXAnO1xuaW1wb3J0IHtleGlzdHNTeW5jLCByZWFkRmlsZVN5bmN9IGZyb20gJ2ZzJztcbmltcG9ydCB7c3luYyBhcyBnbG9iU3luY30gZnJvbSAnZ2xvYic7XG5pbXBvcnQge3Jlc29sdmUgYXMgcGF0aFJlc29sdmUsIGRpcm5hbWV9IGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQge0xleENvbmZpZ30gZnJvbSAnLi4vTGV4Q29uZmlnLmpzJztcblxuZXhwb3J0IGNvbnN0IGdldERpck5hbWUgPSAoKTogc3RyaW5nID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZXZhbCgnbmV3IFVSTChcIi5cIiwgaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZScpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5jd2QoKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldEZpbGVQYXRoID0gKHJlbGF0aXZlUGF0aDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZXZhbCgncmVxdWlyZShcInVybFwiKS5maWxlVVJMVG9QYXRoKG5ldyBVUkwocmVsYXRpdmVQYXRoLCBpbXBvcnQubWV0YS51cmwpKScpO1xuICB9IGNhdGNoIHtcbiAgICBpZihyZWxhdGl2ZVBhdGggPT09ICcuLi8uLi8uLi9wYWNrYWdlLmpzb24nKSB7XG4gICAgICByZXR1cm4gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ3BhY2thZ2UuanNvbicpO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgcmVsYXRpdmVQYXRoKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldExleFBhY2thZ2VKc29uUGF0aCA9ICgpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBMRVhfUEFDS0FHRV9OQU1FID0gJ0BubGFicy9sZXgnO1xuXG4gIGNvbnN0IGxleEluTm9kZU1vZHVsZXMgPSBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnbm9kZV9tb2R1bGVzL0BubGFicy9sZXgvcGFja2FnZS5qc29uJyk7XG5cbiAgaWYoZXhpc3RzU3luYyhsZXhJbk5vZGVNb2R1bGVzKSkge1xuICAgIHJldHVybiBsZXhJbk5vZGVNb2R1bGVzO1xuICB9XG5cbiAgbGV0IHN0YXJ0RGlyOiBzdHJpbmc7XG5cbiAgaWYocHJvY2Vzcy5lbnYuTEVYX1JPT1QpIHtcbiAgICBzdGFydERpciA9IHByb2Nlc3MuZW52LkxFWF9ST09UO1xuICB9IGVsc2Uge1xuICAgIHRyeSB7XG4gICAgICBzdGFydERpciA9IGV2YWwoJ25ldyBVUkwoXCIuXCIsIGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0YXJ0RGlyID0gZXZhbCgnX19maWxlbmFtZSA/IHJlcXVpcmUoXCJwYXRoXCIpLmRpcm5hbWUoX19maWxlbmFtZSkgOiBudWxsJyk7XG4gICAgICAgIGlmKCFzdGFydERpcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignX19maWxlbmFtZSBub3QgYXZhaWxhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmKHByb2Nlc3MuYXJndlsxXSAmJiAhcHJvY2Vzcy5hcmd2WzFdLmluY2x1ZGVzKCdub2RlJykpIHtcbiAgICAgICAgICAgIHN0YXJ0RGlyID0gZGlybmFtZShwcm9jZXNzLmFyZ3ZbMV0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYXJndlsxXSBub3Qgc3VpdGFibGUnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHN0YXJ0RGlyID0gcHJvY2Vzcy5jd2QoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxldCBkaXIgPSBzdGFydERpcjtcbiAgZm9yKGxldCBpID0gMDsgaSA8IDg7IGkrKykge1xuICAgIGNvbnN0IHBrZ1BhdGggPSBwYXRoUmVzb2x2ZShkaXIsICdwYWNrYWdlLmpzb24nKTtcbiAgICBpZihleGlzdHNTeW5jKHBrZ1BhdGgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwa2cgPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhwa2dQYXRoLCAndXRmOCcpKTtcbiAgICAgICAgaWYocGtnLm5hbWUgPT09IExFWF9QQUNLQUdFX05BTUUpIHtcbiAgICAgICAgICByZXR1cm4gcGtnUGF0aDtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudCA9IGRpcm5hbWUoZGlyKTtcbiAgICBpZihwYXJlbnQgPT09IGRpcikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRpciA9IHBhcmVudDtcbiAgfVxuXG4gIHJldHVybiBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAncGFja2FnZS5qc29uJyk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVsYXRpdmVGaWxlUGF0aCA9IChmaWxlbmFtZTogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcgPSAnLi8nLCBiYWNrVXA6IG51bWJlciA9IDApOiBzdHJpbmcgPT4ge1xuICBjb25zdCBuZXN0RGVwdGg6IG51bWJlciA9IDEwO1xuXG4gIGlmKGJhY2tVcCkge1xuICAgIGNvbnN0IGZpbGVQYXRoOiBzdHJpbmcgPSBmaW5kRmlsZVVwLnN5bmMoZmlsZW5hbWUsIGRpclBhdGgsIG5lc3REZXB0aCk7XG4gICAgY29uc3QgcHJldmlvdXNQYXRoOiBzdHJpbmcgPSBBcnJheShiYWNrVXApLmZpbGwobnVsbCkubWFwKCgpID0+ICcuLi8nKS5qb2luKCcnKTtcbiAgICByZXR1cm4gcGF0aFJlc29sdmUoZmlsZVBhdGgsIHByZXZpb3VzUGF0aCk7XG4gIH1cblxuICByZXR1cm4gZmluZEZpbGVVcC5zeW5jKGZpbGVuYW1lLCBkaXJQYXRoLCBuZXN0RGVwdGgpO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbGF0aXZlTm9kZVBhdGggPSAoZmlsZW5hbWU6IHN0cmluZywgZGlyUGF0aDogc3RyaW5nID0gJy4vJywgYmFja1VwOiBudW1iZXIgPSAwKTogc3RyaW5nID0+IHtcbiAgY29uc3QgbmVzdERlcHRoOiBudW1iZXIgPSAxMDtcbiAgY29uc3QgbW9kdWxlUGF0aCA9IGBub2RlX21vZHVsZXMvJHtmaWxlbmFtZX1gO1xuXG4gIGlmKGRpclBhdGggIT09ICcuLycpIHtcbiAgICBjb25zdCBsZXhNb2R1bGVQYXRoID0gcGF0aFJlc29sdmUoZGlyUGF0aCwgbW9kdWxlUGF0aCk7XG4gICAgaWYoZXhpc3RzU3luYyhsZXhNb2R1bGVQYXRoKSkge1xuICAgICAgcmV0dXJuIGxleE1vZHVsZVBhdGg7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdFBhdGggPSBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBtb2R1bGVQYXRoKTtcbiAgaWYoZXhpc3RzU3luYyhwcm9qZWN0UGF0aCkpIHtcbiAgICByZXR1cm4gcHJvamVjdFBhdGg7XG4gIH1cblxuICBpZihiYWNrVXApIHtcbiAgICBjb25zdCBmaWxlUGF0aDogc3RyaW5nID0gZmluZEZpbGVVcC5zeW5jKG1vZHVsZVBhdGgsIGRpclBhdGgsIG5lc3REZXB0aCk7XG4gICAgY29uc3QgcHJldmlvdXNQYXRoOiBzdHJpbmcgPSBBcnJheShuZXN0RGVwdGgpLmZpbGwobnVsbCkubWFwKCgpID0+ICcuLi8nKS5qb2luKCcnKTtcbiAgICByZXR1cm4gcGF0aFJlc29sdmUoZmlsZVBhdGgsIHByZXZpb3VzUGF0aCk7XG4gIH1cblxuICByZXR1cm4gZmluZEZpbGVVcC5zeW5jKG1vZHVsZVBhdGgsIGRpclBhdGgsIG5lc3REZXB0aCkgfHwgYC9ub2RlX21vZHVsZXMvJHtmaWxlbmFtZX1gO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE5vZGVQYXRoID0gKG1vZHVsZU5hbWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGRpck5hbWUgPSBnZXREaXJOYW1lKCk7XG4gIGNvbnN0IG1vZHVsZVBhdGg6IHN0cmluZyA9IGBub2RlX21vZHVsZXMvJHttb2R1bGVOYW1lfWA7XG5cbiAgY29uc3QgcHJvamVjdFBhdGggPSBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBtb2R1bGVQYXRoKTtcbiAgaWYoZXhpc3RzU3luYyhwcm9qZWN0UGF0aCkpIHtcbiAgICByZXR1cm4gcHJvamVjdFBhdGg7XG4gIH1cblxuICBjb25zdCByZXBvUGF0aDogc3RyaW5nID0gZmluZEZpbGVVcC5zeW5jKG1vZHVsZVBhdGgsIGRpck5hbWUpO1xuICBpZihyZXBvUGF0aCAmJiBleGlzdHNTeW5jKHJlcG9QYXRoKSkge1xuICAgIHJldHVybiByZXBvUGF0aDtcbiAgfVxuXG4gIGNvbnN0IGxvY2FsUGF0aDogc3RyaW5nID0gZmluZEZpbGVVcC5zeW5jKG1vZHVsZVBhdGgsICcuLycsIDEwKSB8fCBgLi8ke21vZHVsZVBhdGh9YDtcbiAgcmV0dXJuIGxvY2FsUGF0aDtcbn07XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlQmluYXJ5UGF0aCA9IChiaW5hcnlOYW1lOiBzdHJpbmcsIHBhY2thZ2VOYW1lPzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgbGV4RGlyID0gTGV4Q29uZmlnLmdldExleERpcigpO1xuXG4gIGNvbnN0IGxleEJpblBhdGggPSBwYXRoUmVzb2x2ZShsZXhEaXIsIGBub2RlX21vZHVsZXMvLmJpbi8ke2JpbmFyeU5hbWV9YCk7XG4gIGlmKGV4aXN0c1N5bmMobGV4QmluUGF0aCkpIHtcbiAgICByZXR1cm4gbGV4QmluUGF0aDtcbiAgfVxuXG4gIGlmKHBhY2thZ2VOYW1lKSB7XG4gICAgY29uc3QgbGV4UGFja2FnZUJpblBhdGggPSBwYXRoUmVzb2x2ZShsZXhEaXIsIGBub2RlX21vZHVsZXMvJHtwYWNrYWdlTmFtZX0vYmluLyR7YmluYXJ5TmFtZX1gKTtcbiAgICBpZihleGlzdHNTeW5jKGxleFBhY2thZ2VCaW5QYXRoKSkge1xuICAgICAgcmV0dXJuIGxleFBhY2thZ2VCaW5QYXRoO1xuICAgIH1cblxuICAgIGNvbnN0IGxleFBhY2thZ2VCaW5Kc1BhdGggPSBwYXRoUmVzb2x2ZShsZXhEaXIsIGBub2RlX21vZHVsZXMvJHtwYWNrYWdlTmFtZX0vYmluLyR7YmluYXJ5TmFtZX0uanNgKTtcbiAgICBpZihleGlzdHNTeW5jKGxleFBhY2thZ2VCaW5Kc1BhdGgpKSB7XG4gICAgICByZXR1cm4gbGV4UGFja2FnZUJpbkpzUGF0aDtcbiAgICB9XG5cbiAgICBjb25zdCBsZXhQYWNrYWdlQmluQ2pzUGF0aCA9IHBhdGhSZXNvbHZlKGxleERpciwgYG5vZGVfbW9kdWxlcy8ke3BhY2thZ2VOYW1lfS9iaW4vJHtiaW5hcnlOYW1lfS5janNgKTtcbiAgICBpZihleGlzdHNTeW5jKGxleFBhY2thZ2VCaW5DanNQYXRoKSkge1xuICAgICAgcmV0dXJuIGxleFBhY2thZ2VCaW5DanNQYXRoO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNoZWNrQmluVXAgPSAoc3RhcnREaXI6IHN0cmluZykgPT4ge1xuICAgIGxldCBjaGVja0RpciA9IHN0YXJ0RGlyO1xuICAgIGZvcihsZXQgaSA9IDA7IGkgPCA1OyBpKyspIHtcbiAgICAgIGNvbnN0IG1vbm9yZXBvQmluUGF0aCA9IHBhdGhSZXNvbHZlKGNoZWNrRGlyLCBgbm9kZV9tb2R1bGVzLy5iaW4vJHtiaW5hcnlOYW1lfWApO1xuICAgICAgaWYoZXhpc3RzU3luYyhtb25vcmVwb0JpblBhdGgpKSB7XG4gICAgICAgIHJldHVybiBtb25vcmVwb0JpblBhdGg7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJlbnREaXIgPSBwYXRoUmVzb2x2ZShjaGVja0RpciwgJy4uJyk7XG4gICAgICBpZihwYXJlbnREaXIgPT09IGNoZWNrRGlyKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2hlY2tEaXIgPSBwYXJlbnREaXI7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfTtcblxuICBjb25zdCBmcm9tQ3dkID0gY2hlY2tCaW5VcChwcm9jZXNzLmN3ZCgpKTtcbiAgaWYoZnJvbUN3ZCkge1xuICAgIHJldHVybiBmcm9tQ3dkO1xuICB9XG5cbiAgY29uc3QgZnJvbUxleCA9IGNoZWNrQmluVXAobGV4RGlyKTtcbiAgaWYoZnJvbUxleCkge1xuICAgIHJldHVybiBmcm9tTGV4O1xuICB9XG5cbiAgcmV0dXJuICcnO1xufTtcblxuZXhwb3J0IGNvbnN0IGZpbmRUYWlsd2luZENzc1BhdGggPSAoKTogc3RyaW5nID0+IHtcbiAgY29uc3QgdGFpbHdpbmRQYXR0ZXJucyA9IFsnKiovdGFpbHdpbmQuY3NzJ107XG5cbiAgZm9yKGNvbnN0IHBhdHRlcm4gb2YgdGFpbHdpbmRQYXR0ZXJucykge1xuICAgIGNvbnN0IGZpbGVzID0gZ2xvYlN5bmMocGF0dGVybiwge1xuICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgICAgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi9kaXN0LyoqJywgJyoqL2J1aWxkLyoqJywgJyoqLy5zdG9yeWJvb2svKionXVxuICAgIH0pO1xuXG4gICAgaWYoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksIGZpbGVzWzBdKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59O1xuXG5leHBvcnQgY29uc3QgcmVzb2x2ZVdlYnBhY2tQYXRocyA9IChjdXJyZW50RGlybmFtZTogc3RyaW5nKToge3dlYnBhY2tQYXRoOiBzdHJpbmc7IHdlYnBhY2tDb25maWc6IHN0cmluZ30gPT4ge1xuICBjb25zdCBwb3NzaWJsZVdlYnBhY2tQYXRocyA9IFtcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnbm9kZV9tb2R1bGVzL3dlYnBhY2stY2xpL2Jpbi9jbGkuanMnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnbm9kZV9tb2R1bGVzLy5iaW4vd2VicGFjaycpLFxuICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICdub2RlX21vZHVsZXMvQG5sYWJzL2xleCcsICdub2RlX21vZHVsZXMvd2VicGFjay1jbGkvYmluL2NsaS5qcycpLFxuICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICdub2RlX21vZHVsZXMvQG5sYWJzL2xleCcsICdub2RlX21vZHVsZXMvLmJpbi93ZWJwYWNrJyksXG4gICAgcGF0aFJlc29sdmUoY3VycmVudERpcm5hbWUsICdub2RlX21vZHVsZXMvQG5sYWJzL2xleC9ub2RlX21vZHVsZXMvd2VicGFjay1jbGkvYmluL2NsaS5qcycpLFxuICAgIHBhdGhSZXNvbHZlKGN1cnJlbnREaXJuYW1lLCAnbm9kZV9tb2R1bGVzL0BubGFicy9sZXgvbm9kZV9tb2R1bGVzLy5iaW4vd2VicGFjaycpLFxuICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuZW52LkxFWF9IT01FIHx8ICcvbm9kZV9tb2R1bGVzL0BubGFicy9sZXgnLCAnbm9kZV9tb2R1bGVzL3dlYnBhY2stY2xpL2Jpbi9jbGkuanMnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmVudi5MRVhfSE9NRSB8fCAnL25vZGVfbW9kdWxlcy9AbmxhYnMvbGV4JywgJ25vZGVfbW9kdWxlcy8uYmluL3dlYnBhY2snKVxuICBdO1xuXG4gIGxldCB3ZWJwYWNrUGF0aCA9ICcnO1xuXG4gIGZvcihjb25zdCBwYXRoIG9mIHBvc3NpYmxlV2VicGFja1BhdGhzKSB7XG4gICAgaWYoZXhpc3RzU3luYyhwYXRoKSkge1xuICAgICAgd2VicGFja1BhdGggPSBwYXRoO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYoIXdlYnBhY2tQYXRoKSB7XG4gICAgd2VicGFja1BhdGggPSAnbnB4JztcbiAgfVxuXG4gIGNvbnN0IHBvc3NpYmxlV2VicGFja0NvbmZpZ1BhdGhzID0gW1xuICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICd3ZWJwYWNrLmNvbmZpZy5qcycpLFxuICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICd3ZWJwYWNrLmNvbmZpZy50cycpLFxuICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICdub2RlX21vZHVsZXMvQG5sYWJzL2xleC93ZWJwYWNrLmNvbmZpZy5qcycpLFxuICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICdub2RlX21vZHVsZXMvQG5sYWJzL2xleC93ZWJwYWNrLmNvbmZpZy50cycpLFxuICAgIHBhdGhSZXNvbHZlKGN1cnJlbnREaXJuYW1lLCAnbm9kZV9tb2R1bGVzL0BubGFicy9sZXgvd2VicGFjay5jb25maWcuanMnKSxcbiAgICBwYXRoUmVzb2x2ZShjdXJyZW50RGlybmFtZSwgJ25vZGVfbW9kdWxlcy9AbmxhYnMvbGV4L3dlYnBhY2suY29uZmlnLnRzJyksXG4gICAgcGF0aFJlc29sdmUocHJvY2Vzcy5lbnYuTEVYX0hPTUUgfHwgJy9ub2RlX21vZHVsZXMvQG5sYWJzL2xleCcsICd3ZWJwYWNrLmNvbmZpZy5qcycpLFxuICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuZW52LkxFWF9IT01FIHx8ICcvbm9kZV9tb2R1bGVzL0BubGFicy9sZXgnLCAnd2VicGFjay5jb25maWcudHMnKVxuICBdO1xuXG4gIGxldCB3ZWJwYWNrQ29uZmlnID0gJyc7XG5cbiAgZm9yKGNvbnN0IHBhdGggb2YgcG9zc2libGVXZWJwYWNrQ29uZmlnUGF0aHMpIHtcbiAgICBpZihleGlzdHNTeW5jKHBhdGgpKSB7XG4gICAgICB3ZWJwYWNrQ29uZmlnID0gcGF0aDtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmKCF3ZWJwYWNrQ29uZmlnKSB7XG4gICAgd2VicGFja0NvbmZpZyA9IHBhdGhSZXNvbHZlKGN1cnJlbnREaXJuYW1lLCAnLi4vLi4vd2VicGFjay5jb25maWcuanMnKTtcbiAgfVxuXG4gIHJldHVybiB7d2VicGFja0NvbmZpZywgd2VicGFja1BhdGh9O1xufTsiXSwKICAibWFwcGluZ3MiOiAiQUFJQSxPQUFPLGdCQUFnQjtBQUN2QixTQUFRLFlBQVksb0JBQW1CO0FBQ3ZDLFNBQVEsUUFBUSxnQkFBZTtBQUMvQixTQUFRLFdBQVcsYUFBYSxlQUFjO0FBRTlDLFNBQVEsaUJBQWdCO0FBRWpCLE1BQU0sYUFBYSxNQUFjO0FBQ3RDLE1BQUk7QUFDRixXQUFPLEtBQUssd0NBQXdDO0FBQUEsRUFDdEQsUUFBUTtBQUNOLFdBQU8sUUFBUSxJQUFJO0FBQUEsRUFDckI7QUFDRjtBQUVPLE1BQU0sY0FBYyxDQUFDLGlCQUFpQztBQUMzRCxNQUFJO0FBQ0YsV0FBTyxLQUFLLHNFQUFzRTtBQUFBLEVBQ3BGLFFBQVE7QUFDTixRQUFHLGlCQUFpQix5QkFBeUI7QUFDM0MsYUFBTyxZQUFZLFFBQVEsSUFBSSxHQUFHLGNBQWM7QUFBQSxJQUNsRDtBQUNBLFdBQU8sWUFBWSxRQUFRLElBQUksR0FBRyxZQUFZO0FBQUEsRUFDaEQ7QUFDRjtBQUVPLE1BQU0sd0JBQXdCLE1BQWM7QUFDakQsUUFBTSxtQkFBbUI7QUFFekIsUUFBTSxtQkFBbUIsWUFBWSxRQUFRLElBQUksR0FBRyxzQ0FBc0M7QUFFMUYsTUFBRyxXQUFXLGdCQUFnQixHQUFHO0FBQy9CLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSTtBQUVKLE1BQUcsUUFBUSxJQUFJLFVBQVU7QUFDdkIsZUFBVyxRQUFRLElBQUk7QUFBQSxFQUN6QixPQUFPO0FBQ0wsUUFBSTtBQUNGLGlCQUFXLEtBQUssd0NBQXdDO0FBQUEsSUFDMUQsUUFBUTtBQUNOLFVBQUk7QUFDRixtQkFBVyxLQUFL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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const processTranslations: (sourcePath: string, outputPath: string, quiet?: boolean) => Promise<void>;
|