@nlabs/lex 1.46.2 → 1.47.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.
Files changed (149) 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.d.ts +79 -0
  10. package/dist/LexConfig.js +83 -15
  11. package/dist/commands/ai/ai.d.ts +17 -0
  12. package/dist/commands/ai/ai.js +303 -0
  13. package/dist/commands/ai/index.d.ts +8 -0
  14. package/dist/commands/ai/index.js +7 -0
  15. package/dist/commands/build/build.cli.test.d.ts +5 -0
  16. package/dist/commands/build/build.d.ts +18 -0
  17. package/dist/commands/build/build.integration.test.d.ts +1 -0
  18. package/dist/commands/build/build.js +400 -0
  19. package/dist/commands/build/build.options.test.d.ts +5 -0
  20. package/dist/commands/clean/clean.cli.test.d.ts +1 -0
  21. package/dist/commands/clean/clean.d.ts +7 -0
  22. package/dist/commands/clean/clean.integration.test.d.ts +1 -0
  23. package/dist/commands/clean/clean.js +31 -0
  24. package/dist/commands/clean/clean.options.test.d.ts +1 -0
  25. package/dist/commands/compile/compile.cli.test.d.ts +1 -0
  26. package/dist/commands/compile/compile.d.ts +2 -0
  27. package/dist/commands/compile/compile.integration.test.d.ts +1 -0
  28. package/dist/commands/compile/compile.js +239 -0
  29. package/dist/commands/compile/compile.options.test.d.ts +1 -0
  30. package/dist/commands/config/config.cli.test.d.ts +1 -0
  31. package/dist/commands/config/config.d.ts +7 -0
  32. package/dist/commands/config/config.integration.test.d.ts +1 -0
  33. package/dist/commands/config/config.js +43 -0
  34. package/dist/commands/config/config.options.test.d.ts +1 -0
  35. package/dist/commands/copy/copy.cli.test.d.ts +1 -0
  36. package/dist/commands/copy/copy.d.ts +6 -0
  37. package/dist/commands/copy/copy.integration.test.d.ts +1 -0
  38. package/dist/commands/copy/copy.js +38 -0
  39. package/dist/commands/copy/copy.options.test.d.ts +1 -0
  40. package/dist/commands/create/create.cli.test.d.ts +1 -0
  41. package/dist/commands/create/create.d.ts +8 -0
  42. package/dist/commands/create/create.integration.test.d.ts +1 -0
  43. package/dist/commands/create/create.js +124 -0
  44. package/dist/commands/create/create.options.test.d.ts +1 -0
  45. package/dist/commands/dev/dev.cli.test.d.ts +1 -0
  46. package/dist/commands/dev/dev.d.ts +11 -0
  47. package/dist/commands/dev/dev.integration.test.d.ts +1 -0
  48. package/dist/commands/dev/dev.js +70 -0
  49. package/dist/commands/dev/dev.options.test.d.ts +1 -0
  50. package/dist/commands/init/init.cli.test.d.ts +1 -0
  51. package/dist/commands/init/init.d.ts +9 -0
  52. package/dist/commands/init/init.integration.test.d.ts +1 -0
  53. package/dist/commands/init/init.js +93 -0
  54. package/dist/commands/init/init.options.test.d.ts +1 -0
  55. package/dist/commands/link/link.cli.test.d.ts +1 -0
  56. package/dist/commands/link/link.d.ts +6 -0
  57. package/dist/commands/link/link.integration.test.d.ts +1 -0
  58. package/dist/commands/link/link.js +15 -0
  59. package/dist/commands/link/link.options.test.d.ts +1 -0
  60. package/dist/commands/lint/autofix.d.ts +2 -0
  61. package/dist/commands/lint/lint.cli.test.d.ts +1 -0
  62. package/dist/commands/lint/lint.d.ts +39 -0
  63. package/dist/commands/lint/lint.integration.test.d.ts +1 -0
  64. package/dist/commands/lint/lint.js +820 -0
  65. package/dist/commands/lint/lint.options.test.d.ts +1 -0
  66. package/dist/commands/migrate/migrate.cli.test.d.ts +1 -0
  67. package/dist/commands/migrate/migrate.d.ts +7 -0
  68. package/dist/commands/migrate/migrate.integration.test.d.ts +1 -0
  69. package/dist/commands/migrate/migrate.js +37 -0
  70. package/dist/commands/migrate/migrate.options.test.d.ts +1 -0
  71. package/dist/commands/publish/publish.cli.test.d.ts +1 -0
  72. package/dist/commands/publish/publish.d.ts +12 -0
  73. package/dist/commands/publish/publish.integration.test.d.ts +1 -0
  74. package/dist/commands/publish/publish.js +104 -0
  75. package/dist/commands/publish/publish.options.test.d.ts +1 -0
  76. package/dist/commands/test/test.cli.test.d.ts +1 -0
  77. package/dist/commands/test/test.d.ts +50 -0
  78. package/dist/commands/test/test.integration.test.d.ts +1 -0
  79. package/dist/commands/test/test.js +327 -0
  80. package/dist/commands/test/test.options.test.d.ts +1 -0
  81. package/dist/commands/test/test.test.d.ts +1 -0
  82. package/dist/commands/update/update.cli.test.d.ts +1 -0
  83. package/dist/commands/update/update.d.ts +9 -0
  84. package/dist/commands/update/update.integration.test.d.ts +1 -0
  85. package/dist/commands/update/update.js +131 -0
  86. package/dist/commands/update/update.options.test.d.ts +1 -0
  87. package/dist/commands/upgrade/upgrade.cli.test.d.ts +1 -0
  88. package/dist/commands/upgrade/upgrade.d.ts +7 -0
  89. package/dist/commands/upgrade/upgrade.integration.test.d.ts +1 -0
  90. package/dist/commands/upgrade/upgrade.js +47 -0
  91. package/dist/commands/upgrade/upgrade.options.test.d.ts +1 -0
  92. package/dist/commands/versions/versions.cli.test.d.ts +1 -0
  93. package/dist/commands/versions/versions.d.ts +13 -0
  94. package/dist/commands/versions/versions.integration.test.d.ts +1 -0
  95. package/dist/commands/versions/versions.js +41 -0
  96. package/dist/commands/versions/versions.options.test.d.ts +1 -0
  97. package/dist/create/changelog.d.ts +6 -0
  98. package/dist/create/changelog.js +3 -3
  99. package/dist/index.d.ts +31 -0
  100. package/dist/index.js +35 -0
  101. package/dist/lex.d.ts +2 -0
  102. package/dist/lex.js +25 -22
  103. package/dist/types.d.ts +5 -0
  104. package/dist/types.js +1 -0
  105. package/dist/utils/aiService.d.ts +9 -0
  106. package/dist/utils/aiService.js +299 -0
  107. package/dist/utils/app.d.ts +41 -0
  108. package/dist/utils/app.js +53 -3
  109. package/dist/utils/file.d.ts +3 -0
  110. package/dist/utils/file.js +18 -3
  111. package/dist/utils/log.d.ts +1 -0
  112. package/dist/utils/log.js +2 -1
  113. package/dist/utils/reactShim.d.ts +2 -0
  114. package/dist/utils/reactShim.js +3 -3
  115. package/eslint.config.js +5 -0
  116. package/index.cjs +20 -0
  117. package/jest.config.cjs +31 -27
  118. package/jest.config.lex.d.ts +2 -0
  119. package/jest.config.lex.js +86 -38
  120. package/jest.setup.js +5 -0
  121. package/lex.config.js +50 -0
  122. package/package.json +73 -53
  123. package/{.postcssrc.js → postcss.config.js} +21 -9
  124. package/resolver.cjs +125 -14
  125. package/tsconfig.json +2 -1
  126. package/webpack.config.d.ts +2 -0
  127. package/webpack.config.js +27 -11
  128. package/dist/commands/build.js +0 -265
  129. package/dist/commands/bulid.test.js +0 -317
  130. package/dist/commands/clean.js +0 -31
  131. package/dist/commands/clean.test.js +0 -63
  132. package/dist/commands/compile.js +0 -195
  133. package/dist/commands/compile.test.js +0 -93
  134. package/dist/commands/config.js +0 -43
  135. package/dist/commands/copy.js +0 -38
  136. package/dist/commands/create.js +0 -120
  137. package/dist/commands/dev.js +0 -70
  138. package/dist/commands/init.js +0 -93
  139. package/dist/commands/link.js +0 -15
  140. package/dist/commands/lint.js +0 -179
  141. package/dist/commands/migrate.js +0 -37
  142. package/dist/commands/publish.js +0 -104
  143. package/dist/commands/test.js +0 -190
  144. package/dist/commands/update.js +0 -64
  145. package/dist/commands/upgrade.js +0 -47
  146. package/dist/commands/versions.js +0 -41
  147. package/dist/commands/versions.test.js +0 -49
  148. package/dist/lint.js +0 -11
  149. package/jest.setup.ts +0 -3
@@ -0,0 +1,303 @@
1
+ import chalk from "chalk";
2
+ import { Command } from "commander";
3
+ import { readFileSync } from "fs";
4
+ import { sync as globSync } from "glob";
5
+ import { LexConfig } from "../../LexConfig.js";
6
+ import { callAIService } from "../../utils/aiService.js";
7
+ import { log } from "../../utils/log.js";
8
+ if (process.env.CURSOR_EXTENSION === "true" || process.env.CURSOR_TERMINAL === "true" || process.env.CURSOR_APP === "true" || process.env.PATH?.includes("cursor") || process.env.CURSOR_SESSION_ID) {
9
+ process.env.CURSOR_IDE = "true";
10
+ }
11
+ const getFileContext = (filePath) => {
12
+ try {
13
+ const content = readFileSync(filePath, "utf-8");
14
+ return `File: ${filePath}
15
+
16
+ ${content}`;
17
+ } catch (_error) {
18
+ return `Error reading file: ${filePath}`;
19
+ }
20
+ };
21
+ const getProjectContext = async (options) => {
22
+ const { file, task, context } = options;
23
+ if (context === false) {
24
+ return "";
25
+ }
26
+ let projectContext = "";
27
+ if (file) {
28
+ projectContext += getFileContext(file);
29
+ }
30
+ switch (task) {
31
+ case "generate":
32
+ const files = globSync("src/**/*.{ts,tsx,js,jsx}", {
33
+ cwd: process.cwd(),
34
+ ignore: ["**/node_modules/**", "**/dist/**", "**/*.test.*", "**/*.spec.*"],
35
+ maxDepth: 3
36
+ });
37
+ projectContext += `
38
+
39
+ Project structure:
40
+ ${files.join("\n")}`;
41
+ break;
42
+ case "test":
43
+ if (file) {
44
+ const testConfig = getFileContext("jest.config.js");
45
+ projectContext += `
46
+
47
+ Test configuration:
48
+ ${testConfig}`;
49
+ }
50
+ break;
51
+ case "optimize":
52
+ const webpackConfig = getFileContext("webpack.config.js");
53
+ projectContext += `
54
+
55
+ Webpack configuration:
56
+ ${webpackConfig}`;
57
+ break;
58
+ default:
59
+ break;
60
+ }
61
+ return projectContext;
62
+ };
63
+ const constructPrompt = (options, projectContext) => {
64
+ const { task = "help", prompt = "" } = options;
65
+ const taskInstructions = {
66
+ generate: "Generate code according to the following request. Make sure it follows best practices and is well documented:",
67
+ explain: "Explain the following code in detail, including any patterns, potential issues, and improvement suggestions:",
68
+ test: "Generate comprehensive unit tests for the following code:",
69
+ optimize: "Analyze the following code/configuration and suggest optimization improvements:",
70
+ help: "Provide guidance on the following development question:",
71
+ ask: "Provide guidance on the following development question:",
72
+ analyze: "Analyze the following code:"
73
+ };
74
+ const taskInstruction = taskInstructions[task] || taskInstructions.help;
75
+ let fullPrompt = `${taskInstruction}
76
+
77
+ ${prompt}`;
78
+ if (projectContext) {
79
+ fullPrompt += `
80
+
81
+ ===CONTEXT===
82
+ ${projectContext}`;
83
+ }
84
+ return fullPrompt;
85
+ };
86
+ const displayResponse = (response, options) => {
87
+ const { task = "help", quiet = false } = options;
88
+ let content = "";
89
+ if (typeof response === "string") {
90
+ content = response;
91
+ } else if (response.choices?.[0]?.message?.content) {
92
+ content = response.choices[0].message.content;
93
+ } else if (response.content) {
94
+ content = response.content;
95
+ } else {
96
+ content = "No response received from AI model";
97
+ }
98
+ const cleanedContent = cleanResponse(content, options);
99
+ switch (task) {
100
+ case "generate":
101
+ log("\nGenerated Code:\n", "success", quiet);
102
+ log(cleanedContent, "default", quiet);
103
+ break;
104
+ case "explain":
105
+ log("\nCode Explanation:\n", "success", quiet);
106
+ log(cleanedContent, "default", quiet);
107
+ break;
108
+ case "test":
109
+ log("\nGenerated Tests:\n", "success", quiet);
110
+ log(cleanedContent, "default", quiet);
111
+ break;
112
+ case "optimize":
113
+ log("\nOptimization Suggestions:\n", "success", quiet);
114
+ log(cleanedContent, "default", quiet);
115
+ break;
116
+ default:
117
+ log("\nAI Response:\n", "success", quiet);
118
+ log(cleanedContent, "default", quiet);
119
+ break;
120
+ }
121
+ };
122
+ const cleanResponse = (content, options) => {
123
+ const { prompt = "", task = "help" } = options;
124
+ if (!content) {
125
+ return content;
126
+ }
127
+ let cleanedContent = content;
128
+ const taskInstructions = {
129
+ generate: "Generate code according to the following request. Make sure it follows best practices and is well documented:",
130
+ explain: "Explain the following code in detail, including any patterns, potential issues, and improvement suggestions:",
131
+ test: "Generate comprehensive unit tests for the following code:",
132
+ optimize: "Analyze the following code/configuration and suggest optimization improvements:",
133
+ help: "Provide guidance on the following development question:",
134
+ ask: "Provide guidance on the following development question:",
135
+ analyze: "Analyze the following code:"
136
+ };
137
+ const instruction = taskInstructions[task] || "";
138
+ if (instruction && cleanedContent.includes(instruction)) {
139
+ cleanedContent = cleanedContent.replace(instruction, "").trim();
140
+ }
141
+ if (prompt && cleanedContent.includes(prompt)) {
142
+ cleanedContent = cleanedContent.replace(prompt, "").trim();
143
+ }
144
+ if (cleanedContent.includes("===CONTEXT===")) {
145
+ cleanedContent = cleanedContent.split("===CONTEXT===")[0].trim();
146
+ }
147
+ if (!cleanedContent) {
148
+ return content;
149
+ }
150
+ return cleanedContent;
151
+ };
152
+ const getProviderAuth = (provider) => {
153
+ if (process.cwd().includes("reaktor")) {
154
+ return "cursor-auth";
155
+ }
156
+ if (process.env.AI_API_KEY) {
157
+ return process.env.AI_API_KEY;
158
+ }
159
+ if (provider === "none" && process.env.CURSOR_IDE === "true") {
160
+ return "cursor-auth";
161
+ }
162
+ switch (provider) {
163
+ case "openai":
164
+ return process.env.OPENAI_API_KEY;
165
+ case "anthropic":
166
+ return process.env.ANTHROPIC_API_KEY;
167
+ case "cursor":
168
+ return "cursor-auth";
169
+ case "copilot":
170
+ return process.env.GITHUB_TOKEN;
171
+ case "none":
172
+ return void 0;
173
+ default:
174
+ return void 0;
175
+ }
176
+ };
177
+ const detectCursorIDE = () => {
178
+ if (process.env.CURSOR_IDE === "true") {
179
+ return true;
180
+ }
181
+ const possibleCursorSignals = [
182
+ process.env.CURSOR_EXTENSION === "true",
183
+ process.env.CURSOR_TERMINAL === "true",
184
+ process.env.CURSOR_APP === "true",
185
+ process.env.PATH?.includes("cursor"),
186
+ !!process.env.CURSOR_SESSION_ID
187
+ ];
188
+ const isCursorIDE = possibleCursorSignals.some((signal) => signal);
189
+ if (isCursorIDE) {
190
+ process.env.CURSOR_IDE = "true";
191
+ }
192
+ return isCursorIDE;
193
+ };
194
+ const aiFunction = async (options) => {
195
+ try {
196
+ const config = LexConfig.config || {};
197
+ const aiConfig = config.ai || {};
198
+ const provider = options.provider || aiConfig.provider || "none";
199
+ if (provider === "none" && !process.env.CURSOR_EXTENSION) {
200
+ log(`${chalk.red("Error:")} No AI provider configured.`, "error");
201
+ return { error: "No AI provider configured" };
202
+ }
203
+ const task = options.task || "ask";
204
+ const validTasks = ["explain", "generate", "test", "analyze", "ask"];
205
+ if (!validTasks.includes(task)) {
206
+ log(`${chalk.red("Error:")} Invalid task "${task}". Valid tasks are: ${validTasks.join(", ")}`, "error");
207
+ return { error: `Invalid task "${task}"` };
208
+ }
209
+ const { prompt } = options;
210
+ if (!prompt) {
211
+ log(`${chalk.red("Error:")} No prompt provided. Use --prompt "Your prompt here"`, "error");
212
+ return { error: "No prompt provided" };
213
+ }
214
+ let context = "";
215
+ if (options.file) {
216
+ try {
217
+ const fs = await import("fs/promises");
218
+ const glob = await import("glob");
219
+ const files = await glob.glob(options.file);
220
+ if (files.length === 0) {
221
+ log(`${chalk.yellow("Warning:")} No files found matching "${options.file}"`, "warning");
222
+ } else {
223
+ for (const file of files) {
224
+ const content = await fs.readFile(file, "utf8");
225
+ context += `
226
+ ===FILE: ${file}===
227
+ ${content}
228
+ `;
229
+ }
230
+ }
231
+ } catch (error) {
232
+ log(`${chalk.yellow("Warning:")} Error reading file: ${error.message}`, "warning");
233
+ }
234
+ }
235
+ if (options.dir) {
236
+ try {
237
+ const { execaSync } = await import("execa");
238
+ const result = execaSync("find", [options.dir, "-type", "f", "|", "sort"]);
239
+ context += `
240
+ ===Project structure:===
241
+ ${result.stdout}
242
+ `;
243
+ } catch (error) {
244
+ log(`${chalk.yellow("Warning:")} Error reading directory: ${error.message}`, "warning");
245
+ }
246
+ }
247
+ let formattedPrompt = "";
248
+ switch (task) {
249
+ case "explain":
250
+ formattedPrompt = `Explain the following code:
251
+ ${prompt}`;
252
+ break;
253
+ case "generate":
254
+ formattedPrompt = `Generate code according to the following request:
255
+ ${prompt}`;
256
+ break;
257
+ case "test":
258
+ formattedPrompt = `Generate comprehensive unit tests:
259
+ ${prompt}`;
260
+ break;
261
+ case "analyze":
262
+ formattedPrompt = `Analyze the following code:
263
+ ${prompt}`;
264
+ break;
265
+ case "ask":
266
+ formattedPrompt = `Provide guidance on the following development question:
267
+ ${prompt}`;
268
+ break;
269
+ }
270
+ if (context) {
271
+ formattedPrompt += `
272
+ ===CONTEXT===
273
+ ${context}`;
274
+ }
275
+ if ((provider === "cursor" || process.env.CURSOR_EXTENSION) && task === "generate") {
276
+ log("Using Cursor IDE for code generation...", "info");
277
+ log("Note: For full code generation capabilities, please use Cursor IDE directly with Cmd+L or Cmd+K.", "info");
278
+ log("The CLI integration has limited capabilities for code generation.", "warning");
279
+ } else if (provider === "cursor" || process.env.CURSOR_EXTENSION) {
280
+ log("Using Cursor IDE for AI assistance...", "info");
281
+ log("Note: This is a limited integration. For full AI capabilities, use Cursor IDE directly.", "info");
282
+ } else {
283
+ log(`Using ${provider} for AI assistance...`, "info");
284
+ }
285
+ const response = await callAIService(formattedPrompt, options.quiet || false);
286
+ log(`
287
+ ${response}`, "success");
288
+ return { response };
289
+ } catch (error) {
290
+ log(`${chalk.red("Error:")} ${error.message}`, "error");
291
+ return { error: error.message };
292
+ }
293
+ };
294
+ const ai = new Command("ai").description("Use AI to help with development tasks").option("--provider <provider>", "AI provider to use (openai, anthropic, cursor)").option("--task <task>", "Task to perform (explain, generate, test, analyze, ask)").option("--prompt <prompt>", "Prompt to send to AI").option("--file <file>", "File to analyze").option("--dir <dir>", "Directory to analyze").action(async (options) => {
295
+ await aiFunction(options);
296
+ });
297
+ var ai_default = ai;
298
+ export {
299
+ ai,
300
+ aiFunction,
301
+ ai_default as default
302
+ };
303
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2FpL2FpLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7Q29tbWFuZH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCB7cmVhZEZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge3N5bmMgYXMgZ2xvYlN5bmN9IGZyb20gJ2dsb2InO1xuXG5pbXBvcnQge0xleENvbmZpZ30gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcbmltcG9ydCB7Y2FsbEFJU2VydmljZX0gZnJvbSAnLi4vLi4vdXRpbHMvYWlTZXJ2aWNlLmpzJztcbmltcG9ydCB7bG9nfSBmcm9tICcuLi8uLi91dGlscy9sb2cuanMnO1xuXG5pZihwcm9jZXNzLmVudi5DVVJTT1JfRVhURU5TSU9OID09PSAndHJ1ZScgfHxcbiAgICBwcm9jZXNzLmVudi5DVVJTT1JfVEVSTUlOQUwgPT09ICd0cnVlJyB8fFxuICAgIHByb2Nlc3MuZW52LkNVUlNPUl9BUFAgPT09ICd0cnVlJyB8fFxuICAgIHByb2Nlc3MuZW52LlBBVEg/LmluY2x1ZGVzKCdjdXJzb3InKSB8fFxuICAgIHByb2Nlc3MuZW52LkNVUlNPUl9TRVNTSU9OX0lEKSB7XG4gIHByb2Nlc3MuZW52LkNVUlNPUl9JREUgPSAndHJ1ZSc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQUlPcHRpb25zIHtcbiAgcmVhZG9ubHkgY2xpTmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgY29udGV4dD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGZpbGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGxleENvbmZpZz86IHN0cmluZztcbiAgcmVhZG9ubHkgbW9kZWw/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHByb21wdD86IHN0cmluZztcbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xuICByZWFkb25seSB0YXNrPzogJ2dlbmVyYXRlJyB8ICdleHBsYWluJyB8ICd0ZXN0JyB8ICdvcHRpbWl6ZScgfCAnaGVscCcgfCAnYXNrJyB8ICdhbmFseXplJztcbiAgcmVhZG9ubHkgZGVidWc/OiBib29sZWFuO1xuICByZWFkb25seSBwcm92aWRlcj86IHN0cmluZztcbiAgcmVhZG9ubHkgZGlyPzogc3RyaW5nO1xufVxuXG5jb25zdCBnZXRGaWxlQ29udGV4dCA9IChmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb250ZW50ID0gcmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmLTgnKTtcbiAgICByZXR1cm4gYEZpbGU6ICR7ZmlsZVBhdGh9XFxuXFxuJHtjb250ZW50fWA7XG4gIH0gY2F0Y2goX2Vycm9yKSB7XG4gICAgcmV0dXJuIGBFcnJvciByZWFkaW5nIGZpbGU6ICR7ZmlsZVBhdGh9YDtcbiAgfVxufTtcblxuY29uc3QgZ2V0UHJvamVjdENvbnRleHQgPSBhc3luYyAob3B0aW9uczogQUlPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgY29uc3Qge2ZpbGUsIHRhc2ssIGNvbnRleHR9ID0gb3B0aW9ucztcblxuICBpZihjb250ZXh0ID09PSBmYWxzZSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGxldCBwcm9qZWN0Q29udGV4dCA9ICcnO1xuXG4gIGlmKGZpbGUpIHtcbiAgICBwcm9qZWN0Q29udGV4dCArPSBnZXRGaWxlQ29udGV4dChmaWxlKTtcbiAgfVxuXG4gIHN3aXRjaCh0YXNrKSB7XG4gICAgY2FzZSAnZ2VuZXJhdGUnOlxuICAgICAgY29uc3QgZmlsZXMgPSBnbG9iU3luYygnc3JjLyoqLyoue3RzLHRzeCxqcyxqc3h9Jywge1xuICAgICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgICAgIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionLCAnKiovZGlzdC8qKicsICcqKi8qLnRlc3QuKicsICcqKi8qLnNwZWMuKiddLFxuICAgICAgICBtYXhEZXB0aDogM1xuICAgICAgfSk7XG4gICAgICBwcm9qZWN0Q29udGV4dCArPSBgXFxuXFxuUHJvamVjdCBzdHJ1Y3R1cmU6XFxuJHtmaWxlcy5qb2luKCdcXG4nKX1gO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXN0JzpcbiAgICAgIGlmKGZpbGUpIHtcbiAgICAgICAgY29uc3QgdGVzdENvbmZpZyA9IGdldEZpbGVDb250ZXh0KCdqZXN0LmNvbmZpZy5qcycpO1xuICAgICAgICBwcm9qZWN0Q29udGV4dCArPSBgXFxuXFxuVGVzdCBjb25maWd1cmF0aW9uOlxcbiR7dGVzdENvbmZpZ31gO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdvcHRpbWl6ZSc6XG4gICAgICBjb25zdCB3ZWJwYWNrQ29uZmlnID0gZ2V0RmlsZUNvbnRleHQoJ3dlYnBhY2suY29uZmlnLmpzJyk7XG4gICAgICBwcm9qZWN0Q29udGV4dCArPSBgXFxuXFxuV2VicGFjayBjb25maWd1cmF0aW9uOlxcbiR7d2VicGFja0NvbmZpZ31gO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gcHJvamVjdENvbnRleHQ7XG59O1xuXG5jb25zdCBjb25zdHJ1Y3RQcm9tcHQgPSAob3B0aW9uczogQUlPcHRpb25zLCBwcm9qZWN0Q29udGV4dDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3Qge3Rhc2sgPSAnaGVscCcsIHByb21wdCA9ICcnfSA9IG9wdGlvbnM7XG5cbiAgY29uc3QgdGFza0luc3RydWN0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBnZW5lcmF0ZTogJ0dlbmVyYXRlIGNvZGUgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgcmVxdWVzdC4gTWFrZSBzdXJlIGl0IGZvbGxvd3MgYmVzdCBwcmFjdGljZXMgYW5kIGlzIHdlbGwgZG9jdW1lbnRlZDonLFxuICAgIGV4cGxhaW46ICdFeHBsYWluIHRoZSBmb2xsb3dpbmcgY29kZSBpbiBkZXRhaWwsIGluY2x1ZGluZyBhbnkgcGF0dGVybnMsIHBvdGVudGlhbCBpc3N1ZXMsIGFuZCBpbXByb3ZlbWVudCBzdWdnZXN0aW9uczonLFxuICAgIHRlc3Q6ICdHZW5lcmF0ZSBjb21wcmVoZW5zaXZlIHVuaXQgdGVzdHMgZm9yIHRoZSBmb2xsb3dpbmcgY29kZTonLFxuICAgIG9wdGltaXplOiAnQW5hbHl6ZSB0aGUgZm9sbG93aW5nIGNvZGUvY29uZmlndXJhdGlvbiBhbmQgc3VnZ2VzdCBvcHRpbWl6YXRpb24gaW1wcm92ZW1lbnRzOicsXG4gICAgaGVscDogJ1Byb3ZpZGUgZ3VpZGFuY2Ugb24gdGhlIGZvbGxvd2luZyBkZXZlbG9wbWVudCBxdWVzdGlvbjonLFxuICAgIGFzazogJ1Byb3ZpZGUgZ3VpZGFuY2Ugb24gdGhlIGZvbGxvd2luZyBkZXZlbG9wbWVudCBxdWVzdGlvbjonLFxuICAgIGFuYWx5emU6ICdBbmFseXplIHRoZSBmb2xsb3dpbmcgY29kZTonXG4gIH07XG5cbiAgY29uc3QgdGFza0luc3RydWN0aW9uID0gdGFza0luc3RydWN0aW9uc1t0YXNrXSB8fCB0YXNrSW5zdHJ1Y3Rpb25zLmhlbHA7XG5cbiAgbGV0IGZ1bGxQcm9tcHQgPSBgJHt0YXNrSW5zdHJ1Y3Rpb259XFxuXFxuJHtwcm9tcHR9YDtcblxuICBpZihwcm9qZWN0Q29udGV4dCkge1xuICAgIGZ1bGxQcm9tcHQgKz0gYFxcblxcbj09PUNPTlRFWFQ9PT1cXG4ke3Byb2plY3RDb250ZXh0fWA7XG4gIH1cblxuICByZXR1cm4gZnVsbFByb21wdDtcbn07XG5cbmNvbnN0IGRpc3BsYXlSZXNwb25zZSA9IChyZXNwb25zZTogYW55LCBvcHRpb25zOiBBSU9wdGlvbnMpOiB2b2lkID0+IHtcbiAgY29uc3Qge3Rhc2sgPSAnaGVscCcsIHF1aWV0ID0gZmFsc2V9ID0gb3B0aW9ucztcblxuICBsZXQgY29udGVudCA9ICcnO1xuXG4gIGlmKHR5cGVvZiByZXNwb25zZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb250ZW50ID0gcmVzcG9uc2U7XG4gIH0gZWxzZSBpZihyZXNwb25zZS5jaG9pY2VzPy5bMF0/Lm1lc3NhZ2U/LmNvbnRlbnQpIHtcbiAgICBjb250ZW50ID0gcmVzcG9uc2UuY2hvaWNlc1swXS5tZXNzYWdlLmNvbnRlbnQ7XG4gIH0gZWxzZSBpZihyZXNwb25zZS5jb250ZW50KSB7XG4gICAgY29udGVudCA9IHJlc3BvbnNlLmNvbnRlbnQ7XG4gIH0gZWxzZSB7XG4gICAgY29udGVudCA9ICdObyByZXNwb25zZSByZWNlaXZlZCBmcm9tIEFJIG1vZGVsJztcbiAgfVxuXG4gIGNvbnN0IGNsZWFuZWRDb250ZW50ID0gY2xlYW5SZXNwb25zZShjb250ZW50LCBvcHRpb25zKTtcblxuICBzd2l0Y2godGFzaykge1xuICAgIGNhc2UgJ2dlbmVyYXRlJzpcbiAgICAgIGxvZygnXFxuR2VuZXJhdGVkIENvZGU6XFxuJywgJ3N1Y2Nlc3MnLCBxdWlldCk7XG4gICAgICBsb2coY2xlYW5lZENvbnRlbnQsICdkZWZhdWx0JywgcXVpZXQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdleHBsYWluJzpcbiAgICAgIGxvZygnXFxuQ29kZSBFeHBsYW5hdGlvbjpcXG4nLCAnc3VjY2VzcycsIHF1aWV0KTtcbiAgICAgIGxvZyhjbGVhbmVkQ29udGVudCwgJ2RlZmF1bHQnLCBxdWlldCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3Rlc3QnOlxuICAgICAgbG9nKCdcXG5HZW5lcmF0ZWQgVGVzdHM6XFxuJywgJ3N1Y2Nlc3MnLCBxdWlldCk7XG4gICAgICBsb2coY2xlYW5lZENvbnRlbnQsICdkZWZhdWx0JywgcXVpZXQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdvcHRpbWl6ZSc6XG4gICAgICBsb2coJ1xcbk9wdGltaXphdGlvbiBTdWdnZXN0aW9uczpcXG4nLCAnc3VjY2VzcycsIHF1aWV0KTtcbiAgICAgIGxvZyhjbGVhbmVkQ29udGVudCwgJ2RlZmF1bHQnLCBxdWlldCk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBsb2coJ1xcbkFJIFJlc3BvbnNlOlxcbicsICdzdWNjZXNzJywgcXVpZXQpO1xuICAgICAgbG9nKGNsZWFuZWRDb250ZW50LCAnZGVmYXVsdCcsIHF1aWV0KTtcbiAgICAgIGJyZWFrO1xuICB9XG59O1xuXG5jb25zdCBjbGVhblJlc3BvbnNlID0gKGNvbnRlbnQ6IHN0cmluZywgb3B0aW9uczogQUlPcHRpb25zKTogc3RyaW5nID0+IHtcbiAgY29uc3Qge3Byb21wdCA9ICcnLCB0YXNrID0gJ2hlbHAnfSA9IG9wdGlvbnM7XG5cbiAgaWYoIWNvbnRlbnQpIHtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuXG4gIGxldCBjbGVhbmVkQ29udGVudCA9IGNvbnRlbnQ7XG5cbiAgY29uc3QgdGFza0luc3RydWN0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBnZW5lcmF0ZTogJ0dlbmVyYXRlIGNvZGUgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgcmVxdWVzdC4gTWFrZSBzdXJlIGl0IGZvbGxvd3MgYmVzdCBwcmFjdGljZXMgYW5kIGlzIHdlbGwgZG9jdW1lbnRlZDonLFxuICAgIGV4cGxhaW46ICdFeHBsYWluIHRoZSBmb2xsb3dpbmcgY29kZSBpbiBkZXRhaWwsIGluY2x1ZGluZyBhbnkgcGF0dGVybnMsIHBvdGVudGlhbCBpc3N1ZXMsIGFuZCBpbXByb3ZlbWVudCBzdWdnZXN0aW9uczonLFxuICAgIHRlc3Q6ICdHZW5lcmF0ZSBjb21wcmVoZW5zaXZlIHVuaXQgdGVzdHMgZm9yIHRoZSBmb2xsb3dpbmcgY29kZTonLFxuICAgIG9wdGltaXplOiAnQW5hbHl6ZSB0aGUgZm9sbG93aW5nIGNvZGUvY29uZmlndXJhdGlvbiBhbmQgc3VnZ2VzdCBvcHRpbWl6YXRpb24gaW1wcm92ZW1lbnRzOicsXG4gICAgaGVscDogJ1Byb3ZpZGUgZ3VpZGFuY2Ugb24gdGhlIGZvbGxvd2luZyBkZXZlbG9wbWVudCBxdWVzdGlvbjonLFxuICAgIGFzazogJ1Byb3ZpZGUgZ3VpZGFuY2Ugb24gdGhlIGZvbGxvd2luZyBkZXZlbG9wbWVudCBxdWVzdGlvbjonLFxuICAgIGFuYWx5emU6ICdBbmFseXplIHRoZSBmb2xsb3dpbmcgY29kZTonXG4gIH07XG5cbiAgY29uc3QgaW5zdHJ1Y3Rpb24gPSB0YXNrSW5zdHJ1Y3Rpb25zW3Rhc2tdIHx8ICcnO1xuXG4gIGlmKGluc3RydWN0aW9uICYmIGNsZWFuZWRDb250ZW50LmluY2x1ZGVzKGluc3RydWN0aW9uKSkge1xuICAgIGNsZWFuZWRDb250ZW50ID0gY2xlYW5lZENvbnRlbnQucmVwbGFjZShpbnN0cnVjdGlvbiwgJycpLnRyaW0oKTtcbiAgfVxuXG4gIGlmKHByb21wdCAmJiBjbGVhbmVkQ29udGVudC5pbmNsdWRlcyhwcm9tcHQpKSB7XG4gICAgY2xlYW5lZENvbnRlbnQgPSBjbGVhbmVkQ29udGVudC5yZXBsYWNlKHByb21wdCwgJycpLnRyaW0oKTtcbiAgfVxuXG4gIGlmKGNsZWFuZWRDb250ZW50LmluY2x1ZGVzKCc9PT1DT05URVhUPT09JykpIHtcbiAgICBjbGVhbmVkQ29udGVudCA9IGNsZWFuZWRDb250ZW50LnNwbGl0KCc9PT1DT05URVhUPT09JylbMF0udHJpbSgpO1xuICB9XG5cbiAgaWYoIWNsZWFuZWRDb250ZW50KSB7XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cblxuICByZXR1cm4gY2xlYW5lZENvbnRlbnQ7XG59O1xuXG5jb25zdCBnZXRQcm92aWRlckF1dGggPSAocHJvdmlkZXI6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmKHByb2Nlc3MuY3dkKCkuaW5jbHVkZXMoJ3JlYWt0b3InKSkge1xuICAgIHJldHVybiAnY3Vyc29yLWF1dGgnO1xuICB9XG5cbiAgaWYocHJvY2Vzcy5lbnYuQUlfQVBJX0tFWSkge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5BSV9BUElfS0VZO1xuICB9XG5cbiAgaWYocHJvdmlkZXIgPT09ICdub25lJyAmJiBwcm9jZXNzLmVudi5DVVJTT1JfSURFID09PSAndHJ1ZScpIHtcbiAgICByZXR1cm4gJ2N1cnNvci1hdXRoJztcbiAgfVxuXG4gIHN3aXRjaChwcm92aWRlcikge1xuICAgIGNhc2UgJ29wZW5haSc6XG4gICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuT1BFTkFJX0FQSV9LRVk7XG4gICAgY2FzZSAnYW50aHJvcGljJzpcbiAgICAgIHJldHVybiBwcm9jZXNzLmVudi5BTlRIUk9QSUNfQVBJX0tFWTtcbiAgICBjYXNlICdjdXJzb3InOlxuICAgICAgcmV0dXJuICdjdXJzb3ItYXV0aCc7XG4gICAgY2FzZSAnY29waWxvdCc6XG4gICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOO1xuICAgIGNhc2UgJ25vbmUnOlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufTtcblxuY29uc3QgZGV0ZWN0Q3Vyc29ySURFID0gKCk6IGJvb2xlYW4gPT4ge1xuICBpZihwcm9jZXNzLmVudi5DVVJTT1JfSURFID09PSAndHJ1ZScpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IHBvc3NpYmxlQ3Vyc29yU2lnbmFscyA9IFtcbiAgICBwcm9jZXNzLmVudi5DVVJTT1JfRVhURU5TSU9OID09PSAndHJ1ZScsXG4gICAgcHJvY2Vzcy5lbnYuQ1VSU09SX1RFUk1JTkFMID09PSAndHJ1ZScsXG4gICAgcHJvY2Vzcy5lbnYuQ1VSU09SX0FQUCA9PT0gJ3RydWUnLFxuICAgIHByb2Nlc3MuZW52LlBBVEg/LmluY2x1ZGVzKCdjdXJzb3InKSxcbiAgICAhIXByb2Nlc3MuZW52LkNVUlNPUl9TRVNTSU9OX0lEXG4gIF07XG5cbiAgY29uc3QgaXNDdXJzb3JJREUgPSBwb3NzaWJsZUN1cnNvclNpZ25hbHMuc29tZSgoc2lnbmFsKSA9PiBzaWduYWwpO1xuXG4gIGlmKGlzQ3Vyc29ySURFKSB7XG4gICAgcHJvY2Vzcy5lbnYuQ1VSU09SX0lERSA9ICd0cnVlJztcbiAgfVxuXG4gIHJldHVybiBpc0N1cnNvcklERTtcbn07XG5cbmV4cG9ydCBjb25zdCBhaUZ1bmN0aW9uID0gYXN5bmMgKG9wdGlvbnM6IEFJT3B0aW9ucyk6IFByb21pc2U8YW55PiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29uZmlnID0gTGV4Q29uZmlnLmNvbmZpZyB8fCB7fTtcbiAgICBjb25zdCBhaUNvbmZpZyA9IGNvbmZpZy5haSB8fCB7fTtcbiAgICBjb25zdCBwcm92aWRlciA9IG9wdGlvbnMucHJvdmlkZXIgfHwgYWlDb25maWcucHJvdmlkZXIgfHwgJ25vbmUnO1xuXG4gICAgaWYocHJvdmlkZXIgPT09ICdub25lJyAmJiAhcHJvY2Vzcy5lbnYuQ1VSU09SX0VYVEVOU0lPTikge1xuICAgICAgbG9nKGAke2NoYWxrLnJlZCgnRXJyb3I6Jyl9IE5vIEFJIHByb3ZpZGVyIGNvbmZpZ3VyZWQuYCwgJ2Vycm9yJyk7XG4gICAgICByZXR1cm4ge2Vycm9yOiAnTm8gQUkgcHJvdmlkZXIgY29uZmlndXJlZCd9O1xuICAgIH1cblxuICAgIGNvbnN0IHRhc2sgPSBvcHRpb25zLnRhc2sgfHwgJ2Fzayc7XG4gICAgY29uc3QgdmFsaWRUYXNrcyA9IFsnZXhwbGFpbicsICdnZW5lcmF0ZScsICd0ZXN0JywgJ2FuYWx5emUnLCAnYXNrJ107XG5cbiAgICBpZighdmFsaWRUYXNrcy5pbmNsdWRlcyh0YXNrKSkge1xuICAgICAgbG9nKGAke2NoYWxrLnJlZCgnRXJyb3I6Jyl9IEludmFsaWQgdGFzayBcIiR7dGFza31cIi4gVmFsaWQgdGFza3MgYXJlOiAke3ZhbGlkVGFza3Muam9pbignLCAnKX1gLCAnZXJyb3InKTtcbiAgICAgIHJldHVybiB7ZXJyb3I6IGBJbnZhbGlkIHRhc2sgXCIke3Rhc2t9XCJgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7cHJvbXB0fSA9IG9wdGlvbnM7XG5cbiAgICBpZighcHJvbXB0KSB7XG4gICAgICBsb2coYCR7Y2hhbGsucmVkKCdFcnJvcjonKX0gTm8gcHJvbXB0IHByb3ZpZGVkLiBVc2UgLS1wcm9tcHQgXCJZb3VyIHByb21wdCBoZXJlXCJgLCAnZXJyb3InKTtcbiAgICAgIHJldHVybiB7ZXJyb3I6ICdObyBwcm9tcHQgcHJvdmlkZWQnfTtcbiAgICB9XG5cbiAgICBsZXQgY29udGV4dCA9ICcnO1xuXG4gICAgaWYob3B0aW9ucy5maWxlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBmcyA9IGF3YWl0IGltcG9ydCgnZnMvcHJvbWlzZXMnKTtcbiAgICAgICAgY29uc3QgZ2xvYiA9IGF3YWl0IGltcG9ydCgnZ2xvYicpO1xuICAgICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGdsb2IuZ2xvYihvcHRpb25zLmZpbGUpO1xuXG4gICAgICAgIGlmKGZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGxvZyhgJHtjaGFsay55ZWxsb3coJ1dhcm5pbmc6Jyl9IE5vIGZpbGVzIGZvdW5kIG1hdGNoaW5nIFwiJHtvcHRpb25zLmZpbGV9XCJgLCAnd2FybmluZycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvcihjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZSwgJ3V0ZjgnKTtcbiAgICAgICAgICAgIGNvbnRleHQgKz0gYFxcbj09PUZJTEU6ICR7ZmlsZX09PT1cXG4ke2NvbnRlbnR9XFxuYDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgbG9nKGAke2NoYWxrLnllbGxvdygnV2FybmluZzonKX0gRXJyb3IgcmVhZGluZyBmaWxlOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ3dhcm5pbmcnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZihvcHRpb25zLmRpcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qge2V4ZWNhU3luY30gPSBhd2FpdCBpbXBvcnQoJ2V4ZWNhJyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGV4ZWNhU3luYygnZmluZCcsIFtvcHRpb25zLmRpciwgJy10eXBlJywgJ2YnLCAnfCcsICdzb3J0J10pO1xuICAgICAgICBjb250ZXh0ICs9IGBcXG49PT1Qcm9qZWN0IHN0cnVjdHVyZTo9PT1cXG4ke3Jlc3VsdC5zdGRvdXR9XFxuYDtcbiAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgbG9nKGAke2NoYWxrLnllbGxvdygnV2FybmluZzonKX0gRXJyb3IgcmVhZGluZyBkaXJlY3Rvcnk6ICR7ZXJyb3IubWVzc2FnZX1gLCAnd2FybmluZycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBmb3JtYXR0ZWRQcm9tcHQgPSAnJztcblxuICAgIHN3aXRjaCh0YXNrKSB7XG4gICAgICBjYXNlICdleHBsYWluJzpcbiAgICAgICAgZm9ybWF0dGVkUHJvbXB0ID0gYEV4cGxhaW4gdGhlIGZvbGxvd2luZyBjb2RlOlxcbiR7cHJvbXB0fWA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZ2VuZXJhdGUnOlxuICAgICAgICBmb3JtYXR0ZWRQcm9tcHQgPSBgR2VuZXJhdGUgY29kZSBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyByZXF1ZXN0OlxcbiR7cHJvbXB0fWA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGVzdCc6XG4gICAgICAgIGZvcm1hdHRlZFByb21wdCA9IGBHZW5lcmF0ZSBjb21wcmVoZW5zaXZlIHVuaXQgdGVzdHM6XFxuJHtwcm9tcHR9YDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhbmFseXplJzpcbiAgICAgICAgZm9ybWF0dGVkUHJvbXB0ID0gYEFuYWx5emUgdGhlIGZvbGxvd2luZyBjb2RlOlxcbiR7cHJvbXB0fWA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYXNrJzpcbiAgICAgICAgZm9ybWF0dGVkUHJvbXB0ID0gYFByb3ZpZGUgZ3VpZGFuY2Ugb24gdGhlIGZvbGxvd2luZyBkZXZlbG9wbWVudCBxdWVzdGlvbjpcXG4ke3Byb21wdH1gO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZihjb250ZXh0KSB7XG4gICAgICBmb3JtYXR0ZWRQcm9tcHQgKz0gYFxcbj09PUNPTlRFWFQ9PT1cXG4ke2NvbnRleHR9YDtcbiAgICB9XG5cbiAgICBpZigocHJvdmlkZXIgPT09ICdjdXJzb3InIHx8IHByb2Nlc3MuZW52LkNVUlNPUl9FWFRFTlNJT04pICYmIHRhc2sgPT09ICdnZW5lcmF0ZScpIHtcbiAgICAgIGxvZygnVXNpbmcgQ3Vyc29yIElERSBmb3IgY29kZSBnZW5lcmF0aW9uLi4uJywgJ2luZm8nKTtcbiAgICAgIGxvZygnTm90ZTogRm9yIGZ1bGwgY29kZSBnZW5lcmF0aW9uIGNhcGFiaWxpdGllcywgcGxlYXNlIHVzZSBDdXJzb3IgSURFIGRpcmVjdGx5IHdpdGggQ21kK0wgb3IgQ21kK0suJywgJ2luZm8nKTtcbiAgICAgIGxvZygnVGhlIENMSSBpbnRlZ3JhdGlvbiBoYXMgbGltaXRlZCBjYXBhYmlsaXRpZXMgZm9yIGNvZGUgZ2VuZXJhdGlvbi4nLCAnd2FybmluZycpO1xuICAgIH0gZWxzZSBpZihwcm92aWRlciA9PT0gJ2N1cnNvcicgfHwgcHJvY2Vzcy5lbnYuQ1VSU09SX0VYVEVOU0lPTikge1xuICAgICAgbG9nKCdVc2luZyBDdXJzb3IgSURFIGZvciBBSSBhc3Npc3RhbmNlLi4uJywgJ2luZm8nKTtcbiAgICAgIGxvZygnTm90ZTogVGhpcyBpcyBhIGxpbWl0ZWQgaW50ZWdyYXRpb24uIEZvciBmdWxsIEFJIGNhcGFiaWxpdGllcywgdXNlIEN1cnNvciBJREUgZGlyZWN0bHkuJywgJ2luZm8nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nKGBVc2luZyAke3Byb3ZpZGVyfSBmb3IgQUkgYXNzaXN0YW5jZS4uLmAsICdpbmZvJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjYWxsQUlTZXJ2aWNlKGZvcm1hdHRlZFByb21wdCwgb3B0aW9ucy5xdWlldCB8fCBmYWxzZSk7XG5cbiAgICBsb2coYFxcbiR7cmVzcG9uc2V9YCwgJ3N1Y2Nlc3MnKTtcblxuICAgIHJldHVybiB7cmVzcG9uc2V9O1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nKGAke2NoYWxrLnJlZCgnRXJyb3I6Jyl9ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InKTtcbiAgICByZXR1cm4ge2Vycm9yOiBlcnJvci5tZXNzYWdlfTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGFpID0gbmV3IENvbW1hbmQoJ2FpJylcbiAgLmRlc2NyaXB0aW9uKCdVc2UgQUkgdG8gaGVscCB3aXRoIGRldmVsb3BtZW50IHRhc2tzJylcbiAgLm9wdGlvbignLS1wcm92aWRlciA8cHJvdmlkZXI+JywgJ0FJIHByb3ZpZGVyIHRvIHVzZSAob3BlbmFpLCBhbnRocm9waWMsIGN1cnNvciknKVxuICAub3B0aW9uKCctLXRhc2sgPHRhc2s+JywgJ1Rhc2sgdG8gcGVyZm9ybSAoZXhwbGFpbiwgZ2VuZXJhdGUsIHRlc3QsIGFuYWx5emUsIGFzayknKVxuICAub3B0aW9uKCctLXByb21wdCA8cHJvbXB0PicsICdQcm9tcHQgdG8gc2VuZCB0byBBSScpXG4gIC5vcHRpb24oJy0tZmlsZSA8ZmlsZT4nLCAnRmlsZSB0byBhbmFseXplJylcbiAgLm9wdGlvbignLS1kaXIgPGRpcj4nLCAnRGlyZWN0b3J5IHRvIGFuYWx5emUnKVxuICAuYWN0aW9uKGFzeW5jIChvcHRpb25zOiBBSU9wdGlvbnMpID0+IHtcbiAgICBhd2FpdCBhaUZ1bmN0aW9uKG9wdGlvbnMpO1xuICB9KTtcblxuZXhwb3J0IGRlZmF1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
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Copyright (c) 2018-Present, Nitrogen Labs, Inc.
3
+ * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
+ */
5
+ import ai, { type AIOptions } from './ai.js';
6
+ export { ai };
7
+ export type { AIOptions };
8
+ export default ai;
@@ -0,0 +1,7 @@
1
+ import ai from "./ai.js";
2
+ var ai_default = ai;
3
+ export {
4
+ ai,
5
+ ai_default as default
6
+ };
7
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2FpL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IGFpLCB7dHlwZSBBSU9wdGlvbnN9IGZyb20gJy4vYWkuanMnO1xuXG5leHBvcnQge2FpfTtcbmV4cG9ydCB0eXBlIHtBSU9wdGlvbnN9O1xuZXhwb3J0IGRlZmF1bHQgYWk7Il0sCiAgIm1hcHBpbmdzIjogIkFBSUEsT0FBTyxRQUEwQjtBQUlqQyxJQUFPLGFBQVE7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Test file for build CLI argument generation
3
+ * This test focuses on CLI argument logic without importing problematic modules
4
+ */
5
+ export {};
@@ -0,0 +1,18 @@
1
+ export interface BuildOptions {
2
+ readonly assist?: boolean;
3
+ readonly analyze?: boolean;
4
+ readonly bundler?: 'webpack' | 'esbuild';
5
+ readonly cliName?: string;
6
+ readonly format?: string;
7
+ readonly outputPath?: string;
8
+ readonly quiet?: boolean;
9
+ readonly remove?: boolean;
10
+ readonly sourcePath?: string;
11
+ readonly variables?: string;
12
+ readonly watch?: boolean;
13
+ }
14
+ export type BuildCallback = (status: number) => void;
15
+ export declare const buildWithEsBuild: (spinner: any, commandOptions: BuildOptions, callback: BuildCallback) => Promise<0 | 1>;
16
+ export declare const buildWithWebpack: (spinner: any, cmd: any, callback: any) => Promise<0 | 1>;
17
+ export declare const build: (cmd: BuildOptions, callback?: BuildCallback) => Promise<number>;
18
+ export default build;
@@ -0,0 +1 @@
1
+ export {};