kanel-kysely
Version:
Kysely extension for Kanel
83 lines (82 loc) • 3.31 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const recase_1 = require("@kristiandupont/recase");
const path_1 = require("path");
const MakeKyselyConfig_1 = require("./MakeKyselyConfig");
const processFile_1 = __importDefault(require("./processFile"));
const toPascalCase = (0, recase_1.recase)(null, "pascal");
const makeKyselyHook = (makeKyselyConfig_) => async (outputAcc, instantiatedConfig) => {
const makeKyselyConfig = {
...MakeKyselyConfig_1.defaultConfig,
...makeKyselyConfig_,
};
const output = { ...outputAcc };
const schemaImports = [];
for (const schemaName of Object.keys(instantiatedConfig.schemas)) {
const schema = instantiatedConfig.schemas[schemaName];
const composites = [
...schema.tables,
...schema.views,
...schema.materializedViews,
...schema.compositeTypes,
];
if (composites.length === 0) {
continue;
}
// Get the schema folder from the first known composite.
let schemaFolder;
const tableImports = [];
const tableProps = [];
composites.forEach((compositeDetails) => {
const { path } = instantiatedConfig.getMetadata(compositeDetails, "selector", instantiatedConfig);
const { modifiedDeclarations, tableImport, tableProperty } = (0, processFile_1.default)(output[path].declarations, compositeDetails, instantiatedConfig, path, makeKyselyConfig);
output[path].declarations = modifiedDeclarations;
if (makeKyselyConfig.includeSchemaNameInTableName)
tableProperty.name = `${schemaName}.${tableProperty.name}`;
tableImports.push(tableImport);
tableProps.push(tableProperty);
if (!schemaFolder) {
schemaFolder = (0, path_1.dirname)(path);
}
});
const schemaInterfaceName = `${toPascalCase(schemaName)}Schema`;
const schemaDeclaration = {
declarationType: "interface",
name: schemaInterfaceName,
exportAs: "default",
typeImports: tableImports,
properties: tableProps,
};
const schemaPath = (0, path_1.join)(schemaFolder, schemaInterfaceName);
output[schemaPath] = {
declarations: [schemaDeclaration],
};
const schemaImport = {
name: schemaInterfaceName,
asName: undefined,
isDefault: true,
path: schemaPath,
isAbsolute: false,
importAsType: true,
};
schemaImports.push(schemaImport);
}
const dbPath = (0, path_1.join)(instantiatedConfig.outputPath, makeKyselyConfig.databaseFilename);
const dbDeclaration = {
declarationType: "typeDeclaration",
name: "Database",
typeImports: schemaImports,
typeDefinition: [
schemaImports.map((dbImport) => dbImport.name).join(" & "),
],
exportAs: "default",
};
output[dbPath] = {
declarations: [dbDeclaration],
};
return output;
};
exports.default = makeKyselyHook;