@breadstone-infrastructure/nx-tasks 0.0.231 → 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.
- package/executors/doppler-config-sync/executor.task.d.ts.map +1 -1
- package/executors/doppler-config-sync/executor.task.js +37 -18
- package/executors/doppler-config-sync/executor.task.js.map +1 -1
- package/executors/doppler-vercel-sync/executor.d.ts +11 -0
- package/executors/doppler-vercel-sync/executor.d.ts.map +1 -0
- package/executors/doppler-vercel-sync/executor.js +71 -0
- package/executors/doppler-vercel-sync/executor.js.map +1 -0
- package/executors/doppler-vercel-sync/executor.options.d.ts +8 -0
- package/executors/doppler-vercel-sync/executor.options.d.ts.map +1 -0
- package/executors/doppler-vercel-sync/executor.options.js +4 -0
- package/executors/doppler-vercel-sync/executor.options.js.map +1 -0
- package/executors/doppler-vercel-sync/executor.task.d.ts +30 -0
- package/executors/doppler-vercel-sync/executor.task.d.ts.map +1 -0
- package/executors/doppler-vercel-sync/executor.task.js +522 -0
- package/executors/doppler-vercel-sync/executor.task.js.map +1 -0
- package/executors/doppler-vercel-sync/schema.json +95 -0
- package/executors/generate-package-docs/executor.d.ts +6 -0
- package/executors/generate-package-docs/executor.d.ts.map +1 -0
- package/executors/generate-package-docs/executor.js +72 -0
- package/executors/generate-package-docs/executor.js.map +1 -0
- package/executors/generate-package-docs/executor.options.d.ts +6 -0
- package/executors/generate-package-docs/executor.options.d.ts.map +1 -0
- package/executors/generate-package-docs/executor.options.js +4 -0
- package/executors/generate-package-docs/executor.options.js.map +1 -0
- package/executors/generate-package-docs/executor.task.d.ts +103 -0
- package/executors/generate-package-docs/executor.task.d.ts.map +1 -0
- package/executors/generate-package-docs/executor.task.js +259 -0
- package/executors/generate-package-docs/executor.task.js.map +1 -0
- package/executors/generate-package-docs/schema.json +258 -0
- package/executors/icon-collection-builder/executor.d.ts.map +1 -1
- package/executors/icon-collection-builder/executor.js +3 -2
- package/executors/icon-collection-builder/executor.js.map +1 -1
- package/executors/icon-collection-builder/executor.task.d.ts +1 -0
- package/executors/icon-collection-builder/executor.task.d.ts.map +1 -1
- package/executors/icon-collection-builder/executor.task.js +73 -11
- package/executors/icon-collection-builder/executor.task.js.map +1 -1
- package/executors/icon-collection-builder/svg.d.ts +19 -0
- package/executors/icon-collection-builder/svg.d.ts.map +1 -1
- package/executors/icon-collection-builder/svg.js +106 -0
- package/executors/icon-collection-builder/svg.js.map +1 -1
- package/executors/icon-collection-downloader/executor.d.ts.map +1 -1
- package/executors/icon-collection-downloader/executor.js +3 -2
- package/executors/icon-collection-downloader/executor.js.map +1 -1
- package/executors/icon-collection-downloader/executor.task.d.ts +2 -0
- package/executors/icon-collection-downloader/executor.task.d.ts.map +1 -1
- package/executors/icon-collection-downloader/executor.task.js +130 -15
- package/executors/icon-collection-downloader/executor.task.js.map +1 -1
- package/executors/lit-docs/ComponentDocFixer.d.ts +176 -0
- package/executors/lit-docs/ComponentDocFixer.d.ts.map +1 -0
- package/executors/lit-docs/ComponentDocFixer.js +424 -0
- package/executors/lit-docs/ComponentDocFixer.js.map +1 -0
- package/executors/lit-docs/JSDocFixer.d.ts +97 -0
- package/executors/lit-docs/JSDocFixer.d.ts.map +1 -0
- package/executors/lit-docs/JSDocFixer.js +200 -0
- package/executors/lit-docs/JSDocFixer.js.map +1 -0
- package/executors/lit-docs/executor.d.ts.map +1 -1
- package/executors/lit-docs/executor.js +2 -1
- package/executors/lit-docs/executor.js.map +1 -1
- package/executors/lit-docs/executor.task.d.ts +1 -0
- package/executors/lit-docs/executor.task.d.ts.map +1 -1
- package/executors/lit-docs/executor.task.js +71 -24
- package/executors/lit-docs/executor.task.js.map +1 -1
- package/executors/lit-style-transform/executor.js +1 -1
- package/executors/lit-style-transform/executor.js.map +1 -1
- package/executors/prisma-seeds/executor.options.d.ts +1 -1
- package/executors/prisma-seeds/executor.task.d.ts +1 -1
- package/executors/secrets-config-sync/executor.d.ts +11 -0
- package/executors/secrets-config-sync/executor.d.ts.map +1 -0
- package/executors/secrets-config-sync/executor.js +64 -0
- package/executors/secrets-config-sync/executor.js.map +1 -0
- package/executors/secrets-config-sync/executor.options.d.ts +6 -0
- package/executors/secrets-config-sync/executor.options.d.ts.map +1 -0
- package/executors/secrets-config-sync/executor.options.js +4 -0
- package/executors/secrets-config-sync/executor.options.js.map +1 -0
- package/executors/secrets-config-sync/executor.task.d.ts +14 -0
- package/executors/secrets-config-sync/executor.task.d.ts.map +1 -0
- package/executors/secrets-config-sync/executor.task.js +157 -0
- package/executors/secrets-config-sync/executor.task.js.map +1 -0
- package/executors/secrets-config-sync/providers/azure-keyvault.provider.d.ts +42 -0
- package/executors/secrets-config-sync/providers/azure-keyvault.provider.d.ts.map +1 -0
- package/executors/secrets-config-sync/providers/azure-keyvault.provider.js +120 -0
- package/executors/secrets-config-sync/providers/azure-keyvault.provider.js.map +1 -0
- package/executors/secrets-config-sync/providers/doppler.provider.d.ts +18 -0
- package/executors/secrets-config-sync/providers/doppler.provider.d.ts.map +1 -0
- package/executors/secrets-config-sync/providers/doppler.provider.js +53 -0
- package/executors/secrets-config-sync/providers/doppler.provider.js.map +1 -0
- package/executors/secrets-config-sync/providers/secrets-provider.factory.d.ts +17 -0
- package/executors/secrets-config-sync/providers/secrets-provider.factory.d.ts.map +1 -0
- package/executors/secrets-config-sync/providers/secrets-provider.factory.js +25 -0
- package/executors/secrets-config-sync/providers/secrets-provider.factory.js.map +1 -0
- package/executors/secrets-config-sync/providers/secrets-provider.interface.d.ts +28 -0
- package/executors/secrets-config-sync/providers/secrets-provider.interface.d.ts.map +1 -0
- package/executors/secrets-config-sync/providers/secrets-provider.interface.js +4 -0
- package/executors/secrets-config-sync/providers/secrets-provider.interface.js.map +1 -0
- package/executors/secrets-config-sync/schema.json +44 -0
- package/executors/secrets-vercel-sync/executor.d.ts +11 -0
- package/executors/secrets-vercel-sync/executor.d.ts.map +1 -0
- package/executors/secrets-vercel-sync/executor.js +74 -0
- package/executors/secrets-vercel-sync/executor.js.map +1 -0
- package/executors/secrets-vercel-sync/executor.options.d.ts +8 -0
- package/executors/secrets-vercel-sync/executor.options.d.ts.map +1 -0
- package/executors/secrets-vercel-sync/executor.options.js +4 -0
- package/executors/secrets-vercel-sync/executor.options.js.map +1 -0
- package/executors/secrets-vercel-sync/executor.task.d.ts +34 -0
- package/executors/secrets-vercel-sync/executor.task.d.ts.map +1 -0
- package/executors/secrets-vercel-sync/executor.task.js +492 -0
- package/executors/secrets-vercel-sync/executor.task.js.map +1 -0
- package/executors/secrets-vercel-sync/providers/azure-keyvault.provider.d.ts +42 -0
- package/executors/secrets-vercel-sync/providers/azure-keyvault.provider.d.ts.map +1 -0
- package/executors/secrets-vercel-sync/providers/azure-keyvault.provider.js +118 -0
- package/executors/secrets-vercel-sync/providers/azure-keyvault.provider.js.map +1 -0
- package/executors/secrets-vercel-sync/providers/doppler.provider.d.ts +18 -0
- package/executors/secrets-vercel-sync/providers/doppler.provider.d.ts.map +1 -0
- package/executors/secrets-vercel-sync/providers/doppler.provider.js +61 -0
- package/executors/secrets-vercel-sync/providers/doppler.provider.js.map +1 -0
- package/executors/secrets-vercel-sync/providers/secrets-provider.factory.d.ts +17 -0
- package/executors/secrets-vercel-sync/providers/secrets-provider.factory.d.ts.map +1 -0
- package/executors/secrets-vercel-sync/providers/secrets-provider.factory.js +25 -0
- package/executors/secrets-vercel-sync/providers/secrets-provider.factory.js.map +1 -0
- package/executors/secrets-vercel-sync/providers/secrets-provider.interface.d.ts +28 -0
- package/executors/secrets-vercel-sync/providers/secrets-provider.interface.d.ts.map +1 -0
- package/executors/secrets-vercel-sync/providers/secrets-provider.interface.js +4 -0
- package/executors/secrets-vercel-sync/providers/secrets-provider.interface.js.map +1 -0
- package/executors/secrets-vercel-sync/schema.json +112 -0
- package/executors/token-linter/executor.options.d.ts +1 -1
- package/executors/token-linter/executor.task.d.ts +1 -1
- package/executors/token-linter/schema.json +1 -1
- package/executors.json +40 -30
- package/index.d.ts +4 -3
- package/index.d.ts.map +1 -1
- package/index.js +41 -39
- package/index.js.map +1 -1
- package/package.json +21 -19
- package/utils/markdown-processing.d.ts +43 -0
- package/utils/markdown-processing.d.ts.map +1 -0
- package/utils/markdown-processing.js +186 -0
- package/utils/markdown-processing.js.map +1 -0
- package/utils/valid-html-tags.d.ts +6 -0
- package/utils/valid-html-tags.d.ts.map +1 -0
- package/utils/valid-html-tags.js +83 -0
- 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 @@
|
|
|
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
|