kysely-codegen
Version:
`kysely-codegen` generates Kysely type definitions from your database. That's it.
238 lines • 11.4 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_loadConfig, _Cli_parseBoolean, _Cli_parseDateParser, _Cli_parseDialectName, _Cli_parseNumericParser, _Cli_parseRuntimeEnums, _Cli_parseString, _Cli_parseStringArray, _Cli_showHelp;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Cli = void 0;
const cosmiconfig_1 = require("cosmiconfig");
const minimist_1 = __importDefault(require("minimist"));
const node_path_1 = require("node:path");
const generator_1 = require("../generator");
const connection_string_parser_1 = require("../generator/connection-string-parser");
const generate_1 = require("../generator/generator/generate");
const log_level_1 = require("../generator/logger/log-level");
const logger_1 = require("../generator/logger/logger");
const config_1 = require("./config");
const config_error_1 = require("./config-error");
const constants_1 = require("./constants");
const flags_1 = require("./flags");
const compact = (object) => {
return Object.fromEntries(Object.entries(object).filter(([, value]) => value !== undefined));
};
/**
* Creates a kysely-codegen command-line interface.
*/
class Cli {
constructor() {
_Cli_instances.add(this);
this.logLevel = log_level_1.DEFAULT_LOG_LEVEL;
}
async generate(options) {
const connectionStringParser = new connection_string_parser_1.ConnectionStringParser();
const logger = options.logger ?? new logger_1.Logger(options.logLevel);
logger.debug('Options:');
logger.debug(options);
logger.debug();
const { connectionString, dialect: dialectName } = connectionStringParser.parse({
connectionString: options.url ?? constants_1.DEFAULT_URL,
dialect: options.dialect,
envFile: options.envFile,
logger,
});
if (options.dialect) {
logger.info(`Using dialect '${options.dialect}'.`);
}
else {
logger.info(`No dialect specified. Assuming '${dialectName}'.`);
}
const dialect = (0, generator_1.getDialect)(dialectName, {
dateParser: options.dateParser,
domains: options.domains,
numericParser: options.numericParser,
partitions: options.partitions,
});
const db = await dialect.introspector.connect({
connectionString,
dialect,
});
const output = await (0, generate_1.generate)({
camelCase: options.camelCase,
db,
defaultSchemas: options.defaultSchemas,
dialect,
excludePattern: options.excludePattern,
includePattern: options.includePattern,
logger,
outFile: options.outFile,
overrides: options.overrides,
partitions: options.partitions,
print: options.print,
runtimeEnums: options.runtimeEnums,
serializer: options.serializer,
singularize: options.singularize,
typeOnlyImports: options.typeOnlyImports,
verify: options.verify,
});
await db.destroy();
return output;
}
parseOptions(args, options) {
const argv = (0, minimist_1.default)(args);
const logLevel = argv['log-level'];
if (logLevel !== undefined) {
this.logLevel = logLevel;
}
for (const key in argv) {
if (key === 'schema') {
throw new RangeError(`The flag '${key}' has been deprecated. Use 'default-schema' instead.`);
}
if (key === 'singular') {
throw new RangeError(`The flag '${key}' has been deprecated. Use 'singularize' instead.`);
}
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}'`);
}
}
const _ = argv._;
const help = !!argv.h || !!argv.help || _.includes('-h') || _.includes('--help');
if (help && !options?.silent) {
__classPrivateFieldGet(this, _Cli_instances, "m", _Cli_showHelp).call(this);
process.exit(1);
}
const configFile = __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseString).call(this, argv['config-file']);
const configResult = options?.config
? { config: options.config, filepath: null }
: __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_loadConfig).call(this, { configFile });
const configParseResult = configResult
? config_1.configSchema.safeParse(configResult.config)
: null;
const configError = configParseResult?.error?.errors[0];
if (configError) {
throw new config_error_1.ConfigError(configError);
}
const config = configParseResult?.data;
const configOptions = config
? compact({
...config,
...(configResult?.filepath && config.outFile
? { outFile: (0, node_path_1.resolve)(configResult.filepath, '..', config.outFile) }
: {}),
})
: {};
const cliOptions = compact({
camelCase: __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseBoolean).call(this, argv['camel-case']),
dateParser: __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseDateParser).call(this, argv['date-parser']),
defaultSchemas: __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseStringArray).call(this, argv['default-schema']),
dialect: __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseDialectName).call(this, argv.dialect),
domains: __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseBoolean).call(this, argv.domains),
envFile: __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseString).call(this, argv['env-file']),
excludePattern: __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseString).call(this, argv['exclude-pattern']),
includePattern: __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseString).call(this, argv['include-pattern']),
logLevel,
numericParser: __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseNumericParser).call(this, argv['numeric-parser']),
outFile: __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseString).call(this, argv['out-file']),
overrides: typeof argv.overrides === 'string'
? JSON.parse(argv.overrides)
: undefined,
partitions: __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseBoolean).call(this, argv.partitions),
print: __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseBoolean).call(this, argv.print),
runtimeEnums: __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseRuntimeEnums).call(this, argv['runtime-enums']),
singularize: __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseBoolean).call(this, argv.singularize),
typeOnlyImports: __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseBoolean).call(this, argv['type-only-imports']),
url: __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseString).call(this, argv.url),
verify: __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseBoolean).call(this, argv.verify),
});
const print = cliOptions.print ?? configOptions.print;
const outFile = print
? undefined
: (cliOptions.outFile ?? configOptions.outFile);
const generateOptions = {
...configOptions,
...cliOptions,
...(logLevel === undefined ? {} : { logLevel }),
...(outFile === undefined ? {} : { outFile }),
};
if (generateOptions.dialect &&
!constants_1.VALID_DIALECTS.includes(generateOptions.dialect)) {
const dialectValues = constants_1.VALID_DIALECTS.join(', ');
throw new RangeError(`Parameter '--dialect' must have one of the following values: ${dialectValues}`);
}
return generateOptions;
}
async run(options) {
const generateOptions = this.parseOptions(options?.argv ?? [], {
config: options?.config,
});
return await this.generate(generateOptions);
}
}
exports.Cli = Cli;
_Cli_instances = new WeakSet(), _Cli_loadConfig = function _Cli_loadConfig(config) {
const explorer = (0, cosmiconfig_1.cosmiconfigSync)('kysely-codegen');
return config?.configFile
? explorer.load(config.configFile)
: explorer.search();
}, _Cli_parseBoolean = function _Cli_parseBoolean(input) {
if (input === undefined)
return undefined;
return !!input && input !== 'false';
}, _Cli_parseDateParser = function _Cli_parseDateParser(input) {
if (input === undefined)
return undefined;
switch (input) {
case 'string':
case 'timestamp':
return input;
}
}, _Cli_parseDialectName = function _Cli_parseDialectName(input) {
const result = config_1.dialectNameSchema.safeParse(input);
return result.success ? result.data : undefined;
}, _Cli_parseNumericParser = function _Cli_parseNumericParser(input) {
if (input === undefined)
return undefined;
switch (input) {
case 'number':
case 'number-or-string':
case 'string':
return input;
}
}, _Cli_parseRuntimeEnums = function _Cli_parseRuntimeEnums(input) {
if (input === undefined)
return undefined;
switch (input) {
case 'pascal-case':
case 'screaming-snake-case':
return input;
default:
return __classPrivateFieldGet(this, _Cli_instances, "m", _Cli_parseBoolean).call(this, input);
}
}, _Cli_parseString = function _Cli_parseString(input) {
if (input === undefined)
return undefined;
return String(input);
}, _Cli_parseStringArray = function _Cli_parseStringArray(input) {
if (input === undefined)
return undefined;
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