@enspirit/emb
Version:
A replacement for our Makefile-for-monorepos
72 lines (71 loc) • 3.02 kB
JavaScript
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;
}
}