@t1mmen/srtd
Version:
Supabase Repeatable Template Definitions (srtd): 🪄 Live-reloading SQL templates for Supabase DX. Make your database changes reviewable and migrations maintainable! 🚀
128 lines • 5.4 kB
JavaScript
// src/commands/init.ts
import fs from 'node:fs/promises';
import path from 'node:path';
import chalk from 'chalk';
import { Command } from 'commander';
import figures from 'figures';
import { CONFIG_FILE } from '../constants.js';
import { createBaseJsonOutput, writeJson } from '../output/index.js';
import { renderBranding } from '../ui/index.js';
import { getConfig, saveConfig } from '../utils/config.js';
import { createEmptyBuildLog } from '../utils/createEmptyBuildLog.js';
import { ensureDirectories } from '../utils/ensureDirectories.js';
import { fileExists } from '../utils/fileExists.js';
import { findProjectRoot } from '../utils/findProjectRoot.js';
import { getErrorMessage } from '../utils/getErrorMessage.js';
function formatInitJsonOutput(success, config, error) {
return {
...createBaseJsonOutput('init', success, error),
...(config && { config, configPath: CONFIG_FILE }),
};
}
export const initCommand = new Command('init')
.description('Initialize srtd in the current project')
.option('--json', 'Output results as JSON')
.action(async (options) => {
try {
// Skip branding in JSON mode
if (!options.json) {
await renderBranding({ subtitle: 'Initialize Project' });
}
const baseDir = await findProjectRoot();
const { config } = await getConfig(baseDir);
const configPath = path.join(baseDir, CONFIG_FILE);
// Check and create config file
if (await fileExists(configPath)) {
if (!options.json) {
console.log(chalk.cyan(`${figures.info} ${CONFIG_FILE} already exists`));
}
}
else {
await saveConfig(baseDir, {});
if (!options.json) {
console.log(chalk.green(`${figures.tick} Created ${CONFIG_FILE} with default configuration`));
}
}
// Ensure directories exist
const dirs = await ensureDirectories(baseDir, {
templateDir: config.templateDir,
migrationDir: config.migrationDir,
});
if (!options.json) {
if (dirs.templateDir) {
console.log(chalk.green(`${figures.tick} Created template directory ${config.templateDir}`));
}
else {
console.log(chalk.cyan(`${figures.info} Template directory ${config.templateDir} already exists`));
}
if (dirs.migrationDir) {
console.log(chalk.green(`${figures.tick} Created migration directory ${config.migrationDir}`));
}
else {
console.log(chalk.cyan(`${figures.info} Migration directory ${config.migrationDir} already exists`));
}
}
// Create build logs
const buildLogCreated = await createEmptyBuildLog(path.join(baseDir, config.buildLog));
const localBuildLogCreated = await createEmptyBuildLog(path.join(baseDir, config.localBuildLog));
if (!options.json) {
if (buildLogCreated) {
console.log(chalk.green(`${figures.tick} Created build log at ${config.buildLog}`));
}
else {
console.log(chalk.cyan(`${figures.info} Build log already exists at ${config.buildLog}`));
}
if (localBuildLogCreated) {
console.log(chalk.green(`${figures.tick} Created local build log at ${config.localBuildLog}`));
}
else {
console.log(chalk.cyan(`${figures.info} Local build log already exists at ${config.localBuildLog}`));
}
}
// Update .gitignore
const gitignorePath = path.join(baseDir, '.gitignore');
const ignoreEntry = path.basename(config.localBuildLog);
let content = '';
try {
content = await fs.readFile(gitignorePath, 'utf-8');
}
catch {
// Ignore if file doesn't exist
}
if (!content.includes(ignoreEntry)) {
content = `${content.trim()}\n\n# srtd's local logs should not be committed, as they're per-environment specific\n${ignoreEntry}\n`;
await fs.writeFile(gitignorePath, content);
if (!options.json) {
console.log(chalk.green(`${figures.tick} Added ${ignoreEntry} to .gitignore`));
}
}
else {
if (!options.json) {
console.log(chalk.cyan(`${figures.info} .gitignore already contains ${ignoreEntry}`));
}
}
if (options.json) {
const jsonOutput = formatInitJsonOutput(true, config);
writeJson(jsonOutput);
}
else {
console.log();
console.log(chalk.green(`${figures.tick} Initialization complete!`));
console.log(chalk.dim('Your project is ready to use srtd. Start by creating templates in the templates directory.'));
}
process.exit(0);
}
catch (error) {
const errMsg = getErrorMessage(error);
if (options.json) {
const jsonOutput = formatInitJsonOutput(false, undefined, errMsg);
writeJson(jsonOutput);
}
else {
console.log();
console.log(chalk.red(`${figures.cross} Failed to initialize: ${errMsg}`));
}
process.exit(1);
}
});
//# sourceMappingURL=init.js.map