envase
Version:
Type-safe environment variable validation with Standard Schema compliance
64 lines • 2.83 kB
JavaScript
import { readFile, writeFile } from 'node:fs/promises';
import { resolve } from 'node:path';
import { cac } from 'cac';
import { extractEnvvars } from "./extract-envvars.js";
import { generateMarkdown } from "./generate-markdown.js";
import { loadSchema } from "./load-schema.js";
import { validateMarkdown } from "./validate-markdown.js";
const cli = cac('envase');
cli
.command('generate <schemaPath>', 'Generate markdown documentation from environment schema')
.option('-o, --output <file>', 'Output markdown file path', {
default: './env-docs.md',
})
.example('envase generate ./config.js -o docs/environment.md')
.action(async (schemaPath, options) => {
try {
console.log('Loading schema from:', schemaPath);
const schema = await loadSchema(schemaPath);
const extractedEnvvars = extractEnvvars(schema);
console.log('Generating markdown documentation...');
const markdown = await generateMarkdown(extractedEnvvars);
const outputPath = resolve(process.cwd(), options.output);
await writeFile(outputPath, markdown, 'utf-8');
console.log(`✓ Documentation generated: ${outputPath}`);
}
catch (error) {
console.error('Error:', error instanceof Error ? error.message : String(error));
process.exit(1);
}
});
cli
.command('validate <schemaPath> <markdownPath>', 'Validate if markdown file matches the schema definition')
.example('envase validate ./config.js ./docs/env.md')
.action(async (schemaPath, markdownPath) => {
try {
console.log('Loading schema from:', schemaPath);
const schema = await loadSchema(schemaPath);
const extractedEnvvars = extractEnvvars(schema);
console.log('Generating expected markdown...');
const expectedMarkdown = await generateMarkdown(extractedEnvvars);
console.log('Reading actual markdown from:', markdownPath);
const markdownFilePath = resolve(process.cwd(), markdownPath);
const actualMarkdown = await readFile(markdownFilePath, 'utf-8');
console.log('Validating...');
const result = validateMarkdown(actualMarkdown, expectedMarkdown);
if (result.isValid) {
console.log('Validation passed! The markdown file matches the schema.');
process.exit(0);
}
console.error('Validation failed! Found differences:\n');
console.error(result.differences);
console.error('\nTo regenerate documentation:');
console.error(` envase generate ${schemaPath} -o ${markdownPath}`);
process.exit(1);
}
catch (error) {
console.error('Error:', error instanceof Error ? error.message : String(error));
process.exit(1);
}
});
cli.help();
cli.parse();
//# sourceMappingURL=main.js.map