@nlabs/lex 1.46.1 → 1.47.0

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.
Files changed (72) hide show
  1. package/__mocks__/LexConfig.js +20 -0
  2. package/__mocks__/boxen.js +7 -0
  3. package/__mocks__/build.js +16 -0
  4. package/__mocks__/chalk.js +23 -0
  5. package/__mocks__/compile.js +8 -0
  6. package/__mocks__/execa.js +21 -0
  7. package/__mocks__/ora.js +17 -0
  8. package/__mocks__/versions.js +12 -0
  9. package/dist/LexConfig.js +72 -14
  10. package/dist/commands/ai/ai.js +303 -0
  11. package/dist/commands/ai/index.js +7 -0
  12. package/dist/commands/build/build.js +350 -0
  13. package/dist/commands/clean/clean.js +31 -0
  14. package/dist/commands/compile/compile.js +195 -0
  15. package/dist/commands/config/config.js +43 -0
  16. package/dist/commands/copy/copy.js +38 -0
  17. package/dist/commands/create/create.js +124 -0
  18. package/dist/commands/dev/dev.js +70 -0
  19. package/dist/commands/init/init.js +93 -0
  20. package/dist/commands/link/link.js +15 -0
  21. package/dist/commands/lint/lint.js +656 -0
  22. package/dist/commands/migrate/migrate.js +37 -0
  23. package/dist/commands/publish/publish.js +104 -0
  24. package/dist/commands/test/test.js +327 -0
  25. package/dist/commands/update/update.js +62 -0
  26. package/dist/commands/upgrade/upgrade.js +47 -0
  27. package/dist/commands/versions/versions.js +41 -0
  28. package/dist/create/changelog.js +3 -3
  29. package/dist/index.js +35 -0
  30. package/dist/jest.config.lex.d.ts +2 -0
  31. package/dist/lex.js +25 -22
  32. package/dist/types.js +1 -0
  33. package/dist/utils/aiService.js +290 -0
  34. package/dist/utils/app.js +4 -4
  35. package/dist/utils/file.js +1 -1
  36. package/dist/utils/log.js +2 -1
  37. package/dist/utils/reactShim.js +3 -3
  38. package/dist/webpack.config.d.ts +2 -0
  39. package/eslint.config.js +10 -0
  40. package/index.cjs +20 -0
  41. package/jest.config.cjs +31 -27
  42. package/jest.config.lex.js +90 -38
  43. package/jest.setup.js +5 -0
  44. package/lex.config.js +50 -0
  45. package/package.json +70 -50
  46. package/{.postcssrc.js → postcss.config.js} +21 -9
  47. package/tsconfig.build.json +7 -16
  48. package/tsconfig.json +2 -1
  49. package/webpack.config.js +136 -77
  50. package/.eslintrc +0 -45
  51. package/dist/commands/build.js +0 -265
  52. package/dist/commands/bulid.test.js +0 -317
  53. package/dist/commands/clean.js +0 -31
  54. package/dist/commands/clean.test.js +0 -63
  55. package/dist/commands/compile.js +0 -195
  56. package/dist/commands/compile.test.js +0 -93
  57. package/dist/commands/config.js +0 -43
  58. package/dist/commands/copy.js +0 -38
  59. package/dist/commands/create.js +0 -116
  60. package/dist/commands/dev.js +0 -70
  61. package/dist/commands/init.js +0 -93
  62. package/dist/commands/link.js +0 -15
  63. package/dist/commands/lint.js +0 -179
  64. package/dist/commands/migrate.js +0 -37
  65. package/dist/commands/publish.js +0 -104
  66. package/dist/commands/test.js +0 -190
  67. package/dist/commands/update.js +0 -64
  68. package/dist/commands/upgrade.js +0 -47
  69. package/dist/commands/versions.js +0 -41
  70. package/dist/commands/versions.test.js +0 -49
  71. package/dist/lint.js +0 -11
  72. package/jest.setup.ts +0 -3
@@ -0,0 +1,350 @@
1
+ import GraphqlLoaderPlugin from "@luckycatfactory/esbuild-graphql-loader";
2
+ import { execa } from "execa";
3
+ import { readFileSync } from "fs";
4
+ import { sync as globSync } from "glob";
5
+ import { resolve as pathResolve } from "path";
6
+ import { URL } from "url";
7
+ import { LexConfig } from "../../LexConfig.js";
8
+ import { checkLinkedModules, createSpinner, removeFiles } from "../../utils/app.js";
9
+ import { relativeNodePath } from "../../utils/file.js";
10
+ import { log } from "../../utils/log.js";
11
+ import { aiFunction } from "../ai/ai.js";
12
+ const buildWithEsBuild = async (spinner, commandOptions, callback) => {
13
+ const {
14
+ cliName = "Lex",
15
+ format = "cjs",
16
+ outputPath,
17
+ quiet,
18
+ sourcePath,
19
+ watch
20
+ } = commandOptions;
21
+ const {
22
+ outputFullPath,
23
+ sourceFullPath,
24
+ targetEnvironment,
25
+ useGraphQl,
26
+ useTypescript
27
+ } = LexConfig.config;
28
+ const sourceDir = sourcePath ? pathResolve(process.cwd(), `./${sourcePath}`) : sourceFullPath;
29
+ const loader = {
30
+ ".js": "js"
31
+ };
32
+ if (useTypescript) {
33
+ loader[".ts"] = "ts";
34
+ loader[".tsx"] = "tsx";
35
+ }
36
+ const plugins = [];
37
+ if (useGraphQl) {
38
+ plugins.push(GraphqlLoaderPlugin());
39
+ }
40
+ const globOptions = {
41
+ cwd: sourceDir,
42
+ dot: false,
43
+ nodir: true,
44
+ nosort: true
45
+ };
46
+ const tsFiles = globSync(`${sourceDir}/**/!(*.spec|*.test).ts*`, globOptions);
47
+ const jsFiles = globSync(`${sourceDir}/**/!(*.spec|*.test).js`, globOptions);
48
+ const sourceFiles = [...tsFiles, ...jsFiles];
49
+ const packageJsonData = readFileSync(pathResolve(process.cwd(), "./package.json"));
50
+ const packageJson = JSON.parse(packageJsonData.toString());
51
+ const external = [
52
+ ...Object.keys(packageJson.dependencies || {}),
53
+ ...Object.keys(packageJson.peerDependencies || {})
54
+ ];
55
+ const dirName = new URL(".", import.meta.url).pathname;
56
+ const dirPath = pathResolve(dirName, "../..");
57
+ const outputDir = outputPath || outputFullPath;
58
+ const esbuildPath = relativeNodePath("esbuild/bin/esbuild", dirPath);
59
+ const esbuildOptions = [
60
+ ...sourceFiles,
61
+ "--bundle",
62
+ "--color=true",
63
+ `--format=${format}`,
64
+ `--outdir=${outputDir}`,
65
+ "--platform=node",
66
+ "--format=cjs",
67
+ "--sourcemap=inline",
68
+ `--target=${targetEnvironment === "node" ? "node20" : "es2018"}`
69
+ ];
70
+ if (external.length) {
71
+ esbuildOptions.push(`--external:${external.join(",")}`);
72
+ }
73
+ if (plugins.length) {
74
+ esbuildOptions.push(`--plugins=${plugins.join(",")}`);
75
+ }
76
+ if (watch) {
77
+ esbuildOptions.push("--watch");
78
+ }
79
+ try {
80
+ await execa(esbuildPath, esbuildOptions, { encoding: "utf8" });
81
+ spinner.succeed("Build completed successfully!");
82
+ } catch (error) {
83
+ log(`
84
+ ${cliName} Error: ${error.message}`, "error", quiet);
85
+ if (!quiet) {
86
+ console.error(error);
87
+ }
88
+ spinner.fail("Code build failed.");
89
+ if (commandOptions.assist) {
90
+ spinner.start("AI is analyzing the error...");
91
+ try {
92
+ await aiFunction({
93
+ prompt: `Fix this esbuild error: ${error.message}
94
+
95
+ Error details:
96
+ ${error.toString()}`,
97
+ task: "help",
98
+ context: true,
99
+ quiet
100
+ });
101
+ spinner.succeed("AI analysis complete");
102
+ } catch (aiError) {
103
+ spinner.fail("Could not generate AI assistance");
104
+ if (!quiet) {
105
+ console.error("AI assistance error:", aiError);
106
+ }
107
+ }
108
+ }
109
+ callback(1);
110
+ return 1;
111
+ }
112
+ callback(0);
113
+ return 0;
114
+ };
115
+ const buildWithWebpack = async (spinner, cmd, callback) => {
116
+ const {
117
+ analyze,
118
+ cliName = "Lex",
119
+ config,
120
+ configName,
121
+ defineProcessEnvNodeEnv,
122
+ devtool,
123
+ disableInterpret,
124
+ entry,
125
+ env,
126
+ failOnWarnings,
127
+ json,
128
+ merge,
129
+ mode,
130
+ name,
131
+ nodeEnv,
132
+ noDevtool,
133
+ noStats,
134
+ noTarget,
135
+ noWatch,
136
+ noWatchOptionsStdin,
137
+ outputPath,
138
+ quiet = false,
139
+ stats,
140
+ target,
141
+ watch,
142
+ watchOptionsStdin
143
+ } = cmd;
144
+ let webpackConfig;
145
+ const dirName = new URL(".", import.meta.url).pathname;
146
+ if (config) {
147
+ const isRelativeConfig = config.substr(0, 2) === "./";
148
+ webpackConfig = isRelativeConfig ? pathResolve(process.cwd(), config) : config;
149
+ } else {
150
+ webpackConfig = pathResolve(dirName, "../../webpack.config.js");
151
+ }
152
+ const webpackOptions = [
153
+ "--color",
154
+ "--progress",
155
+ "--config",
156
+ webpackConfig
157
+ ];
158
+ if (analyze) {
159
+ webpackOptions.push("--analyze");
160
+ }
161
+ if (configName) {
162
+ webpackOptions.push("--configName", configName);
163
+ }
164
+ if (defineProcessEnvNodeEnv) {
165
+ webpackOptions.push("--defineProcessEnvNodeEnv", defineProcessEnvNodeEnv);
166
+ }
167
+ if (devtool) {
168
+ webpackOptions.push("--devtool", devtool);
169
+ }
170
+ if (disableInterpret) {
171
+ webpackOptions.push("--disableInterpret");
172
+ }
173
+ if (entry) {
174
+ webpackOptions.push("--entry", entry);
175
+ }
176
+ if (env) {
177
+ webpackOptions.push("--env", env);
178
+ }
179
+ if (failOnWarnings) {
180
+ webpackOptions.push("--failOnWarnings");
181
+ }
182
+ if (json) {
183
+ webpackOptions.push("--json", json);
184
+ }
185
+ if (mode) {
186
+ webpackOptions.push("--mode", mode);
187
+ }
188
+ if (merge) {
189
+ webpackOptions.push("--merge");
190
+ }
191
+ if (name) {
192
+ webpackOptions.push("--name", name);
193
+ }
194
+ if (noDevtool) {
195
+ webpackOptions.push("--noDevtool");
196
+ }
197
+ if (noStats) {
198
+ webpackOptions.push("--noStats");
199
+ }
200
+ if (noTarget) {
201
+ webpackOptions.push("--noTarget");
202
+ }
203
+ if (noWatch) {
204
+ webpackOptions.push("--noWatch");
205
+ }
206
+ if (noWatchOptionsStdin) {
207
+ webpackOptions.push("--noWatchOptionsStdin");
208
+ }
209
+ if (nodeEnv) {
210
+ webpackOptions.push("--nodeEnv", nodeEnv);
211
+ }
212
+ if (outputPath) {
213
+ webpackOptions.push("--outputPath", outputPath);
214
+ }
215
+ if (stats) {
216
+ webpackOptions.push("--stats", stats);
217
+ }
218
+ if (target) {
219
+ webpackOptions.push("--target", target);
220
+ }
221
+ if (watch) {
222
+ webpackOptions.push("--watch");
223
+ }
224
+ if (watchOptionsStdin) {
225
+ webpackOptions.push("--watchOptionsStdin");
226
+ }
227
+ const dirPath = pathResolve(dirName, "../..");
228
+ try {
229
+ const webpackPath = relativeNodePath("webpack-cli/bin/cli.js", dirPath);
230
+ await execa(webpackPath, webpackOptions, { encoding: "utf8", stdio: "inherit" });
231
+ spinner.succeed("Build completed successfully!");
232
+ callback(0);
233
+ return 0;
234
+ } catch (error) {
235
+ log(`
236
+ ${cliName} Error: ${error.message}`, "error", quiet);
237
+ spinner.fail("Build failed.");
238
+ if (cmd.assist) {
239
+ spinner.start("AI is analyzing the webpack error...");
240
+ try {
241
+ await aiFunction({
242
+ prompt: `Fix this webpack build error: ${error.message}
243
+
244
+ Error details:
245
+ ${error.toString()}
246
+
247
+ Configuration used:
248
+ ${JSON.stringify(webpackOptions, null, 2)}`,
249
+ task: "help",
250
+ context: true,
251
+ quiet
252
+ });
253
+ spinner.succeed("AI analysis complete");
254
+ } catch (aiError) {
255
+ spinner.fail("Could not generate AI assistance");
256
+ if (!quiet) {
257
+ console.error("AI assistance error:", aiError);
258
+ }
259
+ }
260
+ }
261
+ callback(1);
262
+ return 1;
263
+ }
264
+ };
265
+ const build = async (cmd, callback = () => ({})) => {
266
+ const {
267
+ bundler = "webpack",
268
+ cliName = "Lex",
269
+ quiet = false,
270
+ remove = false,
271
+ variables = "{}"
272
+ } = cmd;
273
+ const spinner = createSpinner(quiet);
274
+ log(`${cliName} building...`, "info", quiet);
275
+ await LexConfig.parseConfig(cmd);
276
+ const { outputFullPath, useTypescript } = LexConfig.config;
277
+ checkLinkedModules();
278
+ let variablesObj = { NODE_ENV: "production" };
279
+ if (variables) {
280
+ try {
281
+ variablesObj = JSON.parse(variables);
282
+ } catch (error) {
283
+ log(`
284
+ ${cliName} Error: Environment variables option is not a valid JSON object.`, "error", quiet);
285
+ callback(1);
286
+ return 1;
287
+ }
288
+ }
289
+ process.env = { ...process.env, ...variablesObj };
290
+ spinner.start("Building code...");
291
+ if (remove) {
292
+ await removeFiles(outputFullPath);
293
+ }
294
+ if (useTypescript) {
295
+ LexConfig.checkTypescriptConfig();
296
+ }
297
+ let buildResult = 0;
298
+ if (bundler === "esbuild") {
299
+ buildResult = await buildWithEsBuild(spinner, cmd, (status) => {
300
+ buildResult = status;
301
+ });
302
+ } else {
303
+ buildResult = await buildWithWebpack(spinner, cmd, (status) => {
304
+ buildResult = status;
305
+ });
306
+ }
307
+ if (buildResult === 0 && cmd.analyze) {
308
+ spinner.start("AI is analyzing the build output for optimization opportunities...");
309
+ try {
310
+ const stats = {
311
+ outputPath: LexConfig.config.outputFullPath,
312
+ entryPoints: bundler === "esbuild" ? `Source files: ${LexConfig.config.sourceFullPath}/**/*.{ts,js}` : LexConfig.config.webpack?.entry || "Unknown entry points"
313
+ };
314
+ await aiFunction({
315
+ prompt: `Analyze this build for optimization opportunities:
316
+
317
+ Build Type: ${bundler}
318
+ Format: ${cmd.format || "default"}
319
+ Environment: ${LexConfig.config.targetEnvironment}
320
+ ${JSON.stringify(stats, null, 2)}
321
+
322
+ What are the key optimization opportunities for this build configuration? Consider:
323
+ 1. Bundle size optimization strategies
324
+ 2. Code splitting recommendations
325
+ 3. Tree-shaking improvements
326
+ 4. Performance enhancements
327
+ 5. Dependency optimizations`,
328
+ task: "optimize",
329
+ context: true,
330
+ quiet
331
+ });
332
+ spinner.succeed("AI build analysis complete");
333
+ } catch (aiError) {
334
+ spinner.fail("Could not generate AI optimization analysis");
335
+ if (!quiet) {
336
+ console.error("AI analysis error:", aiError);
337
+ }
338
+ }
339
+ }
340
+ callback(buildResult);
341
+ return buildResult;
342
+ };
343
+ var build_default = build;
344
+ export {
345
+ build,
346
+ buildWithEsBuild,
347
+ buildWithWebpack,
348
+ build_default as default
349
+ };
350
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2J1aWxkL2J1aWxkLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IEdyYXBocWxMb2FkZXJQbHVnaW4gZnJvbSAnQGx1Y2t5Y2F0ZmFjdG9yeS9lc2J1aWxkLWdyYXBocWwtbG9hZGVyJztcbmltcG9ydCB7ZXhlY2F9IGZyb20gJ2V4ZWNhJztcbmltcG9ydCB7cmVhZEZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge3N5bmMgYXMgZ2xvYlN5bmN9IGZyb20gJ2dsb2InO1xuaW1wb3J0IHtyZXNvbHZlIGFzIHBhdGhSZXNvbHZlfSBmcm9tICdwYXRoJztcbmltcG9ydCB7VVJMfSBmcm9tICd1cmwnO1xuXG5pbXBvcnQge0xleENvbmZpZ30gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcbmltcG9ydCB7Y2hlY2tMaW5rZWRNb2R1bGVzLCBjcmVhdGVTcGlubmVyLCByZW1vdmVGaWxlc30gZnJvbSAnLi4vLi4vdXRpbHMvYXBwLmpzJztcbmltcG9ydCB7cmVsYXRpdmVOb2RlUGF0aH0gZnJvbSAnLi4vLi4vdXRpbHMvZmlsZS5qcyc7XG5pbXBvcnQge2xvZ30gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJztcbmltcG9ydCB7YWlGdW5jdGlvbn0gZnJvbSAnLi4vYWkvYWkuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGFzc2lzdD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGFuYWx5emU/OiBib29sZWFuO1xuICByZWFkb25seSBidW5kbGVyPzogJ3dlYnBhY2snIHwgJ2VzYnVpbGQnO1xuICByZWFkb25seSBjbGlOYW1lPzogc3RyaW5nO1xuICByZWFkb25seSBmb3JtYXQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG91dHB1dFBhdGg/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHF1aWV0PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcmVtb3ZlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc291cmNlUGF0aD86IHN0cmluZztcbiAgcmVhZG9ubHkgdmFyaWFibGVzPzogc3RyaW5nO1xuICByZWFkb25seSB3YXRjaD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIEJ1aWxkQ2FsbGJhY2sgPSAoc3RhdHVzOiBudW1iZXIpID0+IHZvaWQ7XG5cbmV4cG9ydCBjb25zdCBidWlsZFdpdGhFc0J1aWxkID0gYXN5bmMgKHNwaW5uZXIsIGNvbW1hbmRPcHRpb25zOiBCdWlsZE9wdGlvbnMsIGNhbGxiYWNrOiBCdWlsZENhbGxiYWNrKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjbGlOYW1lID0gJ0xleCcsXG4gICAgZm9ybWF0ID0gJ2NqcycsXG4gICAgb3V0cHV0UGF0aCxcbiAgICBxdWlldCxcbiAgICBzb3VyY2VQYXRoLFxuICAgIHdhdGNoXG4gIH0gPSBjb21tYW5kT3B0aW9ucztcbiAgY29uc3Qge1xuICAgIG91dHB1dEZ1bGxQYXRoLFxuICAgIHNvdXJjZUZ1bGxQYXRoLFxuICAgIHRhcmdldEVudmlyb25tZW50LFxuICAgIHVzZUdyYXBoUWwsXG4gICAgdXNlVHlwZXNjcmlwdFxuICB9ID0gTGV4Q29uZmlnLmNvbmZpZztcbiAgY29uc3Qgc291cmNlRGlyOiBzdHJpbmcgPSBzb3VyY2VQYXRoID8gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgYC4vJHtzb3VyY2VQYXRofWApIDogc291cmNlRnVsbFBhdGg7XG4gIGNvbnN0IGxvYWRlciA9IHtcbiAgICAnLmpzJzogJ2pzJ1xuICB9O1xuXG4gIGlmKHVzZVR5cGVzY3JpcHQpIHtcbiAgICBsb2FkZXJbJy50cyddID0gJ3RzJztcbiAgICBsb2FkZXJbJy50c3gnXSA9ICd0c3gnO1xuICB9XG5cbiAgY29uc3QgcGx1Z2lucyA9IFtdO1xuXG4gIGlmKHVzZUdyYXBoUWwpIHtcbiAgICBwbHVnaW5zLnB1c2goKEdyYXBocWxMb2FkZXJQbHVnaW4gYXMgdW5rbm93biBhcyAoKSA9PiB2b2lkKSgpKTtcbiAgfVxuXG4gIGNvbnN0IGdsb2JPcHRpb25zID0ge1xuICAgIGN3ZDogc291cmNlRGlyLFxuICAgIGRvdDogZmFsc2UsXG4gICAgbm9kaXI6IHRydWUsXG4gICAgbm9zb3J0OiB0cnVlXG4gIH07XG4gIGNvbnN0IHRzRmlsZXM6IHN0cmluZ1tdID0gZ2xvYlN5bmMoYCR7c291cmNlRGlyfS8qKi8hKCouc3BlY3wqLnRlc3QpLnRzKmAsIGdsb2JPcHRpb25zKTtcbiAgY29uc3QganNGaWxlczogc3RyaW5nW10gPSBnbG9iU3luYyhgJHtzb3VyY2VEaXJ9LyoqLyEoKi5zcGVjfCoudGVzdCkuanNgLCBnbG9iT3B0aW9ucyk7XG4gIGNvbnN0IHNvdXJjZUZpbGVzOiBzdHJpbmdbXSA9IFsuLi50c0ZpbGVzLCAuLi5qc0ZpbGVzXTtcblxuICBjb25zdCBwYWNrYWdlSnNvbkRhdGEgPSByZWFkRmlsZVN5bmMocGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJy4vcGFja2FnZS5qc29uJykpO1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocGFja2FnZUpzb25EYXRhLnRvU3RyaW5nKCkpO1xuICBjb25zdCBleHRlcm5hbCA9IFtcbiAgICAuLi5PYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgfHwge30pLFxuICAgIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXMgfHwge30pXG4gIF07XG5cbiAgY29uc3QgZGlyTmFtZSA9IG5ldyBVUkwoJy4nLCBpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lO1xuICBjb25zdCBkaXJQYXRoOiBzdHJpbmcgPSBwYXRoUmVzb2x2ZShkaXJOYW1lLCAnLi4vLi4nKTtcbiAgY29uc3Qgb3V0cHV0RGlyOiBzdHJpbmcgPSBvdXRwdXRQYXRoIHx8IG91dHB1dEZ1bGxQYXRoO1xuICBjb25zdCBlc2J1aWxkUGF0aDogc3RyaW5nID0gcmVsYXRpdmVOb2RlUGF0aCgnZXNidWlsZC9iaW4vZXNidWlsZCcsIGRpclBhdGgpO1xuICBjb25zdCBlc2J1aWxkT3B0aW9uczogc3RyaW5nW10gPSBbXG4gICAgLi4uc291cmNlRmlsZXMsXG4gICAgJy0tYnVuZGxlJyxcbiAgICAnLS1jb2xvcj10cnVlJyxcbiAgICBgLS1mb3JtYXQ9JHtmb3JtYXR9YCxcbiAgICBgLS1vdXRkaXI9JHtvdXRwdXREaXJ9YCxcbiAgICAnLS1wbGF0Zm9ybT1ub2RlJyxcbiAgICAnLS1mb3JtYXQ9Y2pzJyxcbiAgICAnLS1zb3VyY2VtYXA9aW5saW5lJyxcbiAgICBgLS10YXJnZXQ9JHt0YXJnZXRFbnZpcm9ubWVudCA9PT0gJ25vZGUnID8gJ25vZGUyMCcgOiAnZXMyMDE4J31gXG4gIF07XG5cbiAgaWYoZXh0ZXJuYWwubGVuZ3RoKSB7XG4gICAgZXNidWlsZE9wdGlvbnMucHVzaChgLS1leHRlcm5hbDoke2V4dGVybmFsLmpvaW4oJywnKX1gKTtcbiAgfVxuXG4gIGlmKHBsdWdpbnMubGVuZ3RoKSB7XG4gICAgZXNidWlsZE9wdGlvbnMucHVzaChgLS1wbHVnaW5zPSR7cGx1Z2lucy5qb2luKCcsJyl9YCk7XG4gIH1cbiAgaWYod2F0Y2gpIHtcbiAgICBlc2J1aWxkT3B0aW9ucy5wdXNoKCctLXdhdGNoJyk7XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IGV4ZWNhKGVzYnVpbGRQYXRoLCBlc2J1aWxkT3B0aW9ucywge2VuY29kaW5nOiAndXRmOCd9KTtcblxuICAgIHNwaW5uZXIuc3VjY2VlZCgnQnVpbGQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSEnKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcblxuICAgIGlmKCFxdWlldCkge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfVxuXG4gICAgc3Bpbm5lci5mYWlsKCdDb2RlIGJ1aWxkIGZhaWxlZC4nKTtcblxuICAgIGlmKGNvbW1hbmRPcHRpb25zLmFzc2lzdCkge1xuICAgICAgc3Bpbm5lci5zdGFydCgnQUkgaXMgYW5hbHl6aW5nIHRoZSBlcnJvci4uLicpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBhaUZ1bmN0aW9uKHtcbiAgICAgICAgICBwcm9tcHQ6IGBGaXggdGhpcyBlc2J1aWxkIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9XFxuXFxuRXJyb3IgZGV0YWlsczpcXG4ke2Vycm9yLnRvU3RyaW5nKCl9YCxcbiAgICAgICAgICB0YXNrOiAnaGVscCcsXG4gICAgICAgICAgY29udGV4dDogdHJ1ZSxcbiAgICAgICAgICBxdWlldFxuICAgICAgICB9KTtcblxuICAgICAgICBzcGlubmVyLnN1Y2NlZWQoJ0FJIGFuYWx5c2lzIGNvbXBsZXRlJyk7XG4gICAgICB9IGNhdGNoKGFpRXJyb3IpIHtcbiAgICAgICAgc3Bpbm5lci5mYWlsKCdDb3VsZCBub3QgZ2VuZXJhdGUgQUkgYXNzaXN0YW5jZScpO1xuICAgICAgICBpZighcXVpZXQpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdBSSBhc3Npc3RhbmNlIGVycm9yOicsIGFpRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2FsbGJhY2soMSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBjYWxsYmFjaygwKTtcbiAgcmV0dXJuIDA7XG59O1xuXG5leHBvcnQgY29uc3QgYnVpbGRXaXRoV2VicGFjayA9IGFzeW5jIChzcGlubmVyLCBjbWQsIGNhbGxiYWNrKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBhbmFseXplLFxuICAgIGNsaU5hbWUgPSAnTGV4JyxcbiAgICBjb25maWcsXG4gICAgY29uZmlnTmFtZSxcbiAgICBkZWZpbmVQcm9jZXNzRW52Tm9kZUVudixcbiAgICBkZXZ0b29sLFxuICAgIGRpc2FibGVJbnRlcnByZXQsXG4gICAgZW50cnksXG4gICAgZW52LFxuICAgIGZhaWxPbldhcm5pbmdzLFxuICAgIGpzb24sXG4gICAgbWVyZ2UsXG4gICAgbW9kZSxcbiAgICBuYW1lLFxuICAgIG5vZGVFbnYsXG4gICAgbm9EZXZ0b29sLFxuICAgIG5vU3RhdHMsXG4gICAgbm9UYXJnZXQsXG4gICAgbm9XYXRjaCxcbiAgICBub1dhdGNoT3B0aW9uc1N0ZGluLFxuICAgIG91dHB1dFBhdGgsXG4gICAgcXVpZXQgPSBmYWxzZSxcbiAgICBzdGF0cyxcbiAgICB0YXJnZXQsXG4gICAgd2F0Y2gsXG4gICAgd2F0Y2hPcHRpb25zU3RkaW5cbiAgfSA9IGNtZDtcblxuICBsZXQgd2VicGFja0NvbmZpZzogc3RyaW5nO1xuICBjb25zdCBkaXJOYW1lID0gbmV3IFVSTCgnLicsIGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWU7XG5cbiAgaWYoY29uZmlnKSB7XG4gICAgY29uc3QgaXNSZWxhdGl2ZUNvbmZpZzogYm9vbGVhbiA9IGNvbmZpZy5zdWJzdHIoMCwgMikgPT09ICcuLyc7XG4gICAgd2VicGFja0NvbmZpZyA9IGlzUmVsYXRpdmVDb25maWcgPyBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBjb25maWcpIDogY29uZmlnO1xuICB9IGVsc2Uge1xuICAgIHdlYnBhY2tDb25maWcgPSBwYXRoUmVzb2x2ZShkaXJOYW1lLCAnLi4vLi4vd2VicGFjay5jb25maWcuanMnKTtcbiAgfVxuXG4gIGNvbnN0IHdlYnBhY2tPcHRpb25zOiBzdHJpbmdbXSA9IFtcbiAgICAnLS1jb2xvcicsXG4gICAgJy0tcHJvZ3Jlc3MnLFxuICAgICctLWNvbmZpZycsIHdlYnBhY2tDb25maWdcbiAgXTtcblxuICBpZihhbmFseXplKSB7XG4gICAgd2VicGFja09wdGlvbnMucHVzaCgnLS1hbmFseXplJyk7XG4gIH1cblxuICBpZihjb25maWdOYW1lKSB7XG4gICAgd2VicGFja09wdGlvbnMucHVzaCgnLS1jb25maWdOYW1lJywgY29uZmlnTmFtZSk7XG4gIH1cblxuICBpZihkZWZpbmVQcm9jZXNzRW52Tm9kZUVudikge1xuICAgIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tZGVmaW5lUHJvY2Vzc0Vudk5vZGVFbnYnLCBkZWZpbmVQcm9jZXNzRW52Tm9kZUVudik7XG4gIH1cblxuICBpZihkZXZ0b29sKSB7XG4gICAgd2VicGFja09wdGlvbnMucHVzaCgnLS1kZXZ0b29sJywgZGV2dG9vbCk7XG4gIH1cblxuICBpZihkaXNhYmxlSW50ZXJwcmV0KSB7XG4gICAgd2VicGFja09wdGlvbnMucHVzaCgnLS1kaXNhYmxlSW50ZXJwcmV0Jyk7XG4gIH1cblxuICBpZihlbnRyeSkge1xuICAgIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tZW50cnknLCBlbnRyeSk7XG4gIH1cblxuICBpZihlbnYpIHtcbiAgICB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLWVudicsIGVudik7XG4gIH1cblxuICBpZihmYWlsT25XYXJuaW5ncykge1xuICAgIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tZmFpbE9uV2FybmluZ3MnKTtcbiAgfVxuXG4gIGlmKGpzb24pIHtcbiAgICB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLWpzb24nLCBqc29uKTtcbiAgfVxuXG4gIGlmKG1vZGUpIHtcbiAgICB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLW1vZGUnLCBtb2RlKTtcbiAgfVxuXG4gIGlmKG1lcmdlKSB7XG4gICAgd2VicGFja09wdGlvbnMucHVzaCgnLS1tZXJnZScpO1xuICB9XG5cbiAgaWYobmFtZSkge1xuICAgIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tbmFtZScsIG5hbWUpO1xuICB9XG5cbiAgaWYobm9EZXZ0b29sKSB7XG4gICAgd2VicGFja09wdGlvbnMucHVzaCgnLS1ub0RldnRvb2wnKTtcbiAgfVxuXG4gIGlmKG5vU3RhdHMpIHtcbiAgICB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLW5vU3RhdHMnKTtcbiAgfVxuXG4gIGlmKG5vVGFyZ2V0KSB7XG4gICAgd2VicGFja09wdGlvbnMucHVzaCgnLS1ub1RhcmdldCcpO1xuICB9XG5cbiAgaWYobm9XYXRjaCkge1xuICAgIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tbm9XYXRjaCcpO1xuICB9XG5cbiAgaWYobm9XYXRjaE9wdGlvbnNTdGRpbikge1xuICAgIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tbm9XYXRjaE9wdGlvbnNTdGRpbicpO1xuICB9XG5cbiAgaWYobm9kZUVudikge1xuICAgIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tbm9kZUVudicsIG5vZGVFbnYpO1xuICB9XG5cbiAgaWYob3V0cHV0UGF0aCkge1xuICAgIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tb3V0cHV0UGF0aCcsIG91dHB1dFBhdGgpO1xuICB9XG5cbiAgaWYoc3RhdHMpIHtcbiAgICB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLXN0YXRzJywgc3RhdHMpO1xuICB9XG5cbiAgaWYodGFyZ2V0KSB7XG4gICAgd2VicGFja09wdGlvbnMucHVzaCgnLS10YXJnZXQnLCB0YXJnZXQpO1xuICB9XG5cbiAgaWYod2F0Y2gpIHtcbiAgICB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLXdhdGNoJyk7XG4gIH1cblxuICBpZih3YXRjaE9wdGlvbnNTdGRpbikge1xuICAgIHdlYnBhY2tPcHRpb25zLnB1c2goJy0td2F0Y2hPcHRpb25zU3RkaW4nKTtcbiAgfVxuXG4gIGNvbnN0IGRpclBhdGg6IHN0cmluZyA9IHBhdGhSZXNvbHZlKGRpck5hbWUsICcuLi8uLicpO1xuXG4gIHRyeSB7XG4gICAgY29uc3Qgd2VicGFja1BhdGg6IHN0cmluZyA9IHJlbGF0aXZlTm9kZVBhdGgoJ3dlYnBhY2stY2xpL2Jpbi9jbGkuanMnLCBkaXJQYXRoKTtcbiAgICBhd2FpdCBleGVjYSh3ZWJwYWNrUGF0aCwgd2VicGFja09wdGlvbnMsIHtlbmNvZGluZzogJ3V0ZjgnLCBzdGRpbzogJ2luaGVyaXQnfSk7XG5cbiAgICBzcGlubmVyLnN1Y2NlZWQoJ0J1aWxkIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkhJyk7XG5cbiAgICBjYWxsYmFjaygwKTtcbiAgICByZXR1cm4gMDtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcblxuICAgIHNwaW5uZXIuZmFpbCgnQnVpbGQgZmFpbGVkLicpO1xuXG4gICAgaWYoY21kLmFzc2lzdCkge1xuICAgICAgc3Bpbm5lci5zdGFydCgnQUkgaXMgYW5hbHl6aW5nIHRoZSB3ZWJwYWNrIGVycm9yLi4uJyk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGFpRnVuY3Rpb24oe1xuICAgICAgICAgIHByb21wdDogYEZpeCB0aGlzIHdlYnBhY2sgYnVpbGQgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1cXG5cXG5FcnJvciBkZXRhaWxzOlxcbiR7ZXJyb3IudG9TdHJpbmcoKX1cXG5cXG5Db25maWd1cmF0aW9uIHVzZWQ6XFxuJHtKU09OLnN0cmluZ2lmeSh3ZWJwYWNrT3B0aW9ucywgbnVsbCwgMil9YCxcbiAgICAgICAgICB0YXNrOiAnaGVscCcsXG4gICAgICAgICAgY29udGV4dDogdHJ1ZSxcbiAgICAgICAgICBxdWlldFxuICAgICAgICB9KTtcblxuICAgICAgICBzcGlubmVyLnN1Y2NlZWQoJ0FJIGFuYWx5c2lzIGNvbXBsZXRlJyk7XG4gICAgICB9IGNhdGNoKGFpRXJyb3IpIHtcbiAgICAgICAgc3Bpbm5lci5mYWlsKCdDb3VsZCBub3QgZ2VuZXJhdGUgQUkgYXNzaXN0YW5jZScpO1xuICAgICAgICBpZighcXVpZXQpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdBSSBhc3Npc3RhbmNlIGVycm9yOicsIGFpRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2FsbGJhY2soMSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBidWlsZCA9IGFzeW5jIChjbWQ6IEJ1aWxkT3B0aW9ucywgY2FsbGJhY2s6IEJ1aWxkQ2FsbGJhY2sgPSAoKSA9PiAoe30pKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgY29uc3Qge1xuICAgIGJ1bmRsZXIgPSAnd2VicGFjaycsXG4gICAgY2xpTmFtZSA9ICdMZXgnLFxuICAgIHF1aWV0ID0gZmFsc2UsXG4gICAgcmVtb3ZlID0gZmFsc2UsXG4gICAgdmFyaWFibGVzID0gJ3t9J1xuICB9ID0gY21kO1xuXG4gIGNvbnN0IHNwaW5uZXIgPSBjcmVhdGVTcGlubmVyKHF1aWV0KTtcblxuICBsb2coYCR7Y2xpTmFtZX0gYnVpbGRpbmcuLi5gLCAnaW5mbycsIHF1aWV0KTtcblxuICBhd2FpdCBMZXhDb25maWcucGFyc2VDb25maWcoY21kKTtcblxuICBjb25zdCB7b3V0cHV0RnVsbFBhdGgsIHVzZVR5cGVzY3JpcHR9ID0gTGV4Q29uZmlnLmNvbmZpZztcblxuICBjaGVja0xpbmtlZE1vZHVsZXMoKTtcblxuICBsZXQgdmFyaWFibGVzT2JqOiBvYmplY3QgPSB7Tk9ERV9FTlY6ICdwcm9kdWN0aW9uJ307XG5cbiAgaWYodmFyaWFibGVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhcmlhYmxlc09iaiA9IEpTT04ucGFyc2UodmFyaWFibGVzKTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IEVudmlyb25tZW50IHZhcmlhYmxlcyBvcHRpb24gaXMgbm90IGEgdmFsaWQgSlNPTiBvYmplY3QuYCwgJ2Vycm9yJywgcXVpZXQpO1xuXG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIHByb2Nlc3MuZW52ID0gey4uLnByb2Nlc3MuZW52LCAuLi52YXJpYWJsZXNPYmp9O1xuXG4gIHNwaW5uZXIuc3RhcnQoJ0J1aWxkaW5nIGNvZGUuLi4nKTtcblxuICBpZihyZW1vdmUpIHtcbiAgICBhd2FpdCByZW1vdmVGaWxlcyhvdXRwdXRGdWxsUGF0aCk7XG4gIH1cblxuICBpZih1c2VUeXBlc2NyaXB0KSB7XG4gICAgTGV4Q29uZmlnLmNoZWNrVHlwZXNjcmlwdENvbmZpZygpO1xuICB9XG5cbiAgbGV0IGJ1aWxkUmVzdWx0ID0gMDtcblxuICBpZihidW5kbGVyID09PSAnZXNidWlsZCcpIHtcbiAgICBidWlsZFJlc3VsdCA9IGF3YWl0IGJ1aWxkV2l0aEVzQnVpbGQoc3Bpbm5lciwgY21kLCAoc3RhdHVzKSA9PiB7XG4gICAgICBidWlsZFJlc3VsdCA9IHN0YXR1cztcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBidWlsZFJlc3VsdCA9IGF3YWl0IGJ1aWxkV2l0aFdlYnBhY2soc3Bpbm5lciwgY21kLCAoc3RhdHVzKSA9PiB7XG4gICAgICBidWlsZFJlc3VsdCA9IHN0YXR1cztcbiAgICB9KTtcbiAgfVxuXG4gIGlmKGJ1aWxkUmVzdWx0ID09PSAwICYmIGNtZC5hbmFseXplKSB7XG4gICAgc3Bpbm5lci5zdGFydCgnQUkgaXMgYW5hbHl6aW5nIHRoZSBidWlsZCBvdXRwdXQgZm9yIG9wdGltaXphdGlvbiBvcHBvcnR1bml0aWVzLi4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhdHMgPSB7XG4gICAgICAgIG91dHB1dFBhdGg6IExleENvbmZpZy5jb25maWcub3V0cHV0RnVsbFBhdGgsXG4gICAgICAgIGVudHJ5UG9pbnRzOiBidW5kbGVyID09PSAnZXNidWlsZCcgP1xuICAgICAgICAgIGBTb3VyY2UgZmlsZXM6ICR7TGV4Q29uZmlnLmNvbmZpZy5zb3VyY2VGdWxsUGF0aH0vKiovKi57dHMsanN9YCA6XG4gICAgICAgICAgTGV4Q29uZmlnLmNvbmZpZy53ZWJwYWNrPy5lbnRyeSB8fCAnVW5rbm93biBlbnRyeSBwb2ludHMnXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBhaUZ1bmN0aW9uKHtcbiAgICAgICAgcHJvbXB0OiBgQW5hbHl6ZSB0aGlzIGJ1aWxkIGZvciBvcHRpbWl6YXRpb24gb3Bwb3J0dW5pdGllczpcbiAgICAgICAgICBcbkJ1aWxkIFR5cGU6ICR7YnVuZGxlcn1cbkZvcm1hdDogJHtjbWQuZm9ybWF0IHx8ICdkZWZhdWx0J31cbkVudmlyb25tZW50OiAke0xleENvbmZpZy5jb25maWcudGFyZ2V0RW52aXJvbm1lbnR9XG4ke0pTT04uc3RyaW5naWZ5KHN0YXRzLCBudWxsLCAyKX1cbiAgICAgICAgICBcbldoYXQgYXJlIHRoZSBrZXkgb3B0aW1pemF0aW9uIG9wcG9ydHVuaXRpZXMgZm9yIHRoaXMgYnVpbGQgY29uZmlndXJhdGlvbj8gQ29uc2lkZXI6XG4xLiBCdW5kbGUgc2l6ZSBvcHRpbWl6YXRpb24gc3RyYXRlZ2llc1xuMi4gQ29kZSBzcGxpdHRpbmcgcmVjb21tZW5kYXRpb25zXG4zLiBUcmVlLXNoYWtpbmcgaW1wcm92ZW1lbnRzXG40LiBQZXJmb3JtYW5jZSBlbmhhbmNlbWVudHNcbjUuIERlcGVuZGVuY3kgb3B0aW1pemF0aW9uc2AsXG4gICAgICAgIHRhc2s6ICdvcHRpbWl6ZScsXG4gICAgICAgIGNvbnRleHQ6IHRydWUsXG4gICAgICAgIHF1aWV0XG4gICAgICB9KTtcblxuICAgICAgc3Bpbm5lci5zdWNjZWVkKCdBSSBidWlsZCBhbmFseXNpcyBjb21wbGV0ZScpO1xuICAgIH0gY2F0Y2goYWlFcnJvcikge1xuICAgICAgc3Bpbm5lci5mYWlsKCdDb3VsZCBub3QgZ2VuZXJhdGUgQUkgb3B0aW1pemF0aW9uIGFuYWx5c2lzJyk7XG4gICAgICBpZighcXVpZXQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQUkgYW5hbHlzaXMgZXJyb3I6JywgYWlFcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soYnVpbGRSZXN1bHQpO1xuICByZXR1cm4gYnVpbGRSZXN1bHQ7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBidWlsZDtcbiJdLAogICJtYXBwaW5ncyI6ICJBQUlBLE9BQU8seUJBQXlCO0FBQ2hD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
@@ -0,0 +1,31 @@
1
+ import { LexConfig } from "../../LexConfig.js";
2
+ import { createSpinner, removeFiles, removeModules } from "../../utils/app.js";
3
+ import { log } from "../../utils/log.js";
4
+ const clean = async (cmd, callback = (_status) => ({})) => {
5
+ const { cliName = "Lex", quiet, snapshots } = cmd;
6
+ const spinner = createSpinner(quiet);
7
+ log(`${cliName} cleaning directory...`, "info", quiet);
8
+ await LexConfig.parseConfig(cmd);
9
+ spinner.start("Cleaning files...");
10
+ try {
11
+ await removeModules();
12
+ await removeFiles("./coverage", true);
13
+ await removeFiles("./npm-debug.log", true);
14
+ if (snapshots) {
15
+ await removeFiles("./**/__snapshots__", true);
16
+ }
17
+ spinner.succeed("Successfully cleaned!");
18
+ callback(0);
19
+ return 0;
20
+ } catch (error) {
21
+ log(`
22
+ ${cliName} Error: ${error.message}`, "error", quiet);
23
+ spinner.fail("Failed to clean project.");
24
+ callback(1);
25
+ return 1;
26
+ }
27
+ };
28
+ export {
29
+ clean
30
+ };
31
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2NsZWFuL2NsZWFuLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHtMZXhDb25maWd9IGZyb20gJy4uLy4uL0xleENvbmZpZy5qcyc7XG5pbXBvcnQge2NyZWF0ZVNwaW5uZXIsIHJlbW92ZUZpbGVzLCByZW1vdmVNb2R1bGVzfSBmcm9tICcuLi8uLi91dGlscy9hcHAuanMnO1xuaW1wb3J0IHtsb2d9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xlYW5PcHRpb25zIHtcbiAgcmVhZG9ubHkgY2xpTmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xuICByZWFkb25seSBzbmFwc2hvdHM/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBDbGVhbkNhbGxiYWNrID0gKHN0YXR1czogbnVtYmVyKSA9PiB2b2lkO1xuXG5leHBvcnQgY29uc3QgY2xlYW4gPSBhc3luYyAoY21kOiBDbGVhbk9wdGlvbnMsIGNhbGxiYWNrOiBDbGVhbkNhbGxiYWNrID0gKF9zdGF0dXM6IG51bWJlcikgPT4gKHt9KSk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gIGNvbnN0IHtjbGlOYW1lID0gJ0xleCcsIHF1aWV0LCBzbmFwc2hvdHN9ID0gY21kO1xuXG4gIC8vIFNwaW5uZXJcbiAgY29uc3Qgc3Bpbm5lciA9IGNyZWF0ZVNwaW5uZXIocXVpZXQpO1xuXG4gIC8vIERpc3BsYXkgc3RhdHVzXG4gIGxvZyhgJHtjbGlOYW1lfSBjbGVhbmluZyBkaXJlY3RvcnkuLi5gLCAnaW5mbycsIHF1aWV0KTtcblxuICAvLyBHZXQgY3VzdG9tIGNvbmZpZ3VyYXRpb25cbiAgYXdhaXQgTGV4Q29uZmlnLnBhcnNlQ29uZmlnKGNtZCk7XG5cbiAgLy8gU3RhcnQgY2xlYW5pbmcgc3Bpbm5lclxuICBzcGlubmVyLnN0YXJ0KCdDbGVhbmluZyBmaWxlcy4uLicpO1xuXG4gIHRyeSB7XG4gICAgLy8gUmVtb3ZlIG5vZGVfbW9kdWxlc1xuICAgIGF3YWl0IHJlbW92ZU1vZHVsZXMoKTtcblxuICAgIC8vIFJlbW92ZSB0ZXN0IGNvdmVyYWdlIHJlcG9ydHNcbiAgICBhd2FpdCByZW1vdmVGaWxlcygnLi9jb3ZlcmFnZScsIHRydWUpO1xuXG4gICAgLy8gUmVtb3ZlIG5wbSBsb2dzXG4gICAgYXdhaXQgcmVtb3ZlRmlsZXMoJy4vbnBtLWRlYnVnLmxvZycsIHRydWUpO1xuXG4gICAgaWYoc25hcHNob3RzKSB7XG4gICAgICBhd2FpdCByZW1vdmVGaWxlcygnLi8qKi9fX3NuYXBzaG90c19fJywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLy8gU3RvcCBzcGlubmVyXG4gICAgc3Bpbm5lci5zdWNjZWVkKCdTdWNjZXNzZnVsbHkgY2xlYW5lZCEnKTtcblxuICAgIC8vIFN0b3AgcHJvY2Vzc1xuICAgIGNhbGxiYWNrKDApO1xuICAgIHJldHVybiAwO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgLy8gRGlzcGxheSBlcnJvciBtZXNzYWdlXG4gICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuXG4gICAgLy8gU3RvcCBzcGlubmVyXG4gICAgc3Bpbm5lci5mYWlsKCdGYWlsZWQgdG8gY2xlYW4gcHJvamVjdC4nKTtcblxuICAgIC8vIEtpbGwgcHJvY2Vzc1xuICAgIGNhbGxiYWNrKDEpO1xuICAgIHJldHVybiAxO1xuICB9XG59OyJdLAogICJtYXBwaW5ncyI6ICJBQUlBLFNBQVEsaUJBQWdCO0FBQ3hCLFNBQVEsZUFBZSxhQUFhLHFCQUFvQjtBQUN4RCxTQUFRLFdBQVU7QUFVWCxNQUFNLFFBQVEsT0FBTyxLQUFtQixXQUEwQixDQUFDLGFBQXFCLENBQUMsT0FBd0I7QUFDdEgsUUFBTSxFQUFDLFVBQVUsT0FBTyxPQUFPLFVBQVMsSUFBSTtBQUc1QyxRQUFNLFVBQVUsY0FBYyxLQUFLO0FBR25DLE1BQUksR0FBRyxPQUFPLDBCQUEwQixRQUFRLEtBQUs7QUFHckQsUUFBTSxVQUFVLFlBQVksR0FBRztBQUcvQixVQUFRLE1BQU0sbUJBQW1CO0FBRWpDLE1BQUk7QUFFRixVQUFNLGNBQWM7QUFHcEIsVUFBTSxZQUFZLGNBQWMsSUFBSTtBQUdwQyxVQUFNLFlBQVksbUJBQW1CLElBQUk7QUFFekMsUUFBRyxXQUFXO0FBQ1osWUFBTSxZQUFZLHNCQUFzQixJQUFJO0FBQUEsSUFDOUM7QUFHQSxZQUFRLFFBQVEsdUJBQXVCO0FBR3ZDLGFBQVMsQ0FBQztBQUNWLFdBQU87QUFBQSxFQUNULFNBQVEsT0FBTztBQUViLFFBQUk7QUFBQSxFQUFLLE9BQU8sV0FBVyxNQUFNLE9BQU8sSUFBSSxTQUFTLEtBQUs7QUFHMUQsWUFBUSxLQUFLLDBCQUEwQjtBQUd2QyxhQUFTLENBQUM7QUFDVixXQUFPO0FBQUEsRUFDVDtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,195 @@
1
+ import { execa } from "execa";
2
+ import { existsSync, lstatSync, readdirSync } from "fs";
3
+ import { sync as globSync } from "glob";
4
+ import { extname as pathExtname, join as pathJoin, resolve as pathResolve } from "path";
5
+ import { URL } from "url";
6
+ import { LexConfig } from "../../LexConfig.js";
7
+ import { checkLinkedModules, copyFiles, createSpinner, getFilesByExt, removeFiles } from "../../utils/app.js";
8
+ import { relativeNodePath } from "../../utils/file.js";
9
+ import { log } from "../../utils/log.js";
10
+ const hasFileType = (startPath, ext) => {
11
+ if (!existsSync(startPath)) {
12
+ return false;
13
+ }
14
+ const files = readdirSync(startPath);
15
+ return files.some((file) => {
16
+ const filename = pathJoin(startPath, file);
17
+ const fileExt = pathExtname(filename);
18
+ const stat = lstatSync(filename);
19
+ if (stat.isDirectory()) {
20
+ return hasFileType(filename, ext);
21
+ }
22
+ return ext.includes(fileExt);
23
+ });
24
+ };
25
+ const compile = async (cmd, callback = () => ({})) => {
26
+ const {
27
+ cliName = "Lex",
28
+ config,
29
+ outputPath,
30
+ quiet,
31
+ remove,
32
+ sourcePath,
33
+ watch
34
+ } = cmd;
35
+ const spinner = createSpinner(quiet);
36
+ log(`${cliName} compiling...`, "info", quiet);
37
+ await LexConfig.parseConfig(cmd);
38
+ const { outputFullPath, sourceFullPath, useTypescript } = LexConfig.config;
39
+ const outputDir = outputPath || outputFullPath;
40
+ const sourceDir = sourcePath ? pathResolve(process.cwd(), `./${sourcePath}`) : sourceFullPath;
41
+ const dirName = new URL(".", import.meta.url).pathname;
42
+ const dirPath = pathResolve(dirName, "../..");
43
+ checkLinkedModules();
44
+ if (remove) {
45
+ await removeFiles(outputDir);
46
+ }
47
+ if (useTypescript) {
48
+ LexConfig.checkTypescriptConfig();
49
+ const typescriptPath = relativeNodePath("typescript/bin/tsc", dirPath);
50
+ const typescriptOptions = config ? ["-p", config] : [
51
+ "--allowSyntheticDefaultImports",
52
+ "--baseUrl",
53
+ sourceDir,
54
+ "--declaration",
55
+ "--emitDeclarationOnly",
56
+ "--lib",
57
+ "ESNext,DOM",
58
+ "--module",
59
+ "esnext",
60
+ "--moduleResolution",
61
+ "node",
62
+ "--noImplicitReturns",
63
+ "--noImplicitThis",
64
+ "--outDir",
65
+ outputDir,
66
+ "--removeComments",
67
+ "--resolveJsonModule",
68
+ "--target",
69
+ "ESNext",
70
+ "--typeRoots",
71
+ "node_modules/@types,node_modules/json-d-ts"
72
+ ];
73
+ spinner.start("Static type checking with Typescript...");
74
+ try {
75
+ await execa(typescriptPath, typescriptOptions, { encoding: "utf8" });
76
+ spinner.succeed("Successfully completed type checking!");
77
+ } catch (error) {
78
+ log(`
79
+ ${cliName} Error: ${error.message}`, "error", quiet);
80
+ spinner.fail("Type checking failed.");
81
+ callback(1);
82
+ return 1;
83
+ }
84
+ }
85
+ const globOptions = {
86
+ cwd: sourceDir,
87
+ dot: false,
88
+ nodir: true,
89
+ nosort: true
90
+ };
91
+ const tsFiles = globSync(`${sourceDir}/**/!(*.spec|*.test).ts*`, globOptions);
92
+ const jsFiles = globSync(`${sourceDir}/**/!(*.spec|*.test).js`, globOptions);
93
+ const sourceFiles = [...tsFiles, ...jsFiles];
94
+ const esbuildPath = relativeNodePath("esbuild/bin/esbuild", dirPath);
95
+ const esbuildOptions = [
96
+ ...sourceFiles,
97
+ "--color=true",
98
+ "--format=cjs",
99
+ `--outdir=${outputDir}`,
100
+ "--platform=node",
101
+ "--sourcemap=inline",
102
+ "--target=node20"
103
+ ];
104
+ if (watch) {
105
+ esbuildOptions.push("--watch");
106
+ }
107
+ const cssFiles = getFilesByExt(".css", LexConfig.config);
108
+ if (cssFiles.length) {
109
+ const postcssPath = relativeNodePath("postcss-cli/index.js", dirPath);
110
+ const postcssOptions = [
111
+ `${sourceDir}/**/**.css`,
112
+ "--base",
113
+ sourceDir,
114
+ "--dir",
115
+ outputDir,
116
+ "--config",
117
+ pathResolve(dirName, "../../postcss.config.js")
118
+ ];
119
+ try {
120
+ await execa(postcssPath, postcssOptions, { encoding: "utf8" });
121
+ spinner.succeed(`Successfully formatted ${cssFiles.length} css files!`);
122
+ } catch (error) {
123
+ log(`
124
+ ${cliName} Error: ${error.message}`, "error", quiet);
125
+ spinner.fail("Failed formatting css.");
126
+ callback(1);
127
+ return 1;
128
+ }
129
+ }
130
+ const gifFiles = getFilesByExt(".gif", LexConfig.config);
131
+ const jpgFiles = getFilesByExt(".jpg", LexConfig.config);
132
+ const pngFiles = getFilesByExt(".png", LexConfig.config);
133
+ const svgFiles = getFilesByExt(".svg", LexConfig.config);
134
+ const imageFiles = [...gifFiles, ...jpgFiles, ...pngFiles, ...svgFiles];
135
+ if (imageFiles.length) {
136
+ try {
137
+ await copyFiles(imageFiles, "image", spinner, LexConfig.config);
138
+ } catch (error) {
139
+ log(`
140
+ ${cliName} Error: ${error.message}`, "error", quiet);
141
+ spinner.fail("Failed to move images to output directory.");
142
+ callback(1);
143
+ return 1;
144
+ }
145
+ }
146
+ const ttfFiles = getFilesByExt(".ttf", LexConfig.config);
147
+ const otfFiles = getFilesByExt(".otf", LexConfig.config);
148
+ const woffFiles = getFilesByExt(".woff", LexConfig.config);
149
+ const woff2Files = getFilesByExt(".woff2", LexConfig.config);
150
+ const fontFiles = [...ttfFiles, ...otfFiles, ...woffFiles, ...woff2Files];
151
+ if (fontFiles.length) {
152
+ try {
153
+ await copyFiles(fontFiles, "font", spinner, LexConfig.config);
154
+ } catch (error) {
155
+ log(`
156
+ ${cliName} Error: ${error.message}`, "error", quiet);
157
+ spinner.fail("Failed to move fonts to output directory.");
158
+ callback(1);
159
+ return 1;
160
+ }
161
+ }
162
+ const mdFiles = getFilesByExt(".md", LexConfig.config);
163
+ if (mdFiles.length) {
164
+ try {
165
+ await copyFiles(mdFiles, "documents", spinner, LexConfig.config);
166
+ } catch (error) {
167
+ log(`
168
+ ${cliName} Error: ${error.message}`, "error", quiet);
169
+ spinner.fail("Failed to move docs to output directory.");
170
+ callback(1);
171
+ return 1;
172
+ }
173
+ }
174
+ spinner.start(watch ? "Watching for changes..." : "Compiling with ESBuild...");
175
+ try {
176
+ await execa(esbuildPath, esbuildOptions, { encoding: "utf8" });
177
+ spinner.succeed("Compile completed successfully!");
178
+ } catch (error) {
179
+ log(`
180
+ ${cliName} Error: ${error.message}`, "error", quiet);
181
+ if (!quiet) {
182
+ console.error(error);
183
+ }
184
+ spinner.fail("Code compiling failed.");
185
+ callback(1);
186
+ return 1;
187
+ }
188
+ callback(0);
189
+ return 0;
190
+ };
191
+ export {
192
+ compile,
193
+ hasFileType
194
+ };
195
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2NvbXBpbGUvY29tcGlsZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7ZXhlY2F9IGZyb20gJ2V4ZWNhJztcbmltcG9ydCB7ZXhpc3RzU3luYywgbHN0YXRTeW5jLCByZWFkZGlyU3luY30gZnJvbSAnZnMnO1xuaW1wb3J0IHtzeW5jIGFzIGdsb2JTeW5jfSBmcm9tICdnbG9iJztcbmltcG9ydCB7ZXh0bmFtZSBhcyBwYXRoRXh0bmFtZSwgam9pbiBhcyBwYXRoSm9pbiwgcmVzb2x2ZSBhcyBwYXRoUmVzb2x2ZX0gZnJvbSAncGF0aCc7XG5pbXBvcnQge1VSTH0gZnJvbSAndXJsJztcblxuaW1wb3J0IHtMZXhDb25maWd9IGZyb20gJy4uLy4uL0xleENvbmZpZy5qcyc7XG5pbXBvcnQge2NoZWNrTGlua2VkTW9kdWxlcywgY29weUZpbGVzLCBjcmVhdGVTcGlubmVyLCBnZXRGaWxlc0J5RXh0LCByZW1vdmVGaWxlc30gZnJvbSAnLi4vLi4vdXRpbHMvYXBwLmpzJztcbmltcG9ydCB7cmVsYXRpdmVOb2RlUGF0aH0gZnJvbSAnLi4vLi4vdXRpbHMvZmlsZS5qcyc7XG5pbXBvcnQge2xvZ30gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJztcblxuZXhwb3J0IGNvbnN0IGhhc0ZpbGVUeXBlID0gKHN0YXJ0UGF0aDogc3RyaW5nLCBleHQ6IHN0cmluZ1tdKTogYm9vbGVhbiA9PiB7XG4gIGlmKCFleGlzdHNTeW5jKHN0YXJ0UGF0aCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBmaWxlczogc3RyaW5nW10gPSByZWFkZGlyU3luYyhzdGFydFBhdGgpO1xuXG4gIHJldHVybiBmaWxlcy5zb21lKChmaWxlOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBmaWxlbmFtZTogc3RyaW5nID0gcGF0aEpvaW4oc3RhcnRQYXRoLCBmaWxlKTtcbiAgICBjb25zdCBmaWxlRXh0OiBzdHJpbmcgPSBwYXRoRXh0bmFtZShmaWxlbmFtZSk7XG4gICAgY29uc3Qgc3RhdCA9IGxzdGF0U3luYyhmaWxlbmFtZSk7XG5cbiAgICBpZihzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIC8vIFJlY3Vyc2l2ZSBzZWFyY2hcbiAgICAgIHJldHVybiBoYXNGaWxlVHlwZShmaWxlbmFtZSwgZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXh0LmluY2x1ZGVzKGZpbGVFeHQpO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjb21waWxlID0gYXN5bmMgKGNtZDogYW55LCBjYWxsYmFjazogYW55ID0gKCkgPT4gKHt9KSk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjbGlOYW1lID0gJ0xleCcsXG4gICAgY29uZmlnLFxuICAgIG91dHB1dFBhdGgsXG4gICAgcXVpZXQsXG4gICAgcmVtb3ZlLFxuICAgIHNvdXJjZVBhdGgsXG4gICAgd2F0Y2hcbiAgfSA9IGNtZDtcblxuICAvLyBTcGlubmVyXG4gIGNvbnN0IHNwaW5uZXIgPSBjcmVhdGVTcGlubmVyKHF1aWV0KTtcblxuICAvLyBEaXNwbGF5IHN0YXR1c1xuICBsb2coYCR7Y2xpTmFtZX0gY29tcGlsaW5nLi4uYCwgJ2luZm8nLCBxdWlldCk7XG5cbiAgLy8gR2V0IGN1c3RvbSBjb25maWd1cmF0aW9uXG4gIGF3YWl0IExleENvbmZpZy5wYXJzZUNvbmZpZyhjbWQpO1xuXG4gIC8vIENvbXBpbGUgdHlwZVxuICBjb25zdCB7b3V0cHV0RnVsbFBhdGgsIHNvdXJjZUZ1bGxQYXRoLCB1c2VUeXBlc2NyaXB0fSA9IExleENvbmZpZy5jb25maWc7XG4gIGNvbnN0IG91dHB1dERpcjogc3RyaW5nID0gb3V0cHV0UGF0aCB8fCBvdXRwdXRGdWxsUGF0aDtcbiAgY29uc3Qgc291cmNlRGlyOiBzdHJpbmcgPSBzb3VyY2VQYXRoID8gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgYC4vJHtzb3VyY2VQYXRofWApIDogc291cmNlRnVsbFBhdGg7XG4gIGNvbnN0IGRpck5hbWUgPSBuZXcgVVJMKCcuJywgaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZTtcbiAgY29uc3QgZGlyUGF0aDogc3RyaW5nID0gcGF0aFJlc29sdmUoZGlyTmFtZSwgJy4uLy4uJyk7XG5cbiAgLy8gQ2hlY2sgZm9yIGxpbmtlZCBtb2R1bGVzXG4gIGNoZWNrTGlua2VkTW9kdWxlcygpO1xuXG4gIC8vIENsZWFuIG91dHB1dCBkaXJlY3RvcnkgYmVmb3JlIHdlIHN0YXJ0IGFkZGluZyBpbiBuZXcgZmlsZXNcbiAgaWYocmVtb3ZlKSB7XG4gICAgYXdhaXQgcmVtb3ZlRmlsZXMob3V0cHV0RGlyKTtcbiAgfVxuXG4gIC8vIEFkZCB0c2NvbmZpZyBmaWxlIGlmIG5vbmUgZXhpc3RzXG4gIGlmKHVzZVR5cGVzY3JpcHQpIHtcbiAgICAvLyBNYWtlIHN1cmUgdHNjb25maWcuanNvbiBleGlzdHNcbiAgICBMZXhDb25maWcuY2hlY2tUeXBlc2NyaXB0Q29uZmlnKCk7XG5cbiAgICAvLyBDaGVjayBzdGF0aWMgdHlwZXMgd2l0aCB0eXBlc2NyaXB0XG4gICAgY29uc3QgdHlwZXNjcmlwdFBhdGg6IHN0cmluZyA9IHJlbGF0aXZlTm9kZVBhdGgoJ3R5cGVzY3JpcHQvYmluL3RzYycsIGRpclBhdGgpO1xuICAgIGNvbnN0IHR5cGVzY3JpcHRPcHRpb25zOiBzdHJpbmdbXSA9IGNvbmZpZyA/XG4gICAgICBbJy1wJywgY29uZmlnXSA6XG4gICAgICBbXG4gICAgICAgICctLWFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHMnLFxuICAgICAgICAnLS1iYXNlVXJsJywgc291cmNlRGlyLFxuICAgICAgICAnLS1kZWNsYXJhdGlvbicsXG4gICAgICAgICctLWVtaXREZWNsYXJhdGlvbk9ubHknLFxuICAgICAgICAnLS1saWInLCAnRVNOZXh0LERPTScsXG4gICAgICAgICctLW1vZHVsZScsICdlc25leHQnLFxuICAgICAgICAnLS1tb2R1bGVSZXNvbHV0aW9uJywgJ25vZGUnLFxuICAgICAgICAnLS1ub0ltcGxpY2l0UmV0dXJucycsXG4gICAgICAgICctLW5vSW1wbGljaXRUaGlzJyxcbiAgICAgICAgJy0tb3V0RGlyJywgb3V0cHV0RGlyLFxuICAgICAgICAnLS1yZW1vdmVDb21tZW50cycsXG4gICAgICAgICctLXJlc29sdmVKc29uTW9kdWxlJyxcbiAgICAgICAgJy0tdGFyZ2V0JywgJ0VTTmV4dCcsXG4gICAgICAgICctLXR5cGVSb290cycsICdub2RlX21vZHVsZXMvQHR5cGVzLG5vZGVfbW9kdWxlcy9qc29uLWQtdHMnXG4gICAgICBdO1xuXG4gICAgLy8gU3RhcnQgdHlwZSBjaGVja2luZyBzcGlubmVyXG4gICAgc3Bpbm5lci5zdGFydCgnU3RhdGljIHR5cGUgY2hlY2tpbmcgd2l0aCBUeXBlc2NyaXB0Li4uJyk7XG5cbiAgICAvLyBUeXBlIGNoZWNraW5nXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWNhKHR5cGVzY3JpcHRQYXRoLCB0eXBlc2NyaXB0T3B0aW9ucywge2VuY29kaW5nOiAndXRmOCd9KTtcblxuICAgICAgLy8gU3RvcCBzcGlubmVyXG4gICAgICBzcGlubmVyLnN1Y2NlZWQoJ1N1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgdHlwZSBjaGVja2luZyEnKTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAvLyBEaXNwbGF5IGVycm9yIG1lc3NhZ2VcbiAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcblxuICAgICAgLy8gU3RvcCBzcGlubmVyXG4gICAgICBzcGlubmVyLmZhaWwoJ1R5cGUgY2hlY2tpbmcgZmFpbGVkLicpO1xuXG4gICAgICAvLyBLaWxsIFByb2Nlc3NcbiAgICAgIGNhbGxiYWNrKDEpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgLy8gU291cmNlIGZpbGVzXG4gIGNvbnN0IGdsb2JPcHRpb25zID0ge1xuICAgIGN3ZDogc291cmNlRGlyLFxuICAgIGRvdDogZmFsc2UsXG4gICAgbm9kaXI6IHRydWUsXG4gICAgbm9zb3J0OiB0cnVlXG4gIH07XG4gIGNvbnN0IHRzRmlsZXM6IHN0cmluZ1tdID0gZ2xvYlN5bmMoYCR7c291cmNlRGlyfS8qKi8hKCouc3BlY3wqLnRlc3QpLnRzKmAsIGdsb2JPcHRpb25zKTtcbiAgY29uc3QganNGaWxlczogc3RyaW5nW10gPSBnbG9iU3luYyhgJHtzb3VyY2VEaXJ9LyoqLyEoKi5zcGVjfCoudGVzdCkuanNgLCBnbG9iT3B0aW9ucyk7XG4gIGNvbnN0IHNvdXJjZUZpbGVzOiBzdHJpbmdbXSA9IFsuLi50c0ZpbGVzLCAuLi5qc0ZpbGVzXTtcblxuICAvLyBFU0J1aWxkIG9wdGlvbnNcbiAgY29uc3QgZXNidWlsZFBhdGg6IHN0cmluZyA9IHJlbGF0aXZlTm9kZVBhdGgoJ2VzYnVpbGQvYmluL2VzYnVpbGQnLCBkaXJQYXRoKTtcbiAgY29uc3QgZXNidWlsZE9wdGlvbnM6IHN0cmluZ1tdID0gW1xuICAgIC4uLnNvdXJjZUZpbGVzLFxuICAgICctLWNvbG9yPXRydWUnLFxuICAgICctLWZvcm1hdD1janMnLFxuICAgIGAtLW91dGRpcj0ke291dHB1dERpcn1gLFxuICAgICctLXBsYXRmb3JtPW5vZGUnLFxuICAgICctLXNvdXJjZW1hcD1pbmxpbmUnLFxuICAgICctLXRhcmdldD1ub2RlMjAnXG4gIF07XG5cbiAgaWYod2F0Y2gpIHtcbiAgICBlc2J1aWxkT3B0aW9ucy5wdXNoKCctLXdhdGNoJyk7XG4gIH1cblxuICAvLyBVc2UgUG9zdENTUyBmb3IgQ1NTIGZpbGVzXG4gIGNvbnN0IGNzc0ZpbGVzOiBzdHJpbmdbXSA9IGdldEZpbGVzQnlFeHQoJy5jc3MnLCBMZXhDb25maWcuY29uZmlnKTtcblxuICBpZihjc3NGaWxlcy5sZW5ndGgpIHtcbiAgICBjb25zdCBwb3N0Y3NzUGF0aDogc3RyaW5nID0gcmVsYXRpdmVOb2RlUGF0aCgncG9zdGNzcy1jbGkvaW5kZXguanMnLCBkaXJQYXRoKTtcbiAgICBjb25zdCBwb3N0Y3NzT3B0aW9uczogc3RyaW5nW10gPSBbXG4gICAgICBgJHtzb3VyY2VEaXJ9LyoqLyoqLmNzc2AsXG4gICAgICAnLS1iYXNlJyxcbiAgICAgIHNvdXJjZURpcixcbiAgICAgICctLWRpcicsXG4gICAgICBvdXRwdXREaXIsXG4gICAgICAnLS1jb25maWcnLFxuICAgICAgcGF0aFJlc29sdmUoZGlyTmFtZSwgJy4uLy4uL3Bvc3Rjc3MuY29uZmlnLmpzJylcbiAgICBdO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWNhKHBvc3Rjc3NQYXRoLCBwb3N0Y3NzT3B0aW9ucywge2VuY29kaW5nOiAndXRmOCd9KTtcbiAgICAgIHNwaW5uZXIuc3VjY2VlZChgU3VjY2Vzc2Z1bGx5IGZvcm1hdHRlZCAke2Nzc0ZpbGVzLmxlbmd0aH0gY3NzIGZpbGVzIWApO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIC8vIERpc3BsYXkgZXJyb3IgbWVzc2FnZVxuICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuXG4gICAgICAvLyBTdG9wIHNwaW5uZXJcbiAgICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIGZvcm1hdHRpbmcgY3NzLicpO1xuXG4gICAgICAvLyBLaWxsIFByb2Nlc3NcbiAgICAgIGNhbGxiYWNrKDEpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgLy8gQ29weSBpbWFnZSBmaWxlc1xuICBjb25zdCBnaWZGaWxlczogc3RyaW5nW10gPSBnZXRGaWxlc0J5RXh0KCcuZ2lmJywgTGV4Q29uZmlnLmNvbmZpZyk7XG4gIGNvbnN0IGpwZ0ZpbGVzOiBzdHJpbmdbXSA9IGdldEZpbGVzQnlFeHQoJy5qcGcnLCBMZXhDb25maWcuY29uZmlnKTtcbiAgY29uc3QgcG5nRmlsZXM6IHN0cmluZ1tdID0gZ2V0RmlsZXNCeUV4dCgnLnBuZycsIExleENvbmZpZy5jb25maWcpO1xuICBjb25zdCBzdmdGaWxlczogc3RyaW5nW10gPSBnZXRGaWxlc0J5RXh0KCcuc3ZnJywgTGV4Q29uZmlnLmNvbmZpZyk7XG4gIGNvbnN0IGltYWdlRmlsZXM6IHN0cmluZ1tdID0gWy4uLmdpZkZpbGVzLCAuLi5qcGdGaWxlcywgLi4ucG5nRmlsZXMsIC4uLnN2Z0ZpbGVzXTtcblxuICBpZihpbWFnZUZpbGVzLmxlbmd0aCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjb3B5RmlsZXMoaW1hZ2VGaWxlcywgJ2ltYWdlJywgc3Bpbm5lciwgTGV4Q29uZmlnLmNvbmZpZyk7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgLy8gRGlzcGxheSBlcnJvciBtZXNzYWdlXG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG5cbiAgICAgIC8vIFN0b3Agc3Bpbm5lclxuICAgICAgc3Bpbm5lci5mYWlsKCdGYWlsZWQgdG8gbW92ZSBpbWFnZXMgdG8gb3V0cHV0IGRpcmVjdG9yeS4nKTtcblxuICAgICAgLy8gS2lsbCBQcm9jZXNzXG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIC8vIENvcHkgZm9udCBmaWxlc1xuICBjb25zdCB0dGZGaWxlczogc3RyaW5nW10gPSBnZXRGaWxlc0J5RXh0KCcudHRmJywgTGV4Q29uZmlnLmNvbmZpZyk7XG4gIGNvbnN0IG90ZkZpbGVzOiBzdHJpbmdbXSA9IGdldEZpbGVzQnlFeHQoJy5vdGYnLCBMZXhDb25maWcuY29uZmlnKTtcbiAgY29uc3Qgd29mZkZpbGVzOiBzdHJpbmdbXSA9IGdldEZpbGVzQnlFeHQoJy53b2ZmJywgTGV4Q29uZmlnLmNvbmZpZyk7XG4gIGNvbnN0IHdvZmYyRmlsZXM6IHN0cmluZ1tdID0gZ2V0RmlsZXNCeUV4dCgnLndvZmYyJywgTGV4Q29uZmlnLmNvbmZpZyk7XG4gIGNvbnN0IGZvbnRGaWxlczogc3RyaW5nW10gPSBbLi4udHRmRmlsZXMsIC4uLm90ZkZpbGVzLCAuLi53b2ZmRmlsZXMsIC4uLndvZmYyRmlsZXNdO1xuXG4gIGlmKGZvbnRGaWxlcy5sZW5ndGgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY29weUZpbGVzKGZvbnRGaWxlcywgJ2ZvbnQnLCBzcGlubmVyLCBMZXhDb25maWcuY29uZmlnKTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAvLyBEaXNwbGF5IGVycm9yIG1lc3NhZ2VcbiAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcblxuICAgICAgLy8gU3RvcCBzcGlubmVyXG4gICAgICBzcGlubmVyLmZhaWwoJ0ZhaWxlZCB0byBtb3ZlIGZvbnRzIHRvIG91dHB1dCBkaXJlY3RvcnkuJyk7XG5cbiAgICAgIC8vIEtpbGwgUHJvY2Vzc1xuICAgICAgY2FsbGJhY2soMSk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cblxuICAvLyBDb3B5IG1hcmtkb3duIGZpbGVzXG4gIGNvbnN0IG1kRmlsZXM6IHN0cmluZ1tdID0gZ2V0RmlsZXNCeUV4dCgnLm1kJywgTGV4Q29uZmlnLmNvbmZpZyk7XG5cbiAgaWYobWRGaWxlcy5sZW5ndGgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY29weUZpbGVzKG1kRmlsZXMsICdkb2N1bWVudHMnLCBzcGlubmVyLCBMZXhDb25maWcuY29uZmlnKTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAvLyBEaXNwbGF5IGVycm9yIG1lc3NhZ2VcbiAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcblxuICAgICAgLy8gU3RvcCBzcGlubmVyXG4gICAgICBzcGlubmVyLmZhaWwoJ0ZhaWxlZCB0byBtb3ZlIGRvY3MgdG8gb3V0cHV0IGRpcmVjdG9yeS4nKTtcblxuICAgICAgLy8gS2lsbCBQcm9jZXNzXG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIC8vIFN0YXJ0IGNvbXBpbGUgc3Bpbm5lclxuICBzcGlubmVyLnN0YXJ0KHdhdGNoID8gJ1dhdGNoaW5nIGZvciBjaGFuZ2VzLi4uJyA6ICdDb21waWxpbmcgd2l0aCBFU0J1aWxkLi4uJyk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBleGVjYShlc2J1aWxkUGF0aCwgZXNidWlsZE9wdGlvbnMsIHtlbmNvZGluZzogJ3V0ZjgnfSk7XG5cbiAgICAvLyBTdG9wIHNwaW5uZXJcbiAgICBzcGlubmVyLnN1Y2NlZWQoJ0NvbXBpbGUgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSEnKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIC8vIERpc3BsYXkgZXJyb3IgbWVzc2FnZVxuICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcblxuICAgIGlmKCFxdWlldCkge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfVxuXG4gICAgLy8gU3RvcCBzcGlubmVyXG4gICAgc3Bpbm5lci5mYWlsKCdDb2RlIGNvbXBpbGluZyBmYWlsZWQuJyk7XG5cbiAgICAvLyBLaWxsIFByb2Nlc3NcbiAgICBjYWxsYmFjaygxKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIC8vIFN0b3AgcHJvY2Vzc1xuICBjYWxsYmFjaygwKTtcbiAgcmV0dXJuIDA7XG59OyJdLAogICJtYXBwaW5ncyI6ICJBQUlBLFNBQVEsYUFBWTtBQUNwQixTQUFRLFlBQVksV0FBVyxtQkFBa0I7QUFDakQsU0FBUSxRQUFRLGdC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