longcelot-sheet-db
Version:
Google Sheets-backed staging database adapter for Node.js with schema-first design
123 lines (122 loc) ⢠4.15 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateCommand = generateCommand;
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const inquirer_1 = __importDefault(require("inquirer"));
const chalk_1 = __importDefault(require("chalk"));
const actorConfig_1 = require("../../utils/actorConfig");
const cliFiles_1 = require("../../utils/cliFiles");
async function generateCommand(tableName) {
console.log(chalk_1.default.blue.bold(`š Generating table schema: ${tableName}\n`));
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);
}
const answers = await inquirer_1.default.prompt([
{
type: 'list',
name: 'actor',
message: 'Which actor owns this table?',
choices: config.actors.map((a) => (0, actorConfig_1.resolveActorName)(a)),
},
{
type: 'confirm',
name: 'timestamps',
message: 'Add timestamps (_created_at, _updated_at)?',
default: true,
},
{
type: 'confirm',
name: 'softDelete',
message: 'Enable soft delete (_deleted_at)?',
default: false,
},
]);
const columns = [];
let addMore = true;
while (addMore) {
const column = await inquirer_1.default.prompt([
{
type: 'input',
name: 'name',
message: 'Column name (or press Enter to finish):',
},
]);
if (!column.name) {
addMore = false;
continue;
}
const columnDetails = await inquirer_1.default.prompt([
{
type: 'list',
name: 'type',
message: `Type for ${column.name}:`,
choices: ['string', 'number', 'boolean', 'date', 'json'],
},
{
type: 'confirm',
name: 'required',
message: 'Required?',
default: false,
},
{
type: 'confirm',
name: 'unique',
message: 'Unique?',
default: false,
},
{
type: 'input',
name: 'defaultValue',
message: 'Default value (leave empty for none):',
},
]);
columns.push({
name: column.name,
...columnDetails,
});
}
const columnsCode = columns
.map((col) => {
let line = ` ${col.name}: ${col.type}()`;
if (col.required)
line += '.required()';
if (col.unique)
line += '.unique()';
if (col.defaultValue) {
const value = col.type === 'string' ? `"${col.defaultValue}"` : col.defaultValue;
line += `.default(${value})`;
}
line += ',';
return line;
})
.join('\n');
const schemaContent = `import { defineTable, string, number, boolean, date, json } from 'longcelot-sheet-db';
export default defineTable({
name: '${tableName}',
actor: '${answers.actor}',
timestamps: ${answers.timestamps},
softDelete: ${answers.softDelete},
columns: {
${columnsCode}
},
});
`;
const actorDir = path_1.default.join(process.cwd(), 'schemas', answers.actor);
if (!fs_1.default.existsSync(actorDir)) {
fs_1.default.mkdirSync(actorDir, { recursive: true });
}
const filePath = path_1.default.join(actorDir, `${tableName}.ts`);
fs_1.default.writeFileSync(filePath, schemaContent);
console.log(chalk_1.default.green(`\nā
Schema created: ${filePath}`));
console.log(chalk_1.default.cyan('\nNext: Run "lsdb sync" to create the sheet\n'));
}
//# sourceMappingURL=generate.js.map