longcelot-sheet-db
Version:
Google Sheets-backed staging database adapter for Node.js with schema-first design
117 lines • 5.31 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.statusCommand = statusCommand;
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const chalk_1 = __importDefault(require("chalk"));
const actorConfig_1 = require("../../utils/actorConfig");
const cliFiles_1 = require("../../utils/cliFiles");
async function statusCommand() {
console.log(chalk_1.default.blue.bold('📊 LSDB Project Status\n'));
require('dotenv').config();
// Load config
let config;
try {
config = require((0, cliFiles_1.resolveConfigPath)()).default;
}
catch {
console.error(chalk_1.default.red('❌ lsdb.config.ts not found. Run: lsdb init'));
process.exit(1);
}
// Project info
console.log(chalk_1.default.bold('Project'));
console.log(` Name: ${config.projectName || chalk_1.default.gray('(not set)')}`);
const actorRoles = (config.actors ?? []).map((a) => (0, actorConfig_1.resolveActorName)(a));
console.log(` Actors: ${actorRoles.join(', ') || chalk_1.default.gray('(none)')}`);
console.log();
// Environment
console.log(chalk_1.default.bold('Environment'));
const baseEnvVars = [
['GOOGLE_CLIENT_ID', process.env.GOOGLE_CLIENT_ID ? '(set)' : undefined],
['GOOGLE_CLIENT_SECRET', process.env.GOOGLE_CLIENT_SECRET ? '(set)' : undefined],
['GOOGLE_REDIRECT_URI', process.env.GOOGLE_REDIRECT_URI],
];
// Show sheet ID env vars per actor
const actorSheetEnvVars = (config.actors ?? []).map((a) => {
const envKey = typeof a === 'string'
? (a === 'admin' ? 'ADMIN_SHEET_ID' : `DEV_${a.toUpperCase()}_SHEET_ID`)
: (a.sheetIdEnv ?? 'ADMIN_SHEET_ID');
return [envKey, process.env[envKey]];
});
const envVars = [...actorSheetEnvVars, ...baseEnvVars];
for (const [name, value] of envVars) {
const display = value ? chalk_1.default.green(value) : chalk_1.default.red('(missing)');
console.log(` ${name}: ${display}`);
}
console.log();
// OAuth tokens
const tokensPath = (0, cliFiles_1.resolveTokensPath)();
console.log(chalk_1.default.bold('OAuth Tokens'));
if (fs_1.default.existsSync(tokensPath)) {
try {
const tokens = JSON.parse(fs_1.default.readFileSync(tokensPath, 'utf-8'));
const expired = tokens.expiry_date ? Date.now() > tokens.expiry_date : false;
const expiresAt = tokens.expiry_date
? new Date(tokens.expiry_date).toLocaleString()
: 'unknown';
console.log(` Status: ${expired ? chalk_1.default.yellow('expired (will auto-refresh)') : chalk_1.default.green('valid')}`);
console.log(` Access expires: ${expiresAt}`);
console.log(` Refresh token: ${tokens.refresh_token ? chalk_1.default.green('present') : chalk_1.default.red('missing')}`);
}
catch {
console.log(` ${chalk_1.default.red('⚠ Token file could not be parsed')}`);
}
}
else {
console.log(` ${chalk_1.default.yellow('No tokens found — run: lsdb sync')}`);
}
console.log();
// Schemas by actor
const schemasDir = path_1.default.join(process.cwd(), 'schemas');
if (!fs_1.default.existsSync(schemasDir)) {
console.log(chalk_1.default.yellow('No schemas/ directory found. Run: lsdb init'));
return;
}
const schemasByActor = {};
let totalSchemas = 0;
for (const actorEntry of (config.actors || [])) {
const actor = (0, actorConfig_1.resolveActorName)(actorEntry);
const actorDir = path_1.default.join(schemasDir, actor);
schemasByActor[actor] = [];
if (!fs_1.default.existsSync(actorDir))
continue;
const files = fs_1.default.readdirSync(actorDir).filter((f) => f.endsWith('.ts'));
for (const file of files) {
try {
const schema = require(path_1.default.join(actorDir, file)).default;
schemasByActor[actor].push(schema);
totalSchemas++;
}
catch {
// Skip unloadable schemas
}
}
}
console.log(chalk_1.default.bold(`Tables (${totalSchemas} total)`));
for (const [actor, schemas] of Object.entries(schemasByActor)) {
if (schemas.length === 0) {
console.log(`\n ${chalk_1.default.cyan(actor)} ${chalk_1.default.gray('(no schemas)')}`);
continue;
}
console.log(`\n ${chalk_1.default.cyan.bold(actor)}`);
for (const schema of schemas) {
const columnCount = Object.keys(schema.columns).length;
const flags = [
schema.timestamps ? 'timestamps' : '',
schema.softDelete ? 'softDelete' : '',
].filter(Boolean).join(', ');
console.log(` ${chalk_1.default.white(schema.name.padEnd(30))} ${chalk_1.default.gray(`${columnCount} columns`)}` +
(flags ? chalk_1.default.gray(` [${flags}]`) : ''));
}
}
console.log();
}
//# sourceMappingURL=status.js.map