@breadstone-infrastructure/nx-tasks 0.0.231 → 0.0.233

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 (141) 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.options.d.ts +1 -1
  66. package/executors/prisma-seeds/executor.task.d.ts +1 -1
  67. package/executors/secrets-config-sync/executor.d.ts +11 -0
  68. package/executors/secrets-config-sync/executor.d.ts.map +1 -0
  69. package/executors/secrets-config-sync/executor.js +64 -0
  70. package/executors/secrets-config-sync/executor.js.map +1 -0
  71. package/executors/secrets-config-sync/executor.options.d.ts +6 -0
  72. package/executors/secrets-config-sync/executor.options.d.ts.map +1 -0
  73. package/executors/secrets-config-sync/executor.options.js +4 -0
  74. package/executors/secrets-config-sync/executor.options.js.map +1 -0
  75. package/executors/secrets-config-sync/executor.task.d.ts +14 -0
  76. package/executors/secrets-config-sync/executor.task.d.ts.map +1 -0
  77. package/executors/secrets-config-sync/executor.task.js +157 -0
  78. package/executors/secrets-config-sync/executor.task.js.map +1 -0
  79. package/executors/secrets-config-sync/providers/azure-keyvault.provider.d.ts +42 -0
  80. package/executors/secrets-config-sync/providers/azure-keyvault.provider.d.ts.map +1 -0
  81. package/executors/secrets-config-sync/providers/azure-keyvault.provider.js +120 -0
  82. package/executors/secrets-config-sync/providers/azure-keyvault.provider.js.map +1 -0
  83. package/executors/secrets-config-sync/providers/doppler.provider.d.ts +18 -0
  84. package/executors/secrets-config-sync/providers/doppler.provider.d.ts.map +1 -0
  85. package/executors/secrets-config-sync/providers/doppler.provider.js +53 -0
  86. package/executors/secrets-config-sync/providers/doppler.provider.js.map +1 -0
  87. package/executors/secrets-config-sync/providers/secrets-provider.factory.d.ts +17 -0
  88. package/executors/secrets-config-sync/providers/secrets-provider.factory.d.ts.map +1 -0
  89. package/executors/secrets-config-sync/providers/secrets-provider.factory.js +25 -0
  90. package/executors/secrets-config-sync/providers/secrets-provider.factory.js.map +1 -0
  91. package/executors/secrets-config-sync/providers/secrets-provider.interface.d.ts +28 -0
  92. package/executors/secrets-config-sync/providers/secrets-provider.interface.d.ts.map +1 -0
  93. package/executors/secrets-config-sync/providers/secrets-provider.interface.js +4 -0
  94. package/executors/secrets-config-sync/providers/secrets-provider.interface.js.map +1 -0
  95. package/executors/secrets-config-sync/schema.json +44 -0
  96. package/executors/secrets-vercel-sync/executor.d.ts +11 -0
  97. package/executors/secrets-vercel-sync/executor.d.ts.map +1 -0
  98. package/executors/secrets-vercel-sync/executor.js +74 -0
  99. package/executors/secrets-vercel-sync/executor.js.map +1 -0
  100. package/executors/secrets-vercel-sync/executor.options.d.ts +8 -0
  101. package/executors/secrets-vercel-sync/executor.options.d.ts.map +1 -0
  102. package/executors/secrets-vercel-sync/executor.options.js +4 -0
  103. package/executors/secrets-vercel-sync/executor.options.js.map +1 -0
  104. package/executors/secrets-vercel-sync/executor.task.d.ts +34 -0
  105. package/executors/secrets-vercel-sync/executor.task.d.ts.map +1 -0
  106. package/executors/secrets-vercel-sync/executor.task.js +492 -0
  107. package/executors/secrets-vercel-sync/executor.task.js.map +1 -0
  108. package/executors/secrets-vercel-sync/providers/azure-keyvault.provider.d.ts +42 -0
  109. package/executors/secrets-vercel-sync/providers/azure-keyvault.provider.d.ts.map +1 -0
  110. package/executors/secrets-vercel-sync/providers/azure-keyvault.provider.js +118 -0
  111. package/executors/secrets-vercel-sync/providers/azure-keyvault.provider.js.map +1 -0
  112. package/executors/secrets-vercel-sync/providers/doppler.provider.d.ts +18 -0
  113. package/executors/secrets-vercel-sync/providers/doppler.provider.d.ts.map +1 -0
  114. package/executors/secrets-vercel-sync/providers/doppler.provider.js +61 -0
  115. package/executors/secrets-vercel-sync/providers/doppler.provider.js.map +1 -0
  116. package/executors/secrets-vercel-sync/providers/secrets-provider.factory.d.ts +17 -0
  117. package/executors/secrets-vercel-sync/providers/secrets-provider.factory.d.ts.map +1 -0
  118. package/executors/secrets-vercel-sync/providers/secrets-provider.factory.js +25 -0
  119. package/executors/secrets-vercel-sync/providers/secrets-provider.factory.js.map +1 -0
  120. package/executors/secrets-vercel-sync/providers/secrets-provider.interface.d.ts +28 -0
  121. package/executors/secrets-vercel-sync/providers/secrets-provider.interface.d.ts.map +1 -0
  122. package/executors/secrets-vercel-sync/providers/secrets-provider.interface.js +4 -0
  123. package/executors/secrets-vercel-sync/providers/secrets-provider.interface.js.map +1 -0
  124. package/executors/secrets-vercel-sync/schema.json +112 -0
  125. package/executors/token-linter/executor.options.d.ts +1 -1
  126. package/executors/token-linter/executor.task.d.ts +1 -1
  127. package/executors/token-linter/schema.json +1 -1
  128. package/executors.json +40 -30
  129. package/index.d.ts +4 -3
  130. package/index.d.ts.map +1 -1
  131. package/index.js +41 -39
  132. package/index.js.map +1 -1
  133. package/package.json +21 -19
  134. package/utils/markdown-processing.d.ts +43 -0
  135. package/utils/markdown-processing.d.ts.map +1 -0
  136. package/utils/markdown-processing.js +186 -0
  137. package/utils/markdown-processing.js.map +1 -0
  138. package/utils/valid-html-tags.d.ts +6 -0
  139. package/utils/valid-html-tags.d.ts.map +1 -0
  140. package/utils/valid-html-tags.js +83 -0
  141. package/utils/valid-html-tags.js.map +1 -0
@@ -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":"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"}
@@ -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"}
@@ -0,0 +1,17 @@
1
+ import type { ISecretsProvider } from './secrets-provider.interface';
2
+ /**
3
+ * The supported secrets provider types.
4
+ *
5
+ * @public
6
+ */
7
+ export type SecretsProviderType = 'doppler' | 'azure-keyvault';
8
+ /**
9
+ * Creates an {@link ISecretsProvider} instance for the given provider type.
10
+ *
11
+ * @param type - The provider type to instantiate.
12
+ * @returns The corresponding secrets provider.
13
+ *
14
+ * @public
15
+ */
16
+ export declare function createSecretsProvider(type: SecretsProviderType): ISecretsProvider;
17
+ //# sourceMappingURL=secrets-provider.factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets-provider.factory.d.ts","sourceRoot":"","sources":["../../../../src/executors/secrets-config-sync/providers/secrets-provider.factory.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAIrE;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,gBAAgB,CAAC;AAE/D;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,GAAG,gBAAgB,CASjF"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ // #region Imports
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.createSecretsProvider = createSecretsProvider;
5
+ const azure_keyvault_provider_1 = require("./azure-keyvault.provider");
6
+ const doppler_provider_1 = require("./doppler.provider");
7
+ /**
8
+ * Creates an {@link ISecretsProvider} instance for the given provider type.
9
+ *
10
+ * @param type - The provider type to instantiate.
11
+ * @returns The corresponding secrets provider.
12
+ *
13
+ * @public
14
+ */
15
+ function createSecretsProvider(type) {
16
+ switch (type) {
17
+ case 'doppler':
18
+ return new doppler_provider_1.DopplerSecretsProvider();
19
+ case 'azure-keyvault':
20
+ return new azure_keyvault_provider_1.AzureKeyVaultSecretsProvider();
21
+ default:
22
+ throw new Error(`Unknown secrets provider type: "${type}". Supported: doppler, azure-keyvault.`);
23
+ }
24
+ }
25
+ //# sourceMappingURL=secrets-provider.factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets-provider.factory.js","sourceRoot":"","sources":["../../../../src/executors/secrets-config-sync/providers/secrets-provider.factory.ts"],"names":[],"mappings":";AAAA,kBAAkB;;AAuBlB,sDASC;AA9BD,uEAAyE;AACzE,yDAA4D;AAY5D;;;;;;;GAOG;AACH,SAAgB,qBAAqB,CAAC,IAAyB;IAC3D,QAAQ,IAAI,EAAE,CAAC;QACX,KAAK,SAAS;YACV,OAAO,IAAI,yCAAsB,EAAE,CAAC;QACxC,KAAK,gBAAgB;YACjB,OAAO,IAAI,sDAA4B,EAAE,CAAC;QAC9C;YACI,MAAM,IAAI,KAAK,CAAC,mCAAmC,IAAI,wCAAwC,CAAC,CAAC;IACzG,CAAC;AACL,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { ILogger } from '@breadstone-infrastructure/utilities';
2
+ /**
3
+ * Abstraction for a secrets provider that can authenticate and fetch secrets.
4
+ *
5
+ * @public
6
+ */
7
+ export interface ISecretsProvider {
8
+ /**
9
+ * Authenticates with the provider and returns an access token.
10
+ *
11
+ * @param apiKey - An optional API key or access token. If provided, it is used directly.
12
+ * @param interactive - Whether to prompt the user for credentials if none are provided.
13
+ * @returns The resolved access token.
14
+ */
15
+ authenticate(apiKey?: string, interactive?: boolean): Promise<string>;
16
+ /**
17
+ * Fetches all secrets from the provider.
18
+ *
19
+ * @param token - The access token obtained from {@link authenticate}.
20
+ * @param project - The project identifier (Doppler project name, or ignored for Azure Key Vault).
21
+ * @param config - The config identifier (Doppler config name, or ignored for Azure Key Vault).
22
+ * @param logger - Logger instance for status output.
23
+ * @param vaultUrl - The Azure Key Vault URL (only used by the azure-keyvault provider).
24
+ * @returns A flat record of secret key-value pairs.
25
+ */
26
+ fetchSecrets(token: string, project: string, config: string, logger: ILogger, vaultUrl?: string): Promise<Record<string, string>>;
27
+ }
28
+ //# sourceMappingURL=secrets-provider.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets-provider.interface.d.ts","sourceRoot":"","sources":["../../../../src/executors/secrets-config-sync/providers/secrets-provider.interface.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAIpE;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAE7B;;;;;;OAMG;IACH,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEtE;;;;;;;;;OASG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACrI"}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ // #region Imports
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ //# sourceMappingURL=secrets-provider.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets-provider.interface.js","sourceRoot":"","sources":["../../../../src/executors/secrets-config-sync/providers/secrets-provider.interface.ts"],"names":[],"mappings":";AAAA,kBAAkB"}
@@ -0,0 +1,44 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema",
3
+ "cli": "nx",
4
+ "title": "Secrets Config Sync",
5
+ "description": "Fetches secrets from a configurable provider (Doppler, Azure Key Vault) and writes them to local .env files.",
6
+ "type": "object",
7
+ "properties": {
8
+ "provider": {
9
+ "type": "string",
10
+ "description": "The secrets provider to use.",
11
+ "enum": [
12
+ "doppler",
13
+ "azure-keyvault"
14
+ ],
15
+ "default": "doppler"
16
+ },
17
+ "project": {
18
+ "type": "string",
19
+ "description": "The project identifier (e.g. Doppler project name)."
20
+ },
21
+ "config": {
22
+ "type": "string",
23
+ "description": "The configuration identifier (e.g. Doppler config name: dev, prev, prod)."
24
+ },
25
+ "envFile": {
26
+ "type": "string",
27
+ "description": "The relative path to the .env file to write secrets to."
28
+ },
29
+ "apiKey": {
30
+ "type": "string",
31
+ "description": "The API key or access token for the secrets provider. If omitted, the user is prompted interactively."
32
+ },
33
+ "vaultUrl": {
34
+ "type": "string",
35
+ "description": "The Azure Key Vault URL (e.g. https://my-vault.vault.azure.net). Required when provider is azure-keyvault."
36
+ }
37
+ },
38
+ "required": [
39
+ "project",
40
+ "config",
41
+ "envFile"
42
+ ],
43
+ "additionalProperties": false
44
+ }
@@ -0,0 +1,11 @@
1
+ import type { ExecutorContext } from '@nx/devkit';
2
+ import type { SecretsVercelSyncExecutorOptions } from './executor.options';
3
+ /**
4
+ * Nx executor that synchronizes secrets from a configurable provider to Vercel.
5
+ *
6
+ * @public
7
+ */
8
+ export default function runExecutor(options: SecretsVercelSyncExecutorOptions, 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-vercel-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,CA8B5I"}
@@ -0,0 +1,74 @@
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 synchronizes secrets from a configurable provider to Vercel.
42
+ *
43
+ * @public
44
+ */
45
+ async function runExecutor(options, context) {
46
+ try {
47
+ const task = (await Promise.resolve().then(() => __importStar(require('./executor.task')))).SecretsVercelSyncTask;
48
+ await task.run({
49
+ cwd: (0, getProjectRoot_1.getProjectRoot)(context),
50
+ provider: options.provider,
51
+ secretsProject: options.secretsProject,
52
+ secretsConfig: options.secretsConfig,
53
+ vaultUrl: options.vaultUrl,
54
+ apiKey: options.apiKey,
55
+ vercelTeam: options.vercelTeam,
56
+ vercelProject: options.vercelProject,
57
+ vercelEnvironment: options.vercelEnvironment,
58
+ vercelVariableType: options.vercelVariableType,
59
+ conflictStrategy: options.conflictStrategy,
60
+ dryRun: options.dryRun,
61
+ deleteMissing: options.deleteMissing,
62
+ includeKeys: options.includeKeys,
63
+ excludeKeys: options.excludeKeys,
64
+ redeploy: options.redeploy,
65
+ interactive: options.interactive
66
+ });
67
+ return { success: true };
68
+ }
69
+ catch (error) {
70
+ console.error(error);
71
+ return { success: false };
72
+ }
73
+ }
74
+ //# sourceMappingURL=executor.js.map