zenstack
Version:
FullStack enhancement for Prisma ORM: seamless integration from database to UI
66 lines • 2.69 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
const ast_1 = require("@zenstackhq/language/ast");
const utils_1 = require("./utils");
const constants_1 = require("../constants");
/**
* Validates data source declarations.
*/
class DataSourceValidator {
validate(ds, accept) {
(0, utils_1.validateDuplicatedDeclarations)(ds, ds.fields, accept);
this.validateProvider(ds, accept);
this.validateUrl(ds, accept);
this.validateRelationMode(ds, accept);
}
validateProvider(ds, accept) {
const provider = ds.fields.find((f) => f.name === 'provider');
if (!provider) {
accept('error', 'datasource must include a "provider" field', {
node: ds,
});
return;
}
const value = (0, utils_1.getStringLiteral)(provider.value);
if (!value) {
accept('error', '"provider" must be set to a string literal', {
node: provider.value,
});
}
else if (!constants_1.SUPPORTED_PROVIDERS.includes(value)) {
accept('error', `Provider "${value}" is not supported. Choose from ${constants_1.SUPPORTED_PROVIDERS.map((p) => '"' + p + '"').join(' | ')}.`, { node: provider.value });
}
}
validateUrl(ds, accept) {
var _a;
const url = ds.fields.find((f) => f.name === 'url');
if (!url) {
accept('error', 'datasource must include a "url" field', {
node: ds,
});
}
for (const fieldName of ['url', 'shadowDatabaseUrl']) {
const field = ds.fields.find((f) => f.name === fieldName);
if (!field) {
continue;
}
const value = (0, utils_1.getStringLiteral)(field.value);
if (!value && !((0, ast_1.isInvocationExpr)(field.value) && ((_a = field.value.function.ref) === null || _a === void 0 ? void 0 : _a.name) === 'env')) {
accept('error', `"${fieldName}" must be set to a string literal or an invocation of "env" function`, {
node: field.value,
});
}
}
}
validateRelationMode(ds, accept) {
const field = ds.fields.find((f) => f.name === 'relationMode');
if (field) {
const val = (0, utils_1.getStringLiteral)(field.value);
if (!val || !['foreignKeys', 'prisma'].includes(val)) {
accept('error', '"relationMode" must be set to "foreignKeys" or "prisma"', { node: field.value });
}
}
}
}
exports.default = DataSourceValidator;
//# sourceMappingURL=datasource-validator.js.map
;