import fs from "node:fs"; import os from "node:os"; import { InfisicalClient } from "@infisical/sdk"; import { loadConfig, upsertConfig } from "./configurator.js"; const envpath = `${os.homedir()}/.env`; //upsertConfig(); //TODO Build Configuration Generator const config = loadConfig(); const siteUrl = config.infisicalInstance; const projects = config.projects; const pendingSecrets = []; async function getProjectSecrets( projectName, projectId, environment, clientId, clientSecret, path = "/", includeImports = true, ) { const client = new InfisicalClient({ siteUrl, auth: { universalAuth: { clientId, clientSecret } }, }); const secrets = await client.listSecrets({ projectId, environment, path, includeImports, attachToProcessEnv: false, }); return secrets.map((s) => ({ ...s, project: projectName, path })); } function mapToFile(proj, secrets) { const filename = `infisical-autoenv-${proj}`; const date = new Date(); const dateString = date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate(); const paths = Object.keys(secrets); const lines = paths.map( (p) => `# ---${p}--- ${dateString}\n` + secrets[p] .map((s) => `export ${s.secretKey}=${s.secretValue}`) .join("\n"), ); const fileData = lines.join("\n"); fs.writeFileSync(`${envpath}/${filename}`, fileData); } for (var p of projects) { for (var e of p.environments) { if (!process.env[e.clientIdEnvar]) throw Error(`${e.clientIdEnvar} could not be found!`); if (!process.env[e.clientSecretEnvar]) throw Error(`${e.clientSecretEnvar} could not be found!`); for (var path of e.paths) { pendingSecrets.push( getProjectSecrets( p.name, p.projectId, e.slug, process.env[e.clientIdEnvar], process.env[e.clientSecretEnvar], path, ), ); } } } const loadedSecrets = await Promise.all(pendingSecrets); const filteredSecrets = loadedSecrets.flat(2).filter((s) => !s.isFallback); const proj = projects.map((p) => ({ name: p.name, paths: p.environments.map((envs) => envs.paths).flat(2), })); const projectSecrets = {}; for (var p of proj) { projectSecrets[p.name] = {}; for (var path of p.paths) { projectSecrets[p.name][path] = filteredSecrets.filter( (s) => s.project === p.name && s.path === path, ); } mapToFile(p.name, projectSecrets[p.name]); }