zenstack
Version:
FullStack enhancement for Prisma ORM: seamless integration from database to UI
135 lines • 5.81 kB
JavaScript
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ZModelFormatter = void 0;
const langium_1 = require("langium");
const ast = __importStar(require("@zenstackhq/language/ast"));
const module_1 = require("@zenstackhq/language/generated/module");
class ZModelFormatter extends langium_1.AbstractFormatter {
constructor(services) {
super();
this.isPrismaStyle = true;
this.configurationProvider = services.shared.workspace.ConfigurationProvider;
}
format(node) {
const formatter = this.getNodeFormatter(node);
if (ast.isDataModelField(node) || ast.isTypeDefField(node)) {
if (this.isPrismaStyle && (ast.isDataModel(node.$container) || ast.isTypeDef(node.$container))) {
const dataModel = node.$container;
const compareFn = (a, b) => b - a;
const maxNameLength = dataModel.fields.map((x) => x.name.length).sort(compareFn)[0];
const maxTypeLength = dataModel.fields.map(this.getFieldTypeLength).sort(compareFn)[0];
formatter.property('type').prepend(langium_1.Formatting.spaces(maxNameLength - node.name.length + 1));
if (node.attributes.length > 0) {
formatter
.node(node.attributes[0])
.prepend(langium_1.Formatting.spaces(maxTypeLength - this.getFieldTypeLength(node) + 1));
formatter.nodes(...node.attributes.slice(1)).prepend(langium_1.Formatting.oneSpace());
}
}
else {
formatter.property('type').prepend(langium_1.Formatting.oneSpace());
if (node.attributes.length > 0) {
formatter.properties('attributes').prepend(langium_1.Formatting.oneSpace());
}
}
}
else if (ast.isDataModelFieldAttribute(node)) {
formatter.keyword('(').surround(langium_1.Formatting.noSpace());
formatter.keyword(')').prepend(langium_1.Formatting.noSpace());
formatter.keyword(',').append(langium_1.Formatting.oneSpace());
if (node.args.length > 1) {
formatter.nodes(...node.args.slice(1)).prepend(langium_1.Formatting.oneSpace());
}
}
else if (ast.isAttributeArg(node)) {
formatter.keyword(':').prepend(langium_1.Formatting.noSpace());
formatter.keyword(':').append(langium_1.Formatting.oneSpace());
}
else if (ast.isAbstractDeclaration(node)) {
const bracesOpen = formatter.keyword('{');
const bracesClose = formatter.keyword('}');
// allow extra blank lines between declarations
formatter.interior(bracesOpen, bracesClose).prepend(langium_1.Formatting.indent({ allowMore: true }));
bracesOpen.prepend(langium_1.Formatting.oneSpace());
bracesClose.prepend(langium_1.Formatting.newLine());
}
else if (ast.isModel(node)) {
const model = node;
const nodes = formatter.nodes(...model.declarations);
nodes.prepend(langium_1.Formatting.noIndent());
}
}
formatDocument(document, params) {
this.formatOptions = params.options;
this.configurationProvider.getConfiguration(module_1.ZModelLanguageMetaData.languageId, 'format').then((config) => {
// in the CLI case, the config is undefined
if (config) {
if (config.usePrismaStyle === false) {
this.setPrismaStyle(false);
}
else {
this.setPrismaStyle(true);
}
}
});
return super.formatDocument(document, params);
}
getFormatOptions() {
return this.formatOptions;
}
getIndent() {
return 1;
}
setPrismaStyle(isPrismaStyle) {
this.isPrismaStyle = isPrismaStyle;
}
getFieldTypeLength(field) {
let length;
if (field.type.type) {
length = field.type.type.length;
}
else if (field.type.reference) {
length = field.type.reference.$refText.length;
}
else if (ast.isDataModelField(field) && field.type.unsupported) {
const name = `Unsupported("${field.type.unsupported.value.value}")`;
length = name.length;
}
else {
// we shouldn't get here
length = 1;
}
if (field.type.optional) {
length += 1;
}
if (field.type.array) {
length += 2;
}
return length;
}
}
exports.ZModelFormatter = ZModelFormatter;
//# sourceMappingURL=zmodel-formatter.js.map
;