@prisma/language-server
Version:
Prisma Language Server
295 lines • 14.1 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 () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.booleanDefaultCompletions = exports.scalarListDefaultCompletion = exports.startSequenceDefaultCompletion = exports.incrementSequenceDefaultCompletion = exports.cacheSequenceDefaultCompletion = exports.maxValueSequenceDefaultCompletion = exports.minValueSequenceDefaultCompletion = exports.virtualSequenceDefaultCompletion = exports.opsIndexFulltextCompletion = exports.relationArguments = exports.sortLengthProperties = void 0;
exports.filterSortLengthBasedOnInput = filterSortLengthBasedOnInput;
exports.getCompletionsForFieldAttributeArgs = getCompletionsForFieldAttributeArgs;
exports.getCompletionsForBlockAttributeArgs = getCompletionsForBlockAttributeArgs;
const vscode_languageserver_1 = require("vscode-languageserver");
const internals_1 = require("./internals");
const completions = __importStar(require("./completions.json"));
exports.sortLengthProperties = (0, internals_1.convertToCompletionItems)(
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
completions.fieldAttributes
.find((item) => item.label === '@unique')
.params.filter((item) => item.label === 'length' || item.label === 'sort'), vscode_languageserver_1.CompletionItemKind.Property);
exports.relationArguments = (0, internals_1.convertAttributesToCompletionItems)(completions.relationArguments, vscode_languageserver_1.CompletionItemKind.Property);
const sqlServerClusteredValuesCompletionItems = [
{
label: 'true',
kind: vscode_languageserver_1.CompletionItemKind.Value,
insertTextFormat: vscode_languageserver_1.InsertTextFormat.PlainText,
documentation: {
kind: 'markdown',
value: 'CLUSTERED',
},
},
{
label: 'false',
kind: vscode_languageserver_1.CompletionItemKind.Value,
insertTextFormat: vscode_languageserver_1.InsertTextFormat.PlainText,
documentation: {
kind: 'markdown',
value: 'NONCLUSTERED',
},
},
];
/**
* ```prisma
* model A {
* id Int @id
* field Int @unique(sort: |)
* otherField Int
*
* \@@unique(fields: [otherField(sort: |)])
* \@@index(fields: [id(sort: |)])
* }
* ```
* And then specifically Sql Server, we also return:
* ```prisma
* model A {
* id Int @id(sort: |)
*
* \@@id(fields: [id(sort: |)])
* }
* ```
*/
const sortValuesCompletionItems = [
{
label: 'Asc',
kind: vscode_languageserver_1.CompletionItemKind.Enum,
insertTextFormat: vscode_languageserver_1.InsertTextFormat.PlainText,
documentation: {
kind: 'markdown',
value: 'Ascending',
},
},
{
label: 'Desc',
kind: vscode_languageserver_1.CompletionItemKind.Enum,
insertTextFormat: vscode_languageserver_1.InsertTextFormat.PlainText,
documentation: {
kind: 'markdown',
value: 'Descending',
},
},
];
const clusteredCompletion = (items) => items.push({
label: 'clustered',
insertText: 'clustered: $0',
insertTextFormat: vscode_languageserver_1.InsertTextFormat.Snippet,
kind: vscode_languageserver_1.CompletionItemKind.Property,
documentation: 'An index, unique constraint or primary key can be created as clustered or non-clustered; altering the storage and retrieve behavior of the index.',
});
const typeIndexCompletion = (items) => items.push({
label: 'type',
kind: vscode_languageserver_1.CompletionItemKind.Property,
insertText: 'type: $0',
insertTextFormat: vscode_languageserver_1.InsertTextFormat.Snippet,
insertTextMode: vscode_languageserver_1.InsertTextMode.adjustIndentation,
documentation: {
kind: 'markdown',
value: 'Defines the access type of indexes: BTree (default) or Hash.',
},
});
const opsIndexFulltextCompletion = (items) => items.push({
label: 'ops',
insertText: 'ops: $0',
insertTextFormat: vscode_languageserver_1.InsertTextFormat.Snippet,
kind: vscode_languageserver_1.CompletionItemKind.Property,
documentation: 'Specify the operator class for an indexed field.',
});
exports.opsIndexFulltextCompletion = opsIndexFulltextCompletion;
//#region COCKROACHDB ONLY
const virtualSequenceDefaultCompletion = (items) => items.push({
label: 'virtual',
insertText: 'virtual',
kind: vscode_languageserver_1.CompletionItemKind.Property,
documentation: 'Virtual sequences are sequences that do not generate monotonically increasing values and instead produce values like those generated by the built-in function unique_rowid(). They are intended for use in combination with SERIAL-typed columns.',
});
exports.virtualSequenceDefaultCompletion = virtualSequenceDefaultCompletion;
const minValueSequenceDefaultCompletion = (items) => items.push({
label: 'minValue',
insertText: 'minValue: $0',
insertTextFormat: vscode_languageserver_1.InsertTextFormat.Snippet,
kind: vscode_languageserver_1.CompletionItemKind.Property,
documentation: 'The new minimum value of the sequence.',
});
exports.minValueSequenceDefaultCompletion = minValueSequenceDefaultCompletion;
const maxValueSequenceDefaultCompletion = (items) => items.push({
label: 'maxValue',
insertText: 'maxValue: $0',
insertTextFormat: vscode_languageserver_1.InsertTextFormat.Snippet,
kind: vscode_languageserver_1.CompletionItemKind.Property,
documentation: 'The new maximum value of the sequence.',
});
exports.maxValueSequenceDefaultCompletion = maxValueSequenceDefaultCompletion;
const cacheSequenceDefaultCompletion = (items) => items.push({
label: 'cache',
insertText: 'cache: $0',
insertTextFormat: vscode_languageserver_1.InsertTextFormat.Snippet,
kind: vscode_languageserver_1.CompletionItemKind.Property,
documentation: 'The number of sequence values to cache in memory for reuse in the session. A cache size of 1 means that there is no cache, and cache sizes of less than 1 are not valid.',
});
exports.cacheSequenceDefaultCompletion = cacheSequenceDefaultCompletion;
const incrementSequenceDefaultCompletion = (items) => items.push({
label: 'increment',
insertText: 'increment: $0',
insertTextFormat: vscode_languageserver_1.InsertTextFormat.Snippet,
kind: vscode_languageserver_1.CompletionItemKind.Property,
documentation: 'The new value by which the sequence is incremented. A negative number creates a descending sequence. A positive number creates an ascending sequence.',
});
exports.incrementSequenceDefaultCompletion = incrementSequenceDefaultCompletion;
const startSequenceDefaultCompletion = (items) => items.push({
label: 'start',
insertText: 'start: $0',
insertTextFormat: vscode_languageserver_1.InsertTextFormat.Snippet,
kind: vscode_languageserver_1.CompletionItemKind.Property,
documentation: 'The value the sequence starts at if you RESTART or if the sequence hits the MAXVALUE and CYCLE is set.',
});
exports.startSequenceDefaultCompletion = startSequenceDefaultCompletion;
//#endregion
const scalarListDefaultCompletion = (items) => items.unshift({
label: '[]',
insertText: '[$0]',
insertTextFormat: vscode_languageserver_1.InsertTextFormat.Snippet,
documentation: 'Set a default value on the list field',
kind: vscode_languageserver_1.CompletionItemKind.Value,
});
exports.scalarListDefaultCompletion = scalarListDefaultCompletion;
const booleanDefaultCompletions = (items) => items.push({ label: 'true', kind: vscode_languageserver_1.CompletionItemKind.Value }, { label: 'false', kind: vscode_languageserver_1.CompletionItemKind.Value });
exports.booleanDefaultCompletions = booleanDefaultCompletions;
function filterSortLengthBasedOnInput(attribute, previewFeatures, datasourceProvider, wordBeforePosition, items) {
/*
* 1 - Autocomplete values
*/
// Auto completion for sort: Desc | Asc
// includes because `@unique(sort: |)` means wordBeforePosition = '@unique(sort:'
if (wordBeforePosition.includes('sort:')) {
return sortValuesCompletionItems;
}
else {
/*
* 2 - Autocomplete properties
*/
// The length argument is available on MySQL only on the
// @id, @@id, @unique, @@unique and @@index fields.
// The sort argument is available for all databases on the
// @unique, @@unique and @@index fields.
// Additionally, SQL Server also allows it on @id and @@id.
// Which translates too
// - `length` argument for `@id`, `@@id`, `@unique`, `@@unique` and `@@index` (MySQL only)
// - Note that on the `@@` the argument is on available a field - not on the top level attribute
// - `sort` argument for `@unique`, `@@unique` and `@@index` (Additionally `@id` and `@@id` for SQL Server)
if (datasourceProvider === 'mysql') {
if (['@unique', '@@unique', '@@index'].includes(attribute)) {
return items;
}
else {
// filter sort out
return items.filter((arg) => arg.label !== 'sort');
}
}
else if (datasourceProvider === 'sqlserver') {
if (['@unique', '@@unique', '@@index', '@id', '@@id'].includes(attribute)) {
// only filter length out
return items.filter((arg) => arg.label !== 'length');
}
else {
// filter length and sort out
return items.filter((arg) => arg.label !== 'length' && arg.label !== 'sort');
}
}
else {
if (['@unique', '@@unique', '@@index'].includes(attribute)) {
// only filter length out
return items.filter((arg) => arg.label !== 'length');
}
else {
// filter length and sort out
return items.filter((arg) => arg.label !== 'length' && arg.label !== 'sort');
}
}
}
}
function getCompletionsForFieldAttributeArgs(fieldAttributeWithParams, previewFeatures, datasourceProvider, wordBeforePosition) {
const items = (0, internals_1.convertToCompletionItems)(
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
completions.fieldAttributes.find((item) => item.label.includes(fieldAttributeWithParams)).params, vscode_languageserver_1.CompletionItemKind.Property);
const completionItems = filterSortLengthBasedOnInput(fieldAttributeWithParams, previewFeatures, datasourceProvider, wordBeforePosition, items);
if (datasourceProvider === 'sqlserver') {
// Auto completion for SQL Server only, clustered: true | false
if (wordBeforePosition.includes('clustered:')) {
return sqlServerClusteredValuesCompletionItems;
}
// add clustered propery to completion items
completionItems.push({
label: 'clustered',
insertText: 'clustered: $0',
insertTextFormat: vscode_languageserver_1.InsertTextFormat.Snippet,
kind: vscode_languageserver_1.CompletionItemKind.Property,
documentation: 'An index, unique constraint or primary key can be created as clustered or non-clustered; altering the storage and retrieve behavior of the index.',
});
}
return completionItems;
}
function getCompletionsForBlockAttributeArgs({ blockAttributeWithParams, wordBeforePosition, datasourceProvider,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
previewFeatures, }) {
const items = (0, internals_1.convertToCompletionItems)(
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
completions.blockAttributes.find((item) => item.label.includes(blockAttributeWithParams)).params, vscode_languageserver_1.CompletionItemKind.Property);
// SQL Server only, suggest clustered
if (datasourceProvider === 'sqlserver' && blockAttributeWithParams !== '@@fulltext') {
// Auto completion for SQL Server only, clustered: true | false
if (wordBeforePosition.includes('clustered:')) {
return sqlServerClusteredValuesCompletionItems;
}
else {
// add clustered to suggestions
clusteredCompletion(items);
}
}
// PostgreSQL only, suggest type
else if (blockAttributeWithParams === '@@index' &&
datasourceProvider &&
['postgresql', 'postgres'].includes(datasourceProvider)) {
// TODO (Joël) figure out if we need to add cockroachdb provider here
// The type argument is only available for PostgreSQL on @@index
typeIndexCompletion(items);
}
return items;
}
//# sourceMappingURL=arguments.js.map