@launchql/cli
Version:
LaunchQL CLI
168 lines (163 loc) • 5.41 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const logger_1 = require("@launchql/logger");
const server_1 = require("@launchql/server");
const env_1 = require("@launchql/env");
const pg_cache_1 = require("pg-cache");
const log = new logger_1.Logger('server');
const serverUsageText = `
LaunchQL Server Command:
lql server [OPTIONS]
Start LaunchQL GraphQL development server.
Options:
--help, -h Show this help message
--port <number> Server port (default: 5555)
--simpleInflection Use simple inflection (default: true)
--oppositeBaseNames Use opposite base names (default: false)
--postgis Enable PostGIS extension (default: true)
--metaApi Enable Meta API (default: true)
--cwd <directory> Working directory (default: current directory)
Examples:
lql server Start server with defaults
lql server --port 8080 Start server on custom port
lql server --no-postgis Start server without PostGIS
`;
const questions = [
{
name: 'simpleInflection',
message: 'Use simple inflection?',
type: 'confirm',
required: false,
default: true,
useDefault: true
},
{
name: 'oppositeBaseNames',
message: 'Use opposite base names?',
type: 'confirm',
required: false,
default: false,
useDefault: true
},
{
name: 'postgis',
message: 'Enable PostGIS extension?',
type: 'confirm',
required: false,
default: true,
useDefault: true
},
{
name: 'metaApi',
message: 'Enable Meta API?',
type: 'confirm',
required: false,
default: true,
useDefault: true
},
{
name: 'port',
message: 'Development server port',
type: 'number',
required: false,
default: 5555,
useDefault: true
}
];
exports.default = async (argv, prompter, _options) => {
// Show usage if explicitly requested
if (argv.help || argv.h) {
console.log(serverUsageText);
process.exit(0);
}
log.info('🔧 LaunchQL Server Configuration:\n');
let selectedDb = process.env.PGDATABASE;
if (!selectedDb) {
const db = await (0, pg_cache_1.getPgPool)({ database: 'postgres' });
const result = await db.query(`
SELECT datname FROM pg_database
WHERE datistemplate = false AND datname NOT IN ('postgres')
AND datname !~ '^pg_'
ORDER BY datname;
`);
const dbChoices = result.rows.map(row => row.datname);
const { database } = await prompter.prompt(argv, [
{
type: 'autocomplete',
name: 'database',
message: 'Select the database to use',
options: dbChoices,
required: true
}
]);
selectedDb = database;
log.info(`📌 Using database: "${selectedDb}"`);
}
const { oppositeBaseNames, port, postgis, simpleInflection, metaApi } = await prompter.prompt(argv, questions);
let selectedSchemas = [];
let authRole;
let roleName;
if (!metaApi) {
const db = await (0, pg_cache_1.getPgPool)({ database: selectedDb });
const result = await db.query(`
SELECT nspname
FROM pg_namespace
WHERE nspname NOT IN ('pg_catalog', 'information_schema')
ORDER BY nspname;
`);
const schemaChoices = result.rows.map(row => ({
name: row.nspname,
value: row.nspname,
selected: true
}));
const { schemas } = await prompter.prompt(argv, [
{
type: 'checkbox',
name: 'schemas',
message: 'Select schemas to expose',
options: schemaChoices,
required: true
}
]);
selectedSchemas = schemas.filter(s => s.selected).map(s => s.value);
const { authRole: selectedAuthRole, roleName: selectedRoleName } = await prompter.prompt(argv, [
{
type: 'autocomplete',
name: 'authRole',
message: 'Select the authentication role',
options: ['postgres', 'authenticated', 'anonymous'],
required: true
},
{
type: 'autocomplete',
name: 'roleName',
message: 'Enter the default role name:',
options: ['postgres', 'authenticated', 'anonymous'],
required: true
}
]);
authRole = selectedAuthRole;
roleName = selectedRoleName;
}
const options = (0, env_1.getEnvOptions)({
pg: { database: selectedDb },
features: {
oppositeBaseNames,
simpleInflection,
postgis
},
api: {
enableMetaApi: metaApi,
...(metaApi === false && { exposedSchemas: selectedSchemas, authRole, roleName })
},
server: {
port
}
});
log.success('✅ Selected Configuration:');
for (const [key, value] of Object.entries(options)) {
log.debug(`${key}: ${JSON.stringify(value)}`);
}
log.success('🚀 Launching Server...\n');
(0, server_1.LaunchQLServer)(options);
};