kysely-codegen
Version:
`kysely-codegen` generates Kysely type definitions from your database. That's it.
235 lines • 11.1 kB
JavaScript
"use strict";
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_parseBoolean, _Cli_parseLogLevel, _Cli_parseNumericParser, _Cli_parseRuntimeEnumsStyle, _Cli_parseString, _Cli_parseStringArray, _Cli_showHelp;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Cli = void 0;
const minimist_1 = __importDefault(require("minimist"));
const connection_string_parser_1 = require("../generator/connection-string-parser");
const dialect_manager_1 = require("../generator/dialect-manager");
const generate_1 = require("../generator/generator/generate");
const runtime_enums_style_1 = require("../generator/generator/runtime-enums-style");
const log_level_1 = require("../generator/logger/log-level");
const logger_1 = require("../generator/logger/logger");
const numeric_parser_1 = require("../introspector/dialects/postgres/numeric-parser");
const constants_1 = require("./constants");
const flags_1 = require("./flags");
/**
* Creates a kysely-codegen command-line interface.
*/
class Cli {
constructor() {
_Cli_instances.add(this);
this.logLevel = constants_1.DEFAULT_LOG_LEVEL;
}
async generate(options) {
const camelCase = !!options.camelCase;
const excludePattern = options.excludePattern;
const includePattern = options.includePattern;
const numericParser = options.numericParser;
const outFile = options.outFile;
const overrides = options.overrides;
const partitions = !!options.partitions;
const print = !!options.print;
const runtimeEnums = options.runtimeEnums;
const runtimeEnumsStyle = options.runtimeEnumsStyle;
const schemas = options.schemas;
const singular = !!options.singular;
const typeOnlyImports = options.typeOnlyImports;
const verify = options.verify;
const logger = new logger_1.Logger(options.logLevel);
const connectionStringParser = new connection_string_parser_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 dialect_manager_1.DialectManager({
domains: !!options.domains,
numericParser: options.numericParser ?? numeric_parser_1.DEFAULT_NUMERIC_PARSER,
partitions: !!options.partitions,
});
const dialect = dialectManager.getDialect(options.dialectName ?? inferredDialectName);
const db = await dialect.introspector.connect({
connectionString,
dialect,
});
await (0, generate_1.generate)({
camelCase,
db,
dialect,
excludePattern,
includePattern,
logger,
numericParser,
outFile,
overrides,
partitions,
print,
runtimeEnums,
runtimeEnumsStyle,
schemas,
singular,
typeOnlyImports,
verify,
});
await db.destroy();
}
parseOptions(args, options) {
const argv = (0, minimist_1.default)(args);
const logLevel = (this.logLevel = __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseLogLevel).call(this, argv['log-level']));
const _ = argv._;
const camelCase = __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseBoolean).call(this, argv['camel-case']);
const dialectName = __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseString).call(this, argv.dialect);
const domains = __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseBoolean).call(this, argv.domains);
const envFile = __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseString).call(this, argv['env-file']);
const excludePattern = __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseString).call(this, argv['exclude-pattern']);
const help = !!argv.h || !!argv.help || _.includes('-h') || _.includes('--help');
const includePattern = __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseString).call(this, argv['include-pattern']);
const numericParser = __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseNumericParser).call(this, argv['numeric-parser']);
const outFile = __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseString).call(this, argv['out-file']) ??
(argv.print ? undefined : constants_1.DEFAULT_OUT_FILE);
const overrides = argv.overrides ? JSON.parse(argv.overrides) : undefined;
const partitions = __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseBoolean).call(this, argv.partitions);
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 runtimeEnumsStyle = __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseRuntimeEnumsStyle).call(this, argv['runtime-enums-style']);
const schemas = __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseStringArray).call(this, argv.schema);
const singular = __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseBoolean).call(this, argv.singular);
const typeOnlyImports = __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseBoolean).call(this, argv['type-only-imports'] ?? true);
const url = __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseString).call(this, argv.url) ?? constants_1.DEFAULT_URL;
const verify = __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseBoolean).call(this, argv.verify);
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)');
}
return {
camelCase,
dialectName,
domains,
envFile,
excludePattern,
includePattern,
logLevel,
numericParser,
outFile,
overrides,
partitions,
print,
runtimeEnums,
runtimeEnumsStyle,
schemas,
singular,
typeOnlyImports,
url,
verify,
};
}
async run(argv) {
try {
const options = this.parseOptions(argv);
await this.generate(options);
}
catch (error) {
if (this.logLevel > log_level_1.LogLevel.SILENT) {
if (error instanceof Error) {
if (this.logLevel >= log_level_1.LogLevel.DEBUG) {
console.error();
throw error;
}
else {
console.error(new logger_1.Logger().serializeError(error.message));
process.exit(0);
}
}
else {
throw error;
}
}
}
}
}
exports.Cli = Cli;
_Cli_instances = new WeakSet(), _Cli_parseBoolean = function _Cli_parseBoolean(input) {
return !!input && input !== 'false';
}, _Cli_parseLogLevel = function _Cli_parseLogLevel(input) {
switch (input) {
case 'silent':
return log_level_1.LogLevel.SILENT;
case 'info':
return log_level_1.LogLevel.INFO;
case 'error':
return log_level_1.LogLevel.ERROR;
case 'debug':
return log_level_1.LogLevel.DEBUG;
case 'warn':
return log_level_1.LogLevel.WARN;
default:
return constants_1.DEFAULT_LOG_LEVEL;
}
}, _Cli_parseNumericParser = function _Cli_parseNumericParser(input) {
switch (input) {
case 'number':
return numeric_parser_1.NumericParser.NUMBER;
case 'number-or-string':
return numeric_parser_1.NumericParser.NUMBER_OR_STRING;
case 'string':
return numeric_parser_1.NumericParser.STRING;
default:
return numeric_parser_1.DEFAULT_NUMERIC_PARSER;
}
}, _Cli_parseRuntimeEnumsStyle = function _Cli_parseRuntimeEnumsStyle(input) {
switch (input) {
case 'pascal-case':
return runtime_enums_style_1.RuntimeEnumsStyle.PASCAL_CASE;
case 'screaming-snake-case':
return runtime_enums_style_1.RuntimeEnumsStyle.SCREAMING_SNAKE_CASE;
}
}, _Cli_parseString = function _Cli_parseString(input) {
return input === undefined ? undefined : String(input);
}, _Cli_parseStringArray = function _Cli_parseStringArray(input) {
if (input === undefined)
return [];
if (!Array.isArray(input))
return [String(input)];
return input.map(String);
}, _Cli_showHelp = function _Cli_showHelp() {
console.info(['', 'kysely-codegen [options]', '', (0, flags_1.serializeFlags)(flags_1.FLAGS), ''].join('\n'));
process.exit(0);
};
//# sourceMappingURL=cli.js.map