@nlabs/lex 1.48.7 → 1.49.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.storybook/main.ts +9 -2
- package/.vscode/settings.json +1 -6
- package/README.md +249 -0
- package/eslint.config.mjs +24 -0
- package/examples/lex.config.js +18 -8
- package/examples/serverless-example/README.md +109 -0
- package/examples/serverless-example/dist/handlers/echo.js +15 -0
- package/examples/serverless-example/dist/handlers/graphql.js +137 -0
- package/examples/serverless-example/dist/handlers/hello.js +15 -0
- package/examples/serverless-example/dist/handlers/test.js +17 -0
- package/examples/serverless-example/dist/handlers/websocket.js +14 -0
- package/examples/serverless-example/lex.config.mjs +74 -0
- package/jest.config.mjs +13 -12
- package/{dist → lib}/LexConfig.d.ts +7 -6
- package/lib/LexConfig.js +268 -0
- package/lib/commands/ai/ai.js +303 -0
- package/{dist → lib}/commands/build/build.d.ts +3 -0
- package/lib/commands/build/build.js +494 -0
- package/{dist → lib}/commands/clean/clean.js +1 -1
- package/lib/commands/compile/compile.js +241 -0
- package/lib/commands/copy/copy.js +38 -0
- package/{dist → lib}/commands/create/create.js +1 -1
- package/{dist → lib}/commands/dev/dev.d.ts +2 -0
- package/lib/commands/dev/dev.js +286 -0
- package/{dist → lib}/commands/init/init.js +1 -1
- package/lib/commands/lint/lint.js +962 -0
- package/{dist → lib}/commands/migrate/migrate.js +1 -1
- package/lib/commands/publish/publish.js +104 -0
- package/lib/commands/serverless/serverless.d.ts +17 -0
- package/lib/commands/serverless/serverless.js +662 -0
- package/lib/commands/storybook/storybook.js +249 -0
- package/lib/commands/test/test.js +428 -0
- package/lib/commands/update/update.js +128 -0
- package/{dist → lib}/create/changelog.js +1 -1
- package/{dist → lib}/index.d.ts +1 -0
- package/{dist → lib}/index.js +2 -1
- package/lib/lex.js +73 -0
- package/lib/utils/aiService.d.ts +9 -0
- package/lib/utils/aiService.js +299 -0
- package/{dist → lib}/utils/app.d.ts +3 -0
- package/lib/utils/app.js +296 -0
- package/{dist → lib}/utils/file.d.ts +7 -3
- package/lib/utils/file.js +229 -0
- package/lib/utils/translations.d.ts +1 -0
- package/lib/utils/translations.js +74 -0
- package/package.json +60 -54
- package/postcss.config.js +5 -3
- package/tsconfig.build.json +2 -2
- package/webpack.config.js +229 -39
- package/dist/LexConfig.js +0 -287
- package/dist/commands/ai/ai.js +0 -303
- package/dist/commands/build/build.js +0 -404
- package/dist/commands/compile/compile.js +0 -234
- package/dist/commands/copy/copy.js +0 -38
- package/dist/commands/dev/dev.js +0 -74
- package/dist/commands/lint/lint.js +0 -993
- package/dist/commands/publish/publish.js +0 -104
- package/dist/commands/storybook/storybook.js +0 -249
- package/dist/commands/test/test.js +0 -429
- package/dist/commands/update/update.js +0 -132
- package/dist/lex.js +0 -70
- package/dist/utils/aiService.d.ts +0 -9
- package/dist/utils/aiService.js +0 -299
- package/dist/utils/app.js +0 -267
- package/dist/utils/file.js +0 -185
- package/emptyModule.js +0 -0
- package/eslint.config.js +0 -3
- /package/{dist → lib}/Button.stories.d.ts +0 -0
- /package/{dist → lib}/commands/ai/ai.d.ts +0 -0
- /package/{dist → lib}/commands/ai/index.d.ts +0 -0
- /package/{dist → lib}/commands/ai/index.js +0 -0
- /package/{dist → lib}/commands/clean/clean.d.ts +0 -0
- /package/{dist → lib}/commands/compile/compile.d.ts +0 -0
- /package/{dist → lib}/commands/config/config.d.ts +0 -0
- /package/{dist → lib}/commands/config/config.js +0 -0
- /package/{dist → lib}/commands/copy/copy.d.ts +0 -0
- /package/{dist → lib}/commands/create/create.d.ts +0 -0
- /package/{dist → lib}/commands/init/init.d.ts +0 -0
- /package/{dist → lib}/commands/link/link.d.ts +0 -0
- /package/{dist → lib}/commands/link/link.js +0 -0
- /package/{dist → lib}/commands/lint/autofix.d.ts +0 -0
- /package/{dist → lib}/commands/lint/lint.d.ts +0 -0
- /package/{dist → lib}/commands/migrate/migrate.d.ts +0 -0
- /package/{dist → lib}/commands/publish/publish.d.ts +0 -0
- /package/{dist → lib}/commands/storybook/storybook.d.ts +0 -0
- /package/{dist → lib}/commands/test/test.d.ts +0 -0
- /package/{dist → lib}/commands/update/update.d.ts +0 -0
- /package/{dist → lib}/commands/upgrade/upgrade.d.ts +0 -0
- /package/{dist → lib}/commands/upgrade/upgrade.js +0 -0
- /package/{dist → lib}/commands/versions/versions.d.ts +0 -0
- /package/{dist → lib}/commands/versions/versions.js +0 -0
- /package/{dist → lib}/create/changelog.d.ts +0 -0
- /package/{dist → lib}/lex.d.ts +0 -0
- /package/{dist → lib}/storybook/index.d.ts +0 -0
- /package/{dist → lib}/storybook/index.js +0 -0
- /package/{dist → lib}/test-react/index.d.ts +0 -0
- /package/{dist → lib}/test-react/index.js +0 -0
- /package/{dist → lib}/types.d.ts +0 -0
- /package/{dist → lib}/types.js +0 -0
- /package/{dist → lib}/utils/deepMerge.d.ts +0 -0
- /package/{dist → lib}/utils/deepMerge.js +0 -0
- /package/{dist → lib}/utils/log.d.ts +0 -0
- /package/{dist → lib}/utils/log.js +0 -0
- /package/{dist → lib}/utils/reactShim.d.ts +0 -0
- /package/{dist → lib}/utils/reactShim.js +0 -0
|
@@ -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
|
|
12
|
-
const
|
|
13
|
-
const pack = JSON.parse(readFileSync(resolve(
|
|
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
|
-
'
|
|
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
|
-
'
|
|
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
|
-
?
|
|
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
|
-
|
|
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
|
|
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>;
|
package/lib/LexConfig.js
ADDED
|
@@ -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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
|