kanel-knex
Version:
Knex extension for Kanel
113 lines (112 loc) • 4.57 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const path_1 = require("path");
function getAsName(typeMetadata, schemaName) {
return schemaName === "public"
? undefined
: `${schemaName}_${typeMetadata.name}`;
}
const getTypeImports = (details, instantiatedConfig) => {
const selector = instantiatedConfig.getMetadata(details, "selector", instantiatedConfig);
const result = [
{
name: selector.name,
asName: getAsName(selector, details.schemaName),
isDefault: true,
path: selector.path,
isAbsolute: false,
importAsType: true,
},
];
const isReadonly = details.kind !== "table";
if (!isReadonly) {
const initializer = instantiatedConfig.getMetadata(details, "initializer", instantiatedConfig);
result.push({
name: initializer.name,
asName: getAsName(initializer, details.schemaName),
isDefault: false,
path: initializer.path,
isAbsolute: false,
importAsType: true,
});
const mutator = instantiatedConfig.getMetadata(details, "mutator", instantiatedConfig);
result.push({
name: mutator.name,
asName: getAsName(mutator, details.schemaName),
isDefault: false,
path: mutator.path,
isAbsolute: false,
importAsType: true,
});
}
return result;
};
const getLine = (details, instantiatedConfig) => {
const selector = instantiatedConfig.getMetadata(details, "selector", instantiatedConfig);
const selectorName = getAsName(selector, details.schemaName) ?? selector.name;
let initializerName = "never";
let mutatorName = "never";
const isReadonly = details.kind !== "table";
if (!isReadonly) {
const initializer = instantiatedConfig.getMetadata(details, "initializer", instantiatedConfig);
initializerName =
getAsName(initializer, details.schemaName) ?? initializer.name;
const mutator = instantiatedConfig.getMetadata(details, "mutator", instantiatedConfig);
mutatorName = getAsName(mutator, details.schemaName) ?? mutator.name;
}
const name = details.schemaName === "public"
? details.name
: `${details.schemaName}.${details.name}`;
return ` '${name}': Knex.CompositeTableType<${selectorName}, ${initializerName}, ${mutatorName}>;`;
};
const generateKnexTablesModule = (outputAcc, instantiatedConfig) => {
const typeImports = Object.values(instantiatedConfig.schemas).reduce((acc, schema) => {
const tableTypeImports = schema.tables
.sort((a, b) => a.name.localeCompare(b.name))
.map((table) => getTypeImports(table, instantiatedConfig));
const viewTypeImports = schema.views
.sort((a, b) => a.name.localeCompare(b.name))
.map((view) => getTypeImports(view, instantiatedConfig));
const materializedViewTypeImports = schema.materializedViews
.sort((a, b) => a.name.localeCompare(b.name))
.map((materializedView) => getTypeImports(materializedView, instantiatedConfig));
return [
...acc,
...tableTypeImports.flat(),
...viewTypeImports.flat(),
...materializedViewTypeImports.flat(),
];
}, [
{
name: "Knex",
isAbsolute: true,
path: "knex",
isDefault: false,
importAsType: false,
},
]);
const declarationLines = Object.values(instantiatedConfig.schemas).reduce((acc, schema) => {
const tableLines = schema.tables.map((table) => getLine(table, instantiatedConfig));
const viewLines = schema.views.map((view) => getLine(view, instantiatedConfig));
const materializedViewLines = schema.materializedViews.map((materializedView) => getLine(materializedView, instantiatedConfig));
return [...acc, ...tableLines, ...viewLines, ...materializedViewLines];
}, []);
const lines = [
"declare module 'knex/types/tables' {",
" interface Tables {",
...declarationLines,
" }",
"}",
];
const declaration = {
declarationType: "generic",
typeImports,
lines,
};
const path = (0, path_1.join)(instantiatedConfig.outputPath, "knex-tables");
return {
...outputAcc,
[path]: { declarations: [declaration] },
};
};
exports.default = generateKnexTablesModule;