@quiltdata/benchling-webhook 0.5.4-20251102T020826Z → 0.5.4-20251103T180145Z
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/README.md +26 -17
- package/dist/bin/benchling-webhook.d.ts +1 -1
- package/dist/bin/benchling-webhook.d.ts.map +1 -1
- package/dist/bin/benchling-webhook.js +8 -23
- package/dist/bin/benchling-webhook.js.map +1 -1
- package/dist/bin/cdk-dev.js +51 -0
- package/dist/bin/cli.js +8 -22
- package/dist/bin/cli.js.map +1 -1
- package/dist/bin/commands/deploy.d.ts +4 -2
- package/dist/bin/commands/deploy.d.ts.map +1 -1
- package/dist/bin/commands/deploy.js +88 -300
- package/dist/bin/commands/deploy.js.map +1 -1
- package/dist/bin/config-profiles.d.ts +59 -0
- package/dist/bin/config-profiles.d.ts.map +1 -0
- package/dist/bin/config-profiles.js +272 -0
- package/dist/bin/config-profiles.js.map +1 -0
- package/dist/bin/create-secret.d.ts +3 -0
- package/dist/bin/create-secret.d.ts.map +1 -1
- package/dist/bin/create-secret.js +51 -48
- package/dist/bin/create-secret.js.map +1 -1
- package/dist/lib/benchling-auth-validator.d.ts +65 -0
- package/dist/lib/benchling-auth-validator.d.ts.map +1 -0
- package/dist/lib/benchling-auth-validator.js +213 -0
- package/dist/lib/benchling-auth-validator.js.map +1 -0
- package/dist/lib/benchling-webhook-stack.d.ts +5 -23
- package/dist/lib/benchling-webhook-stack.d.ts.map +1 -1
- package/dist/lib/benchling-webhook-stack.js +25 -145
- package/dist/lib/benchling-webhook-stack.js.map +1 -1
- package/dist/lib/config-logger.d.ts +191 -0
- package/dist/lib/config-logger.d.ts.map +1 -0
- package/dist/lib/config-logger.js +372 -0
- package/dist/lib/config-logger.js.map +1 -0
- package/dist/lib/configuration-saver.d.ts +75 -0
- package/dist/lib/configuration-saver.d.ts.map +1 -0
- package/dist/lib/configuration-saver.js +145 -0
- package/dist/lib/configuration-saver.js.map +1 -0
- package/dist/lib/configuration-validator.d.ts +63 -0
- package/dist/lib/configuration-validator.d.ts.map +1 -0
- package/dist/lib/configuration-validator.js +136 -0
- package/dist/lib/configuration-validator.js.map +1 -0
- package/dist/lib/configuration-wizard.d.ts +52 -0
- package/dist/lib/configuration-wizard.d.ts.map +1 -0
- package/dist/lib/configuration-wizard.js +193 -0
- package/dist/lib/configuration-wizard.js.map +1 -0
- package/dist/lib/quilt-config-resolver.d.ts +53 -0
- package/dist/lib/quilt-config-resolver.d.ts.map +1 -0
- package/dist/lib/quilt-config-resolver.js +100 -0
- package/dist/lib/quilt-config-resolver.js.map +1 -0
- package/dist/lib/s3-bucket-validator.d.ts +76 -0
- package/dist/lib/s3-bucket-validator.d.ts.map +1 -0
- package/dist/lib/s3-bucket-validator.js +237 -0
- package/dist/lib/s3-bucket-validator.js.map +1 -0
- package/dist/lib/types/config.d.ts +398 -0
- package/dist/lib/types/config.d.ts.map +1 -0
- package/dist/lib/types/config.js +11 -0
- package/dist/lib/types/config.js.map +1 -0
- package/dist/lib/utils/config-loader.js.map +1 -1
- package/dist/lib/utils/config-resolver.d.ts +26 -26
- package/dist/lib/utils/config-resolver.d.ts.map +1 -1
- package/dist/lib/utils/config-resolver.js +29 -29
- package/dist/lib/utils/config-resolver.js.map +1 -1
- package/dist/lib/utils/config.d.ts +2 -0
- package/dist/lib/utils/config.d.ts.map +1 -1
- package/dist/lib/utils/config.js.map +1 -1
- package/dist/lib/xdg-cli-wrapper.d.ts +113 -0
- package/dist/lib/xdg-cli-wrapper.d.ts.map +1 -0
- package/dist/lib/xdg-cli-wrapper.js +288 -0
- package/dist/lib/xdg-cli-wrapper.js.map +1 -0
- package/dist/lib/xdg-config.d.ts +187 -0
- package/dist/lib/xdg-config.d.ts.map +1 -0
- package/dist/lib/xdg-config.js +562 -0
- package/dist/lib/xdg-config.js.map +1 -0
- package/dist/package.json +38 -26
- package/dist/scripts/config-health-check.d.ts +78 -0
- package/dist/scripts/config-health-check.d.ts.map +1 -0
- package/dist/scripts/config-health-check.js +559 -0
- package/dist/scripts/config-health-check.js.map +1 -0
- package/dist/scripts/infer-quilt-config.d.ts +50 -0
- package/dist/scripts/infer-quilt-config.d.ts.map +1 -0
- package/dist/scripts/infer-quilt-config.js +353 -0
- package/dist/scripts/infer-quilt-config.js.map +1 -0
- package/dist/scripts/install-wizard.d.ts +34 -0
- package/dist/scripts/install-wizard.d.ts.map +1 -0
- package/dist/scripts/install-wizard.js +719 -0
- package/dist/scripts/install-wizard.js.map +1 -0
- package/dist/scripts/sync-secrets.d.ts +63 -0
- package/dist/scripts/sync-secrets.d.ts.map +1 -0
- package/dist/scripts/sync-secrets.js +424 -0
- package/dist/scripts/sync-secrets.js.map +1 -0
- package/env.template +60 -47
- package/package.json +38 -26
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ConfigurationSaver = void 0;
|
|
7
|
+
const xdg_config_1 = require("./xdg-config");
|
|
8
|
+
const lodash_merge_1 = __importDefault(require("lodash.merge"));
|
|
9
|
+
/**
|
|
10
|
+
* Configuration saver for persisting configuration to XDG files
|
|
11
|
+
*/
|
|
12
|
+
class ConfigurationSaver {
|
|
13
|
+
/**
|
|
14
|
+
* Get or create default XDG config instance
|
|
15
|
+
*/
|
|
16
|
+
static getDefaultXDGConfig() {
|
|
17
|
+
if (!ConfigurationSaver.defaultXDGConfig) {
|
|
18
|
+
ConfigurationSaver.defaultXDGConfig = new xdg_config_1.XDGConfig();
|
|
19
|
+
ConfigurationSaver.defaultXDGConfig.ensureDirectories();
|
|
20
|
+
}
|
|
21
|
+
return ConfigurationSaver.defaultXDGConfig;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Save configuration to user config file
|
|
25
|
+
*
|
|
26
|
+
* @param config - Configuration to save
|
|
27
|
+
* @param options - Save options
|
|
28
|
+
* @returns Saved configuration with metadata
|
|
29
|
+
*/
|
|
30
|
+
static async save(config, options = {}) {
|
|
31
|
+
const { xdgConfig = ConfigurationSaver.getDefaultXDGConfig(), source = "wizard", skipValidation = false, merge: shouldMerge = false, } = options;
|
|
32
|
+
// Validate configuration if not skipped
|
|
33
|
+
if (!skipValidation) {
|
|
34
|
+
ConfigurationSaver.validateConfig(config);
|
|
35
|
+
}
|
|
36
|
+
// Merge with existing config if requested
|
|
37
|
+
let finalConfig = { ...config };
|
|
38
|
+
if (shouldMerge) {
|
|
39
|
+
try {
|
|
40
|
+
const existingConfig = xdgConfig.readConfig("user");
|
|
41
|
+
finalConfig = (0, lodash_merge_1.default)({}, existingConfig, config);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// If no existing config, just use the new config
|
|
45
|
+
finalConfig = { ...config };
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Add metadata
|
|
49
|
+
const metadata = ConfigurationSaver.getMetadata({ source });
|
|
50
|
+
const configWithMetadata = {
|
|
51
|
+
...finalConfig,
|
|
52
|
+
_metadata: metadata,
|
|
53
|
+
};
|
|
54
|
+
// Save to user config
|
|
55
|
+
xdgConfig.writeConfig("user", configWithMetadata);
|
|
56
|
+
// If source indicates inference, also save to derived config
|
|
57
|
+
if (source === "quilt-cli" || source === "inference") {
|
|
58
|
+
await ConfigurationSaver.saveToDerived(config, {
|
|
59
|
+
xdgConfig,
|
|
60
|
+
source,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
return finalConfig;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Save inferred configuration to derived config file
|
|
67
|
+
*
|
|
68
|
+
* @param config - Inferred configuration
|
|
69
|
+
* @param options - Save options
|
|
70
|
+
*/
|
|
71
|
+
static async saveToDerived(config, options = {}) {
|
|
72
|
+
const { xdgConfig = ConfigurationSaver.getDefaultXDGConfig(), source = "inferred", } = options;
|
|
73
|
+
// Add inference metadata
|
|
74
|
+
const metadata = ConfigurationSaver.getMetadata({
|
|
75
|
+
source,
|
|
76
|
+
inferredAt: new Date().toISOString(),
|
|
77
|
+
});
|
|
78
|
+
const configWithMetadata = {
|
|
79
|
+
...config,
|
|
80
|
+
_metadata: metadata,
|
|
81
|
+
};
|
|
82
|
+
// Save to derived config
|
|
83
|
+
xdgConfig.writeConfig("derived", configWithMetadata);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Save deployment outputs to deployment config file
|
|
87
|
+
*
|
|
88
|
+
* @param config - Deployment configuration
|
|
89
|
+
* @param options - Save options
|
|
90
|
+
*/
|
|
91
|
+
static async saveToDeployment(config, options = {}) {
|
|
92
|
+
const { xdgConfig = ConfigurationSaver.getDefaultXDGConfig(), source = "deployment", } = options;
|
|
93
|
+
// Add deployment metadata
|
|
94
|
+
const metadata = ConfigurationSaver.getMetadata({ source });
|
|
95
|
+
const configWithMetadata = {
|
|
96
|
+
...config,
|
|
97
|
+
_metadata: metadata,
|
|
98
|
+
};
|
|
99
|
+
// Save to deployment config
|
|
100
|
+
xdgConfig.writeConfig("deploy", configWithMetadata);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Create metadata for configuration
|
|
104
|
+
*
|
|
105
|
+
* @param options - Metadata options
|
|
106
|
+
* @returns Configuration metadata
|
|
107
|
+
*/
|
|
108
|
+
static getMetadata(options = {}) {
|
|
109
|
+
return {
|
|
110
|
+
savedAt: new Date().toISOString(),
|
|
111
|
+
source: options.source || "unknown",
|
|
112
|
+
version: ConfigurationSaver.getVersion(),
|
|
113
|
+
...(options.inferredAt && { inferredAt: options.inferredAt }),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get the current version
|
|
118
|
+
*
|
|
119
|
+
* @returns Version string
|
|
120
|
+
*/
|
|
121
|
+
static getVersion() {
|
|
122
|
+
// For now, return a static version
|
|
123
|
+
// In production, this would read from package.json
|
|
124
|
+
return "0.6.0";
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Validate configuration before saving
|
|
128
|
+
*
|
|
129
|
+
* @param config - Configuration to validate
|
|
130
|
+
* @throws {Error} If configuration is invalid
|
|
131
|
+
*/
|
|
132
|
+
static validateConfig(config) {
|
|
133
|
+
// Check if config is empty
|
|
134
|
+
if (Object.keys(config).length === 0) {
|
|
135
|
+
throw new Error("Configuration validation failed: Configuration cannot be empty");
|
|
136
|
+
}
|
|
137
|
+
// Basic validation passed
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
exports.ConfigurationSaver = ConfigurationSaver;
|
|
141
|
+
/**
|
|
142
|
+
* Default XDG config instance
|
|
143
|
+
*/
|
|
144
|
+
ConfigurationSaver.defaultXDGConfig = null;
|
|
145
|
+
//# sourceMappingURL=configuration-saver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configuration-saver.js","sourceRoot":"","sources":["../../lib/configuration-saver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration object for validation
|
|
3
|
+
*/
|
|
4
|
+
export interface Configuration {
|
|
5
|
+
catalogUrl?: string;
|
|
6
|
+
benchlingTenant?: string;
|
|
7
|
+
benchlingClientId?: string;
|
|
8
|
+
benchlingClientSecret?: string;
|
|
9
|
+
benchlingAppDefinitionId?: string;
|
|
10
|
+
quiltUserBucket?: string;
|
|
11
|
+
quiltRegion?: string;
|
|
12
|
+
[key: string]: string | undefined;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Validation options
|
|
16
|
+
*/
|
|
17
|
+
export interface ValidationOptions {
|
|
18
|
+
skipBenchlingValidation?: boolean;
|
|
19
|
+
skipS3Validation?: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Comprehensive validation result
|
|
23
|
+
*/
|
|
24
|
+
export interface ComprehensiveValidationResult {
|
|
25
|
+
isValid: boolean;
|
|
26
|
+
errors: string[];
|
|
27
|
+
warnings?: string[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Comprehensive configuration validator
|
|
31
|
+
*
|
|
32
|
+
* Combines all validation checks (Benchling + S3) and provides
|
|
33
|
+
* comprehensive validation results with aggregated errors.
|
|
34
|
+
*/
|
|
35
|
+
export declare class ConfigurationValidator {
|
|
36
|
+
/**
|
|
37
|
+
* Required configuration fields
|
|
38
|
+
*/
|
|
39
|
+
private static readonly REQUIRED_FIELDS;
|
|
40
|
+
/**
|
|
41
|
+
* Validate entire configuration
|
|
42
|
+
*
|
|
43
|
+
* @param config - Configuration to validate
|
|
44
|
+
* @param options - Validation options
|
|
45
|
+
* @returns Comprehensive validation result
|
|
46
|
+
*/
|
|
47
|
+
static validate(config: Configuration, options?: ValidationOptions): Promise<ComprehensiveValidationResult>;
|
|
48
|
+
/**
|
|
49
|
+
* Validate catalog URL format
|
|
50
|
+
*
|
|
51
|
+
* @param catalogUrl - Catalog URL to validate
|
|
52
|
+
* @returns True if URL format is valid
|
|
53
|
+
*/
|
|
54
|
+
static validateCatalogUrl(catalogUrl: string): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Check for missing required fields
|
|
57
|
+
*
|
|
58
|
+
* @param config - Configuration to check
|
|
59
|
+
* @returns Array of missing field names
|
|
60
|
+
*/
|
|
61
|
+
static checkRequiredFields(config: Configuration): string[];
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=configuration-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configuration-validator.d.ts","sourceRoot":"","sources":["../../lib/configuration-validator.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAC9B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;;;;GAKG;AACH,qBAAa,sBAAsB;IAC/B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAQrC;IAEF;;;;;;OAMG;WACiB,QAAQ,CACxB,MAAM,EAAE,aAAa,EACrB,OAAO,GAAE,iBAAsB,GAChC,OAAO,CAAC,6BAA6B,CAAC;IA8EzC;;;;;OAKG;WACW,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAa7D;;;;;OAKG;WACW,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,EAAE;CAWrE"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConfigurationValidator = void 0;
|
|
4
|
+
const benchling_auth_validator_1 = require("./benchling-auth-validator");
|
|
5
|
+
const s3_bucket_validator_1 = require("./s3-bucket-validator");
|
|
6
|
+
/**
|
|
7
|
+
* Comprehensive configuration validator
|
|
8
|
+
*
|
|
9
|
+
* Combines all validation checks (Benchling + S3) and provides
|
|
10
|
+
* comprehensive validation results with aggregated errors.
|
|
11
|
+
*/
|
|
12
|
+
class ConfigurationValidator {
|
|
13
|
+
/**
|
|
14
|
+
* Validate entire configuration
|
|
15
|
+
*
|
|
16
|
+
* @param config - Configuration to validate
|
|
17
|
+
* @param options - Validation options
|
|
18
|
+
* @returns Comprehensive validation result
|
|
19
|
+
*/
|
|
20
|
+
static async validate(config, options = {}) {
|
|
21
|
+
const errors = [];
|
|
22
|
+
const warnings = [];
|
|
23
|
+
// Check required fields
|
|
24
|
+
const missingFields = ConfigurationValidator.checkRequiredFields(config);
|
|
25
|
+
if (missingFields.length > 0) {
|
|
26
|
+
errors.push(`Missing required fields: ${missingFields.join(", ")}`);
|
|
27
|
+
}
|
|
28
|
+
// Validate catalog URL format
|
|
29
|
+
if (config.catalogUrl && !ConfigurationValidator.validateCatalogUrl(config.catalogUrl)) {
|
|
30
|
+
errors.push("Invalid catalog URL");
|
|
31
|
+
}
|
|
32
|
+
else if (!config.catalogUrl) {
|
|
33
|
+
errors.push("Invalid catalog URL");
|
|
34
|
+
}
|
|
35
|
+
// If basic validation fails, return early
|
|
36
|
+
if (errors.length > 0 && (options.skipBenchlingValidation || options.skipS3Validation)) {
|
|
37
|
+
return {
|
|
38
|
+
isValid: false,
|
|
39
|
+
errors,
|
|
40
|
+
warnings: warnings.length > 0 ? warnings : undefined,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
// Validate Benchling authentication
|
|
44
|
+
if (!options.skipBenchlingValidation && config.benchlingTenant && config.benchlingClientId && config.benchlingClientSecret) {
|
|
45
|
+
try {
|
|
46
|
+
const benchlingCredentials = {
|
|
47
|
+
tenant: config.benchlingTenant,
|
|
48
|
+
clientId: config.benchlingClientId,
|
|
49
|
+
clientSecret: config.benchlingClientSecret,
|
|
50
|
+
};
|
|
51
|
+
const benchlingResult = await benchling_auth_validator_1.BenchlingAuthValidator.validate(benchlingCredentials);
|
|
52
|
+
if (!benchlingResult.isValid) {
|
|
53
|
+
errors.push(...benchlingResult.errors);
|
|
54
|
+
}
|
|
55
|
+
if (benchlingResult.warnings) {
|
|
56
|
+
warnings.push(...benchlingResult.warnings);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
if (error instanceof Error) {
|
|
61
|
+
errors.push(`Benchling validation failed: ${error.message}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Validate S3 bucket access
|
|
66
|
+
if (!options.skipS3Validation && config.quiltUserBucket && config.quiltRegion) {
|
|
67
|
+
try {
|
|
68
|
+
const s3Config = {
|
|
69
|
+
bucketName: config.quiltUserBucket,
|
|
70
|
+
region: config.quiltRegion,
|
|
71
|
+
};
|
|
72
|
+
const s3Result = await s3_bucket_validator_1.S3BucketValidator.validate(s3Config);
|
|
73
|
+
if (!s3Result.hasAccess) {
|
|
74
|
+
errors.push(...s3Result.errors);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
if (error instanceof Error) {
|
|
79
|
+
errors.push(`S3 validation failed: ${error.message}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
isValid: errors.length === 0,
|
|
85
|
+
errors,
|
|
86
|
+
warnings: warnings.length > 0 ? warnings : undefined,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Validate catalog URL format
|
|
91
|
+
*
|
|
92
|
+
* @param catalogUrl - Catalog URL to validate
|
|
93
|
+
* @returns True if URL format is valid
|
|
94
|
+
*/
|
|
95
|
+
static validateCatalogUrl(catalogUrl) {
|
|
96
|
+
if (!catalogUrl || catalogUrl.trim() === "") {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
try {
|
|
100
|
+
const url = new URL(catalogUrl);
|
|
101
|
+
return url.protocol === "http:" || url.protocol === "https:";
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Check for missing required fields
|
|
109
|
+
*
|
|
110
|
+
* @param config - Configuration to check
|
|
111
|
+
* @returns Array of missing field names
|
|
112
|
+
*/
|
|
113
|
+
static checkRequiredFields(config) {
|
|
114
|
+
const missing = [];
|
|
115
|
+
for (const field of ConfigurationValidator.REQUIRED_FIELDS) {
|
|
116
|
+
if (!config[field] || config[field]?.trim() === "") {
|
|
117
|
+
missing.push(field);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return missing;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
exports.ConfigurationValidator = ConfigurationValidator;
|
|
124
|
+
/**
|
|
125
|
+
* Required configuration fields
|
|
126
|
+
*/
|
|
127
|
+
ConfigurationValidator.REQUIRED_FIELDS = [
|
|
128
|
+
"catalogUrl",
|
|
129
|
+
"benchlingTenant",
|
|
130
|
+
"benchlingClientId",
|
|
131
|
+
"benchlingClientSecret",
|
|
132
|
+
"benchlingAppDefinitionId",
|
|
133
|
+
"quiltUserBucket",
|
|
134
|
+
"quiltRegion",
|
|
135
|
+
];
|
|
136
|
+
//# sourceMappingURL=configuration-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configuration-validator.js","sourceRoot":"","sources":["../../lib/configuration-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration wizard options
|
|
3
|
+
*/
|
|
4
|
+
export interface WizardOptions {
|
|
5
|
+
partialConfig?: Record<string, string | number | boolean>;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Interactive configuration wizard for completing missing configuration details
|
|
9
|
+
*/
|
|
10
|
+
export declare class ConfigurationWizard {
|
|
11
|
+
/**
|
|
12
|
+
* Required configuration fields
|
|
13
|
+
*/
|
|
14
|
+
private static readonly REQUIRED_FIELDS;
|
|
15
|
+
/**
|
|
16
|
+
* Optional configuration fields
|
|
17
|
+
*/
|
|
18
|
+
private static readonly OPTIONAL_FIELDS;
|
|
19
|
+
/**
|
|
20
|
+
* Run the configuration wizard
|
|
21
|
+
*/
|
|
22
|
+
static run(options: WizardOptions): Promise<Record<string, string | number | boolean>>;
|
|
23
|
+
/**
|
|
24
|
+
* Get missing required fields from partial configuration
|
|
25
|
+
*/
|
|
26
|
+
static getMissingFields(partialConfig: Record<string, string | number | boolean | undefined>): string[];
|
|
27
|
+
/**
|
|
28
|
+
* Create inquirer questions for missing fields
|
|
29
|
+
*/
|
|
30
|
+
private static createQuestions;
|
|
31
|
+
/**
|
|
32
|
+
* Validate answers after prompting
|
|
33
|
+
*/
|
|
34
|
+
private static validateAnswers;
|
|
35
|
+
/**
|
|
36
|
+
* Validate Benchling tenant format
|
|
37
|
+
*/
|
|
38
|
+
static validateTenant(value: string): boolean | string;
|
|
39
|
+
/**
|
|
40
|
+
* Validate Benchling client ID format
|
|
41
|
+
*/
|
|
42
|
+
static validateClientId(value: string): boolean | string;
|
|
43
|
+
/**
|
|
44
|
+
* Validate Benchling client secret format
|
|
45
|
+
*/
|
|
46
|
+
static validateClientSecret(value: string): boolean | string;
|
|
47
|
+
/**
|
|
48
|
+
* Validate Benchling app definition ID format
|
|
49
|
+
*/
|
|
50
|
+
static validateAppDefinitionId(value: string): boolean | string;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=configuration-wizard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configuration-wizard.d.ts","sourceRoot":"","sources":["../../lib/configuration-wizard.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;CAC7D;AAaD;;GAEG;AACH,qBAAa,mBAAmB;IAC5B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAyBrC;IAEF;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAOrC;IAEF;;OAEG;WACiB,GAAG,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IAwCnG;;OAEG;WACW,gBAAgB,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GAAG,MAAM,EAAE;IAY9G;;OAEG;IAEH,OAAO,CAAC,MAAM,CAAC,eAAe;IA+B9B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAuB9B;;OAEG;WACW,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM;IAO7D;;OAEG;WACW,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM;IAO/D;;OAEG;WACW,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM;IAUnE;;OAEG;WACW,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM;CAMzE"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ConfigurationWizard = void 0;
|
|
7
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
8
|
+
/**
|
|
9
|
+
* Interactive configuration wizard for completing missing configuration details
|
|
10
|
+
*/
|
|
11
|
+
class ConfigurationWizard {
|
|
12
|
+
/**
|
|
13
|
+
* Run the configuration wizard
|
|
14
|
+
*/
|
|
15
|
+
static async run(options) {
|
|
16
|
+
const { partialConfig = {} } = options;
|
|
17
|
+
try {
|
|
18
|
+
// Identify missing required fields
|
|
19
|
+
const missingFields = ConfigurationWizard.getMissingFields(partialConfig);
|
|
20
|
+
// If no fields are missing, return the partial config
|
|
21
|
+
if (missingFields.length === 0) {
|
|
22
|
+
return partialConfig;
|
|
23
|
+
}
|
|
24
|
+
// Create prompt questions for missing fields
|
|
25
|
+
const questions = ConfigurationWizard.createQuestions(missingFields);
|
|
26
|
+
// Prompt the user for missing fields
|
|
27
|
+
const answers = await inquirer_1.default.prompt(questions);
|
|
28
|
+
// Validate the answers
|
|
29
|
+
ConfigurationWizard.validateAnswers(answers);
|
|
30
|
+
// Merge answers with partial config
|
|
31
|
+
const completeConfig = { ...partialConfig };
|
|
32
|
+
// Add non-empty answers
|
|
33
|
+
for (const [key, value] of Object.entries(answers)) {
|
|
34
|
+
if (value && typeof value === "string" && value.trim() !== "") {
|
|
35
|
+
completeConfig[key] = value;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return completeConfig;
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
if (error instanceof Error && error.message === "User cancelled") {
|
|
42
|
+
throw new Error("Configuration wizard cancelled");
|
|
43
|
+
}
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get missing required fields from partial configuration
|
|
49
|
+
*/
|
|
50
|
+
static getMissingFields(partialConfig) {
|
|
51
|
+
const missingFields = [];
|
|
52
|
+
for (const field of ConfigurationWizard.REQUIRED_FIELDS) {
|
|
53
|
+
if (!partialConfig[field.name] || partialConfig[field.name] === "") {
|
|
54
|
+
missingFields.push(field.name);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return missingFields;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Create inquirer questions for missing fields
|
|
61
|
+
*/
|
|
62
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
63
|
+
static createQuestions(missingFields) {
|
|
64
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
65
|
+
const questions = [];
|
|
66
|
+
// Add questions for missing required fields
|
|
67
|
+
for (const field of ConfigurationWizard.REQUIRED_FIELDS) {
|
|
68
|
+
if (missingFields.includes(field.name)) {
|
|
69
|
+
questions.push({
|
|
70
|
+
type: field.type,
|
|
71
|
+
name: field.name,
|
|
72
|
+
message: field.message,
|
|
73
|
+
validate: field.validate ? (input) => {
|
|
74
|
+
const result = field.validate(input);
|
|
75
|
+
return result === true ? true : result;
|
|
76
|
+
} : undefined,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Add optional fields
|
|
81
|
+
for (const field of ConfigurationWizard.OPTIONAL_FIELDS) {
|
|
82
|
+
questions.push({
|
|
83
|
+
type: field.type,
|
|
84
|
+
name: field.name,
|
|
85
|
+
message: field.message,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
return questions;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Validate answers after prompting
|
|
92
|
+
*/
|
|
93
|
+
static validateAnswers(answers) {
|
|
94
|
+
// Check for empty tenant
|
|
95
|
+
if (answers.benchlingTenant !== undefined &&
|
|
96
|
+
(answers.benchlingTenant === "" || answers.benchlingTenant.trim() === "")) {
|
|
97
|
+
throw new Error("Benchling tenant cannot be empty");
|
|
98
|
+
}
|
|
99
|
+
// Check for empty client ID
|
|
100
|
+
if (answers.benchlingClientId !== undefined && answers.benchlingClientId === "") {
|
|
101
|
+
throw new Error("Benchling client ID cannot be empty");
|
|
102
|
+
}
|
|
103
|
+
// Check for empty client secret
|
|
104
|
+
if (answers.benchlingClientSecret !== undefined && answers.benchlingClientSecret === "") {
|
|
105
|
+
throw new Error("Benchling client secret cannot be empty");
|
|
106
|
+
}
|
|
107
|
+
// Check for empty app definition ID
|
|
108
|
+
if (answers.benchlingAppDefinitionId !== undefined && answers.benchlingAppDefinitionId === "") {
|
|
109
|
+
throw new Error("Benchling app definition ID cannot be empty");
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Validate Benchling tenant format
|
|
114
|
+
*/
|
|
115
|
+
static validateTenant(value) {
|
|
116
|
+
if (!value || value.trim() === "") {
|
|
117
|
+
return "Benchling tenant cannot be empty";
|
|
118
|
+
}
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Validate Benchling client ID format
|
|
123
|
+
*/
|
|
124
|
+
static validateClientId(value) {
|
|
125
|
+
if (!value || value.trim() === "") {
|
|
126
|
+
return "Client ID cannot be empty";
|
|
127
|
+
}
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Validate Benchling client secret format
|
|
132
|
+
*/
|
|
133
|
+
static validateClientSecret(value) {
|
|
134
|
+
if (!value || value.trim() === "") {
|
|
135
|
+
return "Client secret cannot be empty";
|
|
136
|
+
}
|
|
137
|
+
if (value.length < 6) {
|
|
138
|
+
return "Client secret must be at least 6 characters";
|
|
139
|
+
}
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Validate Benchling app definition ID format
|
|
144
|
+
*/
|
|
145
|
+
static validateAppDefinitionId(value) {
|
|
146
|
+
if (!value || value.trim() === "") {
|
|
147
|
+
return "App definition ID cannot be empty";
|
|
148
|
+
}
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
exports.ConfigurationWizard = ConfigurationWizard;
|
|
153
|
+
/**
|
|
154
|
+
* Required configuration fields
|
|
155
|
+
*/
|
|
156
|
+
ConfigurationWizard.REQUIRED_FIELDS = [
|
|
157
|
+
{
|
|
158
|
+
name: "benchlingTenant",
|
|
159
|
+
message: "Enter your Benchling tenant name (e.g., 'acme' for acme.benchling.com):",
|
|
160
|
+
type: "input",
|
|
161
|
+
validate: ConfigurationWizard.validateTenant,
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
name: "benchlingClientId",
|
|
165
|
+
message: "Enter your Benchling OAuth client ID:",
|
|
166
|
+
type: "input",
|
|
167
|
+
validate: ConfigurationWizard.validateClientId,
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
name: "benchlingClientSecret",
|
|
171
|
+
message: "Enter your Benchling OAuth client secret:",
|
|
172
|
+
type: "password",
|
|
173
|
+
validate: ConfigurationWizard.validateClientSecret,
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
name: "benchlingAppDefinitionId",
|
|
177
|
+
message: "Enter your Benchling app definition ID:",
|
|
178
|
+
type: "input",
|
|
179
|
+
validate: ConfigurationWizard.validateAppDefinitionId,
|
|
180
|
+
},
|
|
181
|
+
];
|
|
182
|
+
/**
|
|
183
|
+
* Optional configuration fields
|
|
184
|
+
*/
|
|
185
|
+
ConfigurationWizard.OPTIONAL_FIELDS = [
|
|
186
|
+
{
|
|
187
|
+
name: "benchlingTestEntry",
|
|
188
|
+
message: "Enter a Benchling test entry ID (optional, press Enter to skip):",
|
|
189
|
+
type: "input",
|
|
190
|
+
optional: true,
|
|
191
|
+
},
|
|
192
|
+
];
|
|
193
|
+
//# sourceMappingURL=configuration-wizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configuration-wizard.js","sourceRoot":"","sources":["../../lib/configuration-wizard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quilt Configuration Resolver
|
|
3
|
+
*
|
|
4
|
+
* Automatically infers Quilt configuration from the quilt3 CLI.
|
|
5
|
+
* Extracts catalog URL, S3 bucket, and region information.
|
|
6
|
+
*
|
|
7
|
+
* @module quilt-config-resolver
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Quilt configuration structure
|
|
11
|
+
*/
|
|
12
|
+
export interface QuiltConfig {
|
|
13
|
+
catalogUrl?: string;
|
|
14
|
+
userBucket?: string;
|
|
15
|
+
defaultRegion?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Quilt Configuration Resolver
|
|
19
|
+
*
|
|
20
|
+
* Resolves Quilt configuration from the quilt3 CLI or user overrides.
|
|
21
|
+
*/
|
|
22
|
+
export declare class QuiltConfigResolver {
|
|
23
|
+
/**
|
|
24
|
+
* Resolves Quilt configuration with optional manual overrides
|
|
25
|
+
*
|
|
26
|
+
* @param manualConfig - Optional manual configuration overrides
|
|
27
|
+
* @returns Resolved Quilt configuration
|
|
28
|
+
*/
|
|
29
|
+
static resolve(manualConfig?: Partial<QuiltConfig>): Promise<QuiltConfig>;
|
|
30
|
+
/**
|
|
31
|
+
* Resolves configuration from quilt3 CLI
|
|
32
|
+
*
|
|
33
|
+
* @returns Resolved Quilt configuration
|
|
34
|
+
* @throws {Error} If quilt3 is not installed or configured
|
|
35
|
+
*/
|
|
36
|
+
resolveFromQuilt3(): Promise<QuiltConfig>;
|
|
37
|
+
/**
|
|
38
|
+
* Resolves configuration using a custom command
|
|
39
|
+
*
|
|
40
|
+
* @param command - Command to execute
|
|
41
|
+
* @returns Resolved Quilt configuration
|
|
42
|
+
* @throws {Error} If command fails
|
|
43
|
+
*/
|
|
44
|
+
resolveWithCommand(command: string): Promise<QuiltConfig>;
|
|
45
|
+
/**
|
|
46
|
+
* Parses quilt3 config output
|
|
47
|
+
*
|
|
48
|
+
* @param output - Raw output from quilt3 config command
|
|
49
|
+
* @returns Parsed Quilt configuration
|
|
50
|
+
*/
|
|
51
|
+
parseQuilt3Config(output: string): QuiltConfig;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=quilt-config-resolver.d.ts.map
|