@quiltdata/benchling-webhook 0.5.4 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/README.md +273 -10
  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 +8 -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 +16 -6
  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 +149 -90
  12. package/dist/bin/commands/deploy.js.map +1 -1
  13. package/dist/bin/config-profiles.d.ts +59 -0
  14. package/dist/bin/config-profiles.d.ts.map +1 -0
  15. package/dist/bin/config-profiles.js +272 -0
  16. package/dist/bin/config-profiles.js.map +1 -0
  17. package/dist/bin/create-secret.d.ts +25 -0
  18. package/dist/bin/create-secret.d.ts.map +1 -0
  19. package/dist/bin/create-secret.js +239 -0
  20. package/dist/bin/create-secret.js.map +1 -0
  21. package/dist/lib/benchling-auth-validator.d.ts +65 -0
  22. package/dist/lib/benchling-auth-validator.d.ts.map +1 -0
  23. package/dist/lib/benchling-auth-validator.js +213 -0
  24. package/dist/lib/benchling-auth-validator.js.map +1 -0
  25. package/dist/lib/benchling-webhook-stack.d.ts +13 -10
  26. package/dist/lib/benchling-webhook-stack.d.ts.map +1 -1
  27. package/dist/lib/benchling-webhook-stack.js +25 -69
  28. package/dist/lib/benchling-webhook-stack.js.map +1 -1
  29. package/dist/lib/config-logger.d.ts +191 -0
  30. package/dist/lib/config-logger.d.ts.map +1 -0
  31. package/dist/lib/config-logger.js +372 -0
  32. package/dist/lib/config-logger.js.map +1 -0
  33. package/dist/lib/configuration-saver.d.ts +75 -0
  34. package/dist/lib/configuration-saver.d.ts.map +1 -0
  35. package/dist/lib/configuration-saver.js +145 -0
  36. package/dist/lib/configuration-saver.js.map +1 -0
  37. package/dist/lib/configuration-validator.d.ts +63 -0
  38. package/dist/lib/configuration-validator.d.ts.map +1 -0
  39. package/dist/lib/configuration-validator.js +136 -0
  40. package/dist/lib/configuration-validator.js.map +1 -0
  41. package/dist/lib/configuration-wizard.d.ts +52 -0
  42. package/dist/lib/configuration-wizard.d.ts.map +1 -0
  43. package/dist/lib/configuration-wizard.js +193 -0
  44. package/dist/lib/configuration-wizard.js.map +1 -0
  45. package/dist/lib/fargate-service.d.ts +18 -9
  46. package/dist/lib/fargate-service.d.ts.map +1 -1
  47. package/dist/lib/fargate-service.js +177 -61
  48. package/dist/lib/fargate-service.js.map +1 -1
  49. package/dist/lib/quilt-config-resolver.d.ts +53 -0
  50. package/dist/lib/quilt-config-resolver.d.ts.map +1 -0
  51. package/dist/lib/quilt-config-resolver.js +100 -0
  52. package/dist/lib/quilt-config-resolver.js.map +1 -0
  53. package/dist/lib/s3-bucket-validator.d.ts +76 -0
  54. package/dist/lib/s3-bucket-validator.d.ts.map +1 -0
  55. package/dist/lib/s3-bucket-validator.js +237 -0
  56. package/dist/lib/s3-bucket-validator.js.map +1 -0
  57. package/dist/lib/types/config.d.ts +398 -0
  58. package/dist/lib/types/config.d.ts.map +1 -0
  59. package/dist/lib/types/config.js +11 -0
  60. package/dist/lib/types/config.js.map +1 -0
  61. package/dist/lib/utils/config-loader.d.ts +48 -0
  62. package/dist/lib/utils/config-loader.d.ts.map +1 -0
  63. package/dist/lib/utils/config-loader.js +109 -0
  64. package/dist/lib/utils/config-loader.js.map +1 -0
  65. package/dist/lib/utils/config-resolver.d.ts +138 -0
  66. package/dist/lib/utils/config-resolver.d.ts.map +1 -0
  67. package/dist/lib/utils/config-resolver.js +272 -0
  68. package/dist/lib/utils/config-resolver.js.map +1 -0
  69. package/dist/lib/utils/config.d.ts +50 -0
  70. package/dist/lib/utils/config.d.ts.map +1 -1
  71. package/dist/lib/utils/config.js +86 -0
  72. package/dist/lib/utils/config.js.map +1 -1
  73. package/dist/lib/utils/secrets.d.ts +174 -0
  74. package/dist/lib/utils/secrets.d.ts.map +1 -0
  75. package/dist/lib/utils/secrets.js +351 -0
  76. package/dist/lib/utils/secrets.js.map +1 -0
  77. package/dist/lib/xdg-cli-wrapper.d.ts +113 -0
  78. package/dist/lib/xdg-cli-wrapper.d.ts.map +1 -0
  79. package/dist/lib/xdg-cli-wrapper.js +288 -0
  80. package/dist/lib/xdg-cli-wrapper.js.map +1 -0
  81. package/dist/lib/xdg-config.d.ts +187 -0
  82. package/dist/lib/xdg-config.d.ts.map +1 -0
  83. package/dist/lib/xdg-config.js +562 -0
  84. package/dist/lib/xdg-config.js.map +1 -0
  85. package/dist/package.json +33 -25
  86. package/dist/scripts/config-health-check.d.ts +78 -0
  87. package/dist/scripts/config-health-check.d.ts.map +1 -0
  88. package/dist/scripts/config-health-check.js +559 -0
  89. package/dist/scripts/config-health-check.js.map +1 -0
  90. package/dist/scripts/infer-quilt-config.d.ts +50 -0
  91. package/dist/scripts/infer-quilt-config.d.ts.map +1 -0
  92. package/dist/scripts/infer-quilt-config.js +353 -0
  93. package/dist/scripts/infer-quilt-config.js.map +1 -0
  94. package/dist/scripts/install-wizard.d.ts +34 -0
  95. package/dist/scripts/install-wizard.d.ts.map +1 -0
  96. package/dist/scripts/install-wizard.js +719 -0
  97. package/dist/scripts/install-wizard.js.map +1 -0
  98. package/dist/scripts/sync-secrets.d.ts +63 -0
  99. package/dist/scripts/sync-secrets.d.ts.map +1 -0
  100. package/dist/scripts/sync-secrets.js +424 -0
  101. package/dist/scripts/sync-secrets.js.map +1 -0
  102. package/env.template +60 -47
  103. package/package.json +33 -25
@@ -0,0 +1,237 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.S3BucketValidator = void 0;
4
+ const client_s3_1 = require("@aws-sdk/client-s3");
5
+ /**
6
+ * S3 bucket access validator
7
+ *
8
+ * Validates S3 bucket access and permissions required for the webhook integration.
9
+ */
10
+ class S3BucketValidator {
11
+ /**
12
+ * Validate S3 bucket access and permissions
13
+ *
14
+ * @param config - S3 bucket configuration
15
+ * @returns Validation result with access status and errors
16
+ */
17
+ static async validate(config) {
18
+ const errors = [];
19
+ // Validate bucket name format
20
+ if (!S3BucketValidator.validateBucketName(config.bucketName)) {
21
+ errors.push("Invalid bucket name format");
22
+ return {
23
+ hasAccess: false,
24
+ isConfigured: false,
25
+ errors,
26
+ };
27
+ }
28
+ // Validate region format
29
+ if (!S3BucketValidator.validateRegion(config.region)) {
30
+ errors.push("Invalid AWS region");
31
+ return {
32
+ hasAccess: false,
33
+ isConfigured: false,
34
+ errors,
35
+ };
36
+ }
37
+ // Create S3 client
38
+ const s3Client = new client_s3_1.S3Client({ region: config.region });
39
+ try {
40
+ // Check if bucket exists
41
+ const bucketExists = await S3BucketValidator.checkBucketExists(config.bucketName, config.region, s3Client);
42
+ if (!bucketExists) {
43
+ errors.push("Bucket does not exist");
44
+ return {
45
+ hasAccess: false,
46
+ isConfigured: false,
47
+ errors,
48
+ };
49
+ }
50
+ // Test write permissions
51
+ const hasWritePermission = await S3BucketValidator.testWritePermission(config.bucketName, s3Client);
52
+ if (!hasWritePermission) {
53
+ errors.push("Insufficient write permissions");
54
+ return {
55
+ hasAccess: false,
56
+ isConfigured: false,
57
+ hasWritePermission: false,
58
+ errors,
59
+ };
60
+ }
61
+ // Test read permissions
62
+ const hasReadPermission = await S3BucketValidator.testReadPermission(config.bucketName, s3Client);
63
+ return {
64
+ hasAccess: true,
65
+ isConfigured: true,
66
+ hasWritePermission,
67
+ hasReadPermission,
68
+ errors: [],
69
+ };
70
+ }
71
+ catch (error) {
72
+ if (error instanceof Error) {
73
+ const errorName = error.name || "";
74
+ if (errorName === "NoSuchBucket") {
75
+ errors.push("Bucket does not exist");
76
+ }
77
+ else if (errorName === "AccessDenied" || errorName === "Forbidden") {
78
+ errors.push("Insufficient write permissions");
79
+ }
80
+ else {
81
+ errors.push(`Validation error: ${error.message}`);
82
+ }
83
+ }
84
+ return {
85
+ hasAccess: false,
86
+ isConfigured: false,
87
+ errors,
88
+ };
89
+ }
90
+ }
91
+ /**
92
+ * Validate S3 bucket name format
93
+ *
94
+ * @param bucketName - Bucket name to validate
95
+ * @returns True if bucket name is valid
96
+ */
97
+ static validateBucketName(bucketName) {
98
+ if (!bucketName || bucketName.trim() === "") {
99
+ return false;
100
+ }
101
+ // S3 bucket naming rules:
102
+ // - 3-63 characters
103
+ // - lowercase letters, numbers, hyphens, dots
104
+ // - must start and end with letter or number
105
+ const bucketRegex = /^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$/;
106
+ // Reject names with uppercase (invalid for S3)
107
+ if (bucketName !== bucketName.toLowerCase()) {
108
+ return false;
109
+ }
110
+ return bucketRegex.test(bucketName);
111
+ }
112
+ /**
113
+ * Validate AWS region format
114
+ *
115
+ * @param region - AWS region to validate
116
+ * @returns True if region format is valid
117
+ */
118
+ static validateRegion(region) {
119
+ if (!region || region.trim() === "") {
120
+ return false;
121
+ }
122
+ return S3BucketValidator.VALID_REGIONS.test(region);
123
+ }
124
+ /**
125
+ * Check if S3 bucket exists
126
+ *
127
+ * @param bucketName - Name of the bucket
128
+ * @param region - AWS region
129
+ * @param s3Client - Optional S3 client instance
130
+ * @returns True if bucket exists
131
+ */
132
+ static async checkBucketExists(bucketName, region, s3Client) {
133
+ const client = s3Client || new client_s3_1.S3Client({ region });
134
+ try {
135
+ const command = new client_s3_1.HeadBucketCommand({ Bucket: bucketName });
136
+ await client.send(command);
137
+ return true;
138
+ }
139
+ catch (error) {
140
+ const errorName = error.name || "";
141
+ if (errorName === "NoSuchBucket" || errorName === "NotFound") {
142
+ return false;
143
+ }
144
+ // For other errors (like AccessDenied), bucket exists but we can't access it
145
+ throw error;
146
+ }
147
+ }
148
+ /**
149
+ * Test write permissions on S3 bucket
150
+ *
151
+ * @param bucketName - Name of the bucket
152
+ * @param s3Client - S3 client instance
153
+ * @returns True if write permission is granted
154
+ */
155
+ static async testWritePermission(bucketName, s3Client) {
156
+ const testKey = `.benchling-webhook-test-${Date.now()}`;
157
+ try {
158
+ // Attempt to write a test object
159
+ const putCommand = new client_s3_1.PutObjectCommand({
160
+ Bucket: bucketName,
161
+ Key: testKey,
162
+ Body: "test",
163
+ });
164
+ await s3Client.send(putCommand);
165
+ // Clean up test object
166
+ const deleteCommand = new client_s3_1.DeleteObjectCommand({
167
+ Bucket: bucketName,
168
+ Key: testKey,
169
+ });
170
+ await s3Client.send(deleteCommand);
171
+ return true;
172
+ }
173
+ catch (error) {
174
+ const errorName = error.name || "";
175
+ if (errorName === "AccessDenied" || errorName === "Forbidden") {
176
+ return false;
177
+ }
178
+ throw error;
179
+ }
180
+ }
181
+ /**
182
+ * Test read permissions on S3 bucket
183
+ *
184
+ * @param bucketName - Name of the bucket
185
+ * @param s3Client - S3 client instance
186
+ * @returns True if read permission is granted
187
+ */
188
+ static async testReadPermission(bucketName, s3Client) {
189
+ const testKey = `.benchling-webhook-test-${Date.now()}`;
190
+ try {
191
+ // First, write a test object
192
+ const putCommand = new client_s3_1.PutObjectCommand({
193
+ Bucket: bucketName,
194
+ Key: testKey,
195
+ Body: "test",
196
+ });
197
+ await s3Client.send(putCommand);
198
+ // Attempt to read the test object
199
+ const getCommand = new client_s3_1.GetObjectCommand({
200
+ Bucket: bucketName,
201
+ Key: testKey,
202
+ });
203
+ await s3Client.send(getCommand);
204
+ // Clean up test object
205
+ const deleteCommand = new client_s3_1.DeleteObjectCommand({
206
+ Bucket: bucketName,
207
+ Key: testKey,
208
+ });
209
+ await s3Client.send(deleteCommand);
210
+ return true;
211
+ }
212
+ catch (error) {
213
+ const errorName = error.name || "";
214
+ if (errorName === "AccessDenied" || errorName === "Forbidden") {
215
+ return false;
216
+ }
217
+ // If we can't read, still try to clean up
218
+ try {
219
+ const deleteCommand = new client_s3_1.DeleteObjectCommand({
220
+ Bucket: bucketName,
221
+ Key: testKey,
222
+ });
223
+ await s3Client.send(deleteCommand);
224
+ }
225
+ catch {
226
+ // Ignore cleanup errors
227
+ }
228
+ throw error;
229
+ }
230
+ }
231
+ }
232
+ exports.S3BucketValidator = S3BucketValidator;
233
+ /**
234
+ * Valid AWS region patterns
235
+ */
236
+ S3BucketValidator.VALID_REGIONS = /^(us|eu|ap|sa|ca|me|af|cn|us-gov)-(north|south|east|west|central|northeast|southeast|southwest|northwest)-\d+$/;
237
+ //# sourceMappingURL=s3-bucket-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3-bucket-validator.js","sourceRoot":"","sources":["../../lib/s3-bucket-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,398 @@
1
+ /**
2
+ * Comprehensive Type Definitions for XDG Configuration System
3
+ *
4
+ * This module defines all TypeScript types and interfaces for the
5
+ * XDG-compliant configuration management system.
6
+ *
7
+ * @module types/config
8
+ */
9
+ /**
10
+ * Configuration profile identifier
11
+ * Profiles allow multiple named configurations (e.g., "default", "dev", "prod")
12
+ */
13
+ export type ProfileName = string;
14
+ /**
15
+ * Configuration type identifier
16
+ */
17
+ export type ConfigType = "user" | "derived" | "deploy" | "complete";
18
+ /**
19
+ * User Configuration
20
+ *
21
+ * User-provided settings that define the core configuration.
22
+ * This is the primary configuration file edited by users.
23
+ */
24
+ export interface UserConfig {
25
+ /**
26
+ * Quilt catalog URL (e.g., "https://quilt.example.com")
27
+ */
28
+ quiltCatalog?: string;
29
+ /**
30
+ * Quilt user bucket name for package storage
31
+ */
32
+ quiltUserBucket?: string;
33
+ /**
34
+ * Quilt database (Athena/Glue) identifier
35
+ */
36
+ quiltDatabase?: string;
37
+ /**
38
+ * Quilt CloudFormation stack ARN
39
+ */
40
+ quiltStackArn?: string;
41
+ /**
42
+ * AWS region for Quilt resources
43
+ */
44
+ quiltRegion?: string;
45
+ /**
46
+ * Benchling tenant identifier
47
+ */
48
+ benchlingTenant?: string;
49
+ /**
50
+ * Benchling OAuth client ID
51
+ */
52
+ benchlingClientId?: string;
53
+ /**
54
+ * Benchling OAuth client secret (stored in Secrets Manager in production)
55
+ */
56
+ benchlingClientSecret?: string;
57
+ /**
58
+ * Benchling app definition ID
59
+ */
60
+ benchlingAppDefinitionId?: string;
61
+ /**
62
+ * S3 bucket for Benchling package storage
63
+ */
64
+ benchlingPkgBucket?: string;
65
+ /**
66
+ * Benchling test entry ID (optional, for validation)
67
+ */
68
+ benchlingTestEntry?: string;
69
+ /**
70
+ * AWS Secrets Manager secret ARN for Benchling credentials
71
+ */
72
+ benchlingSecretArn?: string;
73
+ /**
74
+ * AWS account ID for CDK deployment
75
+ */
76
+ cdkAccount?: string;
77
+ /**
78
+ * AWS region for CDK deployment
79
+ */
80
+ cdkRegion?: string;
81
+ /**
82
+ * AWS profile to use for deployment operations
83
+ */
84
+ awsProfile?: string;
85
+ /**
86
+ * SQS queue ARN for package creation
87
+ */
88
+ queueArn?: string;
89
+ /**
90
+ * S3 key prefix for Benchling packages
91
+ */
92
+ pkgPrefix?: string;
93
+ /**
94
+ * Package metadata key (e.g., "experiment_id")
95
+ */
96
+ pkgKey?: string;
97
+ /**
98
+ * Logging level (DEBUG, INFO, WARNING, ERROR)
99
+ */
100
+ logLevel?: string;
101
+ /**
102
+ * Comma-separated IP allowlist for webhook access
103
+ */
104
+ webhookAllowList?: string;
105
+ /**
106
+ * Enable webhook signature verification
107
+ */
108
+ enableWebhookVerification?: string;
109
+ /**
110
+ * Create ECR repository flag
111
+ */
112
+ createEcrRepository?: string;
113
+ /**
114
+ * ECR repository name
115
+ */
116
+ ecrRepositoryName?: string;
117
+ /**
118
+ * Docker image tag
119
+ */
120
+ imageTag?: string;
121
+ /**
122
+ * Configuration metadata (optional)
123
+ */
124
+ _metadata?: ConfigMetadata;
125
+ }
126
+ /**
127
+ * Derived Configuration
128
+ *
129
+ * Configuration values inferred from CLI tools (e.g., quilt3 config)
130
+ * or computed from user configuration.
131
+ */
132
+ export interface DerivedConfig extends UserConfig {
133
+ /**
134
+ * Catalog URL inferred from quilt3 CLI
135
+ */
136
+ catalogUrl?: string;
137
+ /**
138
+ * Metadata tracking inference source and timestamp
139
+ */
140
+ _metadata?: ConfigMetadata & {
141
+ inferredAt?: string;
142
+ inferredFrom?: string;
143
+ };
144
+ }
145
+ /**
146
+ * Deployment Configuration
147
+ *
148
+ * Configuration artifacts generated during deployment.
149
+ * Contains deployment-specific values like webhook URLs and stack ARNs.
150
+ */
151
+ export interface DeploymentConfig extends DerivedConfig {
152
+ /**
153
+ * Deployed webhook endpoint URL
154
+ */
155
+ webhookEndpoint?: string;
156
+ /**
157
+ * Deployed webhook URL (alias for webhookEndpoint)
158
+ */
159
+ webhookUrl?: string;
160
+ /**
161
+ * CloudFormation stack ARN
162
+ */
163
+ stackArn?: string;
164
+ /**
165
+ * Deployment timestamp
166
+ */
167
+ deploymentTimestamp?: string;
168
+ /**
169
+ * ISO timestamp of deployment
170
+ */
171
+ deployedAt?: string;
172
+ /**
173
+ * Metadata tracking deployment details
174
+ */
175
+ _metadata?: ConfigMetadata & {
176
+ deployedAt?: string;
177
+ deployedBy?: string;
178
+ stackName?: string;
179
+ };
180
+ }
181
+ /**
182
+ * Configuration Metadata
183
+ *
184
+ * Tracks configuration provenance, timestamps, and versioning.
185
+ */
186
+ export interface ConfigMetadata {
187
+ /**
188
+ * ISO timestamp when configuration was saved
189
+ */
190
+ savedAt?: string;
191
+ /**
192
+ * Source of configuration (e.g., "cli", "wizard", "manual")
193
+ */
194
+ source?: string;
195
+ /**
196
+ * Configuration version
197
+ */
198
+ version?: string;
199
+ /**
200
+ * Additional metadata fields
201
+ */
202
+ [key: string]: string | undefined;
203
+ }
204
+ /**
205
+ * Complete Configuration
206
+ *
207
+ * Merged configuration from all sources (user + derived + deploy).
208
+ */
209
+ export type CompleteConfig = DeploymentConfig;
210
+ /**
211
+ * Configuration Set
212
+ *
213
+ * Collection of configurations for merging operations.
214
+ */
215
+ export interface ConfigSet {
216
+ user?: UserConfig;
217
+ derived?: DerivedConfig;
218
+ deploy?: DeploymentConfig;
219
+ }
220
+ /**
221
+ * Configuration Profile
222
+ *
223
+ * Named configuration with metadata for profile management.
224
+ */
225
+ export interface ConfigProfile {
226
+ /**
227
+ * Profile name (e.g., "default", "dev", "prod")
228
+ */
229
+ name: ProfileName;
230
+ /**
231
+ * User configuration for this profile
232
+ */
233
+ user?: UserConfig;
234
+ /**
235
+ * Derived configuration for this profile
236
+ */
237
+ derived?: DerivedConfig;
238
+ /**
239
+ * Deployment configuration for this profile
240
+ */
241
+ deploy?: DeploymentConfig;
242
+ /**
243
+ * Profile metadata
244
+ */
245
+ metadata?: {
246
+ createdAt?: string;
247
+ updatedAt?: string;
248
+ description?: string;
249
+ };
250
+ }
251
+ /**
252
+ * Configuration Validation Result
253
+ *
254
+ * Result of configuration validation operations.
255
+ */
256
+ export interface ValidationResult {
257
+ /**
258
+ * Whether the configuration is valid
259
+ */
260
+ isValid: boolean;
261
+ /**
262
+ * Validation errors (if any)
263
+ */
264
+ errors: string[];
265
+ /**
266
+ * Validation warnings (non-fatal issues)
267
+ */
268
+ warnings?: string[];
269
+ /**
270
+ * Additional validation details
271
+ */
272
+ details?: Record<string, unknown>;
273
+ }
274
+ /**
275
+ * XDG Configuration Paths
276
+ *
277
+ * File paths for XDG-compliant configuration storage.
278
+ */
279
+ export interface XDGConfigPaths {
280
+ /**
281
+ * Path to user configuration file
282
+ */
283
+ userConfig: string;
284
+ /**
285
+ * Path to derived configuration file
286
+ */
287
+ derivedConfig: string;
288
+ /**
289
+ * Path to deployment configuration file
290
+ */
291
+ deployConfig: string;
292
+ }
293
+ /**
294
+ * Profile Management Options
295
+ */
296
+ export interface ProfileOptions {
297
+ /**
298
+ * Base configuration directory (defaults to ~/.config/benchling-webhook)
299
+ */
300
+ baseDir?: string;
301
+ /**
302
+ * Profile name to use
303
+ */
304
+ profile?: ProfileName;
305
+ /**
306
+ * Create profile if it doesn't exist
307
+ */
308
+ createIfMissing?: boolean;
309
+ }
310
+ /**
311
+ * Configuration Read Options
312
+ */
313
+ export interface ConfigReadOptions {
314
+ /**
315
+ * Configuration type to read
316
+ */
317
+ type: ConfigType;
318
+ /**
319
+ * Profile name (defaults to "default")
320
+ */
321
+ profile?: ProfileName;
322
+ /**
323
+ * Throw error if file doesn't exist
324
+ */
325
+ throwIfMissing?: boolean;
326
+ /**
327
+ * Validate schema after reading
328
+ */
329
+ validate?: boolean;
330
+ }
331
+ /**
332
+ * Configuration Write Options
333
+ */
334
+ export interface ConfigWriteOptions {
335
+ /**
336
+ * Configuration type to write
337
+ */
338
+ type: ConfigType;
339
+ /**
340
+ * Profile name (defaults to "default")
341
+ */
342
+ profile?: ProfileName;
343
+ /**
344
+ * Create backup before writing
345
+ */
346
+ backup?: boolean;
347
+ /**
348
+ * Validate schema before writing
349
+ */
350
+ validate?: boolean;
351
+ /**
352
+ * Add metadata to configuration
353
+ */
354
+ addMetadata?: boolean;
355
+ }
356
+ /**
357
+ * AWS Profile Configuration
358
+ *
359
+ * Integration with AWS credentials and profiles.
360
+ */
361
+ export interface AWSProfileConfig {
362
+ /**
363
+ * AWS profile name from ~/.aws/credentials
364
+ */
365
+ profileName: string;
366
+ /**
367
+ * AWS region
368
+ */
369
+ region?: string;
370
+ /**
371
+ * AWS account ID
372
+ */
373
+ accountId?: string;
374
+ }
375
+ /**
376
+ * Quilt CLI Configuration
377
+ *
378
+ * Configuration inferred from quilt3 CLI.
379
+ */
380
+ export interface QuiltCLIConfig {
381
+ /**
382
+ * Catalog URL from quilt3 config
383
+ */
384
+ catalog?: string;
385
+ /**
386
+ * Default bucket from quilt3 config
387
+ */
388
+ defaultBucket?: string;
389
+ /**
390
+ * AWS region from quilt3 config
391
+ */
392
+ region?: string;
393
+ /**
394
+ * Registry URL from quilt3 config
395
+ */
396
+ registryUrl?: string;
397
+ }
398
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../lib/types/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ /**
3
+ * Comprehensive Type Definitions for XDG Configuration System
4
+ *
5
+ * This module defines all TypeScript types and interfaces for the
6
+ * XDG-compliant configuration management system.
7
+ *
8
+ * @module types/config
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../lib/types/config.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG"}