@quiltdata/benchling-webhook 0.5.4 → 0.6.1-20251104T043302Z

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/README.md +295 -12
  2. package/dist/bin/benchling-webhook.d.ts +1 -1
  3. package/dist/bin/benchling-webhook.d.ts.map +1 -1
  4. package/dist/bin/benchling-webhook.js +12 -22
  5. package/dist/bin/benchling-webhook.js.map +1 -1
  6. package/dist/bin/cdk-dev.js +59 -3
  7. package/dist/bin/cli.js +27 -9
  8. package/dist/bin/cli.js.map +1 -1
  9. package/dist/bin/commands/deploy.d.ts +6 -2
  10. package/dist/bin/commands/deploy.d.ts.map +1 -1
  11. package/dist/bin/commands/deploy.js +151 -90
  12. package/dist/bin/commands/deploy.js.map +1 -1
  13. package/dist/bin/commands/setup-wizard.d.ts +22 -0
  14. package/dist/bin/commands/setup-wizard.d.ts.map +1 -0
  15. package/dist/bin/commands/setup-wizard.js +47 -0
  16. package/dist/bin/commands/setup-wizard.js.map +1 -0
  17. package/dist/bin/config-profiles.d.ts +59 -0
  18. package/dist/bin/config-profiles.d.ts.map +1 -0
  19. package/dist/bin/config-profiles.js +272 -0
  20. package/dist/bin/config-profiles.js.map +1 -0
  21. package/dist/bin/create-secret.d.ts +25 -0
  22. package/dist/bin/create-secret.d.ts.map +1 -0
  23. package/dist/bin/create-secret.js +239 -0
  24. package/dist/bin/create-secret.js.map +1 -0
  25. package/dist/lib/benchling-auth-validator.d.ts +65 -0
  26. package/dist/lib/benchling-auth-validator.d.ts.map +1 -0
  27. package/dist/lib/benchling-auth-validator.js +213 -0
  28. package/dist/lib/benchling-auth-validator.js.map +1 -0
  29. package/dist/lib/benchling-webhook-stack.d.ts +13 -10
  30. package/dist/lib/benchling-webhook-stack.d.ts.map +1 -1
  31. package/dist/lib/benchling-webhook-stack.js +25 -69
  32. package/dist/lib/benchling-webhook-stack.js.map +1 -1
  33. package/dist/lib/config-logger.d.ts +191 -0
  34. package/dist/lib/config-logger.d.ts.map +1 -0
  35. package/dist/lib/config-logger.js +372 -0
  36. package/dist/lib/config-logger.js.map +1 -0
  37. package/dist/lib/configuration-saver.d.ts +75 -0
  38. package/dist/lib/configuration-saver.d.ts.map +1 -0
  39. package/dist/lib/configuration-saver.js +145 -0
  40. package/dist/lib/configuration-saver.js.map +1 -0
  41. package/dist/lib/configuration-validator.d.ts +63 -0
  42. package/dist/lib/configuration-validator.d.ts.map +1 -0
  43. package/dist/lib/configuration-validator.js +136 -0
  44. package/dist/lib/configuration-validator.js.map +1 -0
  45. package/dist/lib/configuration-wizard.d.ts +52 -0
  46. package/dist/lib/configuration-wizard.d.ts.map +1 -0
  47. package/dist/lib/configuration-wizard.js +193 -0
  48. package/dist/lib/configuration-wizard.js.map +1 -0
  49. package/dist/lib/fargate-service.d.ts +18 -9
  50. package/dist/lib/fargate-service.d.ts.map +1 -1
  51. package/dist/lib/fargate-service.js +177 -61
  52. package/dist/lib/fargate-service.js.map +1 -1
  53. package/dist/lib/quilt-config-resolver.d.ts +53 -0
  54. package/dist/lib/quilt-config-resolver.d.ts.map +1 -0
  55. package/dist/lib/quilt-config-resolver.js +100 -0
  56. package/dist/lib/quilt-config-resolver.js.map +1 -0
  57. package/dist/lib/s3-bucket-validator.d.ts +76 -0
  58. package/dist/lib/s3-bucket-validator.d.ts.map +1 -0
  59. package/dist/lib/s3-bucket-validator.js +237 -0
  60. package/dist/lib/s3-bucket-validator.js.map +1 -0
  61. package/dist/lib/types/config.d.ts +398 -0
  62. package/dist/lib/types/config.d.ts.map +1 -0
  63. package/dist/lib/types/config.js +11 -0
  64. package/dist/lib/types/config.js.map +1 -0
  65. package/dist/lib/utils/config-loader.d.ts +48 -0
  66. package/dist/lib/utils/config-loader.d.ts.map +1 -0
  67. package/dist/lib/utils/config-loader.js +109 -0
  68. package/dist/lib/utils/config-loader.js.map +1 -0
  69. package/dist/lib/utils/config-resolver.d.ts +138 -0
  70. package/dist/lib/utils/config-resolver.d.ts.map +1 -0
  71. package/dist/lib/utils/config-resolver.js +272 -0
  72. package/dist/lib/utils/config-resolver.js.map +1 -0
  73. package/dist/lib/utils/config.d.ts +50 -0
  74. package/dist/lib/utils/config.d.ts.map +1 -1
  75. package/dist/lib/utils/config.js +86 -0
  76. package/dist/lib/utils/config.js.map +1 -1
  77. package/dist/lib/utils/secrets.d.ts +174 -0
  78. package/dist/lib/utils/secrets.d.ts.map +1 -0
  79. package/dist/lib/utils/secrets.js +351 -0
  80. package/dist/lib/utils/secrets.js.map +1 -0
  81. package/dist/lib/xdg-cli-wrapper.d.ts +113 -0
  82. package/dist/lib/xdg-cli-wrapper.d.ts.map +1 -0
  83. package/dist/lib/xdg-cli-wrapper.js +288 -0
  84. package/dist/lib/xdg-cli-wrapper.js.map +1 -0
  85. package/dist/lib/xdg-config.d.ts +187 -0
  86. package/dist/lib/xdg-config.d.ts.map +1 -0
  87. package/dist/lib/xdg-config.js +562 -0
  88. package/dist/lib/xdg-config.js.map +1 -0
  89. package/dist/package.json +34 -26
  90. package/dist/scripts/config-health-check.d.ts +78 -0
  91. package/dist/scripts/config-health-check.d.ts.map +1 -0
  92. package/dist/scripts/config-health-check.js +559 -0
  93. package/dist/scripts/config-health-check.js.map +1 -0
  94. package/dist/scripts/infer-quilt-config.d.ts +50 -0
  95. package/dist/scripts/infer-quilt-config.d.ts.map +1 -0
  96. package/dist/scripts/infer-quilt-config.js +353 -0
  97. package/dist/scripts/infer-quilt-config.js.map +1 -0
  98. package/dist/scripts/install-wizard.d.ts +34 -0
  99. package/dist/scripts/install-wizard.d.ts.map +1 -0
  100. package/dist/scripts/install-wizard.js +719 -0
  101. package/dist/scripts/install-wizard.js.map +1 -0
  102. package/dist/scripts/sync-secrets.d.ts +63 -0
  103. package/dist/scripts/sync-secrets.d.ts.map +1 -0
  104. package/dist/scripts/sync-secrets.js +424 -0
  105. package/dist/scripts/sync-secrets.js.map +1 -0
  106. package/env.template +60 -47
  107. package/package.json +34 -26
@@ -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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"}
@@ -8,22 +8,31 @@ import { Construct } from "constructs";
8
8
  export interface FargateServiceProps {
9
9
  readonly vpc: ec2.IVpc;
10
10
  readonly bucket: s3.IBucket;
11
- readonly queueArn: string;
12
11
  readonly region: string;
13
12
  readonly account: string;
14
- readonly prefix: string;
15
- readonly pkgKey: string;
16
- readonly benchlingClientId: string;
17
- readonly benchlingClientSecret: string;
18
- readonly benchlingTenant: string;
19
- readonly quiltCatalog: string;
20
- readonly quiltDatabase: string;
21
- readonly webhookAllowList: string;
22
13
  readonly ecrRepository: ecr.IRepository;
23
14
  readonly imageTag?: string;
24
15
  readonly stackVersion?: string;
25
16
  readonly logLevel?: string;
26
17
  readonly enableWebhookVerification?: string;
18
+ readonly quiltStackArn?: string;
19
+ readonly benchlingSecret?: string;
20
+ readonly queueArn?: string;
21
+ readonly prefix?: string;
22
+ readonly pkgKey?: string;
23
+ readonly benchlingClientId?: string;
24
+ readonly benchlingClientSecret?: string;
25
+ readonly benchlingTenant?: string;
26
+ readonly benchlingAppDefinitionId?: string;
27
+ /**
28
+ * Consolidated Benchling secrets as JSON string.
29
+ * When provided and non-empty, the container will receive BENCHLING_SECRETS environment variable.
30
+ * Otherwise, individual environment variables (BENCHLING_TENANT) and secrets (BENCHLING_CLIENT_ID, BENCHLING_CLIENT_SECRET) are used.
31
+ */
32
+ readonly benchlingSecrets?: string;
33
+ readonly quiltCatalog?: string;
34
+ readonly quiltDatabase?: string;
35
+ readonly webhookAllowList?: string;
27
36
  }
28
37
  export declare class FargateService extends Construct {
29
38
  readonly service: ecs.FargateService;
@@ -1 +1 @@
1
- {"version":3,"file":"fargate-service.d.ts","sourceRoot":"","sources":["../../lib/fargate-service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,GAAG,MAAM,qBAAqB,CAAC;AAC3C,OAAO,KAAK,GAAG,MAAM,qBAAqB,CAAC;AAC3C,OAAO,KAAK,GAAG,MAAM,qBAAqB,CAAC;AAC3C,OAAO,KAAK,KAAK,MAAM,wCAAwC,CAAC;AAEhE,OAAO,KAAK,IAAI,MAAM,sBAAsB,CAAC;AAE7C,OAAO,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,WAAW,mBAAmB;IAChC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,WAAW,CAAC;IACxC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,yBAAyB,CAAC,EAAE,MAAM,CAAC;CAC/C;AAED,qBAAa,cAAe,SAAQ,SAAS;IACzC,SAAgB,OAAO,EAAE,GAAG,CAAC,cAAc,CAAC;IAC5C,SAAgB,YAAY,EAAE,KAAK,CAAC,uBAAuB,CAAC;IAC5D,SAAgB,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC;IACrC,SAAgB,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC;gBAE7B,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB;CAgTvE"}
1
+ {"version":3,"file":"fargate-service.d.ts","sourceRoot":"","sources":["../../lib/fargate-service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,GAAG,MAAM,qBAAqB,CAAC;AAC3C,OAAO,KAAK,GAAG,MAAM,qBAAqB,CAAC;AAC3C,OAAO,KAAK,GAAG,MAAM,qBAAqB,CAAC;AAC3C,OAAO,KAAK,KAAK,MAAM,wCAAwC,CAAC;AAEhE,OAAO,KAAK,IAAI,MAAM,sBAAsB,CAAC;AAE7C,OAAO,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,WAAW,mBAAmB;IAChC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,WAAW,CAAC;IACxC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IAG5C,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAGlC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAC3C;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACtC;AAED,qBAAa,cAAe,SAAQ,SAAS;IACzC,SAAgB,OAAO,EAAE,GAAG,CAAC,cAAc,CAAC;IAC5C,SAAgB,YAAY,EAAE,KAAK,CAAC,uBAAuB,CAAC;IAC5D,SAAgB,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC;IACrC,SAAgB,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC;gBAE7B,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB;CA0bvE"}