@nlabs/lex 1.48.7 → 1.49.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 (105) hide show
  1. package/.storybook/main.ts +9 -2
  2. package/.vscode/settings.json +1 -6
  3. package/README.md +249 -0
  4. package/eslint.config.mjs +24 -0
  5. package/examples/lex.config.js +18 -8
  6. package/examples/serverless-example/README.md +109 -0
  7. package/examples/serverless-example/dist/handlers/echo.js +15 -0
  8. package/examples/serverless-example/dist/handlers/graphql.js +137 -0
  9. package/examples/serverless-example/dist/handlers/hello.js +15 -0
  10. package/examples/serverless-example/dist/handlers/test.js +17 -0
  11. package/examples/serverless-example/dist/handlers/websocket.js +14 -0
  12. package/examples/serverless-example/lex.config.mjs +74 -0
  13. package/jest.config.mjs +13 -12
  14. package/{dist → lib}/LexConfig.d.ts +7 -6
  15. package/lib/LexConfig.js +268 -0
  16. package/lib/commands/ai/ai.js +303 -0
  17. package/{dist → lib}/commands/build/build.d.ts +3 -0
  18. package/lib/commands/build/build.js +494 -0
  19. package/{dist → lib}/commands/clean/clean.js +1 -1
  20. package/lib/commands/compile/compile.js +241 -0
  21. package/lib/commands/copy/copy.js +38 -0
  22. package/{dist → lib}/commands/create/create.js +1 -1
  23. package/{dist → lib}/commands/dev/dev.d.ts +2 -0
  24. package/lib/commands/dev/dev.js +286 -0
  25. package/{dist → lib}/commands/init/init.js +1 -1
  26. package/lib/commands/lint/lint.js +993 -0
  27. package/{dist → lib}/commands/migrate/migrate.js +1 -1
  28. package/lib/commands/publish/publish.js +104 -0
  29. package/lib/commands/serverless/serverless.d.ts +17 -0
  30. package/lib/commands/serverless/serverless.js +662 -0
  31. package/lib/commands/storybook/storybook.js +249 -0
  32. package/lib/commands/test/test.js +428 -0
  33. package/lib/commands/update/update.js +128 -0
  34. package/{dist → lib}/create/changelog.js +1 -1
  35. package/{dist → lib}/index.d.ts +1 -0
  36. package/{dist → lib}/index.js +2 -1
  37. package/lib/lex.js +73 -0
  38. package/lib/utils/aiService.d.ts +9 -0
  39. package/lib/utils/aiService.js +299 -0
  40. package/{dist → lib}/utils/app.d.ts +3 -0
  41. package/lib/utils/app.js +296 -0
  42. package/{dist → lib}/utils/file.d.ts +7 -3
  43. package/lib/utils/file.js +229 -0
  44. package/lib/utils/translations.d.ts +1 -0
  45. package/lib/utils/translations.js +74 -0
  46. package/package.json +59 -53
  47. package/postcss.config.js +5 -3
  48. package/tsconfig.build.json +2 -2
  49. package/webpack.config.js +229 -39
  50. package/dist/LexConfig.js +0 -287
  51. package/dist/commands/ai/ai.js +0 -303
  52. package/dist/commands/build/build.js +0 -404
  53. package/dist/commands/compile/compile.js +0 -234
  54. package/dist/commands/copy/copy.js +0 -38
  55. package/dist/commands/dev/dev.js +0 -74
  56. package/dist/commands/lint/lint.js +0 -993
  57. package/dist/commands/publish/publish.js +0 -104
  58. package/dist/commands/storybook/storybook.js +0 -249
  59. package/dist/commands/test/test.js +0 -429
  60. package/dist/commands/update/update.js +0 -132
  61. package/dist/lex.js +0 -70
  62. package/dist/utils/aiService.d.ts +0 -9
  63. package/dist/utils/aiService.js +0 -299
  64. package/dist/utils/app.js +0 -267
  65. package/dist/utils/file.js +0 -185
  66. package/emptyModule.js +0 -0
  67. package/eslint.config.js +0 -3
  68. /package/{dist → lib}/Button.stories.d.ts +0 -0
  69. /package/{dist → lib}/commands/ai/ai.d.ts +0 -0
  70. /package/{dist → lib}/commands/ai/index.d.ts +0 -0
  71. /package/{dist → lib}/commands/ai/index.js +0 -0
  72. /package/{dist → lib}/commands/clean/clean.d.ts +0 -0
  73. /package/{dist → lib}/commands/compile/compile.d.ts +0 -0
  74. /package/{dist → lib}/commands/config/config.d.ts +0 -0
  75. /package/{dist → lib}/commands/config/config.js +0 -0
  76. /package/{dist → lib}/commands/copy/copy.d.ts +0 -0
  77. /package/{dist → lib}/commands/create/create.d.ts +0 -0
  78. /package/{dist → lib}/commands/init/init.d.ts +0 -0
  79. /package/{dist → lib}/commands/link/link.d.ts +0 -0
  80. /package/{dist → lib}/commands/link/link.js +0 -0
  81. /package/{dist → lib}/commands/lint/autofix.d.ts +0 -0
  82. /package/{dist → lib}/commands/lint/lint.d.ts +0 -0
  83. /package/{dist → lib}/commands/migrate/migrate.d.ts +0 -0
  84. /package/{dist → lib}/commands/publish/publish.d.ts +0 -0
  85. /package/{dist → lib}/commands/storybook/storybook.d.ts +0 -0
  86. /package/{dist → lib}/commands/test/test.d.ts +0 -0
  87. /package/{dist → lib}/commands/update/update.d.ts +0 -0
  88. /package/{dist → lib}/commands/upgrade/upgrade.d.ts +0 -0
  89. /package/{dist → lib}/commands/upgrade/upgrade.js +0 -0
  90. /package/{dist → lib}/commands/versions/versions.d.ts +0 -0
  91. /package/{dist → lib}/commands/versions/versions.js +0 -0
  92. /package/{dist → lib}/create/changelog.d.ts +0 -0
  93. /package/{dist → lib}/lex.d.ts +0 -0
  94. /package/{dist → lib}/storybook/index.d.ts +0 -0
  95. /package/{dist → lib}/storybook/index.js +0 -0
  96. /package/{dist → lib}/test-react/index.d.ts +0 -0
  97. /package/{dist → lib}/test-react/index.js +0 -0
  98. /package/{dist → lib}/types.d.ts +0 -0
  99. /package/{dist → lib}/types.js +0 -0
  100. /package/{dist → lib}/utils/deepMerge.d.ts +0 -0
  101. /package/{dist → lib}/utils/deepMerge.js +0 -0
  102. /package/{dist → lib}/utils/log.d.ts +0 -0
  103. /package/{dist → lib}/utils/log.js +0 -0
  104. /package/{dist → lib}/utils/reactShim.d.ts +0 -0
  105. /package/{dist → lib}/utils/reactShim.js +0 -0
@@ -0,0 +1,17 @@
1
+ export const handler = async (event, context) => {
2
+ console.log('Test handler called');
3
+ console.log('Event:', event);
4
+
5
+ return {
6
+ statusCode: 200,
7
+ headers: {
8
+ 'Content-Type': 'application/json'
9
+ },
10
+ body: JSON.stringify({
11
+ message: 'Hello from test handler!',
12
+ data: {
13
+ test: true
14
+ }
15
+ })
16
+ };
17
+ };
@@ -0,0 +1,14 @@
1
+ export const handler = async (event, context) => {
2
+ const {routeKey, connectionId} = event.requestContext;
3
+
4
+ return {
5
+ statusCode: 200,
6
+ body: JSON.stringify({
7
+ message: 'WebSocket message received',
8
+ route: routeKey,
9
+ connectionId,
10
+ receivedData: event.body,
11
+ timestamp: new Date().toISOString()
12
+ })
13
+ };
14
+ };
@@ -0,0 +1,74 @@
1
+ export default {
2
+ outputFullPath: './dist',
3
+ serverless: {
4
+ custom: {
5
+ 'serverless-offline': {
6
+ cors: true,
7
+ host: 'localhost',
8
+ httpPort: 3000,
9
+ httpsPort: 3001,
10
+ wsPort: 3002
11
+ }
12
+ },
13
+ functions: {
14
+ echo: {
15
+ events: [
16
+ {
17
+ http: {
18
+ cors: true,
19
+ method: 'POST',
20
+ path: '/echo'
21
+ }
22
+ }
23
+ ],
24
+ handler: 'handlers/echo.js'
25
+ },
26
+ graphql: {
27
+ events: [
28
+ {
29
+ http: {
30
+ cors: true,
31
+ method: 'POST',
32
+ path: '/public'
33
+ }
34
+ }
35
+ ],
36
+ handler: 'handlers/graphql.js'
37
+ },
38
+ hello: {
39
+ events: [
40
+ {
41
+ http: {
42
+ cors: true,
43
+ method: 'GET',
44
+ path: '/hello'
45
+ }
46
+ }
47
+ ],
48
+ handler: 'handlers/hello.js'
49
+ },
50
+ test: {
51
+ events: [
52
+ {
53
+ http: {
54
+ cors: true,
55
+ method: 'GET',
56
+ path: '/test'
57
+ }
58
+ }
59
+ ],
60
+ handler: 'handlers/test.js'
61
+ },
62
+ websocket: {
63
+ events: [
64
+ {
65
+ websocket: {
66
+ route: '$default'
67
+ }
68
+ }
69
+ ],
70
+ handler: 'handlers/websocket.js'
71
+ }
72
+ }
73
+ }
74
+ };
package/jest.config.mjs CHANGED
@@ -2,22 +2,23 @@
2
2
  * Copyright (c) 2018-Present, Nitrogen Labs, Inc.
3
3
  * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
4
  */
5
- import {fileURLToPath} from 'url';
6
- import {dirname, resolve} from 'path';
7
- import {deepMerge} from './dist/utils/deepMerge.js';
8
-
9
5
  import {readFileSync} from 'fs';
6
+ import merge from 'lodash/merge.js';
7
+ import {dirname, resolve} from 'path';
8
+ import {fileURLToPath} from 'url';
10
9
 
11
- const __filename = fileURLToPath(import.meta.url);
12
- const __dirname = dirname(__filename);
13
- const pack = JSON.parse(readFileSync(resolve(__dirname, 'package.json'), 'utf8'));
10
+ const filename = fileURLToPath(import.meta.url);
11
+ const dirnamePath = dirname(filename);
12
+ const pack = JSON.parse(readFileSync(resolve(dirnamePath, 'package.json'), 'utf8'));
14
13
 
15
14
  let projectJestConfig = null;
15
+
16
16
  if(process.env.LEX_CONFIG) {
17
17
  try {
18
18
  const lexConfig = JSON.parse(process.env.LEX_CONFIG);
19
19
  projectJestConfig = lexConfig.jest;
20
- } catch(error) {
20
+ } catch (error) {
21
+ // eslint-disable-next-line no-console
21
22
  console.warn('Failed to parse LEX_CONFIG:', error.message);
22
23
  }
23
24
  }
@@ -36,19 +37,19 @@ const baseConfig = {
36
37
  displayName: pack.name,
37
38
  moduleFileExtensions: ['ts', 'tsx', 'js', 'json', 'node'],
38
39
  moduleNameMapper: {
39
- '^(\\.{1,2}/.*)\\.js$': '$1',
40
+ '^(\\.{1,2}/.*)\\.js$': '$1'
40
41
  },
41
42
  rootDir: process.cwd(),
42
43
  testEnvironment: 'node',
43
44
  testRegex: '(/__tests__/.*|\\.(test|spec|integration))\\.(ts|tsx)?$',
44
45
  transform: {
45
- '^.+\.js$|^.+\.jsx$': ['babel-jest', {
46
+ '^.+\\.js$|^.+\\.jsx$': ['babel-jest', {
46
47
  presets: [
47
48
  ['@babel/preset-env', {targets: {node: 'current'}}],
48
49
  '@babel/preset-typescript'
49
50
  ]
50
51
  }],
51
- '^.+\.ts$|^.+\.tsx$': ['babel-jest', {
52
+ '^.+\\.ts$|^.+\\.tsx$': ['babel-jest', {
52
53
  presets: [
53
54
  ['@babel/preset-env', {targets: {node: 'current'}}],
54
55
  '@babel/preset-typescript',
@@ -60,7 +61,7 @@ const baseConfig = {
60
61
  };
61
62
 
62
63
  const finalConfig = projectJestConfig && Object.keys(projectJestConfig).length > 0
63
- ? deepMerge(baseConfig, projectJestConfig)
64
+ ? merge(baseConfig, projectJestConfig)
64
65
  : baseConfig;
65
66
 
66
67
  export default finalConfig;
@@ -1,5 +1,6 @@
1
1
  import type { Linter } from 'eslint';
2
2
  export interface EsbuildConfig {
3
+ [key: string]: unknown;
3
4
  entryPoints?: string[];
4
5
  outdir?: string;
5
6
  platform?: 'node' | 'browser';
@@ -17,9 +18,9 @@ export interface EsbuildConfig {
17
18
  banner?: Record<string, string>;
18
19
  footer?: Record<string, string>;
19
20
  define?: Record<string, string>;
20
- [key: string]: unknown;
21
21
  }
22
22
  export interface JestConfig {
23
+ [key: string]: unknown;
23
24
  roots?: string[];
24
25
  testEnvironment?: string;
25
26
  transform?: Record<string, [string, Record<string, unknown>]>;
@@ -27,14 +28,14 @@ export interface JestConfig {
27
28
  moduleNameMapper?: Record<string, string>;
28
29
  extensionsToTreatAsEsm?: string[];
29
30
  preset?: string;
30
- [key: string]: unknown;
31
31
  }
32
32
  export interface WebpackConfig {
33
+ [key: string]: unknown;
33
34
  entry?: string | string[];
34
35
  output?: Record<string, unknown>;
35
36
  module?: Record<string, unknown>;
36
37
  plugins?: unknown[];
37
- [key: string]: unknown;
38
+ publicPath?: string;
38
39
  }
39
40
  export interface AIConfig {
40
41
  provider?: 'cursor' | 'copilot' | 'openai' | 'anthropic' | 'none';
@@ -44,9 +45,9 @@ export interface AIConfig {
44
45
  temperature?: number;
45
46
  }
46
47
  export interface ESLintConfig {
48
+ [key: string]: unknown;
47
49
  extends?: string[];
48
50
  rules?: Linter.RulesRecord;
49
- [key: string]: unknown;
50
51
  }
51
52
  export interface LexConfigType {
52
53
  ai?: AIConfig;
@@ -76,11 +77,11 @@ export interface LexConfigType {
76
77
  }
77
78
  export type Config = LexConfigType;
78
79
  export declare const defaultConfigValues: LexConfigType;
79
- export declare function getTypeScriptConfigPath(configName: string): string;
80
+ export declare const getTypeScriptConfigPath: (configName: string) => string;
80
81
  export declare class LexConfig {
81
82
  static config: LexConfigType;
82
- static getLexDir(): string;
83
83
  static set useTypescript(value: boolean);
84
+ static getLexDir(): string;
84
85
  static updateConfig(updatedConfig: LexConfigType): LexConfigType;
85
86
  static addConfigParams(cmd: any, params: LexConfigType): void;
86
87
  static parseConfig(cmd: any, isRoot?: boolean): Promise<void>;
@@ -0,0 +1,268 @@
1
+ import { existsSync, readFileSync, writeFileSync } from "fs";
2
+ import { dirname, extname as pathExtname, resolve as pathResolve } from "path";
3
+ import { URL } from "url";
4
+ import { getDirName, getLexPackageJsonPath, relativeFilePath } from "./utils/file.js";
5
+ import { log } from "./utils/log.js";
6
+ const cwd = process.cwd();
7
+ const defaultConfigValues = {
8
+ ai: {
9
+ maxTokens: 4e3,
10
+ model: "gpt-4o",
11
+ provider: "none",
12
+ temperature: 0.1
13
+ },
14
+ configFiles: [],
15
+ copyFiles: [],
16
+ entryHTML: "index.html",
17
+ entryJs: "index.js",
18
+ env: null,
19
+ esbuild: {
20
+ drop: ["console", "debugger"],
21
+ legalComments: "none",
22
+ metafile: false,
23
+ minify: true,
24
+ pure: ["console.log", "console.warn", "console.error"],
25
+ sourcemap: false,
26
+ splitting: true,
27
+ treeShaking: true
28
+ },
29
+ eslint: {},
30
+ jest: {},
31
+ outputFullPath: pathResolve(cwd, "./dist"),
32
+ outputHash: false,
33
+ outputPath: "./dist",
34
+ packageManager: "npm",
35
+ preset: "web",
36
+ sourceFullPath: pathResolve(cwd, "./src"),
37
+ sourcePath: "./src",
38
+ targetEnvironment: "web",
39
+ useGraphQl: false,
40
+ useTypescript: false,
41
+ webpack: {
42
+ publicPath: "./src/static"
43
+ }
44
+ };
45
+ const getTypeScriptConfigPath = (configName) => {
46
+ const cwd2 = process.cwd();
47
+ if (configName === "tsconfig.build.json") {
48
+ const projectBuildConfig = pathResolve(cwd2, "tsconfig.build.json");
49
+ if (existsSync(projectBuildConfig)) {
50
+ return projectBuildConfig;
51
+ }
52
+ }
53
+ if (configName === "tsconfig.lint.json") {
54
+ const projectLintConfig = pathResolve(cwd2, "tsconfig.eslint.json");
55
+ if (existsSync(projectLintConfig)) {
56
+ return projectLintConfig;
57
+ }
58
+ }
59
+ if (configName === "tsconfig.test.json") {
60
+ const projectTestConfig = pathResolve(cwd2, "tsconfig.test.json");
61
+ if (existsSync(projectTestConfig)) {
62
+ return projectTestConfig;
63
+ }
64
+ }
65
+ const projectConfigPath = pathResolve(cwd2, configName);
66
+ if (existsSync(projectConfigPath)) {
67
+ return projectConfigPath;
68
+ }
69
+ const lexDir = LexConfig.getLexDir();
70
+ return pathResolve(lexDir, configName);
71
+ };
72
+ class LexConfig {
73
+ static config = {
74
+ ...defaultConfigValues
75
+ };
76
+ static set useTypescript(value) {
77
+ LexConfig.config.useTypescript = value;
78
+ const { sourceFullPath } = LexConfig.config;
79
+ const { entryJs } = LexConfig.config;
80
+ if (entryJs === "index.js" && value) {
81
+ const indexPath = pathResolve(cwd, sourceFullPath, "index.tsx");
82
+ const hasIndexTsx = existsSync(indexPath);
83
+ if (hasIndexTsx) {
84
+ LexConfig.config.entryJs = "index.tsx";
85
+ } else {
86
+ LexConfig.config.entryJs = "index.ts";
87
+ }
88
+ }
89
+ }
90
+ static getLexDir() {
91
+ return dirname(getLexPackageJsonPath());
92
+ }
93
+ static updateConfig(updatedConfig) {
94
+ const { outputFullPath, outputPath, sourcePath, sourceFullPath, useTypescript, ai } = updatedConfig;
95
+ const cwd2 = process.cwd();
96
+ if (useTypescript !== void 0) {
97
+ LexConfig.useTypescript = useTypescript;
98
+ }
99
+ if (outputPath !== void 0 && outputFullPath === void 0) {
100
+ updatedConfig.outputFullPath = pathResolve(cwd2, outputPath);
101
+ }
102
+ if (sourcePath !== void 0 && sourceFullPath === void 0) {
103
+ updatedConfig.sourceFullPath = pathResolve(cwd2, sourcePath);
104
+ }
105
+ if (ai) {
106
+ LexConfig.config.ai = { ...LexConfig.config.ai, ...ai };
107
+ if (process.env.CURSOR_IDE === "true" && LexConfig.config.ai.provider === "none") {
108
+ LexConfig.config.ai.provider = "cursor";
109
+ }
110
+ }
111
+ LexConfig.config = { ...LexConfig.config, ...updatedConfig };
112
+ return LexConfig.config;
113
+ }
114
+ static addConfigParams(cmd, params) {
115
+ const nameProperty = "_name";
116
+ const { environment, outputPath, sourcePath, typescript } = cmd;
117
+ if (outputPath !== void 0) {
118
+ params.outputPath = outputPath;
119
+ params.outputFullPath = pathResolve(cwd, outputPath);
120
+ }
121
+ if (sourcePath !== void 0) {
122
+ params.sourcePath = sourcePath;
123
+ params.sourceFullPath = pathResolve(cwd, sourcePath);
124
+ }
125
+ if (typescript !== void 0) {
126
+ params.useTypescript = true;
127
+ }
128
+ if (environment !== void 0) {
129
+ params.targetEnvironment = environment === "web" ? "web" : "node";
130
+ }
131
+ process.env.LEX_CONFIG = JSON.stringify(
132
+ {
133
+ ...LexConfig.updateConfig(params),
134
+ commandName: cmd[nameProperty],
135
+ isStatic: cmd.static
136
+ },
137
+ null,
138
+ 0
139
+ );
140
+ }
141
+ static async parseConfig(cmd, isRoot = true) {
142
+ const { cliName = "Lex", lexConfig, lexConfigName, quiet, typescript, debug = false } = cmd;
143
+ const configFormats = ["js", "mjs", "cjs", "ts", "json"];
144
+ const configBaseName = lexConfigName || "lex.config";
145
+ let configPath = lexConfig || "";
146
+ let configExists = lexConfig ? existsSync(configPath) : false;
147
+ if (!configPath || !configExists) {
148
+ if (debug) {
149
+ log(`Searching for config files with base name: ${configBaseName}`, "info", quiet);
150
+ }
151
+ for (const format of configFormats) {
152
+ const potentialPath = isRoot ? pathResolve(cwd, `./${configBaseName}.${format}`) : relativeFilePath(`${configBaseName}.${format}`, cwd);
153
+ if (debug) {
154
+ log(`Checking for config file: ${potentialPath}`, "info", quiet);
155
+ }
156
+ if (existsSync(potentialPath)) {
157
+ configPath = potentialPath;
158
+ configExists = true;
159
+ break;
160
+ }
161
+ }
162
+ }
163
+ if (configExists) {
164
+ log(`Using ${cliName} configuration file: ${configPath}`, "note", quiet);
165
+ const ext = pathExtname(configPath);
166
+ if (ext === ".json") {
167
+ const configContent = readFileSync(configPath, "utf8");
168
+ if (configContent) {
169
+ let configJson;
170
+ try {
171
+ configJson = JSON.parse(configContent)?.default || {};
172
+ } catch (error) {
173
+ log(`
174
+ ${cliName} Error: Failed to parse JSON config: ${error.message}`, "error", quiet);
175
+ configJson = {};
176
+ }
177
+ LexConfig.addConfigParams(cmd, configJson);
178
+ } else {
179
+ log(`
180
+ ${cliName} Error: Config file malformed, ${configPath}`, "error", quiet);
181
+ }
182
+ } else if ([".js", ".mjs", ".cjs", ".ts"].includes(ext)) {
183
+ try {
184
+ let lexCustomConfig;
185
+ if (ext === ".cjs") {
186
+ const fileUrl = new URL(`file:///${pathResolve(configPath)}`).href;
187
+ if (debug) {
188
+ log(`Loading CommonJS config from: ${fileUrl}`, "info", quiet);
189
+ }
190
+ lexCustomConfig = await import(fileUrl);
191
+ } else {
192
+ if (debug) {
193
+ log(`Loading ESM/TS config from: ${configPath}`, "info", quiet);
194
+ }
195
+ lexCustomConfig = await import(configPath);
196
+ }
197
+ const config = lexCustomConfig.default || lexCustomConfig;
198
+ if (debug) {
199
+ log(`Loaded config: ${JSON.stringify(config, null, 2)}`, "info", quiet);
200
+ }
201
+ if (!config) {
202
+ log(`
203
+ ${cliName} Warning: Config file loaded but no configuration found`, "warn", quiet);
204
+ }
205
+ LexConfig.addConfigParams(cmd, config || {});
206
+ } catch (error) {
207
+ log(`
208
+ ${cliName} Error: Failed to load config file: ${error.message}`, "error", quiet);
209
+ if (debug) {
210
+ console.error(error);
211
+ }
212
+ }
213
+ } else {
214
+ log(`
215
+ ${cliName} Error: Config file must be a JS, CJS, MJS, TS, or JSON file.`, "error", quiet);
216
+ }
217
+ } else {
218
+ if (debug) {
219
+ log("No config file found. Using default configuration.", "info", quiet);
220
+ }
221
+ LexConfig.useTypescript = !!typescript;
222
+ LexConfig.addConfigParams(cmd, LexConfig.config);
223
+ }
224
+ }
225
+ static checkTypescriptConfig() {
226
+ const tsconfigPath = pathResolve(cwd, "./tsconfig.json");
227
+ if (!existsSync(tsconfigPath)) {
228
+ const dirName = getDirName();
229
+ writeFileSync(tsconfigPath, readFileSync(pathResolve(dirName, "../../../tsconfig.base.json")));
230
+ }
231
+ }
232
+ static checkCompileTypescriptConfig() {
233
+ const lexDir = LexConfig.getLexDir();
234
+ const tsconfigCompilePath = pathResolve(lexDir, "./tsconfig.build.json");
235
+ if (!existsSync(tsconfigCompilePath)) {
236
+ const templatePath = pathResolve(lexDir, "tsconfig.build.json");
237
+ if (existsSync(templatePath)) {
238
+ writeFileSync(tsconfigCompilePath, readFileSync(templatePath));
239
+ }
240
+ }
241
+ }
242
+ static checkLintTypescriptConfig() {
243
+ const lexDir = LexConfig.getLexDir();
244
+ const tsconfigLintPath = pathResolve(lexDir, "./tsconfig.lint.json");
245
+ if (!existsSync(tsconfigLintPath)) {
246
+ const templatePath = pathResolve(lexDir, "tsconfig.lint.json");
247
+ if (existsSync(templatePath)) {
248
+ writeFileSync(tsconfigLintPath, readFileSync(templatePath));
249
+ }
250
+ }
251
+ }
252
+ static checkTestTypescriptConfig() {
253
+ const lexDir = LexConfig.getLexDir();
254
+ const tsconfigTestPath = pathResolve(lexDir, "./tsconfig.test.json");
255
+ if (!existsSync(tsconfigTestPath)) {
256
+ const templatePath = pathResolve(lexDir, "tsconfig.test.json");
257
+ if (existsSync(templatePath)) {
258
+ writeFileSync(tsconfigTestPath, readFileSync(templatePath));
259
+ }
260
+ }
261
+ }
262
+ }
263
+ export {
264
+ LexConfig,
265
+ defaultConfigValues,
266
+ getTypeScriptConfigPath
267
+ };
268
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL0xleENvbmZpZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7ZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jLCB3cml0ZUZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge2Rpcm5hbWUsIGV4dG5hbWUgYXMgcGF0aEV4dG5hbWUsIHJlc29sdmUgYXMgcGF0aFJlc29sdmV9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtVUkx9IGZyb20gJ3VybCc7XG5cbmltcG9ydCB7Z2V0RGlyTmFtZSwgZ2V0TGV4UGFja2FnZUpzb25QYXRoLCByZWxhdGl2ZUZpbGVQYXRofSBmcm9tICcuL3V0aWxzL2ZpbGUuanMnO1xuaW1wb3J0IHtsb2d9IGZyb20gJy4vdXRpbHMvbG9nLmpzJztcblxuaW1wb3J0IHR5cGUge0xpbnRlcn0gZnJvbSAnZXNsaW50JztcblxuY29uc3QgY3dkOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVzYnVpbGRDb25maWcge1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xuICBlbnRyeVBvaW50cz86IHN0cmluZ1tdO1xuICBvdXRkaXI/OiBzdHJpbmc7XG4gIHBsYXRmb3JtPzogJ25vZGUnIHwgJ2Jyb3dzZXInO1xuICB0YXJnZXQ/OiBzdHJpbmc7XG4gIGZvcm1hdD86ICdjanMnIHwgJ2VzbSc7XG4gIG1pbmlmeT86IGJvb2xlYW47XG4gIHRyZWVTaGFraW5nPzogYm9vbGVhbjtcbiAgZHJvcD86IHN0cmluZ1tdO1xuICBwdXJlPzogc3RyaW5nW107XG4gIGV4dGVybmFsPzogc3RyaW5nW107XG4gIHNwbGl0dGluZz86IGJvb2xlYW47XG4gIG1ldGFmaWxlPzogYm9vbGVhbjtcbiAgc291cmNlbWFwPzogYm9vbGVhbiB8ICdpbmxpbmUnIHwgJ2V4dGVybmFsJztcbiAgbGVnYWxDb21tZW50cz86ICdub25lJyB8ICdpbmxpbmUnIHwgJ2VvZicgfCAnbGlua2VkJyB8ICdzZXBhcmF0ZSc7XG4gIGJhbm5lcj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGZvb3Rlcj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGRlZmluZT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSmVzdENvbmZpZyB7XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG4gIHJvb3RzPzogc3RyaW5nW107XG4gIHRlc3RFbnZpcm9ubWVudD86IHN0cmluZztcbiAgdHJhbnNmb3JtPzogUmVjb3JkPHN0cmluZywgW3N0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj5dPjtcbiAgdHJhbnNmb3JtSWdub3JlUGF0dGVybnM/OiBzdHJpbmdbXTtcbiAgbW9kdWxlTmFtZU1hcHBlcj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGV4dGVuc2lvbnNUb1RyZWF0QXNFc20/OiBzdHJpbmdbXTtcbiAgcHJlc2V0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdlYnBhY2tDb25maWcge1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xuICBlbnRyeT86IHN0cmluZyB8IHN0cmluZ1tdO1xuICBvdXRwdXQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgbW9kdWxlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHBsdWdpbnM/OiB1bmtub3duW107XG4gIHB1YmxpY1BhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQUlDb25maWcge1xuICBwcm92aWRlcj86ICdjdXJzb3InIHwgJ2NvcGlsb3QnIHwgJ29wZW5haScgfCAnYW50aHJvcGljJyB8ICdub25lJztcbiAgYXBpS2V5Pzogc3RyaW5nO1xuICBtb2RlbD86IHN0cmluZztcbiAgbWF4VG9rZW5zPzogbnVtYmVyO1xuICB0ZW1wZXJhdHVyZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFU0xpbnRDb25maWcge1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xuICBleHRlbmRzPzogc3RyaW5nW107XG4gIHJ1bGVzPzogTGludGVyLlJ1bGVzUmVjb3JkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExleENvbmZpZ1R5cGUge1xuICBhaT86IEFJQ29uZmlnO1xuICBjb25maWdGaWxlcz86IHN0cmluZ1tdO1xuICBjb3B5RmlsZXM/OiBzdHJpbmdbXTtcbiAgZW50cnlIVE1MPzogc3RyaW5nO1xuICBlbnRyeUpzPzogc3RyaW5nO1xuICBlbnY/OiBvYmplY3Q7XG4gIGVzYnVpbGQ/OiBFc2J1aWxkQ29uZmlnO1xuICBlc2xpbnQ/OiBFU0xpbnRDb25maWc7XG4gIGdpdFVybD86IHN0cmluZztcbiAgamVzdD86IEplc3RDb25maWc7XG4gIGxpYnJhcnlOYW1lPzogc3RyaW5nO1xuICBsaWJyYXJ5VGFyZ2V0Pzogc3RyaW5nO1xuICBvdXRwdXRGaWxlPzogc3RyaW5nO1xuICBvdXRwdXRGdWxsUGF0aD86IHN0cmluZztcbiAgb3V0cHV0SGFzaD86IGJvb2xlYW47XG4gIG91dHB1dFBhdGg/OiBzdHJpbmc7XG4gIHBhY2thZ2VNYW5hZ2VyPzogJ25wbScgfCAneWFybic7XG4gIHByZXNldD86ICd3ZWInIHwgJ25vZGUnIHwgJ2xhbWJkYScgfCAnbW9iaWxlJztcbiAgc291cmNlRnVsbFBhdGg/OiBzdHJpbmc7XG4gIHNvdXJjZVBhdGg/OiBzdHJpbmc7XG4gIHRhcmdldEVudmlyb25tZW50PzogJ25vZGUnIHwgJ3dlYic7XG4gIHVzZUdyYXBoUWw/OiBib29sZWFuO1xuICB1c2VUeXBlc2NyaXB0PzogYm9vbGVhbjtcbiAgd2VicGFjaz86IFdlYnBhY2tDb25maWc7XG59XG5cbmV4cG9ydCB0eXBlIENvbmZpZyA9IExleENvbmZpZ1R5cGU7XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0Q29uZmlnVmFsdWVzOiBMZXhDb25maWdUeXBlID0ge1xuICBhaToge1xuICAgIG1heFRva2VuczogNDAwMCxcbiAgICBtb2RlbDogJ2dwdC00bycsXG4gICAgcHJvdmlkZXI6ICdub25lJyxcbiAgICB0ZW1wZXJhdHVyZTogMC4xXG4gIH0sXG4gIGNvbmZpZ0ZpbGVzOiBbXSxcbiAgY29weUZpbGVzOiBbXSxcbiAgZW50cnlIVE1MOiAnaW5kZXguaHRtbCcsXG4gIGVudHJ5SnM6ICdpbmRleC5qcycsXG4gIGVudjogbnVsbCxcbiAgZXNidWlsZDoge1xuICAgIGRyb3A6IFsnY29uc29sZScsICdkZWJ1Z2dlciddLFxuICAgIGxlZ2FsQ29tbWVudHM6ICdub25lJyxcbiAgICBtZXRhZmlsZTogZmFsc2UsXG4gICAgbWluaWZ5OiB0cnVlLFxuICAgIHB1cmU6IFsnY29uc29sZS5sb2cnLCAnY29uc29sZS53YXJuJywgJ2NvbnNvbGUuZXJyb3InXSxcbiAgICBzb3VyY2VtYXA6IGZhbHNlLFxuICAgIHNwbGl0dGluZzogdHJ1ZSxcbiAgICB0cmVlU2hha2luZzogdHJ1ZVxuICB9LFxuICBlc2xpbnQ6IHt9LFxuICBqZXN0OiB7fSxcbiAgb3V0cHV0RnVsbFBhdGg6IHBhdGhSZXNvbHZlKGN3ZCwgJy4vZGlzdCcpLFxuICBvdXRwdXRIYXNoOiBmYWxzZSxcbiAgb3V0cHV0UGF0aDogJy4vZGlzdCcsXG4gIHBhY2thZ2VNYW5hZ2VyOiAnbnBtJyxcbiAgcHJlc2V0OiAnd2ViJyxcbiAgc291cmNlRnVsbFBhdGg6IHBhdGhSZXNvbHZlKGN3ZCwgJy4vc3JjJyksXG4gIHNvdXJjZVBhdGg6ICcuL3NyYycsXG4gIHRhcmdldEVudmlyb25tZW50OiAnd2ViJyxcbiAgdXNlR3JhcGhRbDogZmFsc2UsXG4gIHVzZVR5cGVzY3JpcHQ6IGZhbHNlLFxuICB3ZWJwYWNrOiB7XG4gICAgcHVibGljUGF0aDogJy4vc3JjL3N0YXRpYydcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldFR5cGVTY3JpcHRDb25maWdQYXRoID0gKGNvbmZpZ05hbWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgaWYoY29uZmlnTmFtZSA9PT0gJ3RzY29uZmlnLmJ1aWxkLmpzb24nKSB7XG4gICAgY29uc3QgcHJvamVjdEJ1aWxkQ29uZmlnID0gcGF0aFJlc29sdmUoY3dkLCAndHNjb25maWcuYnVpbGQuanNvbicpO1xuICAgIGlmKGV4aXN0c1N5bmMocHJvamVjdEJ1aWxkQ29uZmlnKSkge1xuICAgICAgcmV0dXJuIHByb2plY3RCdWlsZENvbmZpZztcbiAgICB9XG4gIH1cblxuICBpZihjb25maWdOYW1lID09PSAndHNjb25maWcubGludC5qc29uJykge1xuICAgIGNvbnN0IHByb2plY3RMaW50Q29uZmlnID0gcGF0aFJlc29sdmUoY3dkLCAndHNjb25maWcuZXNsaW50Lmpzb24nKTtcbiAgICBpZihleGlzdHNTeW5jKHByb2plY3RMaW50Q29uZmlnKSkge1xuICAgICAgcmV0dXJuIHByb2plY3RMaW50Q29uZmlnO1xuICAgIH1cbiAgfVxuXG4gIGlmKGNvbmZpZ05hbWUgPT09ICd0c2NvbmZpZy50ZXN0Lmpzb24nKSB7XG4gICAgY29uc3QgcHJvamVjdFRlc3RDb25maWcgPSBwYXRoUmVzb2x2ZShjd2QsICd0c2NvbmZpZy50ZXN0Lmpzb24nKTtcbiAgICBpZihleGlzdHNTeW5jKHByb2plY3RUZXN0Q29uZmlnKSkge1xuICAgICAgcmV0dXJuIHByb2plY3RUZXN0Q29uZmlnO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHByb2plY3RDb25maWdQYXRoID0gcGF0aFJlc29sdmUoY3dkLCBjb25maWdOYW1lKTtcbiAgaWYoZXhpc3RzU3luYyhwcm9qZWN0Q29uZmlnUGF0aCkpIHtcbiAgICByZXR1cm4gcHJvamVjdENvbmZpZ1BhdGg7XG4gIH1cblxuICBjb25zdCBsZXhEaXIgPSBMZXhDb25maWcuZ2V0TGV4RGlyKCk7XG4gIHJldHVybiBwYXRoUmVzb2x2ZShsZXhEaXIsIGNvbmZpZ05hbWUpO1xufTtcblxuZXhwb3J0IGNsYXNzIExleENvbmZpZyB7XG4gIHN0YXRpYyBjb25maWc6IExleENvbmZpZ1R5cGUgPSB7XG4gICAgLi4uZGVmYXVsdENvbmZpZ1ZhbHVlc1xuICB9O1xuXG4gIHN0YXRpYyBzZXQgdXNlVHlwZXNjcmlwdCh2YWx1ZTogYm9vbGVhbikge1xuICAgIExleENvbmZpZy5jb25maWcudXNlVHlwZXNjcmlwdCA9IHZhbHVlO1xuICAgIGNvbnN0IHtzb3VyY2VGdWxsUGF0aH0gPSBMZXhDb25maWcuY29uZmlnO1xuXG4gICAgY29uc3Qge2VudHJ5SnN9ID0gTGV4Q29uZmlnLmNvbmZpZztcblxuICAgIGlmKGVudHJ5SnMgPT09ICdpbmRleC5qcycgJiYgdmFsdWUpIHtcbiAgICAgIGNvbnN0IGluZGV4UGF0aDogc3RyaW5nID0gcGF0aFJlc29sdmUoY3dkLCBzb3VyY2VGdWxsUGF0aCwgJ2luZGV4LnRzeCcpO1xuICAgICAgY29uc3QgaGFzSW5kZXhUc3g6IGJvb2xlYW4gPSBleGlzdHNTeW5jKGluZGV4UGF0aCk7XG5cbiAgICAgIGlmKGhhc0luZGV4VHN4KSB7XG4gICAgICAgIExleENvbmZpZy5jb25maWcuZW50cnlKcyA9ICdpbmRleC50c3gnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgTGV4Q29uZmlnLmNvbmZpZy5lbnRyeUpzID0gJ2luZGV4LnRzJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0TGV4RGlyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRpcm5hbWUoZ2V0TGV4UGFja2FnZUpzb25QYXRoKCkpO1xuICB9XG5cbiAgc3RhdGljIHVwZGF0ZUNvbmZpZyh1cGRhdGVkQ29uZmlnOiBMZXhDb25maWdUeXBlKTogTGV4Q29uZmlnVHlwZSB7XG4gICAgY29uc3Qge291dHB1dEZ1bGxQYXRoLCBvdXRwdXRQYXRoLCBzb3VyY2VQYXRoLCBzb3VyY2VGdWxsUGF0aCwgdXNlVHlwZXNjcmlwdCwgYWl9ID0gdXBkYXRlZENvbmZpZztcbiAgICBjb25zdCBjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgICBpZih1c2VUeXBlc2NyaXB0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIExleENvbmZpZy51c2VUeXBlc2NyaXB0ID0gdXNlVHlwZXNjcmlwdDtcbiAgICB9XG5cbiAgICBpZihvdXRwdXRQYXRoICE9PSB1bmRlZmluZWQgJiYgb3V0cHV0RnVsbFBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgdXBkYXRlZENvbmZpZy5vdXRwdXRGdWxsUGF0aCA9IHBhdGhSZXNvbHZlKGN3ZCwgb3V0cHV0UGF0aCk7XG4gICAgfVxuXG4gICAgaWYoc291cmNlUGF0aCAhPT0gdW5kZWZpbmVkICYmIHNvdXJjZUZ1bGxQYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHVwZGF0ZWRDb25maWcuc291cmNlRnVsbFBhdGggPSBwYXRoUmVzb2x2ZShjd2QsIHNvdXJjZVBhdGgpO1xuICAgIH1cblxuICAgIGlmKGFpKSB7XG4gICAgICBMZXhDb25maWcuY29uZmlnLmFpID0gey4uLkxleENvbmZpZy5jb25maWcuYWksIC4uLmFpfTtcblxuICAgICAgaWYocHJvY2Vzcy5lbnYuQ1VSU09SX0lERSA9PT0gJ3RydWUnICYmIExleENvbmZpZy5jb25maWcuYWkucHJvdmlkZXIgPT09ICdub25lJykge1xuICAgICAgICBMZXhDb25maWcuY29uZmlnLmFpLnByb3ZpZGVyID0gJ2N1cnNvcic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgTGV4Q29uZmlnLmNvbmZpZyA9IHsuLi5MZXhDb25maWcuY29uZmlnLCAuLi51cGRhdGVkQ29uZmlnfTtcblxuICAgIHJldHVybiBMZXhDb25maWcuY29uZmlnO1xuICB9XG5cbiAgc3RhdGljIGFkZENvbmZpZ1BhcmFtcyhjbWQsIHBhcmFtczogTGV4Q29uZmlnVHlwZSkge1xuICAgIGNvbnN0IG5hbWVQcm9wZXJ0eTogc3RyaW5nID0gJ19uYW1lJztcbiAgICBjb25zdCB7ZW52aXJvbm1lbnQsIG91dHB1dFBhdGgsIHNvdXJjZVBhdGgsIHR5cGVzY3JpcHR9ID0gY21kO1xuXG4gICAgaWYob3V0cHV0UGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJhbXMub3V0cHV0UGF0aCA9IG91dHB1dFBhdGg7XG4gICAgICBwYXJhbXMub3V0cHV0RnVsbFBhdGggPSBwYXRoUmVzb2x2ZShjd2QsIG91dHB1dFBhdGgpO1xuICAgIH1cblxuICAgIGlmKHNvdXJjZVBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyYW1zLnNvdXJjZVBhdGggPSBzb3VyY2VQYXRoO1xuICAgICAgcGFyYW1zLnNvdXJjZUZ1bGxQYXRoID0gcGF0aFJlc29sdmUoY3dkLCBzb3VyY2VQYXRoKTtcbiAgICB9XG5cbiAgICBpZih0eXBlc2NyaXB0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtcy51c2VUeXBlc2NyaXB0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZihlbnZpcm9ubWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJhbXMudGFyZ2V0RW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudCA9PT0gJ3dlYicgPyAnd2ViJyA6ICdub2RlJztcbiAgICB9XG5cbiAgICBwcm9jZXNzLmVudi5MRVhfQ09ORklHID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgICB7XG4gICAgICAgIC4uLkxleENvbmZpZy51cGRhdGVDb25maWcocGFyYW1zKSxcbiAgICAgICAgY29tbWFuZE5hbWU6IGNtZFtuYW1lUHJvcGVydHldLFxuICAgICAgICBpc1N0YXRpYzogY21kLnN0YXRpY1xuICAgICAgfSwgbnVsbCwgMFxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgcGFyc2VDb25maWcoY21kLCBpc1Jvb3Q6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qge2NsaU5hbWUgPSAnTGV4JywgbGV4Q29uZmlnLCBsZXhDb25maWdOYW1lLCBxdWlldCwgdHlwZXNjcmlwdCwgZGVidWcgPSBmYWxzZX0gPSBjbWQ7XG4gICAgY29uc3QgY29uZmlnRm9ybWF0cyA9IFsnanMnLCAnbWpzJywgJ2NqcycsICd0cycsICdqc29uJ107XG4gICAgY29uc3QgY29uZmlnQmFzZU5hbWU6IHN0cmluZyA9IGxleENvbmZpZ05hbWUgfHwgJ2xleC5jb25maWcnO1xuICAgIGxldCBjb25maWdQYXRoOiBzdHJpbmcgPSBsZXhDb25maWcgfHwgJyc7XG4gICAgbGV0IGNvbmZpZ0V4aXN0czogYm9vbGVhbiA9IGxleENvbmZpZyA/IGV4aXN0c1N5bmMoY29uZmlnUGF0aCkgOiBmYWxzZTtcblxuICAgIGlmKCFjb25maWdQYXRoIHx8ICFjb25maWdFeGlzdHMpIHtcbiAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgIGxvZyhgU2VhcmNoaW5nIGZvciBjb25maWcgZmlsZXMgd2l0aCBiYXNlIG5hbWU6ICR7Y29uZmlnQmFzZU5hbWV9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICB9XG5cbiAgICAgIGZvcihjb25zdCBmb3JtYXQgb2YgY29uZmlnRm9ybWF0cykge1xuICAgICAgICBjb25zdCBwb3RlbnRpYWxQYXRoID0gaXNSb290XG4gICAgICAgICAgPyBwYXRoUmVzb2x2ZShjd2QsIGAuLyR7Y29uZmlnQmFzZU5hbWV9LiR7Zm9ybWF0fWApXG4gICAgICAgICAgOiByZWxhdGl2ZUZpbGVQYXRoKGAke2NvbmZpZ0Jhc2VOYW1lfS4ke2Zvcm1hdH1gLCBjd2QpO1xuXG4gICAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgICAgbG9nKGBDaGVja2luZyBmb3IgY29uZmlnIGZpbGU6ICR7cG90ZW50aWFsUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKGV4aXN0c1N5bmMocG90ZW50aWFsUGF0aCkpIHtcbiAgICAgICAgICBjb25maWdQYXRoID0gcG90ZW50aWFsUGF0aDtcbiAgICAgICAgICBjb25maWdFeGlzdHMgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYoY29uZmlnRXhpc3RzKSB7XG4gICAgICBsb2coYFVzaW5nICR7Y2xpTmFtZX0gY29uZmlndXJhdGlvbiBmaWxlOiAke2NvbmZpZ1BhdGh9YCwgJ25vdGUnLCBxdWlldCk7XG4gICAgICBjb25zdCBleHQ6IHN0cmluZyA9IHBhdGhFeHRuYW1lKGNvbmZpZ1BhdGgpO1xuXG4gICAgICBpZihleHQgPT09ICcuanNvbicpIHtcbiAgICAgICAgY29uc3QgY29uZmlnQ29udGVudDogc3RyaW5nID0gcmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4Jyk7XG5cbiAgICAgICAgaWYoY29uZmlnQ29udGVudCkge1xuICAgICAgICAgIGxldCBjb25maWdKc29uOiBMZXhDb25maWdUeXBlO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbmZpZ0pzb24gPSBKU09OLnBhcnNlKGNvbmZpZ0NvbnRlbnQpPy5kZWZhdWx0IHx8IHt9O1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IEZhaWxlZCB0byBwYXJzZSBKU09OIGNvbmZpZzogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgICAgIGNvbmZpZ0pzb24gPSB7fTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBMZXhDb25maWcuYWRkQ29uZmlnUGFyYW1zKGNtZCwgY29uZmlnSnNvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBDb25maWcgZmlsZSBtYWxmb3JtZWQsICR7Y29uZmlnUGF0aH1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZihbJy5qcycsICcubWpzJywgJy5janMnLCAnLnRzJ10uaW5jbHVkZXMoZXh0KSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxldCBsZXhDdXN0b21Db25maWc7XG5cbiAgICAgICAgICBpZihleHQgPT09ICcuY2pzJykge1xuICAgICAgICAgICAgY29uc3QgZmlsZVVybCA9IG5ldyBVUkwoYGZpbGU6Ly8vJHtwYXRoUmVzb2x2ZShjb25maWdQYXRoKX1gKS5ocmVmO1xuXG4gICAgICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgICAgICBsb2coYExvYWRpbmcgQ29tbW9uSlMgY29uZmlnIGZyb206ICR7ZmlsZVVybH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxleEN1c3RvbUNvbmZpZyA9IGF3YWl0IGltcG9ydChmaWxlVXJsKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgICAgICAgbG9nKGBMb2FkaW5nIEVTTS9UUyBjb25maWcgZnJvbTogJHtjb25maWdQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXhDdXN0b21Db25maWcgPSBhd2FpdCBpbXBvcnQoY29uZmlnUGF0aCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgY29uZmlnID0gbGV4Q3VzdG9tQ29uZmlnLmRlZmF1bHQgfHwgbGV4Q3VzdG9tQ29uZmlnO1xuXG4gICAgICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgICAgIGxvZyhgTG9hZGVkIGNvbmZpZzogJHtKU09OLnN0cmluZ2lmeShjb25maWcsIG51bGwsIDIpfWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmKCFjb25maWcpIHtcbiAgICAgICAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBXYXJuaW5nOiBDb25maWcgZmlsZSBsb2FkZWQgYnV0IG5vIGNvbmZpZ3VyYXRpb24gZm91bmRgLCAnd2FybicsIHF1aWV0KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBMZXhDb25maWcuYWRkQ29uZmlnUGFyYW1zKGNtZCwgY29uZmlnIHx8IHt9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IEZhaWxlZCB0byBsb2FkIGNvbmZpZyBmaWxlOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IENvbmZpZyBmaWxlIG11c3QgYmUgYSBKUywgQ0pTLCBNSlMsIFRTLCBvciBKU09OIGZpbGUuYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZihkZWJ1Zykge1xuICAgICAgICBsb2coJ05vIGNvbmZpZyBmaWxlIGZvdW5kLiBVc2luZyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uJywgJ2luZm8nLCBxdWlldCk7XG4gICAgICB9XG5cbiAgICAgIExleENvbmZpZy51c2VUeXBlc2NyaXB0ID0gISF0eXBlc2NyaXB0O1xuICAgICAgTGV4Q29uZmlnLmFkZENvbmZpZ1BhcmFtcyhjbWQsIExleENvbmZpZy5jb25maWcpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBjaGVja1R5cGVzY3JpcHRDb25maWcoKSB7XG4gICAgY29uc3QgdHNjb25maWdQYXRoOiBzdHJpbmcgPSBwYXRoUmVzb2x2ZShjd2QsICcuL3RzY29uZmlnLmpzb24nKTtcblxuICAgIGlmKCFleGlzdHNTeW5jKHRzY29uZmlnUGF0aCkpIHtcbiAgICAgIGNvbnN0IGRpck5hbWUgPSBnZXREaXJOYW1lKCk7XG4gICAgICB3cml0ZUZpbGVTeW5jKHRzY29uZmlnUGF0aCwgcmVhZEZpbGVTeW5jKHBhdGhSZXNvbHZlKGRpck5hbWUsICcuLi8uLi8uLi90c2NvbmZpZy5iYXNlLmpzb24nKSkpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBjaGVja0NvbXBpbGVUeXBlc2NyaXB0Q29uZmlnKCkge1xuICAgIGNvbnN0IGxleERpciA9IExleENvbmZpZy5nZXRMZXhEaXIoKTtcbiAgICBjb25zdCB0c2NvbmZpZ0NvbXBpbGVQYXRoOiBzdHJpbmcgPSBwYXRoUmVzb2x2ZShsZXhEaXIsICcuL3RzY29uZmlnLmJ1aWxkLmpzb24nKTtcblxuICAgIGlmKCFleGlzdHNTeW5jKHRzY29uZmlnQ29tcGlsZVBhdGgpKSB7XG4gICAgICBjb25zdCB0ZW1wbGF0ZVBhdGggPSBwYXRoUmVzb2x2ZShsZXhEaXIsICd0c2NvbmZpZy5idWlsZC5qc29uJyk7XG4gICAgICBpZihleGlzdHNTeW5jKHRlbXBsYXRlUGF0aCkpIHtcbiAgICAgICAgd3JpdGVGaWxlU3luYyh0c2NvbmZpZ0NvbXBpbGVQYXRoLCByZWFkRmlsZVN5bmModGVtcGxhdGVQYXRoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGNoZWNrTGludFR5cGVzY3JpcHRDb25maWcoKSB7XG4gICAgY29uc3QgbGV4RGlyID0gTGV4Q29uZmlnLmdldExleERpcigpO1xuICAgIGNvbnN0IHRzY29uZmlnTGludFBhdGg6IHN0cmluZyA9IHBhdGhSZXNvbHZlKGxleERpciwgJy4vdHNjb25maWcubGludC5qc29uJyk7XG5cbiAgICBpZighZXhpc3RzU3luYyh0c2NvbmZpZ0xpbnRQYXRoKSkge1xuICAgICAgY29uc3QgdGVtcGxhdGVQYXRoID0gcGF0aFJlc29sdmUobGV4RGlyLCAndHNjb25maWcubGludC5qc29uJyk7XG4gICAgICBpZihleGlzdHNTeW5jKHRlbXBsYXRlUGF0aCkpIHtcbiAgICAgICAgd3JpdGVGaWxlU3luYyh0c2NvbmZpZ0xpbnRQYXRoLCByZWFkRmlsZVN5bmModGVtcGxhdGVQYXRoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGNoZWNrVGVzdFR5cGVzY3JpcHRDb25maWcoKSB7XG4gICAgY29uc3QgbGV4RGlyID0gTGV4Q29uZmlnLmdldExleERpcigpO1xuICAgIGNvbnN0IHRzY29uZmlnVGVzdFBhdGg6IHN0cmluZyA9IHBhdGhSZXNvbHZlKGxleERpciwgJy4vdHNjb25maWcudGVzdC5qc29uJyk7XG5cbiAgICBpZighZXhpc3RzU3luYyh0c2NvbmZpZ1Rlc3RQYXRoKSkge1xuICAgICAgY29uc3QgdGVtcGxhdGVQYXRoID0gcGF0aFJlc29sdmUobGV4RGlyLCAndHNjb25maWcudGVzdC5qc29uJyk7XG4gICAgICBpZihleGlzdHNTeW5jKHRlbXBsYXRlUGF0aCkpIHtcbiAgICAgICAgd3JpdGVGaWxlU3luYyh0c2NvbmZpZ1Rlc3RQYXRoLCByZWFkRmlsZVN5bmModGVtcGxhdGVQYXRoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59Il0sCiAgIm1hcHBpbmdzIjogIkFBSUEsU0FBUSxZQUFZLGNBQWMscUJBQW9CO0FBQ3RELFNBQVEsU0FBUyxXQUFXLGFBQWEsV0FBVyxtQkFBa0I7QUFDdEUsU0FBUSxXQUFVO0FBRWxCLFNBQVEsWUFBWSx1QkFBdUIsd0JBQXVCO0FBQ2xFLFNBQVEsV0FBVTtBQUlsQixNQUFNLE1BQWMsUUFBUSxJQUFJO0FBc0Z6QixNQUFNLHNCQUFxQztBQUFBLEVBQ2hELElBQUk7QUFBQSxJQUNGLFdBQVc7QUFBQSxJQUNYLE9BQU87QUFBQSxJQUNQLFVBQVU7QUFBQSxJQUNWLGFBQWE7QUFBQSxFQUNmO0FBQUEsRUFDQSxhQUFhLENBQUM7QUFBQSxFQUNkLFdBQVcsQ0FBQztBQUFBLEVBQ1osV0FBVztBQUFBLEVBQ1gsU0FBUztBQUFBLEVBQ1QsS0FBSztBQUFBLEVBQ0wsU0FBUztBQUFBLElBQ1AsTUFBTSxDQUFDLFdBQVcsVUFBVTtBQUFBLElBQzVCLGVBQWU7QUFBQSxJQUNmLFVBQVU7QUFBQSxJQUNWLFFBQVE7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