molstar
Version:
A comprehensive macromolecular library.
163 lines (162 loc) • 7.09 kB
JavaScript
/**
* Copyright (c) 2017-2022 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
import { indentString } from '../../../mol-util/string';
import { FieldPath } from '../../../mol-io/reader/cif/schema';
function header(name, info, moldataImportPath) {
return "/**\n * Copyright (c) 2017-2022 mol* contributors, licensed under MIT, See LICENSE file for more info.\n *\n * Code-generated '".concat(name, "' schema file. ").concat(info, "\n *\n * @author molstar/ciftools package\n */\n\nimport { Database, Column } from '").concat(moldataImportPath, "/db';\n\nimport Schema = Column.Schema;");
}
function footer(name) {
return "\nexport type ".concat(name, "_Schema = typeof ").concat(name, "_Schema;\nexport interface ").concat(name, "_Database extends Database<").concat(name, "_Schema> {};");
}
function getTypeShorthands(schema, fields) {
var types = new Set();
Object.keys(schema.tables).forEach(function (table) {
if (fields && !fields[table])
return;
var columns = schema.tables[table].columns;
Object.keys(columns).forEach(function (columnName) {
if (fields && !fields[table][columnName])
return;
var col = schema.tables[table].columns[columnName];
if (col.type === 'enum')
types.add(col.subType);
types.add(col.type);
});
});
var shorthands = [];
types.forEach(function (type) {
switch (type) {
case 'str':
shorthands.push('const str = Schema.str;');
break;
case 'ustr':
shorthands.push('const ustr = Schema.ustr;');
break;
case 'lstr':
shorthands.push('const lstr = Schema.lstr;');
break;
case 'int':
shorthands.push('const int = Schema.int;');
break;
case 'float':
shorthands.push('const float = Schema.float;');
break;
case 'coord':
shorthands.push('const coord = Schema.coord;');
break;
case 'enum':
shorthands.push('const Aliased = Schema.Aliased;');
break;
case 'matrix':
shorthands.push('const Matrix = Schema.Matrix;');
break;
case 'vector':
shorthands.push('const Vector = Schema.Vector;');
break;
case 'list':
shorthands.push('const List = Schema.List;');
break;
}
});
return shorthands.join('\n');
}
function getTypeDef(c) {
switch (c.type) {
case 'str': return 'str';
case 'int': return 'int';
case 'float': return 'float';
case 'coord': return 'coord';
case 'enum':
return "Aliased<'".concat(c.values.map(function (v) { return v.replace(/'/g, '\\\''); }).join("' | '"), "'>(").concat(c.subType, ")");
case 'matrix':
return "Matrix(".concat(c.rows, ", ").concat(c.columns, ")");
case 'vector':
return "Vector(".concat(c.length, ")");
case 'list':
if (c.subType === 'int') {
return "List('".concat(c.separator, "', x => parseInt(x, 10))");
}
else if (c.subType === 'float' || c.subType === 'coord') {
return "List('".concat(c.separator, "', x => parseFloat(x))");
}
else {
return "List('".concat(c.separator, "', x => x)");
}
}
}
var reSafePropertyName = /^[a-zA-Z_$][0-9a-zA-Z_$]*$/;
function safePropertyString(name) { return name.match(reSafePropertyName) ? name : "'".concat(name, "'"); }
function doc(description, spacesCount) {
var spaces = ' '.repeat(spacesCount);
return [
"".concat(spaces, "/**"),
"".concat(indentString(description, 1, "".concat(spaces, " * "))).replace(/ +\n/g, '\n'),
"".concat(spaces, " */")
].join('\n');
}
export function generate(name, info, schema, fields, moldataImportPath, addAliases) {
var codeLines = [];
if (fields) {
Object.keys(fields).forEach(function (table) {
if (table in schema.tables) {
var schemaTable_1 = schema.tables[table];
Object.keys(fields[table]).forEach(function (column) {
if (!(column in schemaTable_1.columns)) {
console.log("filter field '".concat(table, ".").concat(column, "' not found in schema"));
}
});
}
else {
console.log("filter category '".concat(table, "' not found in schema"));
}
});
}
codeLines.push("export const ".concat(name, "_Schema = {"));
Object.keys(schema.tables).forEach(function (table) {
if (fields && !fields[table])
return;
var _a = schema.tables[table], description = _a.description, columns = _a.columns;
if (description)
codeLines.push(doc(description, 4));
codeLines.push(" ".concat(safePropertyString(table), ": {"));
Object.keys(columns).forEach(function (columnName) {
if (fields && !fields[table][columnName])
return;
var c = columns[columnName];
var typeDef = getTypeDef(c);
if (c.description)
codeLines.push(doc(c.description, 8));
codeLines.push(" ".concat(safePropertyString(columnName), ": ").concat(typeDef, ","));
});
codeLines.push(' },');
});
codeLines.push('};');
if (addAliases) {
codeLines.push('');
codeLines.push("export const ".concat(name, "_Aliases = {"));
Object.keys(schema.aliases).forEach(function (path) {
var _a = path.split('.'), table = _a[0], columnName = _a[1];
if (fields && !fields[table])
return;
if (fields && !fields[table][columnName])
return;
var filteredAliases = new Set();
schema.aliases[path].forEach(function (p) {
if (!FieldPath.equal(p, path))
filteredAliases.add(FieldPath.canonical(p));
});
if (filteredAliases.size === 0)
return;
codeLines.push(" ".concat(safePropertyString(path), ": ["));
filteredAliases.forEach(function (alias) {
codeLines.push(" '".concat(alias, "',"));
});
codeLines.push(' ],');
});
codeLines.push('};');
}
return "".concat(header(name, info, moldataImportPath), "\n\n").concat(getTypeShorthands(schema, fields), "\n\n").concat(codeLines.join('\n'), "\n").concat(footer(name));
}