kysely-codegen
Version:
`kysely-codegen` generates Kysely type definitions from your database. That's it.
200 lines • 8.38 kB
JavaScript
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
var _Cli_instances, _Cli_getLogLevel, _Cli_parseBoolean, _Cli_serializeFlags, _Cli_showHelp;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Cli = void 0;
const minimist_1 = __importDefault(require("minimist"));
const core_1 = require("../core");
const generator_1 = require("../generator");
const constants_1 = require("./constants");
const flags_1 = require("./flags");
/**
* Creates a kysely-codegen command-line interface.
*/
class Cli {
constructor() {
_Cli_instances.add(this);
}
async generate(options) {
const camelCase = !!options.camelCase;
const excludePattern = options.excludePattern;
const includePattern = options.includePattern;
const outFile = options.outFile;
const print = !!options.print;
const runtimeEnums = options.runtimeEnums;
const schema = options.schema;
const typeOnlyImports = options.typeOnlyImports;
const logger = new core_1.Logger(options.logLevel);
const connectionStringParser = new core_1.ConnectionStringParser();
const { connectionString, inferredDialectName } = connectionStringParser.parse({
connectionString: options.url ?? constants_1.DEFAULT_URL,
dialectName: options.dialectName,
envFile: options.envFile,
logger,
});
if (options.dialectName) {
logger.info(`Using dialect '${options.dialectName}'.`);
}
else {
logger.info(`No dialect specified. Assuming '${inferredDialectName}'.`);
}
const dialectManager = new core_1.DialectManager({
domains: !!options.domains,
});
const dialect = dialectManager.getDialect(options.dialectName ?? inferredDialectName);
const db = await dialect.introspector.connect({
connectionString,
dialect,
});
const generator = new generator_1.Generator();
await generator.generate({
camelCase,
db,
dialect,
excludePattern,
includePattern,
logger,
outFile,
print,
runtimeEnums,
schema,
typeOnlyImports,
verify: options.verify,
});
await db.destroy();
}
parseOptions(args, options) {
const argv = (0, minimist_1.default)(args);
const _ = argv._;
const camelCase = __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseBoolean).call(this, argv['camel-case']);
const dialectName = argv.dialect;
const domains = __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseBoolean).call(this, argv.domains);
const envFile = argv['env-file'];
const excludePattern = argv['exclude-pattern'];
const help = !!argv.h || !!argv.help || _.includes('-h') || _.includes('--help');
const includePattern = argv['include-pattern'];
const logLevel = __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_getLogLevel).call(this, argv['log-level']);
const outFile = argv['out-file'] ??
(argv.print ? undefined : constants_1.DEFAULT_OUT_FILE);
const print = __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseBoolean).call(this, argv.print);
const runtimeEnums = __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseBoolean).call(this, argv['runtime-enums']);
const schema = argv.schema;
const typeOnlyImports = __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseBoolean).call(this, argv['type-only-imports'] ?? true);
const url = argv.url ?? constants_1.DEFAULT_URL;
const verify = __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseBoolean).call(this, argv.verify ?? false);
try {
for (const key in argv) {
if (key !== '_' &&
!flags_1.FLAGS.some((flag) => {
return [
flag.shortName,
flag.longName,
...(flag.longName.startsWith('no-')
? [flag.longName.slice(3)]
: []),
].includes(key);
})) {
throw new RangeError(`Invalid flag: "${key}"`);
}
}
if (help && !options?.silent) {
__classPrivateFieldGet(this, _Cli_instances, "m", _Cli_showHelp).call(this);
}
if (dialectName && !constants_1.VALID_DIALECTS.includes(dialectName)) {
const dialectValues = constants_1.VALID_DIALECTS.join(', ');
throw new RangeError(`Parameter '--dialect' must have one of the following values: ${dialectValues}`);
}
if (!url) {
throw new TypeError("Parameter '--url' must be a valid connection string. Examples:\n\n" +
' --url=postgres://username:password@mydomain.com/database\n' +
' --url=env(DATABASE_URL)');
}
}
catch (error) {
if (logLevel > core_1.LogLevel.SILENT) {
if (error instanceof Error) {
console.error(new core_1.Logger().serializeError(error.message));
if (logLevel >= core_1.LogLevel.DEBUG) {
console.error();
throw error;
}
else {
process.exit(0);
}
}
else {
throw error;
}
}
}
return {
camelCase,
dialectName,
domains,
envFile,
excludePattern,
includePattern,
logLevel,
outFile,
print,
runtimeEnums,
schema,
typeOnlyImports,
url,
verify,
};
}
async run(argv) {
const options = this.parseOptions(argv);
await this.generate(options);
}
}
exports.Cli = Cli;
_Cli_instances = new WeakSet(), _Cli_getLogLevel = function _Cli_getLogLevel(name) {
switch (name) {
case 'silent':
return core_1.LogLevel.SILENT;
case 'info':
return core_1.LogLevel.INFO;
case 'error':
return core_1.LogLevel.ERROR;
case 'debug':
return core_1.LogLevel.DEBUG;
case 'warn':
return core_1.LogLevel.WARN;
default:
return constants_1.DEFAULT_LOG_LEVEL;
}
}, _Cli_parseBoolean = function _Cli_parseBoolean(input) {
return !!input && input !== 'false';
}, _Cli_serializeFlags = function _Cli_serializeFlags() {
const lines = [];
let maxLineLength = 0;
for (const { description, longName, shortName } of flags_1.FLAGS) {
let line = ` --${longName}`;
if (shortName) {
line += `, -${shortName}`;
}
if (line.length > maxLineLength) {
maxLineLength = line.length;
}
lines.push({ description, line });
}
return lines.map(({ description, line }) => {
const padding = ' '.repeat(maxLineLength - line.length + 2);
return `${line}${padding}${description}`;
});
}, _Cli_showHelp = function _Cli_showHelp() {
const flagLines = __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_serializeFlags).call(this);
const lines = ['', 'kysely-codegen [options]', '', ...flagLines, ''];
console.info(lines.join('\n'));
process.exit(0);
};
//# sourceMappingURL=cli.js.map
;