@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,562 @@
1
+ "use strict";
2
+ /**
3
+ * XDG Configuration Management
4
+ *
5
+ * Provides XDG-compliant configuration file management for the Benchling Webhook system.
6
+ * Implements a three-file configuration model:
7
+ * - User configuration: User-provided default settings
8
+ * - Derived configuration: CLI-inferred configuration
9
+ * - Deployment configuration: Deployment-specific artifacts
10
+ *
11
+ * Supports multiple named profiles (e.g., "default", "dev", "prod") for flexible configuration management.
12
+ *
13
+ * @module xdg-config
14
+ */
15
+ var __importDefault = (this && this.__importDefault) || function (mod) {
16
+ return (mod && mod.__esModule) ? mod : { "default": mod };
17
+ };
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.XDGConfig = void 0;
20
+ const fs_1 = require("fs");
21
+ const path_1 = require("path");
22
+ const os_1 = require("os");
23
+ const os_2 = require("os");
24
+ const ajv_1 = __importDefault(require("ajv"));
25
+ const lodash_merge_1 = __importDefault(require("lodash.merge"));
26
+ /**
27
+ * JSON Schema for configuration validation
28
+ * This is a lenient schema that allows additional properties
29
+ */
30
+ const CONFIG_SCHEMA = {
31
+ type: "object",
32
+ properties: {
33
+ quiltCatalog: { type: "string" },
34
+ quiltUserBucket: { type: "string" },
35
+ quiltDatabase: { type: "string" },
36
+ quiltStackArn: { type: "string" },
37
+ quiltRegion: { type: "string" },
38
+ catalogUrl: { type: "string" },
39
+ benchlingTenant: { type: "string" },
40
+ benchlingClientId: { type: "string" },
41
+ benchlingClientSecret: { type: "string" },
42
+ benchlingAppDefinitionId: { type: "string" },
43
+ benchlingPkgBucket: { type: "string" },
44
+ benchlingTestEntry: { type: "string" },
45
+ benchlingSecret: { type: "string" },
46
+ benchlingSecrets: { type: "string" },
47
+ cdkAccount: { type: "string" },
48
+ cdkRegion: { type: "string" },
49
+ awsProfile: { type: "string" },
50
+ queueArn: { type: "string" },
51
+ pkgPrefix: { type: "string" },
52
+ pkgKey: { type: "string" },
53
+ logLevel: { type: "string" },
54
+ webhookAllowList: { type: "string" },
55
+ webhookEndpoint: { type: "string" },
56
+ enableWebhookVerification: { type: "string" },
57
+ createEcrRepository: { type: "string" },
58
+ ecrRepositoryName: { type: "string" },
59
+ imageTag: { type: "string" },
60
+ webhookUrl: { type: "string" },
61
+ deploymentTimestamp: { type: "string" },
62
+ deployedAt: { type: "string" },
63
+ stackArn: { type: "string" },
64
+ _metadata: {
65
+ type: "object",
66
+ properties: {
67
+ savedAt: { type: "string" },
68
+ source: { type: "string" },
69
+ version: { type: "string" },
70
+ inferredAt: { type: "string" },
71
+ inferredFrom: { type: "string" },
72
+ deployedBy: { type: "string" },
73
+ stackName: { type: "string" },
74
+ },
75
+ additionalProperties: true,
76
+ },
77
+ },
78
+ additionalProperties: true,
79
+ };
80
+ /**
81
+ * XDG Configuration Manager
82
+ *
83
+ * Manages XDG-compliant configuration files for the Benchling Webhook system.
84
+ */
85
+ class XDGConfig {
86
+ /**
87
+ * Creates a new XDG Configuration Manager
88
+ *
89
+ * @param baseDir - Base configuration directory (defaults to ~/.config/benchling-webhook)
90
+ */
91
+ constructor(baseDir) {
92
+ this.baseDir = baseDir || this.getDefaultBaseDir();
93
+ }
94
+ /**
95
+ * Gets the default XDG base directory
96
+ *
97
+ * @returns The default base directory path
98
+ */
99
+ getDefaultBaseDir() {
100
+ const home = (0, os_1.homedir)();
101
+ return (0, path_1.resolve)(home, ".config", "benchling-webhook");
102
+ }
103
+ /**
104
+ * Expands home directory in a path
105
+ *
106
+ * @param path - Path potentially containing ~ for home directory
107
+ * @returns Expanded absolute path
108
+ */
109
+ static expandHomeDir(path) {
110
+ const home = (0, os_1.homedir)();
111
+ return path.replace(/^~/, home);
112
+ }
113
+ /**
114
+ * Gets the configuration file paths
115
+ *
116
+ * @returns Object containing paths to all configuration files
117
+ */
118
+ static getPaths() {
119
+ const home = (0, os_1.homedir)();
120
+ const baseDir = (0, path_1.resolve)(home, ".config", "benchling-webhook");
121
+ return {
122
+ userConfig: (0, path_1.resolve)(baseDir, "default.json"),
123
+ derivedConfig: (0, path_1.resolve)(baseDir, "config", "default.json"),
124
+ deployConfig: (0, path_1.resolve)(baseDir, "deploy", "default.json"),
125
+ };
126
+ }
127
+ /**
128
+ * Gets the configuration file paths for this instance
129
+ *
130
+ * @returns Object containing paths to all configuration files
131
+ */
132
+ getPaths() {
133
+ return {
134
+ userConfig: (0, path_1.resolve)(this.baseDir, "default.json"),
135
+ derivedConfig: (0, path_1.resolve)(this.baseDir, "config", "default.json"),
136
+ deployConfig: (0, path_1.resolve)(this.baseDir, "deploy", "default.json"),
137
+ };
138
+ }
139
+ /**
140
+ * Ensures all required configuration directories exist
141
+ *
142
+ * Creates the base configuration directory and subdirectories if they don't exist.
143
+ *
144
+ * @throws {Error} If directory creation fails
145
+ */
146
+ ensureDirectories() {
147
+ // Create base directory
148
+ if (!(0, fs_1.existsSync)(this.baseDir)) {
149
+ (0, fs_1.mkdirSync)(this.baseDir, { recursive: true });
150
+ }
151
+ // Create config subdirectory
152
+ const configDir = (0, path_1.resolve)(this.baseDir, "config");
153
+ if (!(0, fs_1.existsSync)(configDir)) {
154
+ (0, fs_1.mkdirSync)(configDir, { recursive: true });
155
+ }
156
+ // Create deploy subdirectory
157
+ const deployDir = (0, path_1.resolve)(this.baseDir, "deploy");
158
+ if (!(0, fs_1.existsSync)(deployDir)) {
159
+ (0, fs_1.mkdirSync)(deployDir, { recursive: true });
160
+ }
161
+ }
162
+ /**
163
+ * Gets the file path for a specific configuration type
164
+ *
165
+ * @param configType - Type of configuration to read
166
+ * @returns Absolute path to the configuration file
167
+ */
168
+ getConfigPath(configType) {
169
+ const paths = this.getPaths();
170
+ switch (configType) {
171
+ case "user":
172
+ return paths.userConfig;
173
+ case "derived":
174
+ return paths.derivedConfig;
175
+ case "deploy":
176
+ return paths.deployConfig;
177
+ default:
178
+ throw new Error(`Unknown configuration type: ${configType}`);
179
+ }
180
+ }
181
+ /**
182
+ * Reads and parses a configuration file with schema validation
183
+ *
184
+ * @param configType - Type of configuration to read ("user", "derived", or "deploy")
185
+ * @returns Parsed configuration object
186
+ * @throws {Error} If file not found, invalid JSON, or schema validation fails
187
+ */
188
+ readConfig(configType) {
189
+ const configPath = this.getConfigPath(configType);
190
+ // Check if file exists
191
+ if (!(0, fs_1.existsSync)(configPath)) {
192
+ throw new Error(`Configuration file not found: ${configPath}`);
193
+ }
194
+ // Read file content
195
+ let fileContent;
196
+ try {
197
+ fileContent = (0, fs_1.readFileSync)(configPath, "utf-8");
198
+ }
199
+ catch (error) {
200
+ throw new Error(`Failed to read configuration file: ${configPath}. ${error.message}`);
201
+ }
202
+ // Parse JSON
203
+ let config;
204
+ try {
205
+ config = JSON.parse(fileContent);
206
+ }
207
+ catch (error) {
208
+ throw new Error(`Invalid JSON in configuration file: ${configPath}. ${error.message}`);
209
+ }
210
+ // Validate schema
211
+ const ajv = new ajv_1.default();
212
+ const validate = ajv.compile(CONFIG_SCHEMA);
213
+ const valid = validate(config);
214
+ if (!valid) {
215
+ const errors = validate.errors?.map((err) => `${err.instancePath} ${err.message}`).join(", ");
216
+ throw new Error(`Invalid configuration schema in ${configPath}: ${errors}`);
217
+ }
218
+ return config;
219
+ }
220
+ /**
221
+ * Gets the backup file path for a configuration type
222
+ *
223
+ * @param configType - Type of configuration
224
+ * @returns Backup file path
225
+ */
226
+ getBackupPath(configType) {
227
+ const configPath = this.getConfigPath(configType);
228
+ return `${configPath}.backup`;
229
+ }
230
+ /**
231
+ * Validates configuration against schema
232
+ *
233
+ * @param config - Configuration object to validate
234
+ * @throws {Error} If validation fails
235
+ */
236
+ validateConfigSchema(config) {
237
+ const ajv = new ajv_1.default();
238
+ const validate = ajv.compile(CONFIG_SCHEMA);
239
+ const valid = validate(config);
240
+ if (!valid) {
241
+ const errors = validate.errors?.map((err) => `${err.instancePath} ${err.message}`).join(", ");
242
+ throw new Error(`Invalid configuration schema: ${errors}`);
243
+ }
244
+ }
245
+ /**
246
+ * Writes a configuration file atomically with backup
247
+ *
248
+ * Uses a temporary file and rename operation for atomic writes.
249
+ * Creates a backup of the existing file before overwriting.
250
+ *
251
+ * @param configType - Type of configuration to write ("user", "derived", or "deploy")
252
+ * @param config - Configuration object to write
253
+ * @throws {Error} If validation fails or write operation fails
254
+ */
255
+ writeConfig(configType, config) {
256
+ // Validate configuration before writing
257
+ this.validateConfigSchema(config);
258
+ const configPath = this.getConfigPath(configType);
259
+ const backupPath = this.getBackupPath(configType);
260
+ const configDir = (0, path_1.dirname)(configPath);
261
+ // Ensure config directory exists first
262
+ if (!(0, fs_1.existsSync)(configDir)) {
263
+ (0, fs_1.mkdirSync)(configDir, { recursive: true });
264
+ }
265
+ // Create backup only if file already exists
266
+ if ((0, fs_1.existsSync)(configPath)) {
267
+ try {
268
+ (0, fs_1.copyFileSync)(configPath, backupPath);
269
+ }
270
+ catch (error) {
271
+ throw new Error(`Failed to create backup: ${error.message}`);
272
+ }
273
+ }
274
+ // Write to temporary file first (atomic write)
275
+ const tempPath = (0, path_1.resolve)((0, os_2.tmpdir)(), `benchling-webhook-config-${Date.now()}.json`);
276
+ const configJson = JSON.stringify(config, null, 4);
277
+ try {
278
+ (0, fs_1.writeFileSync)(tempPath, configJson, "utf-8");
279
+ // Atomic rename (with fallback for cross-device on Windows)
280
+ try {
281
+ (0, fs_1.renameSync)(tempPath, configPath);
282
+ }
283
+ catch {
284
+ // Fall back to copy+delete for cross-device scenarios (Windows)
285
+ (0, fs_1.copyFileSync)(tempPath, configPath);
286
+ (0, fs_1.unlinkSync)(tempPath);
287
+ }
288
+ }
289
+ catch (error) {
290
+ throw new Error(`Failed to write configuration file: ${error.message}`);
291
+ }
292
+ }
293
+ /**
294
+ * Merges multiple configuration sources with priority order
295
+ *
296
+ * Merges configurations in priority order (user → derived → deploy),
297
+ * where later configurations override earlier ones.
298
+ * Uses deep merge to handle nested objects.
299
+ *
300
+ * @param configs - Configuration set to merge
301
+ * @returns Merged configuration object
302
+ */
303
+ mergeConfigs(configs) {
304
+ // Start with empty config
305
+ let merged = {};
306
+ // Merge in priority order: user → derived → deploy
307
+ // Each subsequent config overrides previous values
308
+ if (configs.user) {
309
+ merged = (0, lodash_merge_1.default)({}, merged, configs.user);
310
+ }
311
+ if (configs.derived) {
312
+ merged = (0, lodash_merge_1.default)({}, merged, configs.derived);
313
+ }
314
+ if (configs.deploy) {
315
+ merged = (0, lodash_merge_1.default)({}, merged, configs.deploy);
316
+ }
317
+ return merged;
318
+ }
319
+ // ====================================================================
320
+ // Profile Management Methods (Phase 1.1)
321
+ // ====================================================================
322
+ /**
323
+ * Gets the profile directory path
324
+ *
325
+ * @param profileName - Profile name (defaults to "default")
326
+ * @returns Profile directory path
327
+ */
328
+ getProfileDir(profileName = "default") {
329
+ if (profileName === "default") {
330
+ return this.baseDir;
331
+ }
332
+ return (0, path_1.resolve)(this.baseDir, "profiles", profileName);
333
+ }
334
+ /**
335
+ * Gets configuration file paths for a specific profile
336
+ *
337
+ * @param profileName - Profile name (defaults to "default")
338
+ * @returns Configuration file paths for the profile
339
+ */
340
+ getProfilePaths(profileName = "default") {
341
+ const profileDir = this.getProfileDir(profileName);
342
+ return {
343
+ userConfig: (0, path_1.resolve)(profileDir, "default.json"),
344
+ derivedConfig: (0, path_1.resolve)(profileDir, "config", "default.json"),
345
+ deployConfig: (0, path_1.resolve)(profileDir, "deploy", "default.json"),
346
+ };
347
+ }
348
+ /**
349
+ * Ensures profile directories exist
350
+ *
351
+ * @param profileName - Profile name (defaults to "default")
352
+ */
353
+ ensureProfileDirectories(profileName = "default") {
354
+ const profileDir = this.getProfileDir(profileName);
355
+ // Create profile directory
356
+ if (!(0, fs_1.existsSync)(profileDir)) {
357
+ (0, fs_1.mkdirSync)(profileDir, { recursive: true });
358
+ }
359
+ // Create config subdirectory
360
+ const configDir = (0, path_1.resolve)(profileDir, "config");
361
+ if (!(0, fs_1.existsSync)(configDir)) {
362
+ (0, fs_1.mkdirSync)(configDir, { recursive: true });
363
+ }
364
+ // Create deploy subdirectory
365
+ const deployDir = (0, path_1.resolve)(profileDir, "deploy");
366
+ if (!(0, fs_1.existsSync)(deployDir)) {
367
+ (0, fs_1.mkdirSync)(deployDir, { recursive: true });
368
+ }
369
+ }
370
+ /**
371
+ * Lists all available profiles
372
+ *
373
+ * @returns Array of profile names
374
+ */
375
+ listProfiles() {
376
+ const profiles = ["default"];
377
+ const profilesDir = (0, path_1.resolve)(this.baseDir, "profiles");
378
+ if ((0, fs_1.existsSync)(profilesDir)) {
379
+ const entries = (0, fs_1.readdirSync)(profilesDir, { withFileTypes: true });
380
+ const profileDirs = entries
381
+ .filter((entry) => entry.isDirectory())
382
+ .map((entry) => entry.name);
383
+ profiles.push(...profileDirs);
384
+ }
385
+ return profiles;
386
+ }
387
+ /**
388
+ * Checks if a profile exists
389
+ *
390
+ * @param profileName - Profile name to check
391
+ * @returns True if profile exists, false otherwise
392
+ */
393
+ profileExists(profileName) {
394
+ const profileDir = this.getProfileDir(profileName);
395
+ return (0, fs_1.existsSync)(profileDir);
396
+ }
397
+ /**
398
+ * Reads configuration for a specific profile
399
+ *
400
+ * @param configType - Type of configuration to read
401
+ * @param profileName - Profile name (defaults to "default")
402
+ * @returns Parsed configuration object
403
+ * @throws {Error} If file not found or validation fails
404
+ */
405
+ readProfileConfig(configType, profileName = "default") {
406
+ const paths = this.getProfilePaths(profileName);
407
+ let configPath;
408
+ switch (configType) {
409
+ case "user":
410
+ configPath = paths.userConfig;
411
+ break;
412
+ case "derived":
413
+ configPath = paths.derivedConfig;
414
+ break;
415
+ case "deploy":
416
+ configPath = paths.deployConfig;
417
+ break;
418
+ default:
419
+ throw new Error(`Unknown configuration type: ${configType}`);
420
+ }
421
+ // Check if file exists
422
+ if (!(0, fs_1.existsSync)(configPath)) {
423
+ throw new Error(`Configuration file not found: ${configPath}`);
424
+ }
425
+ // Read and parse
426
+ let fileContent;
427
+ try {
428
+ fileContent = (0, fs_1.readFileSync)(configPath, "utf-8");
429
+ }
430
+ catch (error) {
431
+ throw new Error(`Failed to read configuration file: ${configPath}. ${error.message}`);
432
+ }
433
+ let config;
434
+ try {
435
+ config = JSON.parse(fileContent);
436
+ }
437
+ catch (error) {
438
+ throw new Error(`Invalid JSON in configuration file: ${configPath}. ${error.message}`);
439
+ }
440
+ // Validate schema
441
+ this.validateConfigSchema(config);
442
+ return config;
443
+ }
444
+ /**
445
+ * Writes configuration for a specific profile
446
+ *
447
+ * @param configType - Type of configuration to write
448
+ * @param config - Configuration object to write
449
+ * @param profileName - Profile name (defaults to "default")
450
+ * @throws {Error} If validation fails or write operation fails
451
+ */
452
+ writeProfileConfig(configType, config, profileName = "default") {
453
+ // Validate configuration before writing
454
+ this.validateConfigSchema(config);
455
+ // Ensure profile directories exist
456
+ this.ensureProfileDirectories(profileName);
457
+ const paths = this.getProfilePaths(profileName);
458
+ let configPath;
459
+ switch (configType) {
460
+ case "user":
461
+ configPath = paths.userConfig;
462
+ break;
463
+ case "derived":
464
+ configPath = paths.derivedConfig;
465
+ break;
466
+ case "deploy":
467
+ configPath = paths.deployConfig;
468
+ break;
469
+ default:
470
+ throw new Error(`Unknown configuration type: ${configType}`);
471
+ }
472
+ const backupPath = `${configPath}.backup`;
473
+ // Create backup if file exists
474
+ if ((0, fs_1.existsSync)(configPath)) {
475
+ try {
476
+ (0, fs_1.copyFileSync)(configPath, backupPath);
477
+ }
478
+ catch (error) {
479
+ throw new Error(`Failed to create backup: ${error.message}`);
480
+ }
481
+ }
482
+ // Write to temporary file first (atomic write)
483
+ const tempPath = (0, path_1.resolve)((0, os_2.tmpdir)(), `benchling-webhook-config-${Date.now()}.json`);
484
+ const configJson = JSON.stringify(config, null, 4);
485
+ try {
486
+ (0, fs_1.writeFileSync)(tempPath, configJson, "utf-8");
487
+ // Atomic rename (with fallback for cross-device on Windows)
488
+ try {
489
+ (0, fs_1.renameSync)(tempPath, configPath);
490
+ }
491
+ catch {
492
+ // Fall back to copy+delete for cross-device scenarios (Windows)
493
+ (0, fs_1.copyFileSync)(tempPath, configPath);
494
+ (0, fs_1.unlinkSync)(tempPath);
495
+ }
496
+ }
497
+ catch (error) {
498
+ throw new Error(`Failed to write configuration file: ${error.message}`);
499
+ }
500
+ }
501
+ /**
502
+ * Loads a complete profile with all configuration files
503
+ *
504
+ * @param profileName - Profile name (defaults to "default")
505
+ * @returns Complete profile configuration
506
+ */
507
+ loadProfile(profileName = "default") {
508
+ const profile = {
509
+ name: profileName,
510
+ };
511
+ const paths = this.getProfilePaths(profileName);
512
+ // Load user config if exists
513
+ if ((0, fs_1.existsSync)(paths.userConfig)) {
514
+ try {
515
+ profile.user = this.readProfileConfig("user", profileName);
516
+ }
517
+ catch {
518
+ // User config is optional
519
+ }
520
+ }
521
+ // Load derived config if exists
522
+ if ((0, fs_1.existsSync)(paths.derivedConfig)) {
523
+ try {
524
+ profile.derived = this.readProfileConfig("derived", profileName);
525
+ }
526
+ catch {
527
+ // Derived config is optional
528
+ }
529
+ }
530
+ // Load deploy config if exists
531
+ if ((0, fs_1.existsSync)(paths.deployConfig)) {
532
+ try {
533
+ profile.deploy = this.readProfileConfig("deploy", profileName);
534
+ }
535
+ catch {
536
+ // Deploy config is optional
537
+ }
538
+ }
539
+ return profile;
540
+ }
541
+ /**
542
+ * Deletes a profile and all its configuration files
543
+ *
544
+ * WARNING: This is a destructive operation!
545
+ *
546
+ * @param profileName - Profile name to delete
547
+ * @throws {Error} If attempting to delete the default profile or if deletion fails
548
+ */
549
+ deleteProfile(profileName) {
550
+ if (profileName === "default") {
551
+ throw new Error("Cannot delete the default profile");
552
+ }
553
+ const profileDir = this.getProfileDir(profileName);
554
+ if (!(0, fs_1.existsSync)(profileDir)) {
555
+ throw new Error(`Profile does not exist: ${profileName}`);
556
+ }
557
+ // For safety, we'll require manual deletion
558
+ throw new Error(`Profile deletion must be done manually. Profile directory: ${profileDir}`);
559
+ }
560
+ }
561
+ exports.XDGConfig = XDGConfig;
562
+ //# sourceMappingURL=xdg-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xdg-config.js","sourceRoot":"","sources":["../../lib/xdg-config.ts"],"names":[],"mappings":"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"}