assetflow/src/assets/helper.ts

60 lines
2.4 KiB
TypeScript

// @ts-nocheck
import { formatAst, parsePrismaSchema } from '@loancrate/prisma-schema-parser';
import * as fs from 'fs';
import { log } from '../index.js';
/**
* A helper function which returns every models' required, optional and relation fields
*
* @returns {{}} An object containing every model and their required, optional and relation fields
*/
function returnAllModelFieldData() {
const ast = parsePrismaSchema(fs.readFileSync('./prisma/schema.prisma', { encoding: 'utf8' }));
const modelData: Record<string, object> = {};
Object.keys(ast.declarations).forEach((key) => {
if (ast.declarations[key].kind === 'model') {
log.helper.debug('Found model: ', ast.declarations[key].name.value);
Object.keys(ast.declarations[key].members).forEach((key2) => {
if (ast.declarations[key].members[key2].kind === 'field') {
const currentField = ast.declarations[key].members[key2];
switch (currentField.type.kind) {
case 'optional':
log.helper.debug('Found optional field:', currentField.name.value);
modelData[ast.declarations[key].name.value].optional.push(currentField.name.value);
break;
case 'typeId':
// Required fields are not always required for our purposes, fields with a default value are not required
let isRequired = true;
if (currentField.attributes.length > 0) {
Object.keys(currentField.attributes).forEach((key3) => {
if (currentField.attributes[key3].path != {}) {
if (currentField.attributes[key3].path.value == 'default') {
const defValue = currentField.attributes[key3].args[0].value;
log.helper.debug('Found default field:', currentField.name.value, 'with value: ', defValue);
modelData[ast.declarations[key].name.value].optional.push(currentField.name.value);
isRequired = false;
}
}
});
}
if (isRequired) {
modelData[ast.declarations[key].name.value].required.push(currentField.name.value);
log.helper.debug('Found required field: ', currentField.name.value);
}
break;
case 'list':
log.helper.debug('Found relation/list field:', currentField.name.value);
modelData[ast.declarations[key].name.value].relation.push(currentField.name.value);
break;
default:
log.helper.error('Unable to determine field type:', currentField.name.value, currentField.type.kind);
}
}
});
}
});
return modelData;
}