UNPKG

@enspirit/emb

Version:

A replacement for our Makefile-for-monorepos

72 lines (71 loc) 3.02 kB
import { getContext } from '../../../index.js'; import { printTable } from '@oclif/table'; import { FlavoredCommand, TABLE_DEFAULTS } from '../../index.js'; import { aggregateSecrets, discoverSecrets, } from '../../../secrets/SecretDiscovery.js'; export default class SecretsIndex extends FlavoredCommand { static description = 'List all secret references in the configuration.'; static enableJsonFlag = true; static examples = [ '<%= config.bin %> <%= command.id %>', '<%= config.bin %> <%= command.id %> --json', ]; async run() { const { flags } = await this.parse(SecretsIndex); const context = getContext(); const { monorepo, secrets } = context; // Get registered secret providers dynamically const secretProviders = new Set(secrets.getProviderNames()); // Collect secrets from all configuration sources const allSecrets = []; // Scan monorepo-level config (env, vars, tasks, defaults, flavors) allSecrets.push(...discoverSecrets({ env: monorepo.config.env, vars: monorepo.config.vars, tasks: monorepo.config.tasks, defaults: monorepo.config.defaults, flavors: monorepo.config.flavors, }, { file: '.emb.yml' }, secretProviders)); // Scan each component's config for (const component of monorepo.components) { allSecrets.push(...discoverSecrets({ tasks: component.config.tasks, resources: component.config.resources, }, { file: `${component.name}/Embfile.yml`, component: component.name, }, secretProviders)); } // Aggregate by unique secret reference const aggregated = aggregateSecrets(allSecrets); // Convert to output format const result = aggregated.map((secret) => ({ provider: secret.provider, path: secret.path, key: secret.key, component: secret.locations .map((l) => l.component) .filter(Boolean) .join(', ') || undefined, usageCount: secret.locations.length, })); if (!flags.json) { if (result.length === 0) { this.log('No secret references found in configuration.'); } else { printTable({ ...TABLE_DEFAULTS, columns: ['provider', 'path', 'key', 'component', 'usageCount'], data: result.map((r) => ({ ...r, key: r.key || '-', component: r.component || '-', })), }); const providerCount = new Set(result.map((r) => r.provider)).size; this.log(`\nFound ${result.length} secret reference(s) using ${providerCount} provider(s).`); } } return result; } }