@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.
- 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.d.ts +10 -0
- package/executors/prisma-seeds/executor.d.ts.map +1 -0
- package/executors/prisma-seeds/executor.js +68 -0
- package/executors/prisma-seeds/executor.js.map +1 -0
- package/executors/prisma-seeds/executor.options.d.ts +16 -0
- package/executors/prisma-seeds/executor.options.d.ts.map +1 -0
- package/executors/prisma-seeds/executor.options.js +3 -0
- package/executors/prisma-seeds/executor.options.js.map +1 -0
- package/executors/prisma-seeds/executor.task.d.ts +29 -0
- package/executors/prisma-seeds/executor.task.d.ts.map +1 -0
- package/executors/prisma-seeds/executor.task.js +54 -0
- package/executors/prisma-seeds/executor.task.js.map +1 -0
- package/executors/prisma-seeds/schema.json +35 -0
- 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.d.ts +10 -0
- package/executors/token-linter/executor.d.ts.map +1 -0
- package/executors/token-linter/executor.js +67 -0
- package/executors/token-linter/executor.js.map +1 -0
- package/executors/token-linter/executor.options.d.ts +19 -0
- package/executors/token-linter/executor.options.d.ts.map +1 -0
- package/executors/token-linter/executor.options.js +4 -0
- package/executors/token-linter/executor.options.js.map +1 -0
- package/executors/token-linter/executor.task.d.ts +33 -0
- package/executors/token-linter/executor.task.d.ts.map +1 -0
- package/executors/token-linter/executor.task.js +60 -0
- package/executors/token-linter/executor.task.js.map +1 -0
- package/executors/token-linter/schema.json +63 -0
- package/executors.json +48 -28
- 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 -17
- 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,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 @@
|
|
|
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 @@
|
|
|
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":"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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"}
|