You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
1.4 KiB
JavaScript
57 lines
1.4 KiB
JavaScript
"use strict";
|
|
|
|
const syncpipe = require("syncpipe");
|
|
const table = require("table").table;
|
|
const chalk = require("chalk");
|
|
|
|
const unreachable = require("./unreachable");
|
|
|
|
function renderTable(data) {
|
|
return table(data, {
|
|
border: {
|
|
topBody: "",
|
|
topJoin: "",
|
|
topLeft: "",
|
|
topRight: "",
|
|
bottomBody: "",
|
|
bottomJoin: "",
|
|
bottomLeft: "",
|
|
bottomRight: "",
|
|
bodyLeft: "",
|
|
bodyRight: "",
|
|
joinLeft: "",
|
|
joinRight: ""
|
|
}
|
|
});
|
|
}
|
|
|
|
module.exports = function renderSchema(dbSchema) {
|
|
return Object.entries(dbSchema)
|
|
.map(([ collectionName, schema ]) => {
|
|
let tableData = [
|
|
[ chalk.bold("Column"), chalk.bold("Type"), " " ]
|
|
].concat(syncpipe(schema.fields, [
|
|
(_) => Object.entries(_),
|
|
(_) => _.filter(([ _columnName, definition ]) => definition != null),
|
|
(_) => _.map(([ fieldName, definition ]) => {
|
|
let link = definition.linkTo;
|
|
|
|
if (link != null) {
|
|
if (link.type === "remoteField") {
|
|
let linkedField = dbSchema[link.collectionName].fields[link.fieldName];
|
|
|
|
return [ fieldName, chalk.gray(linkedField.type), `-> ${link.collectionName}.${link.fieldName}` ];
|
|
} else {
|
|
unreachable("Non-remoteField link encountered");
|
|
}
|
|
} else {
|
|
return [ fieldName, definition.type, " " ]; // FIXME: Linked type
|
|
}
|
|
})
|
|
]));
|
|
|
|
return chalk.bold.green(collectionName) + "\n\n" + renderTable(tableData);
|
|
})
|
|
.join("\n\n");
|
|
};
|