UNPKG

molstar

Version:

A comprehensive macromolecular library.

163 lines (162 loc) 7.09 kB
/** * 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)); }