@fjall/util 0.88.4 → 0.89.2
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/LICENSE +21 -0
- package/dist/src/Config.d.ts +67 -124
- package/dist/src/Config.js +157 -304
- package/dist/src/caseConversion.d.ts +33 -0
- package/dist/src/caseConversion.js +59 -0
- package/dist/src/domainExports.d.ts +19 -0
- package/dist/src/domainExports.js +18 -0
- package/dist/src/errorUtils.d.ts +24 -0
- package/dist/src/errorUtils.js +69 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.js +18 -2
- package/package.json +3 -3
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Fjall
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/dist/src/Config.d.ts
CHANGED
|
@@ -1,16 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
export type { Account } from "@aws-sdk/client-organizations";
|
|
3
|
-
export type ServiceConfig = {
|
|
4
|
-
id: string;
|
|
5
|
-
type?: string;
|
|
6
|
-
version?: number;
|
|
7
|
-
options?: object;
|
|
8
|
-
dockerConfig?: {
|
|
9
|
-
dockerfilePath: string;
|
|
10
|
-
containerPort: number;
|
|
11
|
-
};
|
|
12
|
-
apiApplicationId?: string;
|
|
13
|
-
};
|
|
1
|
+
import { z } from "zod";
|
|
14
2
|
export type ProviderAccount = {
|
|
15
3
|
id: string;
|
|
16
4
|
name: string;
|
|
@@ -32,65 +20,69 @@ export type SSOSession = {
|
|
|
32
20
|
ssoRegion: string;
|
|
33
21
|
ssoStartUrl: string;
|
|
34
22
|
};
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
23
|
+
declare const DeployStageSchema: z.ZodObject<{
|
|
24
|
+
account: z.ZodString;
|
|
25
|
+
regions: z.ZodArray<z.ZodString>;
|
|
26
|
+
}, z.core.$strict>;
|
|
27
|
+
export type DeployStage = z.infer<typeof DeployStageSchema>;
|
|
28
|
+
declare const DomainConfigSchema: z.ZodObject<{
|
|
29
|
+
name: z.ZodString;
|
|
30
|
+
type: z.ZodEnum<{
|
|
31
|
+
apex: "apex";
|
|
32
|
+
delegated: "delegated";
|
|
33
|
+
}>;
|
|
34
|
+
parentDomain: z.ZodOptional<z.ZodString>;
|
|
35
|
+
account: z.ZodOptional<z.ZodString>;
|
|
36
|
+
}, z.core.$strict>;
|
|
37
|
+
export type DomainConfig = z.infer<typeof DomainConfigSchema>;
|
|
38
|
+
declare const RootConfigSchema: z.ZodObject<{
|
|
39
|
+
version: z.ZodOptional<z.ZodNumber>;
|
|
40
|
+
generatorVersion: z.ZodOptional<z.ZodString>;
|
|
41
|
+
deploy: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
42
|
+
account: z.ZodString;
|
|
43
|
+
regions: z.ZodArray<z.ZodString>;
|
|
44
|
+
}, z.core.$strict>>>;
|
|
45
|
+
activeStage: z.ZodOptional<z.ZodString>;
|
|
46
|
+
domains: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
47
|
+
name: z.ZodString;
|
|
48
|
+
type: z.ZodEnum<{
|
|
49
|
+
apex: "apex";
|
|
50
|
+
delegated: "delegated";
|
|
51
|
+
}>;
|
|
52
|
+
parentDomain: z.ZodOptional<z.ZodString>;
|
|
53
|
+
account: z.ZodOptional<z.ZodString>;
|
|
54
|
+
}, z.core.$strict>>>;
|
|
55
|
+
}, z.core.$strict>;
|
|
56
|
+
type RootConfig = z.infer<typeof RootConfigSchema>;
|
|
58
57
|
/**
|
|
59
|
-
* Config class for loading and saving fjall-config.json
|
|
58
|
+
* Config class for loading and saving per-app fjall-config.json files.
|
|
59
|
+
* Each app has its own config at fjall/<app>/fjall-config.json.
|
|
60
|
+
* Stores deploy mapping, active stage, domains, and generator version.
|
|
61
|
+
* Org-level config (accounts, regions, OIDC) is served by OrgConfigClient from the API.
|
|
60
62
|
*/
|
|
61
|
-
export type OrgLevelConfig = {
|
|
62
|
-
primaryRegion?: string;
|
|
63
|
-
secondaryRegions?: string[];
|
|
64
|
-
disasterRecoveryRegion?: string;
|
|
65
|
-
providerAccounts?: ProviderAccount[];
|
|
66
|
-
ssoSessions?: {
|
|
67
|
-
[key: string]: SSOSession;
|
|
68
|
-
};
|
|
69
|
-
rootOidcRoleArn?: string;
|
|
70
|
-
};
|
|
71
63
|
export declare class Config {
|
|
72
64
|
rootConfig: RootConfig;
|
|
73
|
-
|
|
74
|
-
constructor(rootConfig?: RootConfig,
|
|
75
|
-
isDevelopment(): boolean;
|
|
65
|
+
private configPath;
|
|
66
|
+
constructor(rootConfig?: RootConfig, configPath?: string);
|
|
76
67
|
/**
|
|
77
|
-
* Find the fjall
|
|
78
|
-
|
|
68
|
+
* Find the fjall directory by walking up the directory tree
|
|
69
|
+
*/
|
|
70
|
+
private static findFjallDirectory;
|
|
71
|
+
/**
|
|
72
|
+
* Find the config directory for a specific app or the legacy root config.
|
|
73
|
+
* When appName is provided, looks for fjall/<appName>/fjall-config.json.
|
|
74
|
+
* When omitted, falls back to legacy fjall/fjall-config.json or direct fjall-config.json.
|
|
79
75
|
*/
|
|
80
76
|
private static findConfigDirectory;
|
|
81
77
|
/**
|
|
82
78
|
* Load config file into memory as a raw JSON string
|
|
83
|
-
* @param configFile - Path to the config file
|
|
84
|
-
* @returns Config as JSON string or NULL if no config file accessible
|
|
85
79
|
*/
|
|
86
80
|
private static loadConfigFile;
|
|
87
81
|
/**
|
|
88
|
-
* Load configuration from file
|
|
89
|
-
*
|
|
90
|
-
* @returns Loaded configuration
|
|
91
|
-
* @throws Error if config file cannot be parsed or fails schema validation
|
|
82
|
+
* Load configuration from file.
|
|
83
|
+
* @param appName - Optional app name to load config for a specific app
|
|
92
84
|
*/
|
|
93
|
-
static loadConfig(): Config;
|
|
85
|
+
static loadConfig(appName?: string): Config;
|
|
94
86
|
/**
|
|
95
87
|
* Format a Zod error into a readable error message
|
|
96
88
|
*/
|
|
@@ -98,74 +90,25 @@ export declare class Config {
|
|
|
98
90
|
/**
|
|
99
91
|
* Save configuration to file
|
|
100
92
|
*/
|
|
101
|
-
saveConfig(): void;
|
|
102
|
-
/**
|
|
103
|
-
* Add a new service to the config file
|
|
104
|
-
* @param serviceKey Name/key of the service
|
|
105
|
-
* @param config Service configuration properties
|
|
106
|
-
*/
|
|
107
|
-
addService(serviceKey: string, config: ServiceConfig): void;
|
|
108
|
-
getServiceConfig(serviceKey: string): ServiceConfig | null;
|
|
109
|
-
addProviderAccount(account: ProviderAccount): void;
|
|
110
|
-
getProviderAccount(accountName: string): ProviderAccount | undefined;
|
|
111
|
-
getProviderAccountById(accountId: string): ProviderAccount | undefined;
|
|
112
|
-
/**
|
|
113
|
-
* Get provider account by environment type
|
|
114
|
-
* @param environment The environment type (e.g., 'platform', 'staging', 'production')
|
|
115
|
-
* @returns The provider account with the specified environment or undefined if not found
|
|
116
|
-
*/
|
|
117
|
-
getAccountByEnvironment(environment: string): ProviderAccount | undefined;
|
|
118
|
-
/**
|
|
119
|
-
* Sets the existing accounts list. This should be called by AccountService
|
|
120
|
-
* after it fetches the accounts from AWS.
|
|
121
|
-
* @param accounts List of AWS accounts from Organizations API
|
|
122
|
-
*/
|
|
123
|
-
setExistingAccountsList(accounts: Account[]): void;
|
|
124
|
-
getExistingAccounts(): Account[];
|
|
125
|
-
setPrimaryRegion(region: string): void;
|
|
126
|
-
setSecondaryRegions(regions: string[]): void;
|
|
127
|
-
setDisasterRecoveryRegion(region: string): void;
|
|
128
|
-
getPrimaryRegion(): string | undefined;
|
|
129
|
-
getSecondaryRegions(): string[] | undefined;
|
|
130
|
-
getDisasterRecoveryRegion(): string | undefined;
|
|
131
|
-
getAllRegions(): string[];
|
|
93
|
+
saveConfig(appName?: string): void;
|
|
132
94
|
/**
|
|
133
95
|
* Get the fjall config directory path
|
|
134
|
-
* @returns The path to the fjall config directory or null if not found
|
|
135
|
-
*/
|
|
136
|
-
static getConfigDirectory(): string | null;
|
|
137
|
-
/**
|
|
138
|
-
* Profile management methods
|
|
139
|
-
*/
|
|
140
|
-
/**
|
|
141
|
-
* Gets the name of the currently active profile.
|
|
142
|
-
* @returns The current profile name, or undefined if no profile is set
|
|
143
|
-
*/
|
|
144
|
-
getCurrentProfile(): string | undefined;
|
|
145
|
-
/**
|
|
146
|
-
* Sets the currently active profile.
|
|
147
|
-
* @param name The name of the profile to set as current
|
|
148
96
|
*/
|
|
149
|
-
|
|
97
|
+
static getConfigDirectory(appName?: string): string | null;
|
|
150
98
|
/**
|
|
151
|
-
*
|
|
152
|
-
* @param name The name of the profile to retrieve
|
|
153
|
-
* @returns The profile configuration, or undefined if not found
|
|
99
|
+
* Discover all app names by scanning fjall/<app>/fjall-config.json
|
|
154
100
|
*/
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
setOrganisationEmail(email: string): void;
|
|
168
|
-
getOidcIssuerUrl(): string | undefined;
|
|
169
|
-
setOidcIssuerUrl(url: string): void;
|
|
170
|
-
setOrgLevelConfig(config: OrgLevelConfig): void;
|
|
101
|
+
static discoverApps(): string[];
|
|
102
|
+
getDeployStages(): Record<string, DeployStage>;
|
|
103
|
+
getDeployStage(name: string): DeployStage | undefined;
|
|
104
|
+
setDeployStage(name: string, stage: DeployStage): void;
|
|
105
|
+
removeDeployStage(name: string): boolean;
|
|
106
|
+
getActiveStage(): string | undefined;
|
|
107
|
+
setActiveStage(name: string): void;
|
|
108
|
+
getDomains(): DomainConfig[];
|
|
109
|
+
setDomains(domains: DomainConfig[]): void;
|
|
110
|
+
addDomain(domain: DomainConfig): void;
|
|
111
|
+
getDomain(name: string): DomainConfig | undefined;
|
|
112
|
+
removeDomain(name: string): boolean;
|
|
171
113
|
}
|
|
114
|
+
export {};
|
package/dist/src/Config.js
CHANGED
|
@@ -4,109 +4,91 @@ exports.Config = void 0;
|
|
|
4
4
|
const fs = require("fs");
|
|
5
5
|
const path = require("path");
|
|
6
6
|
const zod_1 = require("zod");
|
|
7
|
+
const logger_js_1 = require("./logger.js");
|
|
7
8
|
/**
|
|
8
9
|
* Maximum depth for searching up the directory tree for config files.
|
|
9
10
|
* Prevents infinite loops when traversing directories.
|
|
10
11
|
*/
|
|
11
12
|
const CONFIG_SEARCH_MAX_DEPTH = 10;
|
|
12
|
-
//
|
|
13
|
-
const
|
|
13
|
+
// Per-app config schemas
|
|
14
|
+
const DeployStageSchema = zod_1.z
|
|
14
15
|
.object({
|
|
15
|
-
|
|
16
|
-
|
|
16
|
+
account: zod_1.z.string(),
|
|
17
|
+
regions: zod_1.z.array(zod_1.z.string()).min(1)
|
|
17
18
|
})
|
|
18
19
|
.strict();
|
|
19
|
-
const
|
|
20
|
+
const DomainConfigSchema = zod_1.z
|
|
20
21
|
.object({
|
|
21
|
-
id: zod_1.z.string(),
|
|
22
|
-
type: zod_1.z.string().optional(),
|
|
23
|
-
version: zod_1.z.number().optional(),
|
|
24
|
-
// passthrough: service options are arbitrary key-value pairs defined by each service type
|
|
25
|
-
options: zod_1.z.object({}).passthrough().optional(),
|
|
26
|
-
dockerConfig: DockerConfigSchema.optional(),
|
|
27
|
-
apiApplicationId: zod_1.z.string().optional()
|
|
28
|
-
})
|
|
29
|
-
.strict();
|
|
30
|
-
const ProviderAccountSchema = zod_1.z
|
|
31
|
-
.object({
|
|
32
|
-
id: zod_1.z.string(),
|
|
33
22
|
name: zod_1.z.string(),
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
.strict();
|
|
38
|
-
const ProfileSchema = zod_1.z
|
|
39
|
-
.object({
|
|
40
|
-
type: zod_1.z.enum(["sso", "oidc"]),
|
|
41
|
-
region: zod_1.z.string(),
|
|
42
|
-
ssoAccountId: zod_1.z.string().optional(),
|
|
43
|
-
ssoRoleName: zod_1.z.string().optional(),
|
|
44
|
-
ssoSession: zod_1.z.string().optional(),
|
|
45
|
-
oidcRoleArn: zod_1.z.string().optional(),
|
|
46
|
-
oidcProviderArn: zod_1.z.string().optional(),
|
|
47
|
-
roleArn: zod_1.z.string().optional(),
|
|
48
|
-
roleSessionName: zod_1.z.string().optional()
|
|
49
|
-
})
|
|
50
|
-
.strict();
|
|
51
|
-
const SSOSessionSchema = zod_1.z
|
|
52
|
-
.object({
|
|
53
|
-
ssoRegion: zod_1.z.string(),
|
|
54
|
-
ssoStartUrl: zod_1.z.string()
|
|
23
|
+
type: zod_1.z.enum(["apex", "delegated"]),
|
|
24
|
+
parentDomain: zod_1.z.string().optional(),
|
|
25
|
+
account: zod_1.z.string().optional()
|
|
55
26
|
})
|
|
56
27
|
.strict();
|
|
57
28
|
const RootConfigSchema = zod_1.z
|
|
58
29
|
.object({
|
|
59
30
|
version: zod_1.z.number().optional(),
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
secondaryRegions: zod_1.z.array(zod_1.z.string()).optional(),
|
|
65
|
-
disasterRecoveryRegion: zod_1.z.string().optional(),
|
|
66
|
-
currentProfile: zod_1.z.string().optional(),
|
|
67
|
-
profiles: zod_1.z.record(zod_1.z.string(), ProfileSchema).optional(),
|
|
68
|
-
ssoSessions: zod_1.z.record(zod_1.z.string(), SSOSessionSchema).optional(),
|
|
69
|
-
organisationId: zod_1.z.string().optional(),
|
|
70
|
-
organisationName: zod_1.z.string().optional(),
|
|
71
|
-
organisationEmail: zod_1.z.string().optional(),
|
|
72
|
-
oidcIssuerUrl: zod_1.z.string().optional(),
|
|
73
|
-
rootOidcRoleArn: zod_1.z.string().optional()
|
|
31
|
+
generatorVersion: zod_1.z.string().optional(),
|
|
32
|
+
deploy: zod_1.z.record(zod_1.z.string(), DeployStageSchema).optional(),
|
|
33
|
+
activeStage: zod_1.z.string().optional(),
|
|
34
|
+
domains: zod_1.z.array(DomainConfigSchema).optional()
|
|
74
35
|
})
|
|
75
36
|
.strict();
|
|
76
|
-
const AccountSchema = zod_1.z
|
|
77
|
-
.object({
|
|
78
|
-
Id: zod_1.z.string().optional(),
|
|
79
|
-
Arn: zod_1.z.string().optional(),
|
|
80
|
-
Email: zod_1.z.string().optional(),
|
|
81
|
-
Name: zod_1.z.string().optional(),
|
|
82
|
-
Status: zod_1.z.enum(["ACTIVE", "SUSPENDED", "PENDING_CLOSURE"]).optional(),
|
|
83
|
-
JoinedMethod: zod_1.z.enum(["INVITED", "CREATED"]).optional(),
|
|
84
|
-
// z.coerce.date() handles both Date objects (from AWS SDK) and ISO 8601 strings (from JSON parsing)
|
|
85
|
-
JoinedTimestamp: zod_1.z.coerce.date().optional()
|
|
86
|
-
})
|
|
87
|
-
// passthrough: AWS SDK Account objects may contain additional properties not in our schema
|
|
88
|
-
.passthrough();
|
|
89
37
|
/**
|
|
90
38
|
* The current base-version of any newly created config file
|
|
91
39
|
*/
|
|
92
40
|
const BASE_CONFIG_VERSION = 0.1;
|
|
41
|
+
/**
|
|
42
|
+
* Config class for loading and saving per-app fjall-config.json files.
|
|
43
|
+
* Each app has its own config at fjall/<app>/fjall-config.json.
|
|
44
|
+
* Stores deploy mapping, active stage, domains, and generator version.
|
|
45
|
+
* Org-level config (accounts, regions, OIDC) is served by OrgConfigClient from the API.
|
|
46
|
+
*/
|
|
93
47
|
class Config {
|
|
94
|
-
constructor(rootConfig,
|
|
48
|
+
constructor(rootConfig, configPath) {
|
|
49
|
+
this.configPath = null;
|
|
95
50
|
this.rootConfig = rootConfig ?? {
|
|
96
|
-
version: BASE_CONFIG_VERSION
|
|
97
|
-
services: {},
|
|
98
|
-
providerAccounts: []
|
|
51
|
+
version: BASE_CONFIG_VERSION
|
|
99
52
|
};
|
|
100
|
-
this.
|
|
53
|
+
this.configPath = configPath ?? null;
|
|
101
54
|
}
|
|
102
|
-
|
|
103
|
-
|
|
55
|
+
/**
|
|
56
|
+
* Find the fjall directory by walking up the directory tree
|
|
57
|
+
*/
|
|
58
|
+
static findFjallDirectory() {
|
|
59
|
+
let currentDir = process.cwd();
|
|
60
|
+
for (let i = 0; i < CONFIG_SEARCH_MAX_DEPTH; i++) {
|
|
61
|
+
const fjallDir = path.join(currentDir, "fjall");
|
|
62
|
+
if (fs.existsSync(fjallDir) && fs.statSync(fjallDir).isDirectory()) {
|
|
63
|
+
return fjallDir;
|
|
64
|
+
}
|
|
65
|
+
const parentDir = path.dirname(currentDir);
|
|
66
|
+
if (parentDir === currentDir)
|
|
67
|
+
break;
|
|
68
|
+
currentDir = parentDir;
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
104
71
|
}
|
|
105
72
|
/**
|
|
106
|
-
* Find the
|
|
107
|
-
*
|
|
73
|
+
* Find the config directory for a specific app or the legacy root config.
|
|
74
|
+
* When appName is provided, looks for fjall/<appName>/fjall-config.json.
|
|
75
|
+
* When omitted, falls back to legacy fjall/fjall-config.json or direct fjall-config.json.
|
|
108
76
|
*/
|
|
109
|
-
static findConfigDirectory() {
|
|
77
|
+
static findConfigDirectory(appName) {
|
|
78
|
+
if (appName) {
|
|
79
|
+
if (appName !== path.basename(appName))
|
|
80
|
+
return null;
|
|
81
|
+
const fjallDir = Config.findFjallDirectory();
|
|
82
|
+
if (!fjallDir)
|
|
83
|
+
return null;
|
|
84
|
+
const appDir = path.join(fjallDir, appName);
|
|
85
|
+
const configFile = path.join(appDir, "fjall-config.json");
|
|
86
|
+
if (fs.existsSync(configFile)) {
|
|
87
|
+
return appDir;
|
|
88
|
+
}
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
// Legacy: look for fjall/fjall-config.json or direct fjall-config.json
|
|
110
92
|
let currentDir = process.cwd();
|
|
111
93
|
for (let i = 0; i < CONFIG_SEARCH_MAX_DEPTH; i++) {
|
|
112
94
|
const fjallDir = path.join(currentDir, "fjall");
|
|
@@ -127,36 +109,32 @@ class Config {
|
|
|
127
109
|
}
|
|
128
110
|
/**
|
|
129
111
|
* Load config file into memory as a raw JSON string
|
|
130
|
-
* @param configFile - Path to the config file
|
|
131
|
-
* @returns Config as JSON string or NULL if no config file accessible
|
|
132
112
|
*/
|
|
133
113
|
static loadConfigFile(configFile) {
|
|
134
114
|
try {
|
|
135
115
|
fs.accessSync(configFile, fs.constants.R_OK | fs.constants.W_OK);
|
|
136
116
|
return fs.readFileSync(configFile, { encoding: "utf8" });
|
|
137
117
|
}
|
|
138
|
-
catch {
|
|
139
|
-
|
|
118
|
+
catch (err) {
|
|
119
|
+
logger_js_1.logger.debug("Config", "Config file not accessible", {
|
|
120
|
+
file: configFile,
|
|
121
|
+
error: err instanceof Error ? err.message : String(err)
|
|
122
|
+
});
|
|
140
123
|
return null;
|
|
141
124
|
}
|
|
142
125
|
}
|
|
143
126
|
/**
|
|
144
|
-
* Load configuration from file
|
|
145
|
-
*
|
|
146
|
-
* @returns Loaded configuration
|
|
147
|
-
* @throws Error if config file cannot be parsed or fails schema validation
|
|
127
|
+
* Load configuration from file.
|
|
128
|
+
* @param appName - Optional app name to load config for a specific app
|
|
148
129
|
*/
|
|
149
|
-
static loadConfig() {
|
|
150
|
-
const configDir = Config.findConfigDirectory();
|
|
130
|
+
static loadConfig(appName) {
|
|
131
|
+
const configDir = Config.findConfigDirectory(appName);
|
|
151
132
|
if (!configDir) {
|
|
152
133
|
return new Config();
|
|
153
134
|
}
|
|
154
|
-
const
|
|
155
|
-
const
|
|
156
|
-
// Parse each config file separately to identify which one fails
|
|
135
|
+
const configFilePath = path.join(configDir, "fjall-config.json");
|
|
136
|
+
const rootConfigJson = Config.loadConfigFile(configFilePath);
|
|
157
137
|
let rootConfig;
|
|
158
|
-
let existingAccountsConfig;
|
|
159
|
-
// 1. Parse root config (fjall-config.json)
|
|
160
138
|
if (rootConfigJson) {
|
|
161
139
|
try {
|
|
162
140
|
rootConfig = RootConfigSchema.parse(JSON.parse(rootConfigJson));
|
|
@@ -165,17 +143,7 @@ class Config {
|
|
|
165
143
|
throw Config.formatZodError(err, "fjall-config.json");
|
|
166
144
|
}
|
|
167
145
|
}
|
|
168
|
-
|
|
169
|
-
if (existingAccountJson) {
|
|
170
|
-
try {
|
|
171
|
-
const raw = JSON.parse(existingAccountJson);
|
|
172
|
-
existingAccountsConfig = zod_1.z.array(AccountSchema).parse(raw);
|
|
173
|
-
}
|
|
174
|
-
catch (err) {
|
|
175
|
-
throw Config.formatZodError(err, "accounts-config.json");
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
return new Config(rootConfig, existingAccountsConfig);
|
|
146
|
+
return new Config(rootConfig, configFilePath);
|
|
179
147
|
}
|
|
180
148
|
/**
|
|
181
149
|
* Format a Zod error into a readable error message
|
|
@@ -187,7 +155,6 @@ class Config {
|
|
|
187
155
|
.join("; ");
|
|
188
156
|
return new Error(`Failed to parse ${fileName}: ${issueDetails}`);
|
|
189
157
|
}
|
|
190
|
-
// Fall back to the error message, but replace newlines to keep it on one line
|
|
191
158
|
const rawMessage = err instanceof Error ? err.message : String(err);
|
|
192
159
|
const message = rawMessage.replace(/\n/g, " ").substring(0, 500);
|
|
193
160
|
return new Error(`Failed to parse ${fileName}: ${message}`);
|
|
@@ -195,229 +162,115 @@ class Config {
|
|
|
195
162
|
/**
|
|
196
163
|
* Save configuration to file
|
|
197
164
|
*/
|
|
198
|
-
saveConfig() {
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
*/
|
|
214
|
-
addService(serviceKey, config) {
|
|
215
|
-
if (!this.rootConfig.services)
|
|
216
|
-
this.rootConfig.services = {};
|
|
217
|
-
this.rootConfig.services[serviceKey] = config;
|
|
218
|
-
}
|
|
219
|
-
getServiceConfig(serviceKey) {
|
|
220
|
-
if (!this.rootConfig.services)
|
|
221
|
-
return null;
|
|
222
|
-
return this.rootConfig.services[serviceKey] || null;
|
|
223
|
-
}
|
|
224
|
-
addProviderAccount(account) {
|
|
225
|
-
if (!this.rootConfig.providerAccounts)
|
|
226
|
-
this.rootConfig.providerAccounts = [];
|
|
227
|
-
// ensure account name is always lowercase
|
|
228
|
-
account.name = account.name.toLocaleLowerCase();
|
|
229
|
-
this.rootConfig.providerAccounts.push(account);
|
|
230
|
-
}
|
|
231
|
-
getProviderAccount(accountName) {
|
|
232
|
-
if (!this.rootConfig.providerAccounts)
|
|
233
|
-
return undefined;
|
|
234
|
-
return this.rootConfig.providerAccounts.find((account) => account.name.toLocaleLowerCase() === accountName.toLocaleLowerCase());
|
|
235
|
-
}
|
|
236
|
-
getProviderAccountById(accountId) {
|
|
237
|
-
if (!this.rootConfig.providerAccounts)
|
|
238
|
-
return undefined;
|
|
239
|
-
return this.rootConfig.providerAccounts.find((account) => account.id === accountId);
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* Get provider account by environment type
|
|
243
|
-
* @param environment The environment type (e.g., 'platform', 'staging', 'production')
|
|
244
|
-
* @returns The provider account with the specified environment or undefined if not found
|
|
245
|
-
*/
|
|
246
|
-
getAccountByEnvironment(environment) {
|
|
247
|
-
if (!this.rootConfig.providerAccounts)
|
|
248
|
-
return undefined;
|
|
249
|
-
return this.rootConfig.providerAccounts.find((account) => account.environment === environment);
|
|
250
|
-
}
|
|
251
|
-
/**
|
|
252
|
-
* Sets the existing accounts list. This should be called by AccountService
|
|
253
|
-
* after it fetches the accounts from AWS.
|
|
254
|
-
* @param accounts List of AWS accounts from Organizations API
|
|
255
|
-
*/
|
|
256
|
-
setExistingAccountsList(accounts) {
|
|
257
|
-
this.existingAccountsConfig = accounts;
|
|
258
|
-
}
|
|
259
|
-
getExistingAccounts() {
|
|
260
|
-
return this.existingAccountsConfig;
|
|
261
|
-
}
|
|
262
|
-
setPrimaryRegion(region) {
|
|
263
|
-
this.rootConfig.primaryRegion = region;
|
|
264
|
-
}
|
|
265
|
-
setSecondaryRegions(regions) {
|
|
266
|
-
this.rootConfig.secondaryRegions = regions;
|
|
267
|
-
}
|
|
268
|
-
setDisasterRecoveryRegion(region) {
|
|
269
|
-
this.rootConfig.disasterRecoveryRegion = region;
|
|
270
|
-
}
|
|
271
|
-
getPrimaryRegion() {
|
|
272
|
-
return this.rootConfig.primaryRegion;
|
|
273
|
-
}
|
|
274
|
-
getSecondaryRegions() {
|
|
275
|
-
return this.rootConfig.secondaryRegions;
|
|
276
|
-
}
|
|
277
|
-
getDisasterRecoveryRegion() {
|
|
278
|
-
return this.rootConfig.disasterRecoveryRegion;
|
|
279
|
-
}
|
|
280
|
-
getAllRegions() {
|
|
281
|
-
const regions = [];
|
|
282
|
-
if (this.rootConfig.primaryRegion) {
|
|
283
|
-
regions.push(this.rootConfig.primaryRegion);
|
|
284
|
-
}
|
|
285
|
-
if (this.rootConfig.secondaryRegions) {
|
|
286
|
-
regions.push(...this.rootConfig.secondaryRegions);
|
|
287
|
-
}
|
|
288
|
-
if (this.rootConfig.disasterRecoveryRegion &&
|
|
289
|
-
!regions.includes(this.rootConfig.disasterRecoveryRegion)) {
|
|
290
|
-
regions.push(this.rootConfig.disasterRecoveryRegion);
|
|
165
|
+
saveConfig(appName) {
|
|
166
|
+
let targetPath = this.configPath;
|
|
167
|
+
if (!targetPath) {
|
|
168
|
+
if (appName) {
|
|
169
|
+
if (appName !== path.basename(appName)) {
|
|
170
|
+
throw new Error(`Invalid app name: ${appName}`);
|
|
171
|
+
}
|
|
172
|
+
const fjallDir = Config.findFjallDirectory() || path.join(process.cwd(), "fjall");
|
|
173
|
+
const appDir = path.join(fjallDir, appName);
|
|
174
|
+
targetPath = path.join(appDir, "fjall-config.json");
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
const configDir = Config.findConfigDirectory() || path.join(process.cwd(), "fjall");
|
|
178
|
+
targetPath = path.join(configDir, "fjall-config.json");
|
|
179
|
+
}
|
|
291
180
|
}
|
|
292
|
-
|
|
181
|
+
const dir = path.dirname(targetPath);
|
|
182
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
183
|
+
const rootJsonString = JSON.stringify(this.rootConfig, null, 2);
|
|
184
|
+
const tmpPath = `${targetPath}.tmp`;
|
|
185
|
+
fs.writeFileSync(tmpPath, rootJsonString, { mode: 0o600 });
|
|
186
|
+
fs.renameSync(tmpPath, targetPath);
|
|
293
187
|
}
|
|
294
188
|
/**
|
|
295
189
|
* Get the fjall config directory path
|
|
296
|
-
* @returns The path to the fjall config directory or null if not found
|
|
297
|
-
*/
|
|
298
|
-
static getConfigDirectory() {
|
|
299
|
-
return Config.findConfigDirectory();
|
|
300
|
-
}
|
|
301
|
-
/**
|
|
302
|
-
* Profile management methods
|
|
303
|
-
*/
|
|
304
|
-
/**
|
|
305
|
-
* Gets the name of the currently active profile.
|
|
306
|
-
* @returns The current profile name, or undefined if no profile is set
|
|
307
190
|
*/
|
|
308
|
-
|
|
309
|
-
return
|
|
191
|
+
static getConfigDirectory(appName) {
|
|
192
|
+
return Config.findConfigDirectory(appName);
|
|
310
193
|
}
|
|
311
194
|
/**
|
|
312
|
-
*
|
|
313
|
-
* @param name The name of the profile to set as current
|
|
195
|
+
* Discover all app names by scanning fjall/<app>/fjall-config.json
|
|
314
196
|
*/
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
/**
|
|
319
|
-
* Retrieves a profile by name.
|
|
320
|
-
* @param name The name of the profile to retrieve
|
|
321
|
-
* @returns The profile configuration, or undefined if not found
|
|
322
|
-
*/
|
|
323
|
-
getProfile(name) {
|
|
324
|
-
if (!this.rootConfig.profiles)
|
|
325
|
-
return undefined;
|
|
326
|
-
return this.rootConfig.profiles[name];
|
|
327
|
-
}
|
|
328
|
-
getAllProfileNames() {
|
|
329
|
-
if (!this.rootConfig.profiles)
|
|
197
|
+
static discoverApps() {
|
|
198
|
+
const fjallDir = Config.findFjallDirectory();
|
|
199
|
+
if (!fjallDir)
|
|
330
200
|
return [];
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
// If we removed the current profile, clear it
|
|
344
|
-
if (this.rootConfig.currentProfile === name) {
|
|
345
|
-
this.rootConfig.currentProfile = undefined;
|
|
201
|
+
try {
|
|
202
|
+
const entries = fs.readdirSync(fjallDir, { withFileTypes: true });
|
|
203
|
+
const apps = [];
|
|
204
|
+
for (const entry of entries) {
|
|
205
|
+
if (!entry.isDirectory())
|
|
206
|
+
continue;
|
|
207
|
+
const configFile = path.join(fjallDir, entry.name, "fjall-config.json");
|
|
208
|
+
if (fs.existsSync(configFile)) {
|
|
209
|
+
apps.push(entry.name);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return apps.sort();
|
|
346
213
|
}
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
}
|
|
353
|
-
addSSOSession(name, session) {
|
|
354
|
-
if (!this.rootConfig.ssoSessions) {
|
|
355
|
-
this.rootConfig.ssoSessions = {};
|
|
214
|
+
catch (err) {
|
|
215
|
+
logger_js_1.logger.debug("Config", "Failed to discover apps", {
|
|
216
|
+
error: err instanceof Error ? err.message : String(err)
|
|
217
|
+
});
|
|
218
|
+
return [];
|
|
356
219
|
}
|
|
357
|
-
this.rootConfig.ssoSessions[name] = session;
|
|
358
220
|
}
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
const rootAccount = this.rootConfig.providerAccounts?.find((a) => a.environment === "root");
|
|
363
|
-
const rootProfileName = rootAccount?.name.toLowerCase();
|
|
364
|
-
const rootProfile = rootProfileName
|
|
365
|
-
? this.rootConfig.profiles?.[rootProfileName]
|
|
366
|
-
: undefined;
|
|
367
|
-
const derivedRoleArn = rootProfile?.type === "oidc" ? rootProfile.oidcRoleArn : undefined;
|
|
368
|
-
return {
|
|
369
|
-
primaryRegion: this.rootConfig.primaryRegion,
|
|
370
|
-
secondaryRegions: this.rootConfig.secondaryRegions,
|
|
371
|
-
disasterRecoveryRegion: this.rootConfig.disasterRecoveryRegion,
|
|
372
|
-
providerAccounts: this.rootConfig.providerAccounts,
|
|
373
|
-
ssoSessions: this.rootConfig.ssoSessions,
|
|
374
|
-
rootOidcRoleArn: derivedRoleArn ?? this.rootConfig.rootOidcRoleArn
|
|
375
|
-
};
|
|
221
|
+
// Deploy stage management
|
|
222
|
+
getDeployStages() {
|
|
223
|
+
return this.rootConfig.deploy ?? {};
|
|
376
224
|
}
|
|
377
|
-
|
|
378
|
-
return this.rootConfig.
|
|
225
|
+
getDeployStage(name) {
|
|
226
|
+
return this.rootConfig.deploy?.[name];
|
|
379
227
|
}
|
|
380
|
-
|
|
381
|
-
this.rootConfig.
|
|
228
|
+
setDeployStage(name, stage) {
|
|
229
|
+
if (!this.rootConfig.deploy) {
|
|
230
|
+
this.rootConfig.deploy = {};
|
|
231
|
+
}
|
|
232
|
+
this.rootConfig.deploy[name] = stage;
|
|
233
|
+
}
|
|
234
|
+
removeDeployStage(name) {
|
|
235
|
+
if (!this.rootConfig.deploy?.[name])
|
|
236
|
+
return false;
|
|
237
|
+
delete this.rootConfig.deploy[name];
|
|
238
|
+
if (this.rootConfig.activeStage === name) {
|
|
239
|
+
this.rootConfig.activeStage = undefined;
|
|
240
|
+
}
|
|
241
|
+
return true;
|
|
382
242
|
}
|
|
383
|
-
|
|
384
|
-
return this.rootConfig.
|
|
243
|
+
getActiveStage() {
|
|
244
|
+
return this.rootConfig.activeStage;
|
|
385
245
|
}
|
|
386
|
-
|
|
387
|
-
this.rootConfig.
|
|
246
|
+
setActiveStage(name) {
|
|
247
|
+
this.rootConfig.activeStage = name;
|
|
388
248
|
}
|
|
389
|
-
|
|
390
|
-
|
|
249
|
+
// Domain management
|
|
250
|
+
getDomains() {
|
|
251
|
+
return this.rootConfig.domains ?? [];
|
|
391
252
|
}
|
|
392
|
-
|
|
393
|
-
this.rootConfig.
|
|
253
|
+
setDomains(domains) {
|
|
254
|
+
this.rootConfig.domains = domains;
|
|
394
255
|
}
|
|
395
|
-
|
|
396
|
-
|
|
256
|
+
addDomain(domain) {
|
|
257
|
+
if (!this.rootConfig.domains) {
|
|
258
|
+
this.rootConfig.domains = [];
|
|
259
|
+
}
|
|
260
|
+
this.rootConfig.domains.push(domain);
|
|
397
261
|
}
|
|
398
|
-
|
|
399
|
-
this.rootConfig.
|
|
262
|
+
getDomain(name) {
|
|
263
|
+
return this.rootConfig.domains?.find((d) => d.name.toLowerCase() === name.toLowerCase());
|
|
400
264
|
}
|
|
401
|
-
|
|
402
|
-
if (
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
if (
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
this.rootConfig.disasterRecoveryRegion = config.disasterRecoveryRegion;
|
|
410
|
-
}
|
|
411
|
-
if (config.providerAccounts !== undefined) {
|
|
412
|
-
this.rootConfig.providerAccounts = config.providerAccounts;
|
|
413
|
-
}
|
|
414
|
-
if (config.ssoSessions !== undefined) {
|
|
415
|
-
this.rootConfig.ssoSessions = config.ssoSessions;
|
|
416
|
-
}
|
|
417
|
-
if (config.rootOidcRoleArn !== undefined) {
|
|
418
|
-
this.rootConfig.rootOidcRoleArn = config.rootOidcRoleArn;
|
|
419
|
-
}
|
|
265
|
+
removeDomain(name) {
|
|
266
|
+
if (!this.rootConfig.domains)
|
|
267
|
+
return false;
|
|
268
|
+
const index = this.rootConfig.domains.findIndex((d) => d.name.toLowerCase() === name.toLowerCase());
|
|
269
|
+
if (index === -1)
|
|
270
|
+
return false;
|
|
271
|
+
this.rootConfig.domains.splice(index, 1);
|
|
272
|
+
return true;
|
|
420
273
|
}
|
|
421
274
|
}
|
|
422
275
|
exports.Config = Config;
|
|
423
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL0NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLDZCQUF3QjtBQUl4Qjs7O0dBR0c7QUFDSCxNQUFNLHVCQUF1QixHQUFHLEVBQUUsQ0FBQztBQStEbkMsNkJBQTZCO0FBQzdCLE1BQU0sa0JBQWtCLEdBQUcsT0FBQztLQUN6QixNQUFNLENBQUM7SUFDTixjQUFjLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtJQUMxQixhQUFhLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtDQUMxQixDQUFDO0tBQ0QsTUFBTSxFQUFFLENBQUM7QUFFWixNQUFNLG1CQUFtQixHQUFHLE9BQUM7S0FDMUIsTUFBTSxDQUFDO0lBQ04sRUFBRSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7SUFDZCxJQUFJLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUMzQixPQUFPLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUM5QiwwRkFBMEY7SUFDMUYsT0FBTyxFQUFFLE9BQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQzlDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxRQUFRLEVBQUU7SUFDM0MsZ0JBQWdCLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtDQUN4QyxDQUFDO0tBQ0QsTUFBTSxFQUFFLENBQUM7QUFFWixNQUFNLHFCQUFxQixHQUFHLE9BQUM7S0FDNUIsTUFBTSxDQUFDO0lBQ04sRUFBRSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7SUFDZCxJQUFJLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtJQUNoQixXQUFXLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtJQUN2QixPQUFP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Q0FBQztZQUN6QyxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDO1FBQzNELENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUF6WkQsd0JBeVpDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHR5cGUgeyBBY2NvdW50IH0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1vcmdhbml6YXRpb25zXCI7XG5leHBvcnQgdHlwZSB7IEFjY291bnQgfSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LW9yZ2FuaXphdGlvbnNcIjtcblxuLyoqXG4gKiBNYXhpbXVtIGRlcHRoIGZvciBzZWFyY2hpbmcgdXAgdGhlIGRpcmVjdG9yeSB0cmVlIGZvciBjb25maWcgZmlsZXMuXG4gKiBQcmV2ZW50cyBpbmZpbml0ZSBsb29wcyB3aGVuIHRyYXZlcnNpbmcgZGlyZWN0b3JpZXMuXG4gKi9cbmNvbnN0IENPTkZJR19TRUFSQ0hfTUFYX0RFUFRIID0gMTA7XG5cbmV4cG9ydCB0eXBlIFNlcnZpY2VDb25maWcgPSB7XG4gIGlkOiBzdHJpbmc7XG4gIHR5cGU/OiBzdHJpbmc7XG4gIHZlcnNpb24/OiBudW1iZXI7XG4gIG9wdGlvbnM/OiBvYmplY3Q7XG4gIGRvY2tlckNvbmZpZz86IHtcbiAgICBkb2NrZXJmaWxlUGF0aDogc3RyaW5nO1xuICAgIGNvbnRhaW5lclBvcnQ6IG51bWJlcjtcbiAgfTtcbiAgYXBpQXBwbGljYXRpb25JZD86IHN0cmluZzsgLy8gRmphbGwgQVBJIGFwcGxpY2F0aW9uIElEXG59O1xuXG5leHBvcnQgdHlwZSBQcm92aWRlckFjY291bnQgPSB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZW52aXJvbm1lbnQ6IHN0cmluZztcbiAgbWFuYWdlZD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBQcm9maWxlID0ge1xuICB0eXBlOiBcInNzb1wiIHwgXCJvaWRjXCI7XG4gIHJlZ2lvbjogc3RyaW5nO1xuICAvLyBTU08gcHJvZmlsZXNcbiAgc3NvQWNjb3VudElkPzogc3RyaW5nO1xuICBzc29Sb2xlTmFtZT86IHN0cmluZztcbiAgc3NvU2Vzc2lvbj86IHN0cmluZztcbiAgLy8gT0lEQyBwcm9maWxlcyAoQ0kvQ0QgYW5kIEZqYWxsLWlzc3VlZClcbiAgb2lkY1JvbGVBcm4/OiBzdHJpbmc7XG4gIG9pZGNQcm92aWRlckFybj86IHN0cmluZztcbiAgLy8gUm9sZSBhc3N1bXB0aW9uICh1c2VkIGluIEFXUyBjb25maWcgZmlsZSBnZW5lcmF0aW9uKVxuICByb2xlQXJuPzogc3RyaW5nO1xuICByb2xlU2Vzc2lvbk5hbWU/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBTU09TZXNzaW9uID0ge1xuICBzc29SZWdpb246IHN0cmluZztcbiAgc3NvU3RhcnRVcmw6IHN0cmluZztcbn07XG5cbnR5cGUgUm9vdENvbmZpZyA9IHtcbiAgdmVyc2lvbj86IG51bWJlcjtcbiAgZGV2ZWxvcG1lbnQ/OiBib29sZWFuO1xuICBzZXJ2aWNlcz86IHsgW2tleTogc3RyaW5nXTogU2VydmljZUNvbmZpZyB9O1xuICBwcm92aWRlckFjY291bnRzPzogUHJvdmlkZXJBY2NvdW50W107XG4gIHByaW1hcnlSZWdpb24/OiBzdHJpbmc7XG4gIHNlY29uZGFyeVJlZ2lvbnM/OiBzdHJpbmdbXTtcbiAgZGlzYXN0ZXJSZWNvdmVyeVJlZ2lvbj86IHN0cmluZztcbiAgLy8gUHJvZmlsZSBtYW5hZ2VtZW50XG4gIGN1cnJlbnRQcm9maWxlPzogc3RyaW5nO1xuICBwcm9maWxlcz86IHsgW2tleTogc3RyaW5nXTogUHJvZmlsZSB9O1xuICBzc29TZXNzaW9ucz86IHsgW2tleTogc3RyaW5nXTogU1NPU2Vzc2lvbiB9O1xuICAvLyBPcmdhbmlzYXRpb24gaWRlbnRpdHkgKGZyb20gRmphbGwgQVBJKVxuICBvcmdhbmlzYXRpb25JZD86IHN0cmluZztcbiAgb3JnYW5pc2F0aW9uTmFtZT86IHN0cmluZztcbiAgb3JnYW5pc2F0aW9uRW1haWw/OiBzdHJpbmc7XG4gIC8vIE9JREMgY29uZmlndXJhdGlvblxuXG4gIG9pZGNJc3N1ZXJVcmw/OiBzdHJpbmc7XG4gIHJvb3RPaWRjUm9sZUFybj86IHN0cmluZztcbn07XG5cbi8vIFpvZCBzY2hlbWFzIGZvciB2YWxpZGF0aW9uXG5jb25zdCBEb2NrZXJDb25maWdTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIGRvY2tlcmZpbGVQYXRoOiB6LnN0cmluZygpLFxuICAgIGNvbnRhaW5lclBvcnQ6IHoubnVtYmVyKClcbiAgfSlcbiAgLnN0cmljdCgpO1xuXG5jb25zdCBTZXJ2aWNlQ29uZmlnU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBpZDogei5zdHJpbmcoKSxcbiAgICB0eXBlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgdmVyc2lvbjogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIC8vIHBhc3N0aHJvdWdoOiBzZXJ2aWNlIG9wdGlvbnMgYXJlIGFyYml0cmFyeSBrZXktdmFsdWUgcGFpcnMgZGVmaW5lZCBieSBlYWNoIHNlcnZpY2UgdHlwZVxuICAgIG9wdGlvbnM6IHoub2JqZWN0KHt9KS5wYXNzdGhyb3VnaCgpLm9wdGlvbmFsKCksXG4gICAgZG9ja2VyQ29uZmlnOiBEb2NrZXJDb25maWdTY2hlbWEub3B0aW9uYWwoKSxcbiAgICBhcGlBcHBsaWNhdGlvbklkOiB6LnN0cmluZygpLm9wdGlvbmFsKClcbiAgfSlcbiAgLnN0cmljdCgpO1xuXG5jb25zdCBQcm92aWRlckFjY291bnRTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIGlkOiB6LnN0cmluZygpLFxuICAgIG5hbWU6IHouc3RyaW5nKCksXG4gICAgZW52aXJvbm1lbnQ6IHouc3RyaW5nKCksXG4gICAgbWFuYWdlZDogei5ib29sZWFuKCkub3B0aW9uYWwoKVxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmNvbnN0IFByb2ZpbGVTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIHR5cGU6IHouZW51bShbXCJzc29cIiwgXCJvaWRjXCJdKSxcbiAgICByZWdpb246IHouc3RyaW5nKCksXG4gICAgc3NvQWNjb3VudElkOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgc3NvUm9sZU5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBzc29TZXNzaW9uOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgb2lkY1JvbGVBcm46IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBvaWRjUHJvdmlkZXJBcm46IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICByb2xlQXJuOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgcm9sZVNlc3Npb25OYW1lOiB6LnN0cmluZygpLm9wdGlvbmFsKClcbiAgfSlcbiAgLnN0cmljdCgpO1xuXG5jb25zdCBTU09TZXNzaW9uU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBzc29SZWdpb246IHouc3RyaW5nKCksXG4gICAgc3NvU3RhcnRVcmw6IHouc3RyaW5nKClcbiAgfSlcbiAgLnN0cmljdCgpO1xuXG5jb25zdCBSb290Q29uZmlnU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICB2ZXJzaW9uOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgZGV2ZWxvcG1lbnQ6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gICAgc2VydmljZXM6IHoucmVjb3JkKHouc3RyaW5nKCksIFNlcnZpY2VDb25maWdTY2hlbWEpLm9wdGlvbmFsKCksXG4gICAgcHJvdmlkZXJBY2NvdW50czogei5hcnJheShQcm92aWRlckFjY291bnRTY2hlbWEpLm9wdGlvbmFsKCksXG4gICAgcHJpbWFyeVJlZ2lvbjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIHNlY29uZGFyeVJlZ2lvbnM6IHouYXJyYXkoei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICBkaXNhc3RlclJlY292ZXJ5UmVnaW9uOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgY3VycmVudFByb2ZpbGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBwcm9maWxlczogei5yZWNvcmQoei5zdHJpbmcoKSwgUHJvZmlsZVNjaGVtYSkub3B0aW9uYWwoKSxcbiAgICBzc29TZXNzaW9uczogei5yZWNvcmQoei5zdHJpbmcoKSwgU1NPU2Vzc2lvblNjaGVtYSkub3B0aW9uYWwoKSxcbiAgICBvcmdhbmlzYXRpb25JZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIG9yZ2FuaXNhdGlvbk5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBvcmdhbmlzYXRpb25FbWFpbDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuXG4gICAgb2lkY0lzc3VlclVybDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIHJvb3RPaWRjUm9sZUFybjogei5zdHJpbmcoKS5vcHRpb25hbCgpXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuY29uc3QgQWNjb3VudFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgSWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBBcm46IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBFbWFpbDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIE5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBTdGF0dXM6IHouZW51bShbXCJBQ1RJVkVcIiwgXCJTVVNQRU5ERURcIiwgXCJQRU5ESU5HX0NMT1NVUkVcIl0pLm9wdGlvbmFsKCksXG4gICAgSm9pbmVkTWV0aG9kOiB6LmVudW0oW1wiSU5WSVRFRFwiLCBcIkNSRUFURURcIl0pLm9wdGlvbmFsKCksXG4gICAgLy8gei5jb2VyY2UuZGF0ZSgpIGhhbmRsZXMgYm90aCBEYXRlIG9iamVjdHMgKGZyb20gQVdTIFNESykgYW5kIElTTyA4NjAxIHN0cmluZ3MgKGZyb20gSlNPTiBwYXJzaW5nKVxuICAgIEpvaW5lZFRpbWVzdGFtcDogei5jb2VyY2UuZGF0ZSgpLm9wdGlvbmFsKClcbiAgfSlcbiAgLy8gcGFzc3Rocm91Z2g6IEFXUyBTREsgQWNjb3VudCBvYmplY3RzIG1heSBjb250YWluIGFkZGl0aW9uYWwgcHJvcGVydGllcyBub3QgaW4gb3VyIHNjaGVtYVxuICAucGFzc3Rocm91Z2goKTtcblxuLyoqXG4gKiBUaGUgY3VycmVudCBiYXNlLXZlcnNpb24gb2YgYW55IG5ld2x5IGNyZWF0ZWQgY29uZmlnIGZpbGVcbiAqL1xuY29uc3QgQkFTRV9DT05GSUdfVkVSU0lPTiA9IDAuMTtcblxuLyoqXG4gKiBDb25maWcgY2xhc3MgZm9yIGxvYWRpbmcgYW5kIHNhdmluZyBmamFsbC1jb25maWcuanNvbiBmaWxlXG4gKi9cbmV4cG9ydCB0eXBlIE9yZ0xldmVsQ29uZmlnID0ge1xuICBwcmltYXJ5UmVnaW9uPzogc3RyaW5nO1xuICBzZWNvbmRhcnlSZWdpb25zPzogc3RyaW5nW107XG4gIGRpc2FzdGVyUmVjb3ZlcnlSZWdpb24/OiBzdHJpbmc7XG4gIHByb3ZpZGVyQWNjb3VudHM/OiBQcm92aWRlckFjY291bnRbXTtcbiAgc3NvU2Vzc2lvbnM/OiB7IFtrZXk6IHN0cmluZ106IFNTT1Nlc3Npb24gfTtcbiAgcm9vdE9pZGNSb2xlQXJuPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNsYXNzIENvbmZpZyB7XG4gIHJvb3RDb25maWc6IFJvb3RDb25maWc7XG4gIGV4aXN0aW5nQWNjb3VudHNDb25maWc6IEFjY291bnRbXTtcblxuICBjb25zdHJ1Y3Rvcihyb290Q29uZmlnPzogUm9vdENvbmZpZywgZXhpc3RpbmdBY2NvdW50c0NvbmZpZz86IEFjY291bnRbXSkge1xuICAgIHRoaXMucm9vdENvbmZpZyA9IHJvb3RDb25maWcgPz8ge1xuICAgICAgdmVyc2lvbjogQkFTRV9DT05GSUdfVkVSU0lPTixcbiAgICAgIHNlcnZpY2VzOiB7fSxcbiAgICAgIHByb3ZpZGVyQWNjb3VudHM6IFtdXG4gICAgfTtcbiAgICB0aGlzLmV4aXN0aW5nQWNjb3VudHNDb25maWcgPSBleGlzdGluZ0FjY291bnRzQ29uZmlnID8/IFtdO1xuICB9XG5cbiAgaXNEZXZlbG9wbWVudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLnJvb3RDb25maWc/LmRldmVsb3BtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgdGhlIGZqYWxsIGNvbmZpZyBkaXJlY3RvcnkgYnkgd2Fsa2luZyB1cCB0aGUgZGlyZWN0b3J5IHRyZWVcbiAgICogQHJldHVybnMgVGhlIHBhdGggdG8gdGhlIGZqYWxsIGNvbmZpZyBkaXJlY3Rvcnkgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGZpbmRDb25maWdEaXJlY3RvcnkoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgbGV0IGN1cnJlbnREaXIgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBDT05GSUdfU0VBUkNIX01BWF9ERVBUSDsgaSsrKSB7XG4gICAgICBjb25zdCBmamFsbERpciA9IHBhdGguam9pbihjdXJyZW50RGlyLCBcImZqYWxsXCIpO1xuICAgICAgY29uc3QgY29uZmlnRmlsZSA9IHBhdGguam9pbihmamFsbERpciwgXCJmamFsbC1jb25maWcuanNvblwiKTtcblxuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoY29uZmlnRmlsZSkpIHtcbiAgICAgICAgcmV0dXJuIGZqYWxsRGlyO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkaXJlY3RDb25maWdGaWxlID0gcGF0aC5qb2luKGN1cnJlbnREaXIsIFwiZmphbGwtY29uZmlnLmpzb25cIik7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJlY3RDb25maWdGaWxlKSkge1xuICAgICAgICByZXR1cm4gY3VycmVudERpcjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyZW50RGlyID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXIpO1xuICAgICAgaWYgKHBhcmVudERpciA9PT0gY3VycmVudERpcikgYnJlYWs7XG4gICAgICBjdXJyZW50RGlyID0gcGFyZW50RGlyO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgY29uZmlnIGZpbGUgaW50byBtZW1vcnkgYXMgYSByYXcgSlNPTiBzdHJpbmdcbiAgICogQHBhcmFtIGNvbmZpZ0ZpbGUgLSBQYXRoIHRvIHRoZSBjb25maWcgZmlsZVxuICAgKiBAcmV0dXJucyBDb25maWcgYXMgSlNPTiBzdHJpbmcgb3IgTlVMTCBpZiBubyBjb25maWcgZmlsZSBhY2Nlc3NpYmxlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBsb2FkQ29uZmlnRmlsZShjb25maWdGaWxlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgZnMuYWNjZXNzU3luYyhjb25maWdGaWxlLCBmcy5jb25zdGFudHMuUl9PSyB8IGZzLmNvbnN0YW50cy5XX09LKTtcbiAgICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmMoY29uZmlnRmlsZSwgeyBlbmNvZGluZzogXCJ1dGY4XCIgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBGaWxlIG5vdCBhY2Nlc3NpYmxlIG9yIG5vdCByZWFkYWJsZSDigJQgY2FsbGVyIGhhbmRsZXMgbnVsbFxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgY29uZmlndXJhdGlvbiBmcm9tIGZpbGVcbiAgICpcbiAgICogQHJldHVybnMgTG9hZGVkIGNvbmZpZ3VyYXRpb25cbiAgICogQHRocm93cyBFcnJvciBpZiBjb25maWcgZmlsZSBjYW5ub3QgYmUgcGFyc2VkIG9yIGZhaWxzIHNjaGVtYSB2YWxpZGF0aW9uXG4gICAqL1xuICBzdGF0aWMgbG9hZENvbmZpZygpOiBDb25maWcge1xuICAgIGNvbnN0IGNvbmZpZ0RpciA9IENvbmZpZy5maW5kQ29uZmlnRGlyZWN0b3J5KCk7XG4gICAgaWYgKCFjb25maWdEaXIpIHtcbiAgICAgIHJldHVybiBuZXcgQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgY29uc3Qgcm9vdENvbmZpZ0pzb24gPSBDb25maWcubG9hZENvbmZpZ0ZpbGUoXG4gICAgICBwYXRoLmpvaW4oY29uZmlnRGlyLCBcImZqYWxsLWNvbmZpZy5qc29uXCIpXG4gICAgKTtcbiAgICBjb25zdCBleGlzdGluZ0FjY291bnRKc29uID0gQ29uZmlnLmxvYWRDb25maWdGaWxlKFxuICAgICAgcGF0aC5qb2luKGNvbmZpZ0RpciwgXCJhY2NvdW50cy1jb25maWcuanNvblwiKVxuICAgICk7XG5cbiAgICAvLyBQYXJzZSBlYWNoIGNvbmZpZyBmaWxlIHNlcGFyYXRlbHkgdG8gaWRlbnRpZnkgd2hpY2ggb25lIGZhaWxzXG4gICAgbGV0IHJvb3RDb25maWc6IFJvb3RDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGV4aXN0aW5nQWNjb3VudHNDb25maWc6IEFjY291bnRbXSB8IHVuZGVmaW5lZDtcblxuICAgIC8vIDEuIFBhcnNlIHJvb3QgY29uZmlnIChmamFsbC1jb25maWcuanNvbilcbiAgICBpZiAocm9vdENvbmZpZ0pzb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJvb3RDb25maWcgPSBSb290Q29uZmlnU2NoZW1hLnBhcnNlKEpTT04ucGFyc2Uocm9vdENvbmZpZ0pzb24pKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aHJvdyBDb25maWcuZm9ybWF0Wm9kRXJyb3IoZXJyLCBcImZqYWxsLWNvbmZpZy5qc29uXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDIuIFBhcnNlIGFjY291bnRzIGNvbmZpZyAoYWNjb3VudHMtY29uZmlnLmpzb24pXG4gICAgaWYgKGV4aXN0aW5nQWNjb3VudEpzb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJhdyA9IEpTT04ucGFyc2UoZXhpc3RpbmdBY2NvdW50SnNvbik7XG4gICAgICAgIGV4aXN0aW5nQWNjb3VudHNDb25maWcgPSB6LmFycmF5KEFjY291bnRTY2hlbWEpLnBhcnNlKHJhdyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgQ29uZmlnLmZvcm1hdFpvZEVycm9yKGVyciwgXCJhY2NvdW50cy1jb25maWcuanNvblwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IENvbmZpZyhyb290Q29uZmlnLCBleGlzdGluZ0FjY291bnRzQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgYSBab2QgZXJyb3IgaW50byBhIHJlYWRhYmxlIGVycm9yIG1lc3NhZ2VcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGZvcm1hdFpvZEVycm9yKGVycjogdW5rbm93biwgZmlsZU5hbWU6IHN0cmluZyk6IEVycm9yIHtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2Ygei5ab2RFcnJvciAmJiBlcnIuaXNzdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGlzc3VlRGV0YWlscyA9IGVyci5pc3N1ZXNcbiAgICAgICAgLm1hcCgoaXNzdWUpID0+IGAke2lzc3VlLnBhdGguam9pbihcIi5cIil9OiAke2lzc3VlLm1lc3NhZ2V9YClcbiAgICAgICAgLmpvaW4oXCI7IFwiKTtcbiAgICAgIHJldHVybiBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSAke2ZpbGVOYW1lfTogJHtpc3N1ZURldGFpbHN9YCk7XG4gICAgfVxuICAgIC8vIEZhbGwgYmFjayB0byB0aGUgZXJyb3IgbWVzc2FnZSwgYnV0IHJlcGxhY2UgbmV3bGluZXMgdG8ga2VlcCBpdCBvbiBvbmUgbGluZVxuICAgIGNvbnN0IHJhd01lc3NhZ2UgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgY29uc3QgbWVzc2FnZSA9IHJhd01lc3NhZ2UucmVwbGFjZSgvXFxuL2csIFwiIFwiKS5zdWJzdHJpbmcoMCwgNTAwKTtcbiAgICByZXR1cm4gbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgJHtmaWxlTmFtZX06ICR7bWVzc2FnZX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGNvbmZpZ3VyYXRpb24gdG8gZmlsZVxuICAgKi9cbiAgc2F2ZUNvbmZpZygpOiB2b2lkIHtcbiAgICBjb25zdCBjb25maWdEaXIgPVxuICAgICAgQ29uZmlnLmZpbmRDb25maWdEaXJlY3RvcnkoKSB8fCBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgXCJmamFsbFwiKTtcblxuICAgIC8vIEVuc3VyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgZnMubWtkaXJTeW5jKGNvbmZpZ0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBjb25zdCByb290SnNvblN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHRoaXMucm9vdENvbmZpZywgbnVsbCwgMik7XG4gICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgIHBhdGguam9pbihjb25maWdEaXIsIFwiZmphbGwtY29uZmlnLmpzb25cIiksXG4gICAgICByb290SnNvblN0cmluZyxcbiAgICAgIHtcbiAgICAgICAgbW9kZTogMG82MDBcbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uc3QgZXhpc3RpbmdBY2NvdW50c0pzb25TdHJpbmcgPSBKU09OLnN0cmluZ2lmeShcbiAgICAgIHRoaXMuZXhpc3RpbmdBY2NvdW50c0NvbmZpZyxcbiAgICAgIG51bGwsXG4gICAgICAyXG4gICAgKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgcGF0aC5qb2luKGNvbmZpZ0RpciwgXCJhY2NvdW50cy1jb25maWcuanNvblwiKSxcbiAgICAgIGV4aXN0aW5nQWNjb3VudHNKc29uU3RyaW5nLFxuICAgICAgeyBtb2RlOiAwbzYwMCB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBuZXcgc2VydmljZSB0byB0aGUgY29uZmlnIGZpbGVcbiAgICogQHBhcmFtIHNlcnZpY2VLZXkgTmFtZS9rZXkgb2YgdGhlIHNlcnZpY2VcbiAgICogQHBhcmFtIGNvbmZpZyBTZXJ2aWNlIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllc1xuICAgKi9cbiAgYWRkU2VydmljZShzZXJ2aWNlS2V5OiBzdHJpbmcsIGNvbmZpZzogU2VydmljZUNvbmZpZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLnNlcnZpY2VzKSB0aGlzLnJvb3RDb25maWcuc2VydmljZXMgPSB7fTtcbiAgICB0aGlzLnJvb3RDb25maWcuc2VydmljZXNbc2VydmljZUtleV0gPSBjb25maWc7XG4gIH1cblxuICBnZXRTZXJ2aWNlQ29uZmlnKHNlcnZpY2VLZXk6IHN0cmluZyk6IFNlcnZpY2VDb25maWcgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMucm9vdENvbmZpZy5zZXJ2aWNlcykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMucm9vdENvbmZpZy5zZXJ2aWNlc1tzZXJ2aWNlS2V5XSB8fCBudWxsO1xuICB9XG5cbiAgYWRkUHJvdmlkZXJBY2NvdW50KGFjY291bnQ6IFByb3ZpZGVyQWNjb3VudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLnByb3ZpZGVyQWNjb3VudHMpXG4gICAgICB0aGlzLnJvb3RDb25maWcucHJvdmlkZXJBY2NvdW50cyA9IFtdO1xuXG4gICAgLy8gZW5zdXJlIGFjY291bnQgbmFtZSBpcyBhbHdheXMgbG93ZXJjYXNlXG4gICAgYWNjb3VudC5uYW1lID0gYWNjb3VudC5uYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG5cbiAgICB0aGlzLnJvb3RDb25maWcucHJvdmlkZXJBY2NvdW50cy5wdXNoKGFjY291bnQpO1xuICB9XG5cbiAgZ2V0UHJvdmlkZXJBY2NvdW50KGFjY291bnROYW1lOiBzdHJpbmcpOiBQcm92aWRlckFjY291bnQgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLnByb3ZpZGVyQWNjb3VudHMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMucm9vdENvbmZpZy5wcm92aWRlckFjY291bnRzLmZpbmQoXG4gICAgICAoYWNjb3VudCkgPT5cbiAgICAgICAgYWNjb3VudC5uYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09IGFjY291bnROYW1lLnRvTG9jYWxlTG93ZXJDYXNlKClcbiAgICApO1xuICB9XG5cbiAgZ2V0UHJvdmlkZXJBY2NvdW50QnlJZChhY2NvdW50SWQ6IHN0cmluZyk6IFByb3ZpZGVyQWNjb3VudCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLnJvb3RDb25maWcucHJvdmlkZXJBY2NvdW50cykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy5yb290Q29uZmlnLnByb3ZpZGVyQWNjb3VudHMuZmluZChcbiAgICAgIChhY2NvdW50KSA9PiBhY2NvdW50LmlkID09PSBhY2NvdW50SWRcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwcm92aWRlciBhY2NvdW50IGJ5IGVudmlyb25tZW50IHR5cGVcbiAgICogQHBhcmFtIGVudmlyb25tZW50IFRoZSBlbnZpcm9ubWVudCB0eXBlIChlLmcuLCAncGxhdGZvcm0nLCAnc3RhZ2luZycsICdwcm9kdWN0aW9uJylcbiAgICogQHJldHVybnMgVGhlIHByb3ZpZGVyIGFjY291bnQgd2l0aCB0aGUgc3BlY2lmaWVkIGVudmlyb25tZW50IG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmRcbiAgICovXG4gIGdldEFjY291bnRCeUVudmlyb25tZW50KGVudmlyb25tZW50OiBzdHJpbmcpOiBQcm92aWRlckFjY291bnQgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLnByb3ZpZGVyQWNjb3VudHMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMucm9vdENvbmZpZy5wcm92aWRlckFjY291bnRzLmZpbmQoXG4gICAgICAoYWNjb3VudCkgPT4gYWNjb3VudC5lbnZpcm9ubWVudCA9PT0gZW52aXJvbm1lbnRcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGV4aXN0aW5nIGFjY291bnRzIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBieSBBY2NvdW50U2VydmljZVxuICAgKiBhZnRlciBpdCBmZXRjaGVzIHRoZSBhY2NvdW50cyBmcm9tIEFXUy5cbiAgICogQHBhcmFtIGFjY291bnRzIExpc3Qgb2YgQVdTIGFjY291bnRzIGZyb20gT3JnYW5pemF0aW9ucyBBUElcbiAgICovXG4gIHNldEV4aXN0aW5nQWNjb3VudHNMaXN0KGFjY291bnRzOiBBY2NvdW50W10pOiB2b2lkIHtcbiAgICB0aGlzLmV4aXN0aW5nQWNjb3VudHNDb25maWcgPSBhY2NvdW50cztcbiAgfVxuXG4gIGdldEV4aXN0aW5nQWNjb3VudHMoKTogQWNjb3VudFtdIHtcbiAgICByZXR1cm4gdGhpcy5leGlzdGluZ0FjY291bnRzQ29uZmlnO1xuICB9XG5cbiAgc2V0UHJpbWFyeVJlZ2lvbihyZWdpb246IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucm9vdENvbmZpZy5wcmltYXJ5UmVnaW9uID0gcmVnaW9uO1xuICB9XG5cbiAgc2V0U2Vjb25kYXJ5UmVnaW9ucyhyZWdpb25zOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMucm9vdENvbmZpZy5zZWNvbmRhcnlSZWdpb25zID0gcmVnaW9ucztcbiAgfVxuXG4gIHNldERpc2FzdGVyUmVjb3ZlcnlSZWdpb24ocmVnaW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnJvb3RDb25maWcuZGlzYXN0ZXJSZWNvdmVyeVJlZ2lvbiA9IHJlZ2lvbjtcbiAgfVxuXG4gIGdldFByaW1hcnlSZWdpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yb290Q29uZmlnLnByaW1hcnlSZWdpb247XG4gIH1cblxuICBnZXRTZWNvbmRhcnlSZWdpb25zKCk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yb290Q29uZmlnLnNlY29uZGFyeVJlZ2lvbnM7XG4gIH1cblxuICBnZXREaXNhc3RlclJlY292ZXJ5UmVnaW9uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucm9vdENvbmZpZy5kaXNhc3RlclJlY292ZXJ5UmVnaW9uO1xuICB9XG5cbiAgZ2V0QWxsUmVnaW9ucygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcmVnaW9uczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmICh0aGlzLnJvb3RDb25maWcucHJpbWFyeVJlZ2lvbikge1xuICAgICAgcmVnaW9ucy5wdXNoKHRoaXMucm9vdENvbmZpZy5wcmltYXJ5UmVnaW9uKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yb290Q29uZmlnLnNlY29uZGFyeVJlZ2lvbnMpIHtcbiAgICAgIHJlZ2lvbnMucHVzaCguLi50aGlzLnJvb3RDb25maWcuc2Vjb25kYXJ5UmVnaW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5yb290Q29uZmlnLmRpc2FzdGVyUmVjb3ZlcnlSZWdpb24gJiZcbiAgICAgICFyZWdpb25zLmluY2x1ZGVzKHRoaXMucm9vdENvbmZpZy5kaXNhc3RlclJlY292ZXJ5UmVnaW9uKVxuICAgICkge1xuICAgICAgcmVnaW9ucy5wdXNoKHRoaXMucm9vdENvbmZpZy5kaXNhc3RlclJlY292ZXJ5UmVnaW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVnaW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGZqYWxsIGNvbmZpZyBkaXJlY3RvcnkgcGF0aFxuICAgKiBAcmV0dXJucyBUaGUgcGF0aCB0byB0aGUgZmphbGwgY29uZmlnIGRpcmVjdG9yeSBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgc3RhdGljIGdldENvbmZpZ0RpcmVjdG9yeSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gQ29uZmlnLmZpbmRDb25maWdEaXJlY3RvcnkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9maWxlIG1hbmFnZW1lbnQgbWV0aG9kc1xuICAgKi9cblxuICAvKipcbiAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBwcm9maWxlLlxuICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBwcm9maWxlIG5hbWUsIG9yIHVuZGVmaW5lZCBpZiBubyBwcm9maWxlIGlzIHNldFxuICAgKi9cbiAgZ2V0Q3VycmVudFByb2ZpbGUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yb290Q29uZmlnLmN1cnJlbnRQcm9maWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGN1cnJlbnRseSBhY3RpdmUgcHJvZmlsZS5cbiAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb2ZpbGUgdG8gc2V0IGFzIGN1cnJlbnRcbiAgICovXG4gIHNldEN1cnJlbnRQcm9maWxlKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucm9vdENvbmZpZy5jdXJyZW50UHJvZmlsZSA9IG5hbWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIGEgcHJvZmlsZSBieSBuYW1lLlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvZmlsZSB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJucyBUaGUgcHJvZmlsZSBjb25maWd1cmF0aW9uLCBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kXG4gICAqL1xuICBnZXRQcm9maWxlKG5hbWU6IHN0cmluZyk6IFByb2ZpbGUgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLnByb2ZpbGVzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcucHJvZmlsZXNbbmFtZV07XG4gIH1cblxuICBnZXRBbGxQcm9maWxlTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLnByb2ZpbGVzKSByZXR1cm4gW107XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMucm9vdENvbmZpZy5wcm9maWxlcyk7XG4gIH1cblxuICBhZGRQcm9maWxlKG5hbWU6IHN0cmluZywgcHJvZmlsZTogUHJvZmlsZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLnByb2ZpbGVzKSB7XG4gICAgICB0aGlzLnJvb3RDb25maWcucHJvZmlsZXMgPSB7fTtcbiAgICB9XG4gICAgdGhpcy5yb290Q29uZmlnLnByb2ZpbGVzW25hbWVdID0gcHJvZmlsZTtcbiAgfVxuXG4gIHJlbW92ZVByb2ZpbGUobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJvb3RDb25maWcucHJvZmlsZXMpIHJldHVybjtcbiAgICBkZWxldGUgdGhpcy5yb290Q29uZmlnLnByb2ZpbGVzW25hbWVdO1xuXG4gICAgLy8gSWYgd2UgcmVtb3ZlZCB0aGUgY3VycmVudCBwcm9maWxlLCBjbGVhciBpdFxuICAgIGlmICh0aGlzLnJvb3RDb25maWcuY3VycmVudFByb2ZpbGUgPT09IG5hbWUpIHtcbiAgICAgIHRoaXMucm9vdENvbmZpZy5jdXJyZW50UHJvZmlsZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBnZXRTU09TZXNzaW9uKG5hbWU6IHN0cmluZyk6IFNTT1Nlc3Npb24gfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLnNzb1Nlc3Npb25zKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcuc3NvU2Vzc2lvbnNbbmFtZV07XG4gIH1cblxuICBhZGRTU09TZXNzaW9uKG5hbWU6IHN0cmluZywgc2Vzc2lvbjogU1NPU2Vzc2lvbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLnNzb1Nlc3Npb25zKSB7XG4gICAgICB0aGlzLnJvb3RDb25maWcuc3NvU2Vzc2lvbnMgPSB7fTtcbiAgICB9XG4gICAgdGhpcy5yb290Q29uZmlnLnNzb1Nlc3Npb25zW25hbWVdID0gc2Vzc2lvbjtcbiAgfVxuXG4gIGdldE9yZ0xldmVsQ29uZmlnKCk6IE9yZ0xldmVsQ29uZmlnIHtcbiAgICAvLyBEZXJpdmUgcm9vdE9pZGNSb2xlQXJuIGZyb20gdGhlIHJvb3QgYWNjb3VudCdzIE9JREMgcHJvZmlsZSBpZiBhdmFpbGFibGUsXG4gICAgLy8gZmFsbGluZyBiYWNrIHRvIHRoZSBleHBsaWNpdGx5IHN0b3JlZCBmaWVsZCAoc2V0IGR1cmluZyBjb25maWcgcHVsbClcbiAgICBjb25zdCByb290QWNjb3VudCA9IHRoaXMucm9vdENvbmZpZy5wcm92aWRlckFjY291bnRzPy5maW5kKFxuICAgICAgKGEpID0+IGEuZW52aXJvbm1lbnQgPT09IFwicm9vdFwiXG4gICAgKTtcbiAgICBjb25zdCByb290UHJvZmlsZU5hbWUgPSByb290QWNjb3VudD8ubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHJvb3RQcm9maWxlID0gcm9vdFByb2ZpbGVOYW1lXG4gICAgICA/IHRoaXMucm9vdENvbmZpZy5wcm9maWxlcz8uW3Jvb3RQcm9maWxlTmFtZV1cbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRlcml2ZWRSb2xlQXJuID1cbiAgICAgIHJvb3RQcm9maWxlPy50eXBlID09PSBcIm9pZGNcIiA/IHJvb3RQcm9maWxlLm9pZGNSb2xlQXJuIDogdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHByaW1hcnlSZWdpb246IHRoaXMucm9vdENvbmZpZy5wcmltYXJ5UmVnaW9uLFxuICAgICAgc2Vjb25kYXJ5UmVnaW9uczogdGhpcy5yb290Q29uZmlnLnNlY29uZGFyeVJlZ2lvbnMsXG4gICAgICBkaXNhc3RlclJlY292ZXJ5UmVnaW9uOiB0aGlzLnJvb3RDb25maWcuZGlzYXN0ZXJSZWNvdmVyeVJlZ2lvbixcbiAgICAgIHByb3ZpZGVyQWNjb3VudHM6IHRoaXMucm9vdENvbmZpZy5wcm92aWRlckFjY291bnRzLFxuICAgICAgc3NvU2Vzc2lvbnM6IHRoaXMucm9vdENvbmZpZy5zc29TZXNzaW9ucyxcbiAgICAgIHJvb3RPaWRjUm9sZUFybjogZGVyaXZlZFJvbGVBcm4gPz8gdGhpcy5yb290Q29uZmlnLnJvb3RPaWRjUm9sZUFyblxuICAgIH07XG4gIH1cblxuICBnZXRPcmdhbmlzYXRpb25JZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcub3JnYW5pc2F0aW9uSWQ7XG4gIH1cblxuICBzZXRPcmdhbmlzYXRpb25JZChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yb290Q29uZmlnLm9yZ2FuaXNhdGlvbklkID0gaWQ7XG4gIH1cblxuICBnZXRPcmdhbmlzYXRpb25OYW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucm9vdENvbmZpZy5vcmdhbmlzYXRpb25OYW1lO1xuICB9XG5cbiAgc2V0T3JnYW5pc2F0aW9uTmFtZShuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnJvb3RDb25maWcub3JnYW5pc2F0aW9uTmFtZSA9IG5hbWU7XG4gIH1cblxuICBnZXRPcmdhbmlzYXRpb25FbWFpbCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcub3JnYW5pc2F0aW9uRW1haWw7XG4gIH1cblxuICBzZXRPcmdhbmlzYXRpb25FbWFpbChlbWFpbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yb290Q29uZmlnLm9yZ2FuaXNhdGlvbkVtYWlsID0gZW1haWw7XG4gIH1cblxuICBnZXRPaWRjSXNzdWVyVXJsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucm9vdENvbmZpZy5vaWRjSXNzdWVyVXJsO1xuICB9XG5cbiAgc2V0T2lkY0lzc3VlclVybCh1cmw6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucm9vdENvbmZpZy5vaWRjSXNzdWVyVXJsID0gdXJsO1xuICB9XG5cbiAgc2V0T3JnTGV2ZWxDb25maWcoY29uZmlnOiBPcmdMZXZlbENvbmZpZyk6IHZvaWQge1xuICAgIGlmIChjb25maWcucHJpbWFyeVJlZ2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnJvb3RDb25maWcucHJpbWFyeVJlZ2lvbiA9IGNvbmZpZy5wcmltYXJ5UmVnaW9uO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnNlY29uZGFyeVJlZ2lvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5yb290Q29uZmlnLnNlY29uZGFyeVJlZ2lvbnMgPSBjb25maWcuc2Vjb25kYXJ5UmVnaW9ucztcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kaXNhc3RlclJlY292ZXJ5UmVnaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucm9vdENvbmZpZy5kaXNhc3RlclJlY292ZXJ5UmVnaW9uID0gY29uZmlnLmRpc2FzdGVyUmVjb3ZlcnlSZWdpb247XG4gICAgfVxuICAgIGlmIChjb25maWcucHJvdmlkZXJBY2NvdW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnJvb3RDb25maWcucHJvdmlkZXJBY2NvdW50cyA9IGNvbmZpZy5wcm92aWRlckFjY291bnRzO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnNzb1Nlc3Npb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucm9vdENvbmZpZy5zc29TZXNzaW9ucyA9IGNvbmZpZy5zc29TZXNzaW9ucztcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yb290T2lkY1JvbGVBcm4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5yb290Q29uZmlnLnJvb3RPaWRjUm9sZUFybiA9IGNvbmZpZy5yb290T2lkY1JvbGVBcm47XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
276
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL0NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLDZCQUF3QjtBQUN4QiwyQ0FBcUM7QUFFckM7OztHQUdHO0FBQ0gsTUFBTSx1QkFBdUIsR0FBRyxFQUFFLENBQUM7QUEyQm5DLHlCQUF5QjtBQUN6QixNQUFNLGlCQUFpQixHQUFHLE9BQUM7S0FDeEIsTUFBTSxDQUFDO0lBQ04sT0FBTyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7SUFDbkIsT0FBTyxFQUFFLE9BQUMsQ0FBQyxLQUFLLENBQUMsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztDQUNwQyxDQUFDO0tBQ0QsTUFBTSxFQUFFLENBQUM7QUFJWixNQUFNLGtCQUFrQixHQUFHLE9BQUM7S0FDekIsTUFBTSxDQUFDO0lBQ04sSUFBSSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7SUFDaEIsSUFBSSxFQUFFLE9BQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDbkMsWUFBWSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDbkMsT0FBTyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDL0IsQ0FBQztLQUNELE1BQU0sRUFBRSxDQUFDO0FBSVosTUFBTSxnQkFBZ0IsR0FBRyxPQUFDO0tBQ3ZCLE1BQU0sQ0FBQztJQUNOLE9BQU8sRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQzlCLGdCQUFnQixFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDdkMsTUFBTSxFQUFFLE9BQUMsQ0FBQyxNQUFNLENBQUMsT0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLGlC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Q0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUNuRCxDQUFDO0lBQ0osQ0FBQztJQUVELFlBQVksQ0FBQyxJQUFZO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU87WUFBRSxPQUFPLEtBQUssQ0FBQztRQUMzQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQzdDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FDbkQsQ0FBQztRQUNGLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQy9CLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0Y7QUExUUQsd0JBMFFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4vbG9nZ2VyLmpzXCI7XG5cbi8qKlxuICogTWF4aW11bSBkZXB0aCBmb3Igc2VhcmNoaW5nIHVwIHRoZSBkaXJlY3RvcnkgdHJlZSBmb3IgY29uZmlnIGZpbGVzLlxuICogUHJldmVudHMgaW5maW5pdGUgbG9vcHMgd2hlbiB0cmF2ZXJzaW5nIGRpcmVjdG9yaWVzLlxuICovXG5jb25zdCBDT05GSUdfU0VBUkNIX01BWF9ERVBUSCA9IDEwO1xuXG5leHBvcnQgdHlwZSBQcm92aWRlckFjY291bnQgPSB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZW52aXJvbm1lbnQ6IHN0cmluZztcbiAgbWFuYWdlZD86IGJvb2xlYW47XG59O1xuXG4vLyBTdGFuZGFsb25lIHR5cGVzIOKAlCB1c2VkIGJ5IFByb2ZpbGVSZXNvbHZlciBhbmQgYXV0aCBzeXN0ZW0sIG5vdCBpbiBjb25maWcgZmlsZVxuZXhwb3J0IHR5cGUgUHJvZmlsZSA9IHtcbiAgdHlwZTogXCJzc29cIiB8IFwib2lkY1wiO1xuICByZWdpb246IHN0cmluZztcbiAgc3NvQWNjb3VudElkPzogc3RyaW5nO1xuICBzc29Sb2xlTmFtZT86IHN0cmluZztcbiAgc3NvU2Vzc2lvbj86IHN0cmluZztcbiAgb2lkY1JvbGVBcm4/OiBzdHJpbmc7XG4gIG9pZGNQcm92aWRlckFybj86IHN0cmluZztcbiAgcm9sZUFybj86IHN0cmluZztcbiAgcm9sZVNlc3Npb25OYW1lPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgU1NPU2Vzc2lvbiA9IHtcbiAgc3NvUmVnaW9uOiBzdHJpbmc7XG4gIHNzb1N0YXJ0VXJsOiBzdHJpbmc7XG59O1xuXG4vLyBQZXItYXBwIGNvbmZpZyBzY2hlbWFzXG5jb25zdCBEZXBsb3lTdGFnZVNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgYWNjb3VudDogei5zdHJpbmcoKSxcbiAgICByZWdpb25zOiB6LmFycmF5KHouc3RyaW5nKCkpLm1pbigxKVxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmV4cG9ydCB0eXBlIERlcGxveVN0YWdlID0gei5pbmZlcjx0eXBlb2YgRGVwbG95U3RhZ2VTY2hlbWE+O1xuXG5jb25zdCBEb21haW5Db25maWdTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIG5hbWU6IHouc3RyaW5nKCksXG4gICAgdHlwZTogei5lbnVtKFtcImFwZXhcIiwgXCJkZWxlZ2F0ZWRcIl0pLFxuICAgIHBhcmVudERvbWFpbjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIGFjY291bnQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKVxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmV4cG9ydCB0eXBlIERvbWFpbkNvbmZpZyA9IHouaW5mZXI8dHlwZW9mIERvbWFpbkNvbmZpZ1NjaGVtYT47XG5cbmNvbnN0IFJvb3RDb25maWdTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIHZlcnNpb246IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICBnZW5lcmF0b3JWZXJzaW9uOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgZGVwbG95OiB6LnJlY29yZCh6LnN0cmluZygpLCBEZXBsb3lTdGFnZVNjaGVtYSkub3B0aW9uYWwoKSxcbiAgICBhY3RpdmVTdGFnZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIGRvbWFpbnM6IHouYXJyYXkoRG9tYWluQ29uZmlnU2NoZW1hKS5vcHRpb25hbCgpXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxudHlwZSBSb290Q29uZmlnID0gei5pbmZlcjx0eXBlb2YgUm9vdENvbmZpZ1NjaGVtYT47XG5cbi8qKlxuICogVGhlIGN1cnJlbnQgYmFzZS12ZXJzaW9uIG9mIGFueSBuZXdseSBjcmVhdGVkIGNvbmZpZyBmaWxlXG4gKi9cbmNvbnN0IEJBU0VfQ09ORklHX1ZFUlNJT04gPSAwLjE7XG5cbi8qKlxuICogQ29uZmlnIGNsYXNzIGZvciBsb2FkaW5nIGFuZCBzYXZpbmcgcGVyLWFwcCBmamFsbC1jb25maWcuanNvbiBmaWxlcy5cbiAqIEVhY2ggYXBwIGhhcyBpdHMgb3duIGNvbmZpZyBhdCBmamFsbC88YXBwPi9mamFsbC1jb25maWcuanNvbi5cbiAqIFN0b3JlcyBkZXBsb3kgbWFwcGluZywgYWN0aXZlIHN0YWdlLCBkb21haW5zLCBhbmQgZ2VuZXJhdG9yIHZlcnNpb24uXG4gKiBPcmctbGV2ZWwgY29uZmlnIChhY2NvdW50cywgcmVnaW9ucywgT0lEQykgaXMgc2VydmVkIGJ5IE9yZ0NvbmZpZ0NsaWVudCBmcm9tIHRoZSBBUEkuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25maWcge1xuICByb290Q29uZmlnOiBSb290Q29uZmlnO1xuICBwcml2YXRlIGNvbmZpZ1BhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHJvb3RDb25maWc/OiBSb290Q29uZmlnLCBjb25maWdQYXRoPzogc3RyaW5nKSB7XG4gICAgdGhpcy5yb290Q29uZmlnID0gcm9vdENvbmZpZyA/PyB7XG4gICAgICB2ZXJzaW9uOiBCQVNFX0NPTkZJR19WRVJTSU9OXG4gICAgfTtcbiAgICB0aGlzLmNvbmZpZ1BhdGggPSBjb25maWdQYXRoID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRmluZCB0aGUgZmphbGwgZGlyZWN0b3J5IGJ5IHdhbGtpbmcgdXAgdGhlIGRpcmVjdG9yeSB0cmVlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBmaW5kRmphbGxEaXJlY3RvcnkoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgbGV0IGN1cnJlbnREaXIgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBDT05GSUdfU0VBUkNIX01BWF9ERVBUSDsgaSsrKSB7XG4gICAgICBjb25zdCBmamFsbERpciA9IHBhdGguam9pbihjdXJyZW50RGlyLCBcImZqYWxsXCIpO1xuXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhmamFsbERpcikgJiYgZnMuc3RhdFN5bmMoZmphbGxEaXIpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgcmV0dXJuIGZqYWxsRGlyO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJlbnREaXIgPSBwYXRoLmRpcm5hbWUoY3VycmVudERpcik7XG4gICAgICBpZiAocGFyZW50RGlyID09PSBjdXJyZW50RGlyKSBicmVhaztcbiAgICAgIGN1cnJlbnREaXIgPSBwYXJlbnREaXI7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRmluZCB0aGUgY29uZmlnIGRpcmVjdG9yeSBmb3IgYSBzcGVjaWZpYyBhcHAgb3IgdGhlIGxlZ2FjeSByb290IGNvbmZpZy5cbiAgICogV2hlbiBhcHBOYW1lIGlzIHByb3ZpZGVkLCBsb29rcyBmb3IgZmphbGwvPGFwcE5hbWU+L2ZqYWxsLWNvbmZpZy5qc29uLlxuICAgKiBXaGVuIG9taXR0ZWQsIGZhbGxzIGJhY2sgdG8gbGVnYWN5IGZqYWxsL2ZqYWxsLWNvbmZpZy5qc29uIG9yIGRpcmVjdCBmamFsbC1jb25maWcuanNvbi5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGZpbmRDb25maWdEaXJlY3RvcnkoYXBwTmFtZT86IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmIChhcHBOYW1lKSB7XG4gICAgICBpZiAoYXBwTmFtZSAhPT0gcGF0aC5iYXNlbmFtZShhcHBOYW1lKSkgcmV0dXJuIG51bGw7XG5cbiAgICAgIGNvbnN0IGZqYWxsRGlyID0gQ29uZmlnLmZpbmRGamFsbERpcmVjdG9yeSgpO1xuICAgICAgaWYgKCFmamFsbERpcikgcmV0dXJuIG51bGw7XG5cbiAgICAgIGNvbnN0IGFwcERpciA9IHBhdGguam9pbihmamFsbERpciwgYXBwTmFtZSk7XG4gICAgICBjb25zdCBjb25maWdGaWxlID0gcGF0aC5qb2luKGFwcERpciwgXCJmamFsbC1jb25maWcuanNvblwiKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZ0ZpbGUpKSB7XG4gICAgICAgIHJldHVybiBhcHBEaXI7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBMZWdhY3k6IGxvb2sgZm9yIGZqYWxsL2ZqYWxsLWNvbmZpZy5qc29uIG9yIGRpcmVjdCBmamFsbC1jb25maWcuanNvblxuICAgIGxldCBjdXJyZW50RGlyID0gcHJvY2Vzcy5jd2QoKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgQ09ORklHX1NFQVJDSF9NQVhfREVQVEg7IGkrKykge1xuICAgICAgY29uc3QgZmphbGxEaXIgPSBwYXRoLmpvaW4oY3VycmVudERpciwgXCJmamFsbFwiKTtcbiAgICAgIGNvbnN0IGNvbmZpZ0ZpbGUgPSBwYXRoLmpvaW4oZmphbGxEaXIsIFwiZmphbGwtY29uZmlnLmpzb25cIik7XG5cbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZ0ZpbGUpKSB7XG4gICAgICAgIHJldHVybiBmamFsbERpcjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGlyZWN0Q29uZmlnRmlsZSA9IHBhdGguam9pbihjdXJyZW50RGlyLCBcImZqYWxsLWNvbmZpZy5qc29uXCIpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlyZWN0Q29uZmlnRmlsZSkpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnREaXI7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmVudERpciA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyKTtcbiAgICAgIGlmIChwYXJlbnREaXIgPT09IGN1cnJlbnREaXIpIGJyZWFrO1xuICAgICAgY3VycmVudERpciA9IHBhcmVudERpcjtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGNvbmZpZyBmaWxlIGludG8gbWVtb3J5IGFzIGEgcmF3IEpTT04gc3RyaW5nXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBsb2FkQ29uZmlnRmlsZShjb25maWdGaWxlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgZnMuYWNjZXNzU3luYyhjb25maWdGaWxlLCBmcy5jb25zdGFudHMuUl9PSyB8IGZzLmNvbnN0YW50cy5XX09LKTtcbiAgICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmMoY29uZmlnRmlsZSwgeyBlbmNvZGluZzogXCJ1dGY4XCIgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJDb25maWdcIiwgXCJDb25maWcgZmlsZSBub3QgYWNjZXNzaWJsZVwiLCB7XG4gICAgICAgIGZpbGU6IGNvbmZpZ0ZpbGUsXG4gICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycilcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgY29uZmlndXJhdGlvbiBmcm9tIGZpbGUuXG4gICAqIEBwYXJhbSBhcHBOYW1lIC0gT3B0aW9uYWwgYXBwIG5hbWUgdG8gbG9hZCBjb25maWcgZm9yIGEgc3BlY2lmaWMgYXBwXG4gICAqL1xuICBzdGF0aWMgbG9hZENvbmZpZyhhcHBOYW1lPzogc3RyaW5nKTogQ29uZmlnIHtcbiAgICBjb25zdCBjb25maWdEaXIgPSBDb25maWcuZmluZENvbmZpZ0RpcmVjdG9yeShhcHBOYW1lKTtcbiAgICBpZiAoIWNvbmZpZ0Rpcikge1xuICAgICAgcmV0dXJuIG5ldyBDb25maWcoKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWdGaWxlUGF0aCA9IHBhdGguam9pbihjb25maWdEaXIsIFwiZmphbGwtY29uZmlnLmpzb25cIik7XG4gICAgY29uc3Qgcm9vdENvbmZpZ0pzb24gPSBDb25maWcubG9hZENvbmZpZ0ZpbGUoY29uZmlnRmlsZVBhdGgpO1xuXG4gICAgbGV0IHJvb3RDb25maWc6IFJvb3RDb25maWcgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAocm9vdENvbmZpZ0pzb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJvb3RDb25maWcgPSBSb290Q29uZmlnU2NoZW1hLnBhcnNlKEpTT04ucGFyc2Uocm9vdENvbmZpZ0pzb24pKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aHJvdyBDb25maWcuZm9ybWF0Wm9kRXJyb3IoZXJyLCBcImZqYWxsLWNvbmZpZy5qc29uXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgQ29uZmlnKHJvb3RDb25maWcsIGNvbmZpZ0ZpbGVQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgYSBab2QgZXJyb3IgaW50byBhIHJlYWRhYmxlIGVycm9yIG1lc3NhZ2VcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGZvcm1hdFpvZEVycm9yKGVycjogdW5rbm93biwgZmlsZU5hbWU6IHN0cmluZyk6IEVycm9yIHtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2Ygei5ab2RFcnJvciAmJiBlcnIuaXNzdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGlzc3VlRGV0YWlscyA9IGVyci5pc3N1ZXNcbiAgICAgICAgLm1hcCgoaXNzdWUpID0+IGAke2lzc3VlLnBhdGguam9pbihcIi5cIil9OiAke2lzc3VlLm1lc3NhZ2V9YClcbiAgICAgICAgLmpvaW4oXCI7IFwiKTtcbiAgICAgIHJldHVybiBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSAke2ZpbGVOYW1lfTogJHtpc3N1ZURldGFpbHN9YCk7XG4gICAgfVxuICAgIGNvbnN0IHJhd01lc3NhZ2UgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgY29uc3QgbWVzc2FnZSA9IHJhd01lc3NhZ2UucmVwbGFjZSgvXFxuL2csIFwiIFwiKS5zdWJzdHJpbmcoMCwgNTAwKTtcbiAgICByZXR1cm4gbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgJHtmaWxlTmFtZX06ICR7bWVzc2FnZX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGNvbmZpZ3VyYXRpb24gdG8gZmlsZVxuICAgKi9cbiAgc2F2ZUNvbmZpZyhhcHBOYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gICAgbGV0IHRhcmdldFBhdGggPSB0aGlzLmNvbmZpZ1BhdGg7XG5cbiAgICBpZiAoIXRhcmdldFBhdGgpIHtcbiAgICAgIGlmIChhcHBOYW1lKSB7XG4gICAgICAgIGlmIChhcHBOYW1lICE9PSBwYXRoLmJhc2VuYW1lKGFwcE5hbWUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFwcCBuYW1lOiAke2FwcE5hbWV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmphbGxEaXIgPVxuICAgICAgICAgIENvbmZpZy5maW5kRmphbGxEaXJlY3RvcnkoKSB8fCBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgXCJmamFsbFwiKTtcbiAgICAgICAgY29uc3QgYXBwRGlyID0gcGF0aC5qb2luKGZqYWxsRGlyLCBhcHBOYW1lKTtcbiAgICAgICAgdGFyZ2V0UGF0aCA9IHBhdGguam9pbihhcHBEaXIsIFwiZmphbGwtY29uZmlnLmpzb25cIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjb25maWdEaXIgPVxuICAgICAgICAgIENvbmZpZy5maW5kQ29uZmlnRGlyZWN0b3J5KCkgfHwgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwiZmphbGxcIik7XG4gICAgICAgIHRhcmdldFBhdGggPSBwYXRoLmpvaW4oY29uZmlnRGlyLCBcImZqYWxsLWNvbmZpZy5qc29uXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZSh0YXJnZXRQYXRoKTtcbiAgICBmcy5ta2RpclN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IHJvb3RKc29uU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkodGhpcy5yb290Q29uZmlnLCBudWxsLCAyKTtcbiAgICBjb25zdCB0bXBQYXRoID0gYCR7dGFyZ2V0UGF0aH0udG1wYDtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHRtcFBhdGgsIHJvb3RKc29uU3RyaW5nLCB7IG1vZGU6IDBvNjAwIH0pO1xuICAgIGZzLnJlbmFtZVN5bmModG1wUGF0aCwgdGFyZ2V0UGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmamFsbCBjb25maWcgZGlyZWN0b3J5IHBhdGhcbiAgICovXG4gIHN0YXRpYyBnZXRDb25maWdEaXJlY3RvcnkoYXBwTmFtZT86IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiBDb25maWcuZmluZENvbmZpZ0RpcmVjdG9yeShhcHBOYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNjb3ZlciBhbGwgYXBwIG5hbWVzIGJ5IHNjYW5uaW5nIGZqYWxsLzxhcHA+L2ZqYWxsLWNvbmZpZy5qc29uXG4gICAqL1xuICBzdGF0aWMgZGlzY292ZXJBcHBzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBmamFsbERpciA9IENvbmZpZy5maW5kRmphbGxEaXJlY3RvcnkoKTtcbiAgICBpZiAoIWZqYWxsRGlyKSByZXR1cm4gW107XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGZqYWxsRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgICBjb25zdCBhcHBzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgaWYgKCFlbnRyeS5pc0RpcmVjdG9yeSgpKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgY29uZmlnRmlsZSA9IHBhdGguam9pbihmamFsbERpciwgZW50cnkubmFtZSwgXCJmamFsbC1jb25maWcuanNvblwiKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoY29uZmlnRmlsZSkpIHtcbiAgICAgICAgICBhcHBzLnB1c2goZW50cnkubmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFwcHMuc29ydCgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwiQ29uZmlnXCIsIFwiRmFpbGVkIHRvIGRpc2NvdmVyIGFwcHNcIiwge1xuICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICAvLyBEZXBsb3kgc3RhZ2UgbWFuYWdlbWVudFxuXG4gIGdldERlcGxveVN0YWdlcygpOiBSZWNvcmQ8c3RyaW5nLCBEZXBsb3lTdGFnZT4ge1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcuZGVwbG95ID8/IHt9O1xuICB9XG5cbiAgZ2V0RGVwbG95U3RhZ2UobmFtZTogc3RyaW5nKTogRGVwbG95U3RhZ2UgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcuZGVwbG95Py5bbmFtZV07XG4gIH1cblxuICBzZXREZXBsb3lTdGFnZShuYW1lOiBzdHJpbmcsIHN0YWdlOiBEZXBsb3lTdGFnZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLmRlcGxveSkge1xuICAgICAgdGhpcy5yb290Q29uZmlnLmRlcGxveSA9IHt9O1xuICAgIH1cbiAgICB0aGlzLnJvb3RDb25maWcuZGVwbG95W25hbWVdID0gc3RhZ2U7XG4gIH1cblxuICByZW1vdmVEZXBsb3lTdGFnZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMucm9vdENvbmZpZy5kZXBsb3k/LltuYW1lXSkgcmV0dXJuIGZhbHNlO1xuICAgIGRlbGV0ZSB0aGlzLnJvb3RDb25maWcuZGVwbG95W25hbWVdO1xuXG4gICAgaWYgKHRoaXMucm9vdENvbmZpZy5hY3RpdmVTdGFnZSA9PT0gbmFtZSkge1xuICAgICAgdGhpcy5yb290Q29uZmlnLmFjdGl2ZVN0YWdlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldEFjdGl2ZVN0YWdlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucm9vdENvbmZpZy5hY3RpdmVTdGFnZTtcbiAgfVxuXG4gIHNldEFjdGl2ZVN0YWdlKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucm9vdENvbmZpZy5hY3RpdmVTdGFnZSA9IG5hbWU7XG4gIH1cblxuICAvLyBEb21haW4gbWFuYWdlbWVudFxuXG4gIGdldERvbWFpbnMoKTogRG9tYWluQ29uZmlnW10ge1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcuZG9tYWlucyA/PyBbXTtcbiAgfVxuXG4gIHNldERvbWFpbnMoZG9tYWluczogRG9tYWluQ29uZmlnW10pOiB2b2lkIHtcbiAgICB0aGlzLnJvb3RDb25maWcuZG9tYWlucyA9IGRvbWFpbnM7XG4gIH1cblxuICBhZGREb21haW4oZG9tYWluOiBEb21haW5Db25maWcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucm9vdENvbmZpZy5kb21haW5zKSB7XG4gICAgICB0aGlzLnJvb3RDb25maWcuZG9tYWlucyA9IFtdO1xuICAgIH1cbiAgICB0aGlzLnJvb3RDb25maWcuZG9tYWlucy5wdXNoKGRvbWFpbik7XG4gIH1cblxuICBnZXREb21haW4obmFtZTogc3RyaW5nKTogRG9tYWluQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yb290Q29uZmlnLmRvbWFpbnM/LmZpbmQoXG4gICAgICAoZCkgPT4gZC5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUudG9Mb3dlckNhc2UoKVxuICAgICk7XG4gIH1cblxuICByZW1vdmVEb21haW4obmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnJvb3RDb25maWcuZG9tYWlucykgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yb290Q29uZmlnLmRvbWFpbnMuZmluZEluZGV4KFxuICAgICAgKGQpID0+IGQubmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKClcbiAgICApO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLnJvb3RDb25maWcuZG9tYWlucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Case Conversion Utilities
|
|
3
|
+
*
|
|
4
|
+
* Canonical implementations of string case conversion functions
|
|
5
|
+
* shared across the monorepo. All packages should import from
|
|
6
|
+
* @fjall/util rather than maintaining local copies.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Convert hyphenated/underscored names to PascalCase.
|
|
10
|
+
* e.g., "my-app" -> "MyApp", "my_app" -> "MyApp"
|
|
11
|
+
*/
|
|
12
|
+
export declare function toPascalCase(str: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* Convert any case (PascalCase, camelCase, kebab-case, snake_case) to kebab-case.
|
|
15
|
+
* Three-pass regex: split acronyms, split camel boundaries, replace separators.
|
|
16
|
+
* e.g., "MyApp" -> "my-app", "AWSLambda" -> "aws-lambda", "myApp" -> "my-app"
|
|
17
|
+
*/
|
|
18
|
+
export declare function toKebab(str: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Convert a name to a valid RDS database name (snake_case).
|
|
21
|
+
* RDS API allows letters, numbers, and underscores for PostgreSQL/MySQL DatabaseName.
|
|
22
|
+
* Hyphens are rejected, so convert them to underscores.
|
|
23
|
+
*/
|
|
24
|
+
export declare function toValidDatabaseName(name: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* Capitalise the first character of a string.
|
|
27
|
+
*/
|
|
28
|
+
export declare function capitalise(str: string): string;
|
|
29
|
+
/**
|
|
30
|
+
* Strip dots from a zone name to produce a safe string for construct IDs.
|
|
31
|
+
* e.g., "example.com" -> "examplecom"
|
|
32
|
+
*/
|
|
33
|
+
export declare function getSafeZoneName(zoneName: string): string;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Case Conversion Utilities
|
|
4
|
+
*
|
|
5
|
+
* Canonical implementations of string case conversion functions
|
|
6
|
+
* shared across the monorepo. All packages should import from
|
|
7
|
+
* @fjall/util rather than maintaining local copies.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.toPascalCase = toPascalCase;
|
|
11
|
+
exports.toKebab = toKebab;
|
|
12
|
+
exports.toValidDatabaseName = toValidDatabaseName;
|
|
13
|
+
exports.capitalise = capitalise;
|
|
14
|
+
exports.getSafeZoneName = getSafeZoneName;
|
|
15
|
+
/**
|
|
16
|
+
* Convert hyphenated/underscored names to PascalCase.
|
|
17
|
+
* e.g., "my-app" -> "MyApp", "my_app" -> "MyApp"
|
|
18
|
+
*/
|
|
19
|
+
function toPascalCase(str) {
|
|
20
|
+
return str
|
|
21
|
+
.replace(/[-_](.)/g, (_, c) => c.toUpperCase())
|
|
22
|
+
.replace(/^./, (c) => c.toUpperCase());
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Convert any case (PascalCase, camelCase, kebab-case, snake_case) to kebab-case.
|
|
26
|
+
* Three-pass regex: split acronyms, split camel boundaries, replace separators.
|
|
27
|
+
* e.g., "MyApp" -> "my-app", "AWSLambda" -> "aws-lambda", "myApp" -> "my-app"
|
|
28
|
+
*/
|
|
29
|
+
function toKebab(str) {
|
|
30
|
+
return str
|
|
31
|
+
.replace(/([A-Z]+)([A-Z][a-z])/g, "$1-$2")
|
|
32
|
+
.replace(/([a-z\d])([A-Z])/g, "$1-$2")
|
|
33
|
+
.replace(/[\s_]+/g, "-")
|
|
34
|
+
.toLowerCase();
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Convert a name to a valid RDS database name (snake_case).
|
|
38
|
+
* RDS API allows letters, numbers, and underscores for PostgreSQL/MySQL DatabaseName.
|
|
39
|
+
* Hyphens are rejected, so convert them to underscores.
|
|
40
|
+
*/
|
|
41
|
+
function toValidDatabaseName(name) {
|
|
42
|
+
return toKebab(name).replace(/-/g, "_");
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Capitalise the first character of a string.
|
|
46
|
+
*/
|
|
47
|
+
function capitalise(str) {
|
|
48
|
+
if (str.length === 0)
|
|
49
|
+
return str;
|
|
50
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Strip dots from a zone name to produce a safe string for construct IDs.
|
|
54
|
+
* e.g., "example.com" -> "examplecom"
|
|
55
|
+
*/
|
|
56
|
+
function getSafeZoneName(zoneName) {
|
|
57
|
+
return zoneName.split(".").join("");
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FzZUNvbnZlcnNpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2FzZUNvbnZlcnNpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7R0FNRzs7QUFNSCxvQ0FJQztBQU9ELDBCQU1DO0FBT0Qsa0RBRUM7QUFLRCxnQ0FHQztBQU1ELDBDQUVDO0FBOUNEOzs7R0FHRztBQUNILFNBQWdCLFlBQVksQ0FBQyxHQUFXO0lBQ3RDLE9BQU8sR0FBRztTQUNQLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDdEQsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDM0MsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixPQUFPLENBQUMsR0FBVztJQUNqQyxPQUFPLEdBQUc7U0FDUCxPQUFPLENBQUMsdUJBQXVCLEVBQUUsT0FBTyxDQUFDO1NBQ3pDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLENBQUM7U0FDckMsT0FBTyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUM7U0FDdkIsV0FBVyxFQUFFLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixtQkFBbUIsQ0FBQyxJQUFZO0lBQzlDLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsVUFBVSxDQUFDLEdBQVc7SUFDcEMsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUNqQyxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsZUFBZSxDQUFDLFFBQWdCO0lBQzlDLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2FzZSBDb252ZXJzaW9uIFV0aWxpdGllc1xuICpcbiAqIENhbm9uaWNhbCBpbXBsZW1lbnRhdGlvbnMgb2Ygc3RyaW5nIGNhc2UgY29udmVyc2lvbiBmdW5jdGlvbnNcbiAqIHNoYXJlZCBhY3Jvc3MgdGhlIG1vbm9yZXBvLiBBbGwgcGFja2FnZXMgc2hvdWxkIGltcG9ydCBmcm9tXG4gKiBAZmphbGwvdXRpbCByYXRoZXIgdGhhbiBtYWludGFpbmluZyBsb2NhbCBjb3BpZXMuXG4gKi9cblxuLyoqXG4gKiBDb252ZXJ0IGh5cGhlbmF0ZWQvdW5kZXJzY29yZWQgbmFtZXMgdG8gUGFzY2FsQ2FzZS5cbiAqIGUuZy4sIFwibXktYXBwXCIgLT4gXCJNeUFwcFwiLCBcIm15X2FwcFwiIC0+IFwiTXlBcHBcIlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9QYXNjYWxDYXNlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHN0clxuICAgIC5yZXBsYWNlKC9bLV9dKC4pL2csIChfLCBjOiBzdHJpbmcpID0+IGMudG9VcHBlckNhc2UoKSlcbiAgICAucmVwbGFjZSgvXi4vLCAoYykgPT4gYy50b1VwcGVyQ2FzZSgpKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGFueSBjYXNlIChQYXNjYWxDYXNlLCBjYW1lbENhc2UsIGtlYmFiLWNhc2UsIHNuYWtlX2Nhc2UpIHRvIGtlYmFiLWNhc2UuXG4gKiBUaHJlZS1wYXNzIHJlZ2V4OiBzcGxpdCBhY3Jvbnltcywgc3BsaXQgY2FtZWwgYm91bmRhcmllcywgcmVwbGFjZSBzZXBhcmF0b3JzLlxuICogZS5nLiwgXCJNeUFwcFwiIC0+IFwibXktYXBwXCIsIFwiQVdTTGFtYmRhXCIgLT4gXCJhd3MtbGFtYmRhXCIsIFwibXlBcHBcIiAtPiBcIm15LWFwcFwiXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0tlYmFiKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHN0clxuICAgIC5yZXBsYWNlKC8oW0EtWl0rKShbQS1aXVthLXpdKS9nLCBcIiQxLSQyXCIpXG4gICAgLnJlcGxhY2UoLyhbYS16XFxkXSkoW0EtWl0pL2csIFwiJDEtJDJcIilcbiAgICAucmVwbGFjZSgvW1xcc19dKy9nLCBcIi1cIilcbiAgICAudG9Mb3dlckNhc2UoKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgbmFtZSB0byBhIHZhbGlkIFJEUyBkYXRhYmFzZSBuYW1lIChzbmFrZV9jYXNlKS5cbiAqIFJEUyBBUEkgYWxsb3dzIGxldHRlcnMsIG51bWJlcnMsIGFuZCB1bmRlcnNjb3JlcyBmb3IgUG9zdGdyZVNRTC9NeVNRTCBEYXRhYmFzZU5hbWUuXG4gKiBIeXBoZW5zIGFyZSByZWplY3RlZCwgc28gY29udmVydCB0aGVtIHRvIHVuZGVyc2NvcmVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9WYWxpZERhdGFiYXNlTmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdG9LZWJhYihuYW1lKS5yZXBsYWNlKC8tL2csIFwiX1wiKTtcbn1cblxuLyoqXG4gKiBDYXBpdGFsaXNlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXBpdGFsaXNlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHN0ci5sZW5ndGggPT09IDApIHJldHVybiBzdHI7XG4gIHJldHVybiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSk7XG59XG5cbi8qKlxuICogU3RyaXAgZG90cyBmcm9tIGEgem9uZSBuYW1lIHRvIHByb2R1Y2UgYSBzYWZlIHN0cmluZyBmb3IgY29uc3RydWN0IElEcy5cbiAqIGUuZy4sIFwiZXhhbXBsZS5jb21cIiAtPiBcImV4YW1wbGVjb21cIlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2FmZVpvbmVOYW1lKHpvbmVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gem9uZU5hbWUuc3BsaXQoXCIuXCIpLmpvaW4oXCJcIik7XG59XG4iXX0=
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare const DNS_APEX: "@";
|
|
2
|
+
/**
|
|
3
|
+
* Compute predictable CloudFormation export names for domain stack outputs.
|
|
4
|
+
* Used by both infrastructure constructs (to set export names) and CLI services
|
|
5
|
+
* (to import zone ID and certificate ARN via Fn.importValue).
|
|
6
|
+
*/
|
|
7
|
+
export declare function getDomainExportNames(domainName: string): {
|
|
8
|
+
hostedZoneId: string;
|
|
9
|
+
certificateArn: string;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Props for importing zone and certificate from a managed domain stack.
|
|
13
|
+
* When set, app constructs use Fn.importValue() instead of creating inline.
|
|
14
|
+
*/
|
|
15
|
+
export interface ManagedDomainExports {
|
|
16
|
+
hostedZoneIdExport: string;
|
|
17
|
+
certificateArnExport: string;
|
|
18
|
+
zoneName: string;
|
|
19
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DNS_APEX = void 0;
|
|
4
|
+
exports.getDomainExportNames = getDomainExportNames;
|
|
5
|
+
exports.DNS_APEX = "@";
|
|
6
|
+
/**
|
|
7
|
+
* Compute predictable CloudFormation export names for domain stack outputs.
|
|
8
|
+
* Used by both infrastructure constructs (to set export names) and CLI services
|
|
9
|
+
* (to import zone ID and certificate ARN via Fn.importValue).
|
|
10
|
+
*/
|
|
11
|
+
function getDomainExportNames(domainName) {
|
|
12
|
+
const safe = domainName.replace(/\./g, "-");
|
|
13
|
+
return {
|
|
14
|
+
hostedZoneId: `${safe}-hosted-zone-id`,
|
|
15
|
+
certificateArn: `${safe}-certificate-arn`
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9tYWluRXhwb3J0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kb21haW5FeHBvcnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQU9BLG9EQVNDO0FBaEJZLFFBQUEsUUFBUSxHQUFHLEdBQVksQ0FBQztBQUVyQzs7OztHQUlHO0FBQ0gsU0FBZ0Isb0JBQW9CLENBQUMsVUFBa0I7SUFJckQsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDNUMsT0FBTztRQUNMLFlBQVksRUFBRSxHQUFHLElBQUksaUJBQWlCO1FBQ3RDLGNBQWMsRUFBRSxHQUFHLElBQUksa0JBQWtCO0tBQzFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IEROU19BUEVYID0gXCJAXCIgYXMgY29uc3Q7XG5cbi8qKlxuICogQ29tcHV0ZSBwcmVkaWN0YWJsZSBDbG91ZEZvcm1hdGlvbiBleHBvcnQgbmFtZXMgZm9yIGRvbWFpbiBzdGFjayBvdXRwdXRzLlxuICogVXNlZCBieSBib3RoIGluZnJhc3RydWN0dXJlIGNvbnN0cnVjdHMgKHRvIHNldCBleHBvcnQgbmFtZXMpIGFuZCBDTEkgc2VydmljZXNcbiAqICh0byBpbXBvcnQgem9uZSBJRCBhbmQgY2VydGlmaWNhdGUgQVJOIHZpYSBGbi5pbXBvcnRWYWx1ZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREb21haW5FeHBvcnROYW1lcyhkb21haW5OYW1lOiBzdHJpbmcpOiB7XG4gIGhvc3RlZFpvbmVJZDogc3RyaW5nO1xuICBjZXJ0aWZpY2F0ZUFybjogc3RyaW5nO1xufSB7XG4gIGNvbnN0IHNhZmUgPSBkb21haW5OYW1lLnJlcGxhY2UoL1xcLi9nLCBcIi1cIik7XG4gIHJldHVybiB7XG4gICAgaG9zdGVkWm9uZUlkOiBgJHtzYWZlfS1ob3N0ZWQtem9uZS1pZGAsXG4gICAgY2VydGlmaWNhdGVBcm46IGAke3NhZmV9LWNlcnRpZmljYXRlLWFybmBcbiAgfTtcbn1cblxuLyoqXG4gKiBQcm9wcyBmb3IgaW1wb3J0aW5nIHpvbmUgYW5kIGNlcnRpZmljYXRlIGZyb20gYSBtYW5hZ2VkIGRvbWFpbiBzdGFjay5cbiAqIFdoZW4gc2V0LCBhcHAgY29uc3RydWN0cyB1c2UgRm4uaW1wb3J0VmFsdWUoKSBpbnN0ZWFkIG9mIGNyZWF0aW5nIGlubGluZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYW5hZ2VkRG9tYWluRXhwb3J0cyB7XG4gIGhvc3RlZFpvbmVJZEV4cG9ydDogc3RyaW5nO1xuICBjZXJ0aWZpY2F0ZUFybkV4cG9ydDogc3RyaW5nO1xuICB6b25lTmFtZTogc3RyaW5nO1xufVxuIl19
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalise an unknown thrown value into an Error instance
|
|
3
|
+
*/
|
|
4
|
+
export declare function normaliseError(error: unknown): Error;
|
|
5
|
+
/**
|
|
6
|
+
* Safely extract error message from any error type
|
|
7
|
+
*/
|
|
8
|
+
export declare function getErrorMessage(error: unknown): string;
|
|
9
|
+
/**
|
|
10
|
+
* Check if an error has a specific error code
|
|
11
|
+
*/
|
|
12
|
+
export declare function hasErrorCode(error: unknown, code: string): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Extract error code from an error if present
|
|
15
|
+
*/
|
|
16
|
+
export declare function getErrorCode(error: unknown): string | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* Safely extract the stack trace from an unknown thrown value
|
|
19
|
+
*/
|
|
20
|
+
export declare function getErrorStack(error: unknown): string | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Create a formatted error string with optional code prefix
|
|
23
|
+
*/
|
|
24
|
+
export declare function formatErrorString(error: unknown): string;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normaliseError = normaliseError;
|
|
4
|
+
exports.getErrorMessage = getErrorMessage;
|
|
5
|
+
exports.hasErrorCode = hasErrorCode;
|
|
6
|
+
exports.getErrorCode = getErrorCode;
|
|
7
|
+
exports.getErrorStack = getErrorStack;
|
|
8
|
+
exports.formatErrorString = formatErrorString;
|
|
9
|
+
/**
|
|
10
|
+
* Normalise an unknown thrown value into an Error instance
|
|
11
|
+
*/
|
|
12
|
+
function normaliseError(error) {
|
|
13
|
+
return error instanceof Error ? error : new Error(String(error));
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Safely extract error message from any error type
|
|
17
|
+
*/
|
|
18
|
+
function getErrorMessage(error) {
|
|
19
|
+
if (error instanceof Error) {
|
|
20
|
+
return error.message;
|
|
21
|
+
}
|
|
22
|
+
if (typeof error === "string") {
|
|
23
|
+
return error;
|
|
24
|
+
}
|
|
25
|
+
if (error && typeof error === "object" && "message" in error) {
|
|
26
|
+
return String(error.message);
|
|
27
|
+
}
|
|
28
|
+
return "An unknown error occurred";
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Check if an error has a specific error code
|
|
32
|
+
*/
|
|
33
|
+
function hasErrorCode(error, code) {
|
|
34
|
+
if (!error || typeof error !== "object") {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
return "code" in error && error.code === code;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Extract error code from an error if present
|
|
41
|
+
*/
|
|
42
|
+
function getErrorCode(error) {
|
|
43
|
+
if (!error || typeof error !== "object") {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
if ("code" in error &&
|
|
47
|
+
typeof error.code === "string") {
|
|
48
|
+
return error.code;
|
|
49
|
+
}
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Safely extract the stack trace from an unknown thrown value
|
|
54
|
+
*/
|
|
55
|
+
function getErrorStack(error) {
|
|
56
|
+
return error instanceof Error ? error.stack : undefined;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Create a formatted error string with optional code prefix
|
|
60
|
+
*/
|
|
61
|
+
function formatErrorString(error) {
|
|
62
|
+
const message = getErrorMessage(error);
|
|
63
|
+
const code = getErrorCode(error);
|
|
64
|
+
if (code && code !== "UNKNOWN_ERROR") {
|
|
65
|
+
return `[${code}] ${message}`;
|
|
66
|
+
}
|
|
67
|
+
return message;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JVdGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lcnJvclV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0Esd0NBRUM7QUFLRCwwQ0FXQztBQUtELG9DQUtDO0FBS0Qsb0NBV0M7QUFLRCxzQ0FFQztBQUtELDhDQVFDO0FBbkVEOztHQUVHO0FBQ0gsU0FBZ0IsY0FBYyxDQUFDLEtBQWM7SUFDM0MsT0FBTyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ25FLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLGVBQWUsQ0FBQyxLQUFjO0lBQzVDLElBQUksS0FBSyxZQUFZLEtBQUssRUFBRSxDQUFDO1FBQzNCLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQztJQUN2QixDQUFDO0lBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxJQUFJLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksU0FBUyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQzdELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBQ0QsT0FBTywyQkFBMkIsQ0FBQztBQUNyQyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixZQUFZLENBQUMsS0FBYyxFQUFFLElBQVk7SUFDdkQsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN4QyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxPQUFPLE1BQU0sSUFBSSxLQUFLLElBQUssS0FBMkIsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDO0FBQ3ZFLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLFlBQVksQ0FBQyxLQUFjO0lBQ3pDLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDeEMsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELElBQ0UsTUFBTSxJQUFJLEtBQUs7UUFDZixPQUFRLEtBQTJCLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFDckQsQ0FBQztRQUNELE9BQVEsS0FBMEIsQ0FBQyxJQUFJLENBQUM7SUFDMUMsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLGFBQWEsQ0FBQyxLQUFjO0lBQzFDLE9BQU8sS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQzFELENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLGlCQUFpQixDQUFDLEtBQWM7SUFDOUMsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVqQyxJQUFJLElBQUksSUFBSSxJQUFJLEtBQUssZUFBZSxFQUFFLENBQUM7UUFDckMsT0FBTyxJQUFJLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTm9ybWFsaXNlIGFuIHVua25vd24gdGhyb3duIHZhbHVlIGludG8gYW4gRXJyb3IgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGlzZUVycm9yKGVycm9yOiB1bmtub3duKTogRXJyb3Ige1xuICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpO1xufVxuXG4vKipcbiAqIFNhZmVseSBleHRyYWN0IGVycm9yIG1lc3NhZ2UgZnJvbSBhbnkgZXJyb3IgdHlwZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXJyb3JNZXNzYWdlKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4gZXJyb3IubWVzc2FnZTtcbiAgfVxuICBpZiAodHlwZW9mIGVycm9yID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9XG4gIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09IFwib2JqZWN0XCIgJiYgXCJtZXNzYWdlXCIgaW4gZXJyb3IpIHtcbiAgICByZXR1cm4gU3RyaW5nKGVycm9yLm1lc3NhZ2UpO1xuICB9XG4gIHJldHVybiBcIkFuIHVua25vd24gZXJyb3Igb2NjdXJyZWRcIjtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhbiBlcnJvciBoYXMgYSBzcGVjaWZpYyBlcnJvciBjb2RlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNFcnJvckNvZGUoZXJyb3I6IHVua25vd24sIGNvZGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gXCJjb2RlXCIgaW4gZXJyb3IgJiYgKGVycm9yIGFzIHsgY29kZTogdW5rbm93biB9KS5jb2RlID09PSBjb2RlO1xufVxuXG4vKipcbiAqIEV4dHJhY3QgZXJyb3IgY29kZSBmcm9tIGFuIGVycm9yIGlmIHByZXNlbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEVycm9yQ29kZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoXG4gICAgXCJjb2RlXCIgaW4gZXJyb3IgJiZcbiAgICB0eXBlb2YgKGVycm9yIGFzIHsgY29kZTogdW5rbm93biB9KS5jb2RlID09PSBcInN0cmluZ1wiXG4gICkge1xuICAgIHJldHVybiAoZXJyb3IgYXMgeyBjb2RlOiBzdHJpbmcgfSkuY29kZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFNhZmVseSBleHRyYWN0IHRoZSBzdGFjayB0cmFjZSBmcm9tIGFuIHVua25vd24gdGhyb3duIHZhbHVlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFcnJvclN0YWNrKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBmb3JtYXR0ZWQgZXJyb3Igc3RyaW5nIHdpdGggb3B0aW9uYWwgY29kZSBwcmVmaXhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEVycm9yU3RyaW5nKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgY29uc3QgbWVzc2FnZSA9IGdldEVycm9yTWVzc2FnZShlcnJvcik7XG4gIGNvbnN0IGNvZGUgPSBnZXRFcnJvckNvZGUoZXJyb3IpO1xuXG4gIGlmIChjb2RlICYmIGNvZGUgIT09IFwiVU5LTk9XTl9FUlJPUlwiKSB7XG4gICAgcmV0dXJuIGBbJHtjb2RlfV0gJHttZXNzYWdlfWA7XG4gIH1cbiAgcmV0dXJuIG1lc3NhZ2U7XG59XG4iXX0=
|
package/dist/src/index.d.ts
CHANGED
|
@@ -1,2 +1,5 @@
|
|
|
1
1
|
export * from "./Config";
|
|
2
2
|
export { logger } from "./logger.js";
|
|
3
|
+
export { DNS_APEX, getDomainExportNames, type ManagedDomainExports } from "./domainExports";
|
|
4
|
+
export { toPascalCase, toKebab, toValidDatabaseName, capitalise, getSafeZoneName } from "./caseConversion";
|
|
5
|
+
export { normaliseError, getErrorMessage, hasErrorCode, getErrorCode, getErrorStack, formatErrorString } from "./errorUtils";
|
package/dist/src/index.js
CHANGED
|
@@ -14,8 +14,24 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.logger = void 0;
|
|
17
|
+
exports.formatErrorString = exports.getErrorStack = exports.getErrorCode = exports.hasErrorCode = exports.getErrorMessage = exports.normaliseError = exports.getSafeZoneName = exports.capitalise = exports.toValidDatabaseName = exports.toKebab = exports.toPascalCase = exports.getDomainExportNames = exports.DNS_APEX = exports.logger = void 0;
|
|
18
18
|
__exportStar(require("./Config"), exports);
|
|
19
19
|
var logger_js_1 = require("./logger.js");
|
|
20
20
|
Object.defineProperty(exports, "logger", { enumerable: true, get: function () { return logger_js_1.logger; } });
|
|
21
|
-
|
|
21
|
+
var domainExports_1 = require("./domainExports");
|
|
22
|
+
Object.defineProperty(exports, "DNS_APEX", { enumerable: true, get: function () { return domainExports_1.DNS_APEX; } });
|
|
23
|
+
Object.defineProperty(exports, "getDomainExportNames", { enumerable: true, get: function () { return domainExports_1.getDomainExportNames; } });
|
|
24
|
+
var caseConversion_1 = require("./caseConversion");
|
|
25
|
+
Object.defineProperty(exports, "toPascalCase", { enumerable: true, get: function () { return caseConversion_1.toPascalCase; } });
|
|
26
|
+
Object.defineProperty(exports, "toKebab", { enumerable: true, get: function () { return caseConversion_1.toKebab; } });
|
|
27
|
+
Object.defineProperty(exports, "toValidDatabaseName", { enumerable: true, get: function () { return caseConversion_1.toValidDatabaseName; } });
|
|
28
|
+
Object.defineProperty(exports, "capitalise", { enumerable: true, get: function () { return caseConversion_1.capitalise; } });
|
|
29
|
+
Object.defineProperty(exports, "getSafeZoneName", { enumerable: true, get: function () { return caseConversion_1.getSafeZoneName; } });
|
|
30
|
+
var errorUtils_1 = require("./errorUtils");
|
|
31
|
+
Object.defineProperty(exports, "normaliseError", { enumerable: true, get: function () { return errorUtils_1.normaliseError; } });
|
|
32
|
+
Object.defineProperty(exports, "getErrorMessage", { enumerable: true, get: function () { return errorUtils_1.getErrorMessage; } });
|
|
33
|
+
Object.defineProperty(exports, "hasErrorCode", { enumerable: true, get: function () { return errorUtils_1.hasErrorCode; } });
|
|
34
|
+
Object.defineProperty(exports, "getErrorCode", { enumerable: true, get: function () { return errorUtils_1.getErrorCode; } });
|
|
35
|
+
Object.defineProperty(exports, "getErrorStack", { enumerable: true, get: function () { return errorUtils_1.getErrorStack; } });
|
|
36
|
+
Object.defineProperty(exports, "formatErrorString", { enumerable: true, get: function () { return errorUtils_1.formatErrorString; } });
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBeUI7QUFDekIseUNBQXFDO0FBQTVCLG1HQUFBLE1BQU0sT0FBQTtBQUNmLGlEQUl5QjtBQUh2Qix5R0FBQSxRQUFRLE9BQUE7QUFDUixxSEFBQSxvQkFBb0IsT0FBQTtBQUd0QixtREFNMEI7QUFMeEIsOEdBQUEsWUFBWSxPQUFBO0FBQ1oseUdBQUEsT0FBTyxPQUFBO0FBQ1AscUhBQUEsbUJBQW1CLE9BQUE7QUFDbkIsNEdBQUEsVUFBVSxPQUFBO0FBQ1YsaUhBQUEsZUFBZSxPQUFBO0FBRWpCLDJDQU9zQjtBQU5wQiw0R0FBQSxjQUFjLE9BQUE7QUFDZCw2R0FBQSxlQUFlLE9BQUE7QUFDZiwwR0FBQSxZQUFZLE9BQUE7QUFDWiwwR0FBQSxZQUFZLE9BQUE7QUFDWiwyR0FBQSxhQUFhLE9BQUE7QUFDYiwrR0FBQSxpQkFBaUIsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL0NvbmZpZ1wiO1xuZXhwb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4vbG9nZ2VyLmpzXCI7XG5leHBvcnQge1xuICBETlNfQVBFWCxcbiAgZ2V0RG9tYWluRXhwb3J0TmFtZXMsXG4gIHR5cGUgTWFuYWdlZERvbWFpbkV4cG9ydHNcbn0gZnJvbSBcIi4vZG9tYWluRXhwb3J0c1wiO1xuZXhwb3J0IHtcbiAgdG9QYXNjYWxDYXNlLFxuICB0b0tlYmFiLFxuICB0b1ZhbGlkRGF0YWJhc2VOYW1lLFxuICBjYXBpdGFsaXNlLFxuICBnZXRTYWZlWm9uZU5hbWVcbn0gZnJvbSBcIi4vY2FzZUNvbnZlcnNpb25cIjtcbmV4cG9ydCB7XG4gIG5vcm1hbGlzZUVycm9yLFxuICBnZXRFcnJvck1lc3NhZ2UsXG4gIGhhc0Vycm9yQ29kZSxcbiAgZ2V0RXJyb3JDb2RlLFxuICBnZXRFcnJvclN0YWNrLFxuICBmb3JtYXRFcnJvclN0cmluZ1xufSBmcm9tIFwiLi9lcnJvclV0aWxzXCI7XG4iXX0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fjall/util",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.89.2",
|
|
4
4
|
"description": "Common utility methods",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"format:check": "prettier --check \"src/**/*.{ts,tsx,js,jsx,json}\""
|
|
17
17
|
},
|
|
18
18
|
"author": "",
|
|
19
|
-
"license": "
|
|
19
|
+
"license": "MIT",
|
|
20
20
|
"devDependencies": {
|
|
21
21
|
"@types/node": "^22.13.10",
|
|
22
22
|
"prettier": "^3.2.5",
|
|
@@ -33,5 +33,5 @@
|
|
|
33
33
|
"engines": {
|
|
34
34
|
"node": ">=18.0.0"
|
|
35
35
|
},
|
|
36
|
-
"gitHead": "
|
|
36
|
+
"gitHead": "5bb039ff669fbe96d656ae1467e9986cf4327e92"
|
|
37
37
|
}
|