@breadstone-infrastructure/nx-tasks 0.0.230 → 0.0.232

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 (162) hide show
  1. package/executors/doppler-config-sync/executor.task.d.ts.map +1 -1
  2. package/executors/doppler-config-sync/executor.task.js +37 -18
  3. package/executors/doppler-config-sync/executor.task.js.map +1 -1
  4. package/executors/doppler-vercel-sync/executor.d.ts +11 -0
  5. package/executors/doppler-vercel-sync/executor.d.ts.map +1 -0
  6. package/executors/doppler-vercel-sync/executor.js +71 -0
  7. package/executors/doppler-vercel-sync/executor.js.map +1 -0
  8. package/executors/doppler-vercel-sync/executor.options.d.ts +8 -0
  9. package/executors/doppler-vercel-sync/executor.options.d.ts.map +1 -0
  10. package/executors/doppler-vercel-sync/executor.options.js +4 -0
  11. package/executors/doppler-vercel-sync/executor.options.js.map +1 -0
  12. package/executors/doppler-vercel-sync/executor.task.d.ts +30 -0
  13. package/executors/doppler-vercel-sync/executor.task.d.ts.map +1 -0
  14. package/executors/doppler-vercel-sync/executor.task.js +522 -0
  15. package/executors/doppler-vercel-sync/executor.task.js.map +1 -0
  16. package/executors/doppler-vercel-sync/schema.json +95 -0
  17. package/executors/generate-package-docs/executor.d.ts +6 -0
  18. package/executors/generate-package-docs/executor.d.ts.map +1 -0
  19. package/executors/generate-package-docs/executor.js +72 -0
  20. package/executors/generate-package-docs/executor.js.map +1 -0
  21. package/executors/generate-package-docs/executor.options.d.ts +6 -0
  22. package/executors/generate-package-docs/executor.options.d.ts.map +1 -0
  23. package/executors/generate-package-docs/executor.options.js +4 -0
  24. package/executors/generate-package-docs/executor.options.js.map +1 -0
  25. package/executors/generate-package-docs/executor.task.d.ts +103 -0
  26. package/executors/generate-package-docs/executor.task.d.ts.map +1 -0
  27. package/executors/generate-package-docs/executor.task.js +259 -0
  28. package/executors/generate-package-docs/executor.task.js.map +1 -0
  29. package/executors/generate-package-docs/schema.json +258 -0
  30. package/executors/icon-collection-builder/executor.d.ts.map +1 -1
  31. package/executors/icon-collection-builder/executor.js +3 -2
  32. package/executors/icon-collection-builder/executor.js.map +1 -1
  33. package/executors/icon-collection-builder/executor.task.d.ts +1 -0
  34. package/executors/icon-collection-builder/executor.task.d.ts.map +1 -1
  35. package/executors/icon-collection-builder/executor.task.js +73 -11
  36. package/executors/icon-collection-builder/executor.task.js.map +1 -1
  37. package/executors/icon-collection-builder/svg.d.ts +19 -0
  38. package/executors/icon-collection-builder/svg.d.ts.map +1 -1
  39. package/executors/icon-collection-builder/svg.js +106 -0
  40. package/executors/icon-collection-builder/svg.js.map +1 -1
  41. package/executors/icon-collection-downloader/executor.d.ts.map +1 -1
  42. package/executors/icon-collection-downloader/executor.js +3 -2
  43. package/executors/icon-collection-downloader/executor.js.map +1 -1
  44. package/executors/icon-collection-downloader/executor.task.d.ts +2 -0
  45. package/executors/icon-collection-downloader/executor.task.d.ts.map +1 -1
  46. package/executors/icon-collection-downloader/executor.task.js +130 -15
  47. package/executors/icon-collection-downloader/executor.task.js.map +1 -1
  48. package/executors/lit-docs/ComponentDocFixer.d.ts +176 -0
  49. package/executors/lit-docs/ComponentDocFixer.d.ts.map +1 -0
  50. package/executors/lit-docs/ComponentDocFixer.js +424 -0
  51. package/executors/lit-docs/ComponentDocFixer.js.map +1 -0
  52. package/executors/lit-docs/JSDocFixer.d.ts +97 -0
  53. package/executors/lit-docs/JSDocFixer.d.ts.map +1 -0
  54. package/executors/lit-docs/JSDocFixer.js +200 -0
  55. package/executors/lit-docs/JSDocFixer.js.map +1 -0
  56. package/executors/lit-docs/executor.d.ts.map +1 -1
  57. package/executors/lit-docs/executor.js +2 -1
  58. package/executors/lit-docs/executor.js.map +1 -1
  59. package/executors/lit-docs/executor.task.d.ts +1 -0
  60. package/executors/lit-docs/executor.task.d.ts.map +1 -1
  61. package/executors/lit-docs/executor.task.js +71 -24
  62. package/executors/lit-docs/executor.task.js.map +1 -1
  63. package/executors/lit-style-transform/executor.js +1 -1
  64. package/executors/lit-style-transform/executor.js.map +1 -1
  65. package/executors/prisma-seeds/executor.d.ts +10 -0
  66. package/executors/prisma-seeds/executor.d.ts.map +1 -0
  67. package/executors/prisma-seeds/executor.js +68 -0
  68. package/executors/prisma-seeds/executor.js.map +1 -0
  69. package/executors/prisma-seeds/executor.options.d.ts +16 -0
  70. package/executors/prisma-seeds/executor.options.d.ts.map +1 -0
  71. package/executors/prisma-seeds/executor.options.js +3 -0
  72. package/executors/prisma-seeds/executor.options.js.map +1 -0
  73. package/executors/prisma-seeds/executor.task.d.ts +29 -0
  74. package/executors/prisma-seeds/executor.task.d.ts.map +1 -0
  75. package/executors/prisma-seeds/executor.task.js +54 -0
  76. package/executors/prisma-seeds/executor.task.js.map +1 -0
  77. package/executors/prisma-seeds/schema.json +35 -0
  78. package/executors/secrets-config-sync/executor.d.ts +11 -0
  79. package/executors/secrets-config-sync/executor.d.ts.map +1 -0
  80. package/executors/secrets-config-sync/executor.js +64 -0
  81. package/executors/secrets-config-sync/executor.js.map +1 -0
  82. package/executors/secrets-config-sync/executor.options.d.ts +6 -0
  83. package/executors/secrets-config-sync/executor.options.d.ts.map +1 -0
  84. package/executors/secrets-config-sync/executor.options.js +4 -0
  85. package/executors/secrets-config-sync/executor.options.js.map +1 -0
  86. package/executors/secrets-config-sync/executor.task.d.ts +14 -0
  87. package/executors/secrets-config-sync/executor.task.d.ts.map +1 -0
  88. package/executors/secrets-config-sync/executor.task.js +157 -0
  89. package/executors/secrets-config-sync/executor.task.js.map +1 -0
  90. package/executors/secrets-config-sync/providers/azure-keyvault.provider.d.ts +42 -0
  91. package/executors/secrets-config-sync/providers/azure-keyvault.provider.d.ts.map +1 -0
  92. package/executors/secrets-config-sync/providers/azure-keyvault.provider.js +120 -0
  93. package/executors/secrets-config-sync/providers/azure-keyvault.provider.js.map +1 -0
  94. package/executors/secrets-config-sync/providers/doppler.provider.d.ts +18 -0
  95. package/executors/secrets-config-sync/providers/doppler.provider.d.ts.map +1 -0
  96. package/executors/secrets-config-sync/providers/doppler.provider.js +53 -0
  97. package/executors/secrets-config-sync/providers/doppler.provider.js.map +1 -0
  98. package/executors/secrets-config-sync/providers/secrets-provider.factory.d.ts +17 -0
  99. package/executors/secrets-config-sync/providers/secrets-provider.factory.d.ts.map +1 -0
  100. package/executors/secrets-config-sync/providers/secrets-provider.factory.js +25 -0
  101. package/executors/secrets-config-sync/providers/secrets-provider.factory.js.map +1 -0
  102. package/executors/secrets-config-sync/providers/secrets-provider.interface.d.ts +28 -0
  103. package/executors/secrets-config-sync/providers/secrets-provider.interface.d.ts.map +1 -0
  104. package/executors/secrets-config-sync/providers/secrets-provider.interface.js +4 -0
  105. package/executors/secrets-config-sync/providers/secrets-provider.interface.js.map +1 -0
  106. package/executors/secrets-config-sync/schema.json +44 -0
  107. package/executors/secrets-vercel-sync/executor.d.ts +11 -0
  108. package/executors/secrets-vercel-sync/executor.d.ts.map +1 -0
  109. package/executors/secrets-vercel-sync/executor.js +74 -0
  110. package/executors/secrets-vercel-sync/executor.js.map +1 -0
  111. package/executors/secrets-vercel-sync/executor.options.d.ts +8 -0
  112. package/executors/secrets-vercel-sync/executor.options.d.ts.map +1 -0
  113. package/executors/secrets-vercel-sync/executor.options.js +4 -0
  114. package/executors/secrets-vercel-sync/executor.options.js.map +1 -0
  115. package/executors/secrets-vercel-sync/executor.task.d.ts +34 -0
  116. package/executors/secrets-vercel-sync/executor.task.d.ts.map +1 -0
  117. package/executors/secrets-vercel-sync/executor.task.js +492 -0
  118. package/executors/secrets-vercel-sync/executor.task.js.map +1 -0
  119. package/executors/secrets-vercel-sync/providers/azure-keyvault.provider.d.ts +42 -0
  120. package/executors/secrets-vercel-sync/providers/azure-keyvault.provider.d.ts.map +1 -0
  121. package/executors/secrets-vercel-sync/providers/azure-keyvault.provider.js +118 -0
  122. package/executors/secrets-vercel-sync/providers/azure-keyvault.provider.js.map +1 -0
  123. package/executors/secrets-vercel-sync/providers/doppler.provider.d.ts +18 -0
  124. package/executors/secrets-vercel-sync/providers/doppler.provider.d.ts.map +1 -0
  125. package/executors/secrets-vercel-sync/providers/doppler.provider.js +61 -0
  126. package/executors/secrets-vercel-sync/providers/doppler.provider.js.map +1 -0
  127. package/executors/secrets-vercel-sync/providers/secrets-provider.factory.d.ts +17 -0
  128. package/executors/secrets-vercel-sync/providers/secrets-provider.factory.d.ts.map +1 -0
  129. package/executors/secrets-vercel-sync/providers/secrets-provider.factory.js +25 -0
  130. package/executors/secrets-vercel-sync/providers/secrets-provider.factory.js.map +1 -0
  131. package/executors/secrets-vercel-sync/providers/secrets-provider.interface.d.ts +28 -0
  132. package/executors/secrets-vercel-sync/providers/secrets-provider.interface.d.ts.map +1 -0
  133. package/executors/secrets-vercel-sync/providers/secrets-provider.interface.js +4 -0
  134. package/executors/secrets-vercel-sync/providers/secrets-provider.interface.js.map +1 -0
  135. package/executors/secrets-vercel-sync/schema.json +112 -0
  136. package/executors/token-linter/executor.d.ts +10 -0
  137. package/executors/token-linter/executor.d.ts.map +1 -0
  138. package/executors/token-linter/executor.js +67 -0
  139. package/executors/token-linter/executor.js.map +1 -0
  140. package/executors/token-linter/executor.options.d.ts +19 -0
  141. package/executors/token-linter/executor.options.d.ts.map +1 -0
  142. package/executors/token-linter/executor.options.js +4 -0
  143. package/executors/token-linter/executor.options.js.map +1 -0
  144. package/executors/token-linter/executor.task.d.ts +33 -0
  145. package/executors/token-linter/executor.task.d.ts.map +1 -0
  146. package/executors/token-linter/executor.task.js +60 -0
  147. package/executors/token-linter/executor.task.js.map +1 -0
  148. package/executors/token-linter/schema.json +63 -0
  149. package/executors.json +48 -28
  150. package/index.d.ts +4 -3
  151. package/index.d.ts.map +1 -1
  152. package/index.js +41 -39
  153. package/index.js.map +1 -1
  154. package/package.json +21 -17
  155. package/utils/markdown-processing.d.ts +43 -0
  156. package/utils/markdown-processing.d.ts.map +1 -0
  157. package/utils/markdown-processing.js +186 -0
  158. package/utils/markdown-processing.js.map +1 -0
  159. package/utils/valid-html-tags.d.ts +6 -0
  160. package/utils/valid-html-tags.d.ts.map +1 -0
  161. package/utils/valid-html-tags.js +83 -0
  162. package/utils/valid-html-tags.js.map +1 -0
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ // #region Imports
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.PrismaSeedsTask = void 0;
5
+ const prisma_seeds_1 = require("@breadstone-infrastructure/prisma-seeds");
6
+ // #endregion
7
+ /**
8
+ * @description Task to discover and execute Prisma seed configurations.
9
+ * Discovers `seed.config.mjs` in the project root automatically.
10
+ * Executor options from project.json override the config file values.
11
+ * @public
12
+ */
13
+ var PrismaSeedsTask;
14
+ (function (PrismaSeedsTask) {
15
+ // #region Interfaces
16
+ // #endregion
17
+ // #region Functions
18
+ /**
19
+ * @description Discovers the config file and executes the Prisma seeder.
20
+ * Executor options override config file values.
21
+ */
22
+ async function run(options) {
23
+ const orchestrator = new prisma_seeds_1.SeedOrchestrator();
24
+ const overrides = {};
25
+ if (options.drop !== undefined) {
26
+ overrides['drop'] = options.drop;
27
+ }
28
+ if (options.count !== undefined) {
29
+ overrides['count'] = options.count;
30
+ }
31
+ if (options.force !== undefined) {
32
+ overrides['force'] = options.force;
33
+ }
34
+ if (options.dryRun !== undefined) {
35
+ overrides['dryRun'] = options.dryRun;
36
+ }
37
+ if (options.seed !== undefined) {
38
+ overrides['seed'] = options.seed;
39
+ }
40
+ if (options.environment !== undefined) {
41
+ overrides['environment'] = options.environment;
42
+ }
43
+ const result = await orchestrator.executeWithOverrides(options.cwd, overrides);
44
+ if (!result.success) {
45
+ const errorMessages = result.errors.length > 0
46
+ ? result.errors.join('\n')
47
+ : 'Unknown error';
48
+ throw new Error(`Prisma Seeder failed:\n${errorMessages}`);
49
+ }
50
+ }
51
+ PrismaSeedsTask.run = run;
52
+ // #endregion
53
+ })(PrismaSeedsTask || (exports.PrismaSeedsTask = PrismaSeedsTask = {}));
54
+ //# sourceMappingURL=executor.task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.task.js","sourceRoot":"","sources":["../../../src/executors/prisma-seeds/executor.task.ts"],"names":[],"mappings":";AAAA,kBAAkB;;;AAElB,0EAA2E;AAE3E,aAAa;AAEb;;;;;GAKG;AACH,IAAiB,eAAe,CAkD/B;AAlDD,WAAiB,eAAe;IAE5B,qBAAqB;IAkBrB,aAAa;IAEb,oBAAoB;IAEpB;;;OAGG;IACI,KAAK,UAAU,GAAG,CAAC,OAAgC;QACtD,MAAM,YAAY,GAAG,IAAI,+BAAgB,EAAE,CAAC;QAC5C,MAAM,SAAS,GAA4B,EAAE,CAAC;QAE9C,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAAC,SAAS,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;QAAC,CAAC;QACrE,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAAC,SAAS,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;QAAC,CAAC;QACxE,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAAC,SAAS,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;QAAC,CAAC;QACxE,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;QAAC,CAAC;QAC3E,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAAC,SAAS,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;QAAC,CAAC;QACrE,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YAAC,SAAS,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;QAAC,CAAC;QAE1F,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,oBAAoB,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAE/E,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;gBAC1C,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC1B,CAAC,CAAC,eAAe,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,0BAA0B,aAAa,EAAE,CAAC,CAAC;QAC/D,CAAC;IACL,CAAC;IAnBqB,mBAAG,MAmBxB,CAAA;IAED,aAAa;AACjB,CAAC,EAlDgB,eAAe,+BAAf,eAAe,QAkD/B"}
@@ -0,0 +1,35 @@
1
+ {
2
+ "type": "object",
3
+ "description": "Prisma seeds executor options. All fields are optional \u2014 the primary config comes from `seed.config.mjs` in the project root. Options specified here override the config file values.",
4
+ "properties": {
5
+ "drop": {
6
+ "type": "boolean",
7
+ "description": "Drop existing data before seeding. Overrides config file."
8
+ },
9
+ "count": {
10
+ "type": "number",
11
+ "description": "Number of items to seed per definition. Overrides config file."
12
+ },
13
+ "force": {
14
+ "type": "boolean",
15
+ "description": "Force seeding even if data already exists. Overrides config file."
16
+ },
17
+ "dryRun": {
18
+ "type": "boolean",
19
+ "description": "Run without making changes to the database. Overrides config file."
20
+ },
21
+ "seed": {
22
+ "type": "number",
23
+ "description": "Seed value for deterministic random number generation. Overrides config file."
24
+ },
25
+ "environment": {
26
+ "type": "string",
27
+ "description": "Target environment name (e.g., 'development', 'staging'). Overrides config file."
28
+ },
29
+ "verbose": {
30
+ "type": "boolean",
31
+ "description": "Enable verbose logging. Overrides config file."
32
+ }
33
+ },
34
+ "required": []
35
+ }
@@ -0,0 +1,11 @@
1
+ import type { ExecutorContext } from '@nx/devkit';
2
+ import type { SecretsConfigSyncExecutorOptions } from './executor.options';
3
+ /**
4
+ * Nx executor that fetches secrets from a configurable provider and writes them to local .env files.
5
+ *
6
+ * @public
7
+ */
8
+ export default function runExecutor(options: SecretsConfigSyncExecutorOptions, context: ExecutorContext): Promise<{
9
+ success: boolean;
10
+ }>;
11
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../../src/executors/secrets-config-sync/executor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,oBAAoB,CAAC;AAI3E;;;;GAIG;AACH,wBAA8B,WAAW,CAAC,OAAO,EAAE,gCAAgC,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAkB5I"}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ // #region Imports
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.default = runExecutor;
38
+ const getProjectRoot_1 = require("../../utils/getProjectRoot");
39
+ // #endregion
40
+ /**
41
+ * Nx executor that fetches secrets from a configurable provider and writes them to local .env files.
42
+ *
43
+ * @public
44
+ */
45
+ async function runExecutor(options, context) {
46
+ try {
47
+ const task = (await Promise.resolve().then(() => __importStar(require('./executor.task')))).SecretsConfigSyncTask;
48
+ await task.run({
49
+ cwd: (0, getProjectRoot_1.getProjectRoot)(context),
50
+ provider: options.provider,
51
+ project: options.project,
52
+ config: options.config,
53
+ envFile: options.envFile,
54
+ apiKey: options.apiKey,
55
+ vaultUrl: options.vaultUrl
56
+ });
57
+ return { success: true };
58
+ }
59
+ catch (error) {
60
+ console.error(error);
61
+ return { success: false };
62
+ }
63
+ }
64
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../src/executors/secrets-config-sync/executor.ts"],"names":[],"mappings":";AAAA,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAalB,8BAkBC;AA5BD,+DAA4D;AAG5D,aAAa;AAEb;;;;GAIG;AACY,KAAK,UAAU,WAAW,CAAC,OAAyC,EAAE,OAAwB;IACzG,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,wDAAa,iBAAiB,GAAC,CAAC,CAAC,qBAAqB,CAAC;QAErE,MAAM,IAAI,CAAC,GAAG,CAAC;YACX,GAAG,EAAE,IAAA,+BAAc,EAAC,OAAO,CAAC;YAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC7B,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC9B,CAAC;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { SecretsConfigSyncTask } from './executor.task';
2
+ /**
3
+ * @public
4
+ */
5
+ export type SecretsConfigSyncExecutorOptions = Omit<SecretsConfigSyncTask.ISecretsConfigSyncTaskOptions, 'cwd'>;
6
+ //# sourceMappingURL=executor.options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.options.d.ts","sourceRoot":"","sources":["../../../src/executors/secrets-config-sync/executor.options.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAI7D;;GAEG;AACH,MAAM,MAAM,gCAAgC,GAAG,IAAI,CAAC,qBAAqB,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ // #region Imports
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ //# sourceMappingURL=executor.options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.options.js","sourceRoot":"","sources":["../../../src/executors/secrets-config-sync/executor.options.ts"],"names":[],"mappings":";AAAA,kBAAkB"}
@@ -0,0 +1,14 @@
1
+ import type { SecretsProviderType } from './providers/secrets-provider.factory';
2
+ export declare namespace SecretsConfigSyncTask {
3
+ interface ISecretsConfigSyncTaskOptions {
4
+ cwd: string;
5
+ provider: SecretsProviderType;
6
+ project: string;
7
+ config: string;
8
+ envFile: string;
9
+ apiKey?: string;
10
+ vaultUrl?: string;
11
+ }
12
+ function run(options: ISecretsConfigSyncTaskOptions): Promise<void>;
13
+ }
14
+ //# sourceMappingURL=executor.task.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.task.d.ts","sourceRoot":"","sources":["../../../src/executors/secrets-config-sync/executor.task.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAKhF,yBAAiB,qBAAqB,CAAC;IAInC,UAAiB,6BAA6B;QAC1C,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,mBAAmB,CAAC;QAC9B,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACrB;IAsGD,SAAsB,GAAG,CAAC,OAAO,EAAE,6BAA6B,GAAG,OAAO,CAAC,IAAI,CAAC,CAoC/E;CAGJ"}
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ // #region Imports
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.SecretsConfigSyncTask = void 0;
38
+ const utilities_1 = require("@breadstone-infrastructure/utilities");
39
+ const dotenv = __importStar(require("dotenv"));
40
+ const secrets_provider_factory_1 = require("./providers/secrets-provider.factory");
41
+ // #endregion
42
+ var SecretsConfigSyncTask;
43
+ (function (SecretsConfigSyncTask) {
44
+ // #region Interfaces
45
+ // #endregion
46
+ // #region Functions
47
+ /**
48
+ * Loads the existing environment variables from the .env file.
49
+ *
50
+ * @param envFilePath - Path to the .env file.
51
+ * @param logger - Logger instance.
52
+ * @returns A record of environment variables.
53
+ */
54
+ function loadEnvFile(envFilePath, logger) {
55
+ if (!utilities_1.File.exists(envFilePath)) {
56
+ return {};
57
+ }
58
+ logger.log(`Loading .env file from: ${envFilePath}`);
59
+ const envConfig = dotenv.config({ path: envFilePath });
60
+ if (envConfig.error) {
61
+ throw new Error(`Error loading .env file: ${envConfig.error.message}`);
62
+ }
63
+ return envConfig.parsed ?? {};
64
+ }
65
+ /**
66
+ * Computes the diff between current env and fetched secrets.
67
+ *
68
+ * @param currentEnv - The current environment variables.
69
+ * @param secrets - The fetched secrets from the provider.
70
+ * @returns A list of sync results.
71
+ */
72
+ function computeDiff(currentEnv, secrets) {
73
+ const results = [];
74
+ for (const key of Object.keys(secrets)) {
75
+ if (!(key in currentEnv)) {
76
+ results.push({ key, action: 'added' });
77
+ }
78
+ else if (currentEnv[key] !== secrets[key]) {
79
+ results.push({ key, action: 'updated' });
80
+ }
81
+ else {
82
+ results.push({ key, action: 'unchanged' });
83
+ }
84
+ }
85
+ return results;
86
+ }
87
+ /**
88
+ * Returns a colored tag string for the given sync action.
89
+ */
90
+ function formatActionTag(action) {
91
+ switch (action) {
92
+ case 'added':
93
+ return (0, utilities_1.green)((0, utilities_1.bold)('[added]'));
94
+ case 'updated':
95
+ return (0, utilities_1.yellow)((0, utilities_1.bold)('[updated]'));
96
+ case 'unchanged':
97
+ return (0, utilities_1.gray)((0, utilities_1.bold)('[unchanged]'));
98
+ }
99
+ }
100
+ /**
101
+ * Logs the sync results as a single alphabetically sorted tree with colored action tags.
102
+ */
103
+ function logResults(logger, results) {
104
+ const sorted = [...results].sort((a, b) => a.key.localeCompare(b.key));
105
+ (0, utilities_1.logTree)(logger, `Keys (${sorted.length})`, sorted.map(r => ({
106
+ label: `${r.key} ${formatActionTag(r.action)}`
107
+ })));
108
+ }
109
+ /**
110
+ * Writes updated secrets to the .env file.
111
+ *
112
+ * @param envFilePath - Path to the .env file.
113
+ * @param updatedEnv - The updated environment variables.
114
+ */
115
+ function updateEnvFile(envFilePath, updatedEnv) {
116
+ const envContent = Object.entries(updatedEnv)
117
+ .map(([key, value]) => `${key}="${value}"`)
118
+ .join('\n');
119
+ utilities_1.File.writeAllText(envFilePath, envContent);
120
+ }
121
+ // #endregion
122
+ // #region Main Task
123
+ async function run(options) {
124
+ const logger = new utilities_1.ConsoleLogger();
125
+ const providerType = options.provider ?? 'doppler';
126
+ try {
127
+ const provider = (0, secrets_provider_factory_1.createSecretsProvider)(providerType);
128
+ // Step 1: Authenticate with the provider
129
+ logger.log(`Authenticating with ${providerType}...`);
130
+ const token = await provider.authenticate(options.apiKey, true);
131
+ // Step 2: Fetch secrets from the provider
132
+ logger.log(`Fetching secrets from ${providerType}...`);
133
+ const secrets = await provider.fetchSecrets(token, options.project, options.config, logger, options.vaultUrl);
134
+ // Step 3: Load the current environment file
135
+ logger.log('Loading current .env file...');
136
+ const envPath = utilities_1.Path.combine(options.cwd, options.envFile);
137
+ const currentEnv = loadEnvFile(envPath, logger);
138
+ // Step 4: Compute and log the diff
139
+ const diff = computeDiff(currentEnv, secrets);
140
+ logResults(logger, diff);
141
+ // Step 5: Merge and update the .env file with new secrets
142
+ const mergedEnv = {
143
+ ...currentEnv,
144
+ ...secrets
145
+ };
146
+ updateEnvFile(envPath, mergedEnv);
147
+ logger.log('Successfully wrote updated secrets to .env file.');
148
+ }
149
+ catch (error) {
150
+ logger.error(`Error: ${error.message}`);
151
+ throw error;
152
+ }
153
+ }
154
+ SecretsConfigSyncTask.run = run;
155
+ // #endregion
156
+ })(SecretsConfigSyncTask || (exports.SecretsConfigSyncTask = SecretsConfigSyncTask = {}));
157
+ //# sourceMappingURL=executor.task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.task.js","sourceRoot":"","sources":["../../../src/executors/secrets-config-sync/executor.task.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { ILogger } from '@breadstone-infrastructure/utilities';
2
+ import type { ISecretsProvider } from './secrets-provider.interface';
3
+ /**
4
+ * Secrets provider implementation for Azure Key Vault.
5
+ *
6
+ * Uses the Key Vault REST API with a Bearer token (e.g. from `az account get-access-token`
7
+ * or a service principal client credential flow). The token must be provided via `apiKey`
8
+ * or entered interactively.
9
+ *
10
+ * @public
11
+ */
12
+ export declare class AzureKeyVaultSecretsProvider implements ISecretsProvider {
13
+ /**
14
+ * @inheritdoc
15
+ */
16
+ authenticate(apiKey?: string, interactive?: boolean): Promise<string>;
17
+ /**
18
+ * Fetches all secrets from an Azure Key Vault.
19
+ *
20
+ * The `project` and `config` parameters are ignored. The vault is identified
21
+ * solely by `vaultUrl`.
22
+ *
23
+ * @inheritdoc
24
+ */
25
+ fetchSecrets(token: string, _project: string, _config: string, logger: ILogger, vaultUrl?: string): Promise<Record<string, string>>;
26
+ /**
27
+ * Lists all secrets in the vault (handles pagination).
28
+ */
29
+ private listSecrets;
30
+ /**
31
+ * Fetches the current value of a single secret.
32
+ */
33
+ private getSecretValue;
34
+ /**
35
+ * Extracts the secret name from a Key Vault secret ID URL.
36
+ *
37
+ * @example
38
+ * `https://my-vault.vault.azure.net/secrets/MY_SECRET` → `MY_SECRET`
39
+ */
40
+ private extractSecretName;
41
+ }
42
+ //# sourceMappingURL=azure-keyvault.provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"azure-keyvault.provider.d.ts","sourceRoot":"","sources":["../../../../src/executors/secrets-config-sync/providers/azure-keyvault.provider.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAEpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AA8BrE;;;;;;;;GAQG;AACH,qBAAa,4BAA6B,YAAW,gBAAgB;IAIjE;;OAEG;IACU,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAwBlF;;;;;;;OAOG;IACU,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAwChJ;;OAEG;YACW,WAAW;IAsBzB;;OAEG;YACW,cAAc;IAgB5B;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;CAO5B"}
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ // #region Imports
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.AzureKeyVaultSecretsProvider = void 0;
5
+ const enquirer_1 = require("enquirer");
6
+ // #endregion
7
+ /**
8
+ * Secrets provider implementation for Azure Key Vault.
9
+ *
10
+ * Uses the Key Vault REST API with a Bearer token (e.g. from `az account get-access-token`
11
+ * or a service principal client credential flow). The token must be provided via `apiKey`
12
+ * or entered interactively.
13
+ *
14
+ * @public
15
+ */
16
+ class AzureKeyVaultSecretsProvider {
17
+ // #region Methods
18
+ /**
19
+ * @inheritdoc
20
+ */
21
+ async authenticate(apiKey, interactive) {
22
+ if (apiKey) {
23
+ return apiKey;
24
+ }
25
+ if (interactive) {
26
+ const credentials = await (0, enquirer_1.prompt)([
27
+ {
28
+ type: 'input',
29
+ name: 'token',
30
+ message: 'Enter your Azure Key Vault access token:\nYou can obtain one via `az account get-access-token --resource https://vault.azure.net --query accessToken -o tsv`.'
31
+ }
32
+ ]);
33
+ if (!credentials.token) {
34
+ throw new Error('No Azure Key Vault access token provided. Aborting.');
35
+ }
36
+ return credentials.token;
37
+ }
38
+ throw new Error('No Azure Key Vault access token provided and interactive mode is disabled.');
39
+ }
40
+ /**
41
+ * Fetches all secrets from an Azure Key Vault.
42
+ *
43
+ * The `project` and `config` parameters are ignored. The vault is identified
44
+ * solely by `vaultUrl`.
45
+ *
46
+ * @inheritdoc
47
+ */
48
+ async fetchSecrets(token, _project, _config, logger, vaultUrl) {
49
+ if (!vaultUrl) {
50
+ throw new Error('vaultUrl is required for the azure-keyvault provider.');
51
+ }
52
+ const normalizedVaultUrl = vaultUrl.endsWith('/') ? vaultUrl.slice(0, -1) : vaultUrl;
53
+ const secrets = {};
54
+ // Step 1: List all secrets (paged)
55
+ const secretItems = await this.listSecrets(token, normalizedVaultUrl);
56
+ logger.log(`Found ${secretItems.length} secrets in Key Vault.`);
57
+ // Step 2: Fetch each secret value
58
+ for (const item of secretItems) {
59
+ const secretName = this.extractSecretName(item.id);
60
+ const value = await this.getSecretValue(token, normalizedVaultUrl, secretName);
61
+ secrets[secretName] = value;
62
+ }
63
+ logger.log(`Fetched ${Object.keys(secrets).length} secrets from Azure Key Vault [${normalizedVaultUrl}].`);
64
+ return secrets;
65
+ }
66
+ // #endregion
67
+ // #region Properties
68
+ // #endregion
69
+ // #region Fields
70
+ // #endregion
71
+ // #region Ctor
72
+ // #endregion
73
+ // #region Private Methods
74
+ /**
75
+ * Lists all secrets in the vault (handles pagination).
76
+ */
77
+ async listSecrets(token, vaultUrl) {
78
+ const allItems = [];
79
+ let nextLink = `${vaultUrl}/secrets?api-version=7.4`;
80
+ while (nextLink) {
81
+ const response = await fetch(nextLink, {
82
+ headers: { Authorization: `Bearer ${token}` }
83
+ });
84
+ if (!response.ok) {
85
+ throw new Error(`Failed to list Azure Key Vault secrets (HTTP ${response.status}): ${response.statusText}`);
86
+ }
87
+ const data = await response.json();
88
+ const enabledItems = data.value.filter(item => item.attributes.enabled);
89
+ allItems.push(...enabledItems);
90
+ nextLink = data.nextLink;
91
+ }
92
+ return allItems;
93
+ }
94
+ /**
95
+ * Fetches the current value of a single secret.
96
+ */
97
+ async getSecretValue(token, vaultUrl, secretName) {
98
+ const url = `${vaultUrl}/secrets/${encodeURIComponent(secretName)}?api-version=7.4`;
99
+ const response = await fetch(url, {
100
+ headers: { Authorization: `Bearer ${token}` }
101
+ });
102
+ if (!response.ok) {
103
+ throw new Error(`Failed to fetch Azure Key Vault secret "${secretName}" (HTTP ${response.status}): ${response.statusText}`);
104
+ }
105
+ const data = await response.json();
106
+ return data.value;
107
+ }
108
+ /**
109
+ * Extracts the secret name from a Key Vault secret ID URL.
110
+ *
111
+ * @example
112
+ * `https://my-vault.vault.azure.net/secrets/MY_SECRET` → `MY_SECRET`
113
+ */
114
+ extractSecretName(secretId) {
115
+ const parts = secretId.split('/');
116
+ return parts[parts.length - 1];
117
+ }
118
+ }
119
+ exports.AzureKeyVaultSecretsProvider = AzureKeyVaultSecretsProvider;
120
+ //# sourceMappingURL=azure-keyvault.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"azure-keyvault.provider.js","sourceRoot":"","sources":["../../../../src/executors/secrets-config-sync/providers/azure-keyvault.provider.ts"],"names":[],"mappings":";AAAA,kBAAkB;;;AAGlB,uCAAkC;AA6BlC,aAAa;AAEb;;;;;;;;GAQG;AACH,MAAa,4BAA4B;IAErC,kBAAkB;IAElB;;OAEG;IACI,KAAK,CAAC,YAAY,CAAC,MAAe,EAAE,WAAqB;QAC5D,IAAI,MAAM,EAAE,CAAC;YACT,OAAO,MAAM,CAAC;QAClB,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YACd,MAAM,WAAW,GAAG,MAAM,IAAA,iBAAM,EAAoB;gBAChD;oBACI,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,+JAA+J;iBAC3K;aACJ,CAAC,CAAC;YAEH,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;YAC3E,CAAC;YAED,OAAO,WAAW,CAAC,KAAK,CAAC;QAC7B,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAC;IAClG,CAAC;IAED;;;;;;;OAOG;IACI,KAAK,CAAC,YAAY,CAAC,KAAa,EAAE,QAAgB,EAAE,OAAe,EAAE,MAAe,EAAE,QAAiB;QAC1G,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC7E,CAAC;QAED,MAAM,kBAAkB,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACrF,MAAM,OAAO,GAA2B,EAAE,CAAC;QAE3C,mCAAmC;QACnC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;QACtE,MAAM,CAAC,GAAG,CAAC,SAAS,WAAW,CAAC,MAAM,wBAAwB,CAAC,CAAC;QAEhE,kCAAkC;QAClC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,kBAAkB,EAAE,UAAU,CAAC,CAAC;YAC/E,OAAO,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC;QAChC,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,kCAAkC,kBAAkB,IAAI,CAAC,CAAC;QAE3G,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,aAAa;IAEb,qBAAqB;IAErB,aAAa;IAEb,iBAAiB;IAEjB,aAAa;IAEb,eAAe;IAEf,aAAa;IAEb,0BAA0B;IAE1B;;OAEG;IACK,KAAK,CAAC,WAAW,CAAC,KAAa,EAAE,QAAgB;QACrD,MAAM,QAAQ,GAAoC,EAAE,CAAC;QACrD,IAAI,QAAQ,GAAuB,GAAG,QAAQ,0BAA0B,CAAC;QAEzE,OAAO,QAAQ,EAAE,CAAC;YACd,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;gBACnC,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;aAChD,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,gDAAgD,QAAQ,CAAC,MAAM,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YAChH,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAsC,CAAC;YACvE,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACxE,QAAQ,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;YAC/B,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC7B,CAAC;QAED,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,cAAc,CAAC,KAAa,EAAE,QAAgB,EAAE,UAAkB;QAC5E,MAAM,GAAG,GAAG,GAAG,QAAQ,YAAY,kBAAkB,CAAC,UAAU,CAAC,kBAAkB,CAAC;QAEpF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC9B,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;SAChD,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,2CAA2C,UAAU,WAAW,QAAQ,CAAC,MAAM,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAChI,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAuC,CAAC;QAExE,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAED;;;;;OAKG;IACK,iBAAiB,CAAC,QAAgB;QACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAElC,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACnC,CAAC;CAGJ;AAxID,oEAwIC"}
@@ -0,0 +1,18 @@
1
+ import type { ILogger } from '@breadstone-infrastructure/utilities';
2
+ import type { ISecretsProvider } from './secrets-provider.interface';
3
+ /**
4
+ * Secrets provider implementation for Doppler.
5
+ *
6
+ * @public
7
+ */
8
+ export declare class DopplerSecretsProvider implements ISecretsProvider {
9
+ /**
10
+ * @inheritdoc
11
+ */
12
+ authenticate(apiKey?: string, interactive?: boolean): Promise<string>;
13
+ /**
14
+ * @inheritdoc
15
+ */
16
+ fetchSecrets(token: string, project: string, config: string, logger: ILogger): Promise<Record<string, string>>;
17
+ }
18
+ //# sourceMappingURL=doppler.provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doppler.provider.d.ts","sourceRoot":"","sources":["../../../../src/executors/secrets-config-sync/providers/doppler.provider.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAEpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAqBrE;;;;GAIG;AACH,qBAAa,sBAAuB,YAAW,gBAAgB;IAI3D;;OAEG;IACU,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAwBlF;;OAEG;IACU,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAmB9H"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ // #region Imports
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.DopplerSecretsProvider = void 0;
5
+ const enquirer_1 = require("enquirer");
6
+ // #endregion
7
+ /**
8
+ * Secrets provider implementation for Doppler.
9
+ *
10
+ * @public
11
+ */
12
+ class DopplerSecretsProvider {
13
+ // #region Methods
14
+ /**
15
+ * @inheritdoc
16
+ */
17
+ async authenticate(apiKey, interactive) {
18
+ if (apiKey) {
19
+ return apiKey;
20
+ }
21
+ if (interactive) {
22
+ const credentials = await (0, enquirer_1.prompt)([
23
+ {
24
+ type: 'input',
25
+ name: 'apiKey',
26
+ message: 'Enter your Doppler API key:\nYou can find it in your Doppler account settings.'
27
+ }
28
+ ]);
29
+ if (!credentials.apiKey) {
30
+ throw new Error('No Doppler API key provided. Aborting.');
31
+ }
32
+ return credentials.apiKey;
33
+ }
34
+ throw new Error('No Doppler API key provided and interactive mode is disabled.');
35
+ }
36
+ /**
37
+ * @inheritdoc
38
+ */
39
+ async fetchSecrets(token, project, config, logger) {
40
+ const apiUrl = `https://api.doppler.com/v3/configs/config/secrets?project=${encodeURIComponent(project)}&config=${encodeURIComponent(config)}&include_dynamic_secrets=false&include_managed_secrets=true`;
41
+ const response = await fetch(apiUrl, {
42
+ headers: { Authorization: `Bearer ${token}` }
43
+ });
44
+ if (!response.ok) {
45
+ throw new Error(`Failed to fetch Doppler secrets (HTTP ${response.status}): ${response.statusText}`);
46
+ }
47
+ const data = await response.json();
48
+ logger.log(`Fetched ${Object.keys(data.secrets).length} secrets from Doppler [${project}/${config}].`);
49
+ return Object.fromEntries(Object.entries(data.secrets).map(([key, value]) => [key, value.raw]));
50
+ }
51
+ }
52
+ exports.DopplerSecretsProvider = DopplerSecretsProvider;
53
+ //# sourceMappingURL=doppler.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doppler.provider.js","sourceRoot":"","sources":["../../../../src/executors/secrets-config-sync/providers/doppler.provider.ts"],"names":[],"mappings":";AAAA,kBAAkB;;;AAGlB,uCAAkC;AAoBlC,aAAa;AAEb;;;;GAIG;AACH,MAAa,sBAAsB;IAE/B,kBAAkB;IAElB;;OAEG;IACI,KAAK,CAAC,YAAY,CAAC,MAAe,EAAE,WAAqB;QAC5D,IAAI,MAAM,EAAE,CAAC;YACT,OAAO,MAAM,CAAC;QAClB,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YACd,MAAM,WAAW,GAAG,MAAM,IAAA,iBAAM,EAAqB;gBACjD;oBACI,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,gFAAgF;iBAC5F;aACJ,CAAC,CAAC;YAEH,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;YAC9D,CAAC;YAED,OAAO,WAAW,CAAC,MAAM,CAAC;QAC9B,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IACrF,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,YAAY,CAAC,KAAa,EAAE,OAAe,EAAE,MAAc,EAAE,MAAe;QACrF,MAAM,MAAM,GAAG,6DAA6D,kBAAkB,CAAC,OAAO,CAAC,WAAW,kBAAkB,CAAC,MAAM,CAAC,6DAA6D,CAAC;QAE1M,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE;YACjC,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;SAChD,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,yCAAyC,QAAQ,CAAC,MAAM,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACzG,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA6B,CAAC;QAE9D,MAAM,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,0BAA0B,OAAO,IAAI,MAAM,IAAI,CAAC,CAAC;QAEvG,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACpG,CAAC;CAGJ;AArDD,wDAqDC"}