@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,118 @@
|
|
|
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
|
+
const envToken = process.env['AZURE_KEYVAULT_TOKEN'];
|
|
26
|
+
if (envToken) {
|
|
27
|
+
return envToken;
|
|
28
|
+
}
|
|
29
|
+
if (interactive) {
|
|
30
|
+
const credentials = await (0, enquirer_1.prompt)([
|
|
31
|
+
{
|
|
32
|
+
type: 'input',
|
|
33
|
+
name: 'token',
|
|
34
|
+
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`.'
|
|
35
|
+
}
|
|
36
|
+
]);
|
|
37
|
+
if (!credentials.token) {
|
|
38
|
+
throw new Error('No Azure Key Vault access token provided. Aborting.');
|
|
39
|
+
}
|
|
40
|
+
return credentials.token;
|
|
41
|
+
}
|
|
42
|
+
throw new Error('AZURE_KEYVAULT_TOKEN environment variable is not set. Set it to an Azure Key Vault access token, or enable interactive mode.');
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Fetches all secrets from an Azure Key Vault.
|
|
46
|
+
*
|
|
47
|
+
* The `project` and `config` parameters are ignored. The vault is identified
|
|
48
|
+
* solely by `vaultUrl`.
|
|
49
|
+
*
|
|
50
|
+
* @inheritdoc
|
|
51
|
+
*/
|
|
52
|
+
async fetchSecrets(token, _project, _config, logger, vaultUrl) {
|
|
53
|
+
if (!vaultUrl) {
|
|
54
|
+
throw new Error('vaultUrl is required for the azure-keyvault provider.');
|
|
55
|
+
}
|
|
56
|
+
const normalizedVaultUrl = vaultUrl.endsWith('/') ? vaultUrl.slice(0, -1) : vaultUrl;
|
|
57
|
+
const secrets = {};
|
|
58
|
+
// Step 1: List all secrets (paged)
|
|
59
|
+
const secretItems = await this.listSecrets(token, normalizedVaultUrl);
|
|
60
|
+
logger.log(` Found ${secretItems.length} secrets in Key Vault.`);
|
|
61
|
+
// Step 2: Fetch each secret value
|
|
62
|
+
for (const item of secretItems) {
|
|
63
|
+
const secretName = this.extractSecretName(item.id);
|
|
64
|
+
const value = await this.getSecretValue(token, normalizedVaultUrl, secretName);
|
|
65
|
+
secrets[secretName] = value;
|
|
66
|
+
}
|
|
67
|
+
logger.log(` Fetched ${Object.keys(secrets).length} secrets from Azure Key Vault [${normalizedVaultUrl}].`);
|
|
68
|
+
return secrets;
|
|
69
|
+
}
|
|
70
|
+
// #endregion
|
|
71
|
+
// #region Private Methods
|
|
72
|
+
/**
|
|
73
|
+
* Lists all secrets in the vault (handles pagination).
|
|
74
|
+
*/
|
|
75
|
+
async listSecrets(token, vaultUrl) {
|
|
76
|
+
const allItems = [];
|
|
77
|
+
let nextLink = `${vaultUrl}/secrets?api-version=7.4`;
|
|
78
|
+
while (nextLink) {
|
|
79
|
+
const response = await fetch(nextLink, {
|
|
80
|
+
headers: { Authorization: `Bearer ${token}` }
|
|
81
|
+
});
|
|
82
|
+
if (!response.ok) {
|
|
83
|
+
throw new Error(`Failed to list Azure Key Vault secrets (HTTP ${response.status}): ${response.statusText}`);
|
|
84
|
+
}
|
|
85
|
+
const data = await response.json();
|
|
86
|
+
const enabledItems = data.value.filter(item => item.attributes.enabled);
|
|
87
|
+
allItems.push(...enabledItems);
|
|
88
|
+
nextLink = data.nextLink;
|
|
89
|
+
}
|
|
90
|
+
return allItems;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Fetches the current value of a single secret.
|
|
94
|
+
*/
|
|
95
|
+
async getSecretValue(token, vaultUrl, secretName) {
|
|
96
|
+
const url = `${vaultUrl}/secrets/${encodeURIComponent(secretName)}?api-version=7.4`;
|
|
97
|
+
const response = await fetch(url, {
|
|
98
|
+
headers: { Authorization: `Bearer ${token}` }
|
|
99
|
+
});
|
|
100
|
+
if (!response.ok) {
|
|
101
|
+
throw new Error(`Failed to fetch Azure Key Vault secret "${secretName}" (HTTP ${response.status}): ${response.statusText}`);
|
|
102
|
+
}
|
|
103
|
+
const data = await response.json();
|
|
104
|
+
return data.value;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Extracts the secret name from a Key Vault secret ID URL.
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* `https://my-vault.vault.azure.net/secrets/MY_SECRET` → `MY_SECRET`
|
|
111
|
+
*/
|
|
112
|
+
extractSecretName(secretId) {
|
|
113
|
+
const parts = secretId.split('/');
|
|
114
|
+
return parts[parts.length - 1];
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
exports.AzureKeyVaultSecretsProvider = AzureKeyVaultSecretsProvider;
|
|
118
|
+
//# sourceMappingURL=azure-keyvault.provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"azure-keyvault.provider.js","sourceRoot":"","sources":["../../../../src/executors/secrets-vercel-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-vercel-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;AAiBrE;;;;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;IA6BlF;;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;CA2B9H"}
|
|
@@ -0,0 +1,61 @@
|
|
|
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
|
+
const envToken = process.env['DOPPLER_TOKEN'];
|
|
22
|
+
if (envToken) {
|
|
23
|
+
return envToken;
|
|
24
|
+
}
|
|
25
|
+
if (interactive) {
|
|
26
|
+
const credentials = await (0, enquirer_1.prompt)([
|
|
27
|
+
{
|
|
28
|
+
type: 'input',
|
|
29
|
+
name: 'token',
|
|
30
|
+
message: 'Enter your Doppler API token:\nYou can find it in your Doppler account under Service Tokens or Personal Tokens.'
|
|
31
|
+
}
|
|
32
|
+
]);
|
|
33
|
+
if (!credentials.token) {
|
|
34
|
+
throw new Error('No Doppler API token provided. Aborting.');
|
|
35
|
+
}
|
|
36
|
+
return credentials.token;
|
|
37
|
+
}
|
|
38
|
+
throw new Error('DOPPLER_TOKEN environment variable is not set. Set it to a Doppler Service Token or Personal Token, or enable interactive mode.');
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* @inheritdoc
|
|
42
|
+
*/
|
|
43
|
+
async fetchSecrets(token, project, config, logger) {
|
|
44
|
+
const apiUrl = `https://api.doppler.com/v3/configs/config/secrets?project=${encodeURIComponent(project)}&config=${encodeURIComponent(config)}&include_dynamic_secrets=false&include_managed_secrets=true`;
|
|
45
|
+
const response = await fetch(apiUrl, {
|
|
46
|
+
headers: { Authorization: `Bearer ${token}` }
|
|
47
|
+
});
|
|
48
|
+
if (!response.ok) {
|
|
49
|
+
throw new Error(`Failed to fetch Doppler secrets (HTTP ${response.status}): ${response.statusText}`);
|
|
50
|
+
}
|
|
51
|
+
const data = await response.json();
|
|
52
|
+
if (!data.success) {
|
|
53
|
+
throw new Error('Doppler API returned success=false.');
|
|
54
|
+
}
|
|
55
|
+
const secrets = Object.fromEntries(Object.entries(data.secrets).map(([key, value]) => [key, value.computed]));
|
|
56
|
+
logger.log(` Fetched ${Object.keys(secrets).length} secrets from Doppler [${project}/${config}].`);
|
|
57
|
+
return secrets;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
exports.DopplerSecretsProvider = DopplerSecretsProvider;
|
|
61
|
+
//# sourceMappingURL=doppler.provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doppler.provider.js","sourceRoot":"","sources":["../../../../src/executors/secrets-vercel-sync/providers/doppler.provider.ts"],"names":[],"mappings":";AAAA,kBAAkB;;;AAGlB,uCAAkC;AAgBlC,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,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC9C,IAAI,QAAQ,EAAE,CAAC;YACX,OAAO,QAAQ,CAAC;QACpB,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YACd,MAAM,WAAW,GAAG,MAAM,IAAA,iBAAM,EAAoB;gBAChD;oBACI,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,iHAAiH;iBAC7H;aACJ,CAAC,CAAC;YAEH,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;YAChE,CAAC;YAED,OAAO,WAAW,CAAC,KAAK,CAAC;QAC7B,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,iIAAiI,CAAC,CAAC;IACvJ,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,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAC9B,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,QAAQ,CAAC,CAAC,CAC5E,CAAC;QAEF,MAAM,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,0BAA0B,OAAO,IAAI,MAAM,IAAI,CAAC,CAAC;QAEpG,OAAO,OAAO,CAAC;IACnB,CAAC;CAGJ;AAlED,wDAkEC"}
|
|
@@ -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-vercel-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-vercel-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-vercel-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-vercel-sync/providers/secrets-provider.interface.ts"],"names":[],"mappings":";AAAA,kBAAkB"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema",
|
|
3
|
+
"cli": "nx",
|
|
4
|
+
"title": "Secrets Vercel Sync",
|
|
5
|
+
"description": "Synchronizes secrets from a configurable provider (Doppler, Azure Key Vault) to a Vercel project/environment.",
|
|
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
|
+
"secretsProject": {
|
|
18
|
+
"type": "string",
|
|
19
|
+
"description": "The secrets provider project identifier (e.g. Doppler project name)."
|
|
20
|
+
},
|
|
21
|
+
"secretsConfig": {
|
|
22
|
+
"type": "string",
|
|
23
|
+
"description": "The secrets provider configuration identifier (e.g. Doppler config name: dev, prev, prod)."
|
|
24
|
+
},
|
|
25
|
+
"vaultUrl": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"description": "The Azure Key Vault URL (e.g. https://my-vault.vault.azure.net). Required when provider is azure-keyvault."
|
|
28
|
+
},
|
|
29
|
+
"apiKey": {
|
|
30
|
+
"type": "string",
|
|
31
|
+
"description": "The API key or access token for the secrets provider. If omitted, resolved from environment or prompted interactively."
|
|
32
|
+
},
|
|
33
|
+
"vercelTeam": {
|
|
34
|
+
"type": "string",
|
|
35
|
+
"description": "The Vercel team slug or scope."
|
|
36
|
+
},
|
|
37
|
+
"vercelProject": {
|
|
38
|
+
"type": "string",
|
|
39
|
+
"description": "The Vercel project name or ID."
|
|
40
|
+
},
|
|
41
|
+
"vercelEnvironment": {
|
|
42
|
+
"type": "string",
|
|
43
|
+
"description": "The target Vercel environment.",
|
|
44
|
+
"enum": [
|
|
45
|
+
"development",
|
|
46
|
+
"preview",
|
|
47
|
+
"production"
|
|
48
|
+
]
|
|
49
|
+
},
|
|
50
|
+
"vercelVariableType": {
|
|
51
|
+
"type": "string",
|
|
52
|
+
"description": "The Vercel variable type (encrypted or sensitive).",
|
|
53
|
+
"enum": [
|
|
54
|
+
"encrypted",
|
|
55
|
+
"sensitive"
|
|
56
|
+
],
|
|
57
|
+
"default": "encrypted"
|
|
58
|
+
},
|
|
59
|
+
"conflictStrategy": {
|
|
60
|
+
"type": "string",
|
|
61
|
+
"description": "How to handle conflicts between the secrets provider and existing Vercel values.",
|
|
62
|
+
"enum": [
|
|
63
|
+
"none",
|
|
64
|
+
"prefer-source",
|
|
65
|
+
"prefer-vercel"
|
|
66
|
+
],
|
|
67
|
+
"default": "prefer-source"
|
|
68
|
+
},
|
|
69
|
+
"dryRun": {
|
|
70
|
+
"type": "boolean",
|
|
71
|
+
"description": "If true, no changes are written to Vercel. Only a diff report is shown.",
|
|
72
|
+
"default": false
|
|
73
|
+
},
|
|
74
|
+
"deleteMissing": {
|
|
75
|
+
"type": "boolean",
|
|
76
|
+
"description": "If true, keys present in Vercel but not in the secrets provider are deleted. Must be explicitly enabled.",
|
|
77
|
+
"default": false
|
|
78
|
+
},
|
|
79
|
+
"includeKeys": {
|
|
80
|
+
"type": "array",
|
|
81
|
+
"items": {
|
|
82
|
+
"type": "string"
|
|
83
|
+
},
|
|
84
|
+
"description": "If set, only these keys are synchronized."
|
|
85
|
+
},
|
|
86
|
+
"excludeKeys": {
|
|
87
|
+
"type": "array",
|
|
88
|
+
"items": {
|
|
89
|
+
"type": "string"
|
|
90
|
+
},
|
|
91
|
+
"description": "If set, these keys are excluded from synchronization."
|
|
92
|
+
},
|
|
93
|
+
"redeploy": {
|
|
94
|
+
"type": "boolean",
|
|
95
|
+
"description": "If true, triggers a redeployment of the Vercel project after sync.",
|
|
96
|
+
"default": false
|
|
97
|
+
},
|
|
98
|
+
"interactive": {
|
|
99
|
+
"type": "boolean",
|
|
100
|
+
"description": "If true, prompts the user for missing tokens instead of failing.",
|
|
101
|
+
"default": false
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
"required": [
|
|
105
|
+
"secretsProject",
|
|
106
|
+
"secretsConfig",
|
|
107
|
+
"vercelTeam",
|
|
108
|
+
"vercelProject",
|
|
109
|
+
"vercelEnvironment"
|
|
110
|
+
],
|
|
111
|
+
"additionalProperties": false
|
|
112
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ExecutorContext } from '@nx/devkit';
|
|
2
|
+
import type { TokenLinterExecutorOptions } from './executor.options';
|
|
3
|
+
/**
|
|
4
|
+
* @description Nx executor entry point for the token linter.
|
|
5
|
+
* @public
|
|
6
|
+
*/
|
|
7
|
+
export default function runExecutor(options: TokenLinterExecutorOptions, context: ExecutorContext): Promise<{
|
|
8
|
+
success: boolean;
|
|
9
|
+
}>;
|
|
10
|
+
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../../src/executors/token-linter/executor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAIrE;;;GAGG;AACH,wBAA8B,WAAW,CAAC,OAAO,EAAE,0BAA0B,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAuBtI"}
|
|
@@ -0,0 +1,67 @@
|
|
|
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
|
+
const isVerbose_1 = require("../../utils/isVerbose");
|
|
40
|
+
// #endregion
|
|
41
|
+
/**
|
|
42
|
+
* @description Nx executor entry point for the token linter.
|
|
43
|
+
* @public
|
|
44
|
+
*/
|
|
45
|
+
async function runExecutor(options, context) {
|
|
46
|
+
try {
|
|
47
|
+
const task = (await Promise.resolve().then(() => __importStar(require('./executor.task')))).TokenLinterTask;
|
|
48
|
+
const verbose = (0, isVerbose_1.isVerbose)(context, options);
|
|
49
|
+
await task.run({
|
|
50
|
+
cwd: (0, getProjectRoot_1.getProjectRoot)(context),
|
|
51
|
+
tokensDir: options.tokensDir,
|
|
52
|
+
mixinsDir: options.mixinsDir,
|
|
53
|
+
themes: options.themes,
|
|
54
|
+
fix: options.fix,
|
|
55
|
+
verbose,
|
|
56
|
+
reporter: options.reporter,
|
|
57
|
+
rules: options.rules,
|
|
58
|
+
ruleOptions: options.ruleOptions,
|
|
59
|
+
});
|
|
60
|
+
return { success: true };
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
console.error(error);
|
|
64
|
+
return { success: false };
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../src/executors/token-linter/executor.ts"],"names":[],"mappings":";AAAA,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAalB,8BAuBC;AAjCD,+DAA4D;AAC5D,qDAAkD;AAGlD,aAAa;AAEb;;;GAGG;AACY,KAAK,UAAU,WAAW,CAAC,OAAmC,EAAE,OAAwB;IACnG,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,wDAAa,iBAAiB,GAAC,CAAC,CAAC,eAAe,CAAC;QAC/D,MAAM,OAAO,GAAG,IAAA,qBAAS,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAE5C,MAAM,IAAI,CAAC,GAAG,CAAC;YACX,GAAG,EAAE,IAAA,+BAAc,EAAC,OAAO,CAAC;YAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,OAAO;YACP,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,WAAW,EAAE,OAAO,CAAC,WAAW;SACnC,CAAC,CAAC;QAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAErB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC9B,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { RuleSeverity } from '@breadstone-infrastructure/token-linter';
|
|
2
|
+
/**
|
|
3
|
+
* @description Options for the token-linter executor as declared in project.json.
|
|
4
|
+
* All fields are optional - the primary config comes from `tokenlinter.config.mjs`.
|
|
5
|
+
* Any options specified here override the config file values.
|
|
6
|
+
* @public
|
|
7
|
+
*/
|
|
8
|
+
export interface TokenLinterExecutorOptions {
|
|
9
|
+
tokensDir?: string;
|
|
10
|
+
themes?: string[];
|
|
11
|
+
mixinsDir?: string;
|
|
12
|
+
fix?: boolean;
|
|
13
|
+
interactive?: boolean;
|
|
14
|
+
verbose?: boolean;
|
|
15
|
+
reporter?: 'console' | 'json' | 'summary';
|
|
16
|
+
rules?: Record<string, RuleSeverity | 'off'>;
|
|
17
|
+
ruleOptions?: Record<string, Record<string, unknown>>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=executor.options.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.options.d.ts","sourceRoot":"","sources":["../../../src/executors/token-linter/executor.options.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAI5E;;;;;GAKG;AACH,MAAM,WAAW,0BAA0B;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,KAAK,CAAC,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACzD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.options.js","sourceRoot":"","sources":["../../../src/executors/token-linter/executor.options.ts"],"names":[],"mappings":";AAAA,kBAAkB"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type RuleSeverity } from '@breadstone-infrastructure/token-linter';
|
|
2
|
+
/**
|
|
3
|
+
* @description Task to validate and lint Style Dictionary token JSON files across themes.
|
|
4
|
+
* Discovers `tokenlinter.config.mjs` in the project root automatically.
|
|
5
|
+
* Executor options from project.json override the config file values.
|
|
6
|
+
* @public
|
|
7
|
+
*/
|
|
8
|
+
export declare namespace TokenLinterTask {
|
|
9
|
+
/**
|
|
10
|
+
* @description All fields are optional - the primary configuration comes from
|
|
11
|
+
* the `tokenlinter.config.mjs` config file. Any values provided here override
|
|
12
|
+
* the config file values.
|
|
13
|
+
* @public
|
|
14
|
+
*/
|
|
15
|
+
interface ITokenLinterTaskOptions {
|
|
16
|
+
cwd: string;
|
|
17
|
+
tokensDir?: string;
|
|
18
|
+
mixinsDir?: string;
|
|
19
|
+
themes?: string[];
|
|
20
|
+
fix?: boolean;
|
|
21
|
+
interactive?: boolean;
|
|
22
|
+
verbose?: boolean;
|
|
23
|
+
reporter?: 'console' | 'json' | 'summary';
|
|
24
|
+
rules?: Record<string, RuleSeverity | 'off'>;
|
|
25
|
+
ruleOptions?: Record<string, Record<string, unknown>>;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* @description Discovers the config file and executes the token linter.
|
|
29
|
+
* Executor options override config file values.
|
|
30
|
+
*/
|
|
31
|
+
function run(options: ITokenLinterTaskOptions): Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=executor.task.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.task.d.ts","sourceRoot":"","sources":["../../../src/executors/token-linter/executor.task.ts"],"names":[],"mappings":"AAEA,OAAO,EAA2B,KAAK,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAIrG;;;;;GAKG;AACH,yBAAiB,eAAe,CAAC;IAI7B;;;;;OAKG;IACH,UAAiB,uBAAuB;QACpC,GAAG,EAAE,MAAM,CAAC;QACZ,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,GAAG,CAAC,EAAE,OAAO,CAAC;QACd,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,QAAQ,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;QAC1C,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,KAAK,CAAC,CAAC;QAC7C,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;KACzD;IAMD;;;OAGG;IACH,SAAsB,GAAG,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBzE;CAGJ"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// #region Imports
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.TokenLinterTask = void 0;
|
|
5
|
+
const token_linter_1 = require("@breadstone-infrastructure/token-linter");
|
|
6
|
+
// #endregion
|
|
7
|
+
/**
|
|
8
|
+
* @description Task to validate and lint Style Dictionary token JSON files across themes.
|
|
9
|
+
* Discovers `tokenlinter.config.mjs` in the project root automatically.
|
|
10
|
+
* Executor options from project.json override the config file values.
|
|
11
|
+
* @public
|
|
12
|
+
*/
|
|
13
|
+
var TokenLinterTask;
|
|
14
|
+
(function (TokenLinterTask) {
|
|
15
|
+
// #region Interfaces
|
|
16
|
+
// #endregion
|
|
17
|
+
// #region Functions
|
|
18
|
+
/**
|
|
19
|
+
* @description Discovers the config file and executes the token linter.
|
|
20
|
+
* Executor options override config file values.
|
|
21
|
+
*/
|
|
22
|
+
async function run(options) {
|
|
23
|
+
const orchestrator = new token_linter_1.TokenLinterOrchestrator();
|
|
24
|
+
const overrides = {};
|
|
25
|
+
if (options.tokensDir !== undefined) {
|
|
26
|
+
overrides['tokensDir'] = options.tokensDir;
|
|
27
|
+
}
|
|
28
|
+
if (options.mixinsDir !== undefined) {
|
|
29
|
+
overrides['mixinsDir'] = options.mixinsDir;
|
|
30
|
+
}
|
|
31
|
+
if (options.themes !== undefined) {
|
|
32
|
+
overrides['themes'] = options.themes;
|
|
33
|
+
}
|
|
34
|
+
if (options.fix !== undefined) {
|
|
35
|
+
overrides['fix'] = options.fix;
|
|
36
|
+
}
|
|
37
|
+
if (options.interactive !== undefined) {
|
|
38
|
+
overrides['interactive'] = options.interactive;
|
|
39
|
+
}
|
|
40
|
+
if (options.verbose !== undefined) {
|
|
41
|
+
overrides['verbose'] = options.verbose;
|
|
42
|
+
}
|
|
43
|
+
if (options.reporter !== undefined) {
|
|
44
|
+
overrides['reporter'] = options.reporter;
|
|
45
|
+
}
|
|
46
|
+
if (options.rules !== undefined) {
|
|
47
|
+
overrides['rules'] = options.rules;
|
|
48
|
+
}
|
|
49
|
+
if (options.ruleOptions !== undefined) {
|
|
50
|
+
overrides['ruleOptions'] = options.ruleOptions;
|
|
51
|
+
}
|
|
52
|
+
const result = await orchestrator.executeWithOverrides(options.cwd, overrides);
|
|
53
|
+
if (result.totalErrors > 0) {
|
|
54
|
+
throw new Error(`Token Linter found ${result.totalErrors} error(s).`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
TokenLinterTask.run = run;
|
|
58
|
+
// #endregion
|
|
59
|
+
})(TokenLinterTask || (exports.TokenLinterTask = TokenLinterTask = {}));
|
|
60
|
+
//# sourceMappingURL=executor.task.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.task.js","sourceRoot":"","sources":["../../../src/executors/token-linter/executor.task.ts"],"names":[],"mappings":";AAAA,kBAAkB;;;AAElB,0EAAqG;AAErG,aAAa;AAEb;;;;;GAKG;AACH,IAAiB,eAAe,CAqD/B;AArDD,WAAiB,eAAe;IAE5B,qBAAqB;IAqBrB,aAAa;IAEb,oBAAoB;IAEpB;;;OAGG;IACI,KAAK,UAAU,GAAG,CAAC,OAAgC;QACtD,MAAM,YAAY,GAAG,IAAI,sCAAuB,EAAE,CAAC;QACnD,MAAM,SAAS,GAA4B,EAAE,CAAC;QAE9C,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAAC,SAAS,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;QAAC,CAAC;QACpF,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAAC,SAAS,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;QAAC,CAAC;QACpF,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;QAAC,CAAC;QAC3E,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAAC,SAAS,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;QAAC,CAAC;QAClE,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YAAC,SAAS,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;QAAC,CAAC;QAC1F,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAAC,SAAS,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;QAAC,CAAC;QAC9E,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAAC,SAAS,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;QAAC,CAAC;QACjF,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAAC,SAAS,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;QAAC,CAAC;QACxE,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,MAAM,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,sBAAsB,MAAM,CAAC,WAAW,YAAY,CAAC,CAAC;QAC1E,CAAC;IACL,CAAC;IAnBqB,mBAAG,MAmBxB,CAAA;IAED,aAAa;AACjB,CAAC,EArDgB,eAAe,+BAAf,eAAe,QAqD/B"}
|