zenstack
Version:
FullStack enhancement for Prisma ORM: seamless integration from database to UI
53 lines (52 loc) • 1.8 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateCheckerType = generateCheckerType;
const sdk_1 = require("@zenstackhq/sdk");
const lower_case_first_1 = require("lower-case-first");
const ts_pattern_1 = require("ts-pattern");
/**
* Generates a `ModelCheckers` interface that contains a `check` method for each model in the schema.
*
* E.g.:
*
* ```ts
* type CheckerOperation = 'create' | 'read' | 'update' | 'delete';
*
* export interface ModelCheckers {
* user: { check(op: CheckerOperation, args?: { email?: string; age?: number; }): Promise<boolean> },
* ...
* }
* ```
*/
function generateCheckerType(model) {
return `
import type { PolicyCrudKind } from '@zenstackhq/runtime';
export interface ModelCheckers {
${(0, sdk_1.getDataModels)(model)
.map((dataModel) => `\t${(0, lower_case_first_1.lowerCaseFirst)(dataModel.name)}: ${generateDataModelChecker(dataModel)}`)
.join(',\n')}
}
`;
}
function generateDataModelChecker(dataModel) {
return `{
check(args: { operation: PolicyCrudKind, where?: ${generateDataModelArgs(dataModel)} }): Promise<boolean>
}`;
}
function generateDataModelArgs(dataModel) {
return `{ ${dataModel.fields
.filter((field) => isFieldFilterable(field))
.map((field) => `${field.name}?: ${mapFieldType(field)}`)
.join('; ')} }`;
}
function isFieldFilterable(field) {
return !!mapFieldType(field);
}
function mapFieldType(field) {
return (0, ts_pattern_1.match)(field.type.type)
.with('Boolean', () => 'boolean')
.with(ts_pattern_1.P.union('BigInt', 'Int', 'Float', 'Decimal'), () => 'number')
.with('String', () => 'string')
.otherwise(() => undefined);
}
//# sourceMappingURL=checker-type-generator.js.map
;