@onn-software/ddl-to-gql
Version:
Convert a SQL DDL to a GraphQL implementation with all relations.
76 lines (74 loc) • 4.06 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.RepoGenerator = void 0;
const repo_generator_templates_1 = require("./repo-generator.templates");
const globals_1 = require("../globals");
class RepoGenerator {
execute(tableDefs) {
const partialsDefs = tableDefs.map((tableDef) => this.generateRepo(tableDef));
const repoFactories = this.generateFactories(tableDefs).join('\n');
return repo_generator_templates_1.baseRepo.replaceAll("__REPO_FACTORIES__", repoFactories) + partialsDefs.join('\n');
}
generateRepo(tableDef) {
const interfaceName = globals_1.Globals.getTypescriptName(tableDef.tableName);
const remapKeys = tableDef.columns.filter((c) => !!c.sqlKey);
const { lookupTable, unSafeValueMappers, unSafeOrderMappers, unSafeClauseMappers, unSafeDistinctMappers } = this.buildUnsafeMappers(interfaceName, remapKeys);
const safeMappers = remapKeys
.map((c) => {
const safeSqlKey = c.sqlKey?.startsWith('`') ? c.sqlKey : `\`${c.sqlKey}\``;
return ` res.${c.key} = res[${safeSqlKey}];`;
})
.join('\n');
const safePaginatedMappers = remapKeys.length === 0
? ''
: ` paginated.data = paginated.data.map((res: any) => {\n${safeMappers.replaceAll(' ', ' ')}
return res;
});`;
const unqiueKeys = [
'string',
...tableDef.columns.filter((c) => c.unique).map((c) => `'${c.key}'`),
].join(' | ');
const allKeys = ['string', ...tableDef.columns.map((c) => `'${c.key}'`)].join(' | ');
return repo_generator_templates_1.repoTemplate
.replaceAll('__SQL_TYPE__', interfaceName)
.replaceAll('__SQL_TABLE__', tableDef.tableName)
.replaceAll('__UNIQUE_FIELDS__', unqiueKeys)
.replaceAll('__NON_UNIQUE_FIELDS__', allKeys)
.replaceAll('__UNSAFE_LOOKUP__', lookupTable)
.replaceAll('__UNSAFE_VALUE_MAPPERS__', unSafeValueMappers)
.replaceAll('__UNSAFE_ORDER_MAPPERS__', unSafeOrderMappers)
.replaceAll('__UNSAFE_DISTINCT_MAPPERS__', unSafeDistinctMappers)
.replaceAll('__UNSAFE_CLAUSE_MAPPERS__', unSafeClauseMappers)
.replaceAll('__SAFE_MAPPERS__', safeMappers)
.replaceAll('__SAFE_PAGINATED_MAPPERS__', safePaginatedMappers)
.replaceAll('__FIELD_GETTER_BLOCK__', '')
.replaceAll('__PAGINATED_FIELD_GETTER_BLOCK__', '');
}
buildUnsafeMappers(interfaceName, remapKeys) {
if (remapKeys.length <= 0) {
return { lookupTable: '', unSafeValueMappers: '', unSafeOrderMappers: '', unSafeClauseMappers: '', unSafeDistinctMappers: '' };
}
const lookupTable = `
const ${interfaceName}FieldLookUp: Record<string, string> = {
${remapKeys.map((c) => ` ${c.key}: ${c.sqlKey}`).join(',\n')}
};
`;
const unSafeValueMappers = `
const anyValue: any = { ...value };
const keys = Object.keys(value);
keys.filter(key => !!${interfaceName}FieldLookUp[key]).forEach(key => {
anyValue[${interfaceName}FieldLookUp[key]] = anyValue[key]
delete anyValue[key]
});
value = anyValue;
`;
const unSafeOrderMappers = ` if(orderBy?.field) orderBy.field = ${interfaceName}FieldLookUp[orderBy.field] ?? orderBy.field;`;
const unSafeClauseMappers = ` clauses = clauses.map(clause => ({...clause, field: ${interfaceName}FieldLookUp[clause.field] ?? clause.field})) as any;`;
const unSafeDistinctMappers = ` distinct = distinct?.map(entry => ${interfaceName}FieldLookUp[entry] ?? entry);`;
return { lookupTable, unSafeValueMappers, unSafeOrderMappers, unSafeClauseMappers, unSafeDistinctMappers };
}
generateFactories(tableDefs) {
return tableDefs.map(tableDef => ` ${tableDef.tableName}: () => new ${globals_1.Globals.getTypescriptName(tableDef.tableName)}_Repo() as any,`);
}
}
exports.RepoGenerator = RepoGenerator;