@prisma/language-server
Version:
Prisma Language Server
1,285 lines (1,283 loc) • 146 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const ts_dedent_1 = __importDefault(require("ts-dedent"));
const vitest_1 = require("vitest");
const vscode_languageserver_1 = require("vscode-languageserver");
const MessageHandler_1 = require("../../lib/MessageHandler");
const Schema_1 = require("../../lib/Schema");
const helper_1 = require("../helper");
const vscode_languageserver_textdocument_1 = require("vscode-languageserver-textdocument");
const baseSchema = (provider, previewFeatures) => {
if (!provider && previewFeatures?.length === 0) {
throw new Error(`provider and/or previewFeatures is required.`);
}
let base = '';
if (provider) {
base = /* Prisma */ `
datasource db {
provider = "${provider}"
url = env("DATABASE_URL")
}`;
}
if (previewFeatures?.length) {
base += /* Prisma */ `
generator js {
provider = "prisma-client-js"
previewFeatures = ["${previewFeatures.join('","')}"]
}`;
}
return (0, ts_dedent_1.default)(base);
};
function assertCompletion({ provider, previewFeatures, schema, expected, }) {
// Remove indentation
schema = (0, ts_dedent_1.default)(schema);
if (provider || previewFeatures) {
schema = `
${baseSchema(provider, previewFeatures)}
${schema}
`;
}
const position = (0, helper_1.findCursorPosition)(schema);
const document = vscode_languageserver_textdocument_1.TextDocument.create('file:///completions/none.prisma', 'prisma', 1, schema.replace(helper_1.CURSOR_CHARACTER, ''));
const completionParams = {
textDocument: document,
position,
context: {
triggerKind: vscode_languageserver_1.CompletionTriggerKind.Invoked,
},
};
const completionResult = (0, MessageHandler_1.handleCompletionRequest)(Schema_1.PrismaSchema.singleFile(document), document, completionParams);
(0, vitest_1.expect)(completionResult).not.toBeUndefined();
(0, vitest_1.expect)(completionResult?.isIncomplete, `Line ${position.line} - Character ${position.character}
Expected isIncomplete to be '${expected.isIncomplete}' but got '${completionResult?.isIncomplete}'`).toStrictEqual(expected.isIncomplete);
(0, vitest_1.expect)(completionResult?.items.map((item) => item.label), `Line ${position.line} - Character ${position.character}
mapped items => item.label`).toStrictEqual(expected.items.map((item) => item.label));
(0, vitest_1.expect)(completionResult?.items.map((item) => item.kind), `Line ${position.line} - Character ${position.character}
mapped items => item.kind`).toStrictEqual(expected.items.map((item) => item.kind));
// TODO: This is missing the output of `expected.items` so one can compare
(0, vitest_1.expect)(completionResult?.items.length, `Line ${position.line} - Character ${position.character}
Expected ${expected.items.length} suggestions and got ${completionResult?.items.length}: ${JSON.stringify(completionResult?.items, undefined, 2)}`).toStrictEqual(expected.items.length);
}
(0, vitest_1.describe)('Completions', function () {
// used in more than 1 describe
//#region types
const fieldProvider = {
label: 'provider',
kind: vscode_languageserver_1.CompletionItemKind.Field,
};
const staticValueTrue = {
label: 'true',
kind: vscode_languageserver_1.CompletionItemKind.Value,
};
const staticValueFalse = {
label: 'false',
kind: vscode_languageserver_1.CompletionItemKind.Value,
};
const fieldsProperty = {
label: 'fields',
kind: vscode_languageserver_1.CompletionItemKind.Property,
};
const mapProperty = {
label: 'map',
kind: vscode_languageserver_1.CompletionItemKind.Property,
};
const sortProperty = {
label: 'sort',
kind: vscode_languageserver_1.CompletionItemKind.Property,
};
const nameProperty = {
label: 'name',
kind: vscode_languageserver_1.CompletionItemKind.Property,
};
//#endregion
(0, vitest_1.describe)('BASE BLOCKS', () => {
(0, vitest_1.test)('Diagnoses block type suggestions for empty file', () => {
assertCompletion({
schema: /* Prisma */ `|`,
expected: {
isIncomplete: false,
items: [
{ label: 'datasource', kind: vscode_languageserver_1.CompletionItemKind.Class },
{ label: 'generator', kind: vscode_languageserver_1.CompletionItemKind.Class },
{ label: 'model', kind: vscode_languageserver_1.CompletionItemKind.Class },
{ label: 'enum', kind: vscode_languageserver_1.CompletionItemKind.Class },
],
},
});
});
(0, vitest_1.test)('Diagnoses block type suggestions with sqlite as provider', () => {
assertCompletion({
schema: /* Prisma */ `
datasource db {
provider = "sqlite"
}
|
`,
expected: {
isIncomplete: false,
items: [
{ label: 'datasource', kind: vscode_languageserver_1.CompletionItemKind.Class },
{ label: 'generator', kind: vscode_languageserver_1.CompletionItemKind.Class },
{ label: 'model', kind: vscode_languageserver_1.CompletionItemKind.Class },
],
},
});
});
(0, vitest_1.test)('Diagnoses block type suggestions with mongodb as provider', () => {
assertCompletion({
schema: /* Prisma */ `
datasource db {
provider = "mongodb"
}
|
`,
expected: {
isIncomplete: false,
items: [
{ label: 'datasource', kind: vscode_languageserver_1.CompletionItemKind.Class },
{ label: 'generator', kind: vscode_languageserver_1.CompletionItemKind.Class },
{ label: 'model', kind: vscode_languageserver_1.CompletionItemKind.Class },
{ label: 'enum', kind: vscode_languageserver_1.CompletionItemKind.Class },
{ label: 'type', kind: vscode_languageserver_1.CompletionItemKind.Class },
],
},
});
});
(0, vitest_1.test)('Diagnoses block type suggestions for view preview', () => {
assertCompletion({
schema: /* Prisma */ `
generator client {
provider = "prisma-client-js"
// ! Assures we are reading the correct previewFeatures section.
// previewFeatures = []
previewFeatures = ["views"]
}
|
`,
expected: {
isIncomplete: false,
items: [
{ label: 'datasource', kind: vscode_languageserver_1.CompletionItemKind.Class },
{ label: 'generator', kind: vscode_languageserver_1.CompletionItemKind.Class },
{ label: 'model', kind: vscode_languageserver_1.CompletionItemKind.Class },
{ label: 'enum', kind: vscode_languageserver_1.CompletionItemKind.Class },
{ label: 'view', kind: vscode_languageserver_1.CompletionItemKind.Class },
],
},
});
});
});
(0, vitest_1.describe)('DATABASE BLOCK', () => {
const fieldUrl = { label: 'url', kind: vscode_languageserver_1.CompletionItemKind.Field };
const fieldDirectUrl = { label: 'directUrl', kind: vscode_languageserver_1.CompletionItemKind.Field };
const fieldShadowDatabaseUrl = {
label: 'shadowDatabaseUrl',
kind: vscode_languageserver_1.CompletionItemKind.Field,
};
const fieldRelationMode = {
label: 'relationMode',
kind: vscode_languageserver_1.CompletionItemKind.Field,
};
const fieldPostgresqlExtensions = {
label: 'extensions',
kind: vscode_languageserver_1.CompletionItemKind.Field,
};
const fieldSchemas = {
label: 'schemas',
kind: vscode_languageserver_1.CompletionItemKind.Field,
};
const sqlite = { label: 'sqlite', kind: vscode_languageserver_1.CompletionItemKind.Constant };
const mysql = { label: 'mysql', kind: vscode_languageserver_1.CompletionItemKind.Constant };
const postgresql = {
label: 'postgresql',
kind: vscode_languageserver_1.CompletionItemKind.Constant,
};
const sqlserver = {
label: 'sqlserver',
kind: vscode_languageserver_1.CompletionItemKind.Constant,
};
const mongodb = { label: 'mongodb', kind: vscode_languageserver_1.CompletionItemKind.Constant };
const cockroachdb = {
label: 'cockroachdb',
kind: vscode_languageserver_1.CompletionItemKind.Constant,
};
const relationModeForeignKeys = {
label: 'foreignKeys',
kind: vscode_languageserver_1.CompletionItemKind.Field,
};
const relationModePrisma = {
label: 'prisma',
kind: vscode_languageserver_1.CompletionItemKind.Field,
};
const relationModeForeignKeysWithQuotes = {
label: '"foreignKeys"',
kind: vscode_languageserver_1.CompletionItemKind.Field,
};
const relationModePrismaWithQuotes = {
label: '"prisma"',
kind: vscode_languageserver_1.CompletionItemKind.Field,
};
const quotationMarks = {
label: '""',
kind: vscode_languageserver_1.CompletionItemKind.Property,
};
const env = { label: 'env()', kind: vscode_languageserver_1.CompletionItemKind.Property };
(0, vitest_1.test)('Diagnoses datasource field suggestions in empty block', () => {
assertCompletion({
schema: /* Prisma */ `
datasource db {
|
}`,
expected: {
isIncomplete: false,
items: [fieldProvider, fieldUrl, fieldShadowDatabaseUrl, fieldDirectUrl, fieldRelationMode],
},
});
});
(0, vitest_1.test)('Diagnoses datasource field suggestions with existing field', () => {
assertCompletion({
schema: /* Prisma */ `
datasource db {
provider = "sqlite"
|
}`,
expected: {
isIncomplete: false,
items: [fieldProvider, fieldUrl, fieldShadowDatabaseUrl, fieldDirectUrl, fieldRelationMode],
},
});
assertCompletion({
schema: /* Prisma */ `
datasource db {
url = env("DATABASE_URL")
|
}`,
expected: {
isIncomplete: false,
items: [fieldProvider, fieldUrl, fieldShadowDatabaseUrl, fieldDirectUrl, fieldRelationMode],
},
});
});
(0, vitest_1.test)('url = env("|")', () => {
assertCompletion({
schema: /* Prisma */ `
datasource db {
url = |
}`,
expected: {
isIncomplete: false,
items: [env, quotationMarks],
},
});
assertCompletion({
schema: /* Prisma */ `
datasource db {
url = env("|")
}`,
expected: {
isIncomplete: false,
items: [
{
label: 'DATABASE_URL',
kind: vscode_languageserver_1.CompletionItemKind.Constant,
},
],
},
});
});
(0, vitest_1.test)('shadowDatabaseUrl = env("|")', () => {
assertCompletion({
schema: /* Prisma */ `
datasource db {
url = |
}`,
expected: {
isIncomplete: false,
items: [env, quotationMarks],
},
});
assertCompletion({
schema: /* Prisma */ `
datasource db {
shadowDatabaseUrl = env("|")
}`,
expected: {
isIncomplete: false,
items: [
{
label: 'SHADOW_DATABASE_URL',
kind: vscode_languageserver_1.CompletionItemKind.Constant,
},
],
},
});
});
(0, vitest_1.test)('directUrl = env("|")', () => {
assertCompletion({
schema: /* Prisma */ `
datasource db {
url = |
}`,
expected: {
isIncomplete: false,
items: [env, quotationMarks],
},
});
assertCompletion({
schema: /* Prisma */ `
datasource db {
directUrl = env("|")
}`,
expected: {
isIncomplete: false,
items: [
{
label: 'DIRECT_URL',
kind: vscode_languageserver_1.CompletionItemKind.Constant,
},
],
},
});
});
(0, vitest_1.test)('Diagnoses field extensions availability', () => {
assertCompletion({
schema: /* Prisma */ `
generator client {
provider = "prisma-client-js"
previewFeatures = ["postgresqlExtensions"]
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
|
}
`,
expected: {
isIncomplete: false,
items: [fieldShadowDatabaseUrl, fieldDirectUrl, fieldRelationMode, fieldPostgresqlExtensions],
},
});
});
(0, vitest_1.test)('Diagnoses field schemas', () => {
assertCompletion({
schema: /* Prisma */ `
generator client {
provider = "prisma-client-js"
previewFeatures = ["multiSchema"]
}
datasource db {
provider = "cockroachdb"
url = env("DATABASE_URL")
|
}
`,
expected: {
isIncomplete: false,
items: [fieldShadowDatabaseUrl, fieldDirectUrl, fieldRelationMode, fieldSchemas],
},
});
});
(0, vitest_1.test)('provider = "|"', () => {
assertCompletion({
schema: /* Prisma */ `
datasource db {
provider = "|"
}`,
expected: {
isIncomplete: true,
items: [mysql, postgresql, sqlite, sqlserver, mongodb, cockroachdb],
},
});
});
(0, vitest_1.test)('provider = |', () => {
assertCompletion({
schema: /* Prisma */ `
datasource db {
provider = |
}`,
expected: {
isIncomplete: true,
items: [quotationMarks],
},
});
});
(0, vitest_1.test)('relationMode = "|"', () => {
assertCompletion({
schema: /* Prisma */ `
datasource db {
provider = "sqlite"
relationMode = "|"
}`,
expected: {
isIncomplete: false,
items: [relationModeForeignKeys, relationModePrisma],
},
});
});
(0, vitest_1.test)('relationMode = |', () => {
assertCompletion({
schema: /* Prisma */ `
datasource db {
relationMode = |
}`,
expected: {
isIncomplete: false,
items: [relationModeForeignKeysWithQuotes, relationModePrismaWithQuotes],
},
});
});
});
(0, vitest_1.describe)('GENERATOR BLOCK', () => {
// fieldProvider defined above already
//#region types
const fieldOutput = { label: 'output', kind: vscode_languageserver_1.CompletionItemKind.Field };
const fieldBinaryTargets = {
label: 'binaryTargets',
kind: vscode_languageserver_1.CompletionItemKind.Field,
};
const fieldPreviewFeatures = {
label: 'previewFeatures',
kind: vscode_languageserver_1.CompletionItemKind.Field,
};
const fieldEngineType = {
label: 'engineType',
kind: vscode_languageserver_1.CompletionItemKind.Field,
};
//#endregion
(0, vitest_1.test)('Diagnoses generator field suggestions in empty block', () => {
assertCompletion({
schema: /* Prisma */ `
generator gen {
|
}`,
expected: {
isIncomplete: false,
items: [fieldProvider, fieldPreviewFeatures, fieldOutput, fieldEngineType, fieldBinaryTargets],
},
});
});
(0, vitest_1.test)('Diagnoses generator field suggestions with existing fields', () => {
assertCompletion({
schema: /* Prisma */ `
generator gen {
provider = 'sqlite'
|
}`,
expected: {
isIncomplete: false,
items: [fieldPreviewFeatures, fieldOutput, fieldEngineType, fieldBinaryTargets],
},
});
assertCompletion({
schema: /* Prisma */ `
generator gen {
output = "node_modules/@prisma/client"
|
}`,
expected: {
isIncomplete: false,
items: [fieldProvider, fieldPreviewFeatures, fieldEngineType, fieldBinaryTargets],
},
});
});
(0, vitest_1.test)('engineType = |', () => {
assertCompletion({
schema: /* Prisma */ `
generator gen {
engineType = |
}`,
expected: {
isIncomplete: true,
items: [
{
label: '""',
kind: vscode_languageserver_1.CompletionItemKind.Property,
},
],
},
});
});
(0, vitest_1.test)('engineType = "|"', () => {
assertCompletion({
schema: /* Prisma */ `
generator gen {
engineType = "|"
}`,
expected: {
isIncomplete: true,
items: [
{
label: 'library',
kind: vscode_languageserver_1.CompletionItemKind.Constant,
},
{
label: 'binary',
kind: vscode_languageserver_1.CompletionItemKind.Constant,
},
{
label: 'client',
kind: vscode_languageserver_1.CompletionItemKind.Constant,
},
],
},
});
});
});
(0, vitest_1.describe)('BLOCK ATTRIBUTES', () => {
//#region types
const blockAttributeId = {
label: '@@id',
kind: vscode_languageserver_1.CompletionItemKind.Property,
};
const blockAttributeMap = {
label: '@@map',
kind: vscode_languageserver_1.CompletionItemKind.Property,
};
const blockAttributeUnique = {
label: '@@unique',
kind: vscode_languageserver_1.CompletionItemKind.Property,
};
const blockAttributeIndex = {
label: '@@index',
kind: vscode_languageserver_1.CompletionItemKind.Property,
};
const blockAttributeFulltextIndex = {
label: '@@fulltext',
kind: vscode_languageserver_1.CompletionItemKind.Property,
};
const blockAttributeIgnore = {
label: '@@ignore',
kind: vscode_languageserver_1.CompletionItemKind.Property,
};
const blockAttributeSchema = {
label: '@@schema',
kind: vscode_languageserver_1.CompletionItemKind.Property,
};
const typeProperty = {
label: 'type',
kind: vscode_languageserver_1.CompletionItemKind.Property,
};
const namespaceOne = {
label: 'one',
kind: vscode_languageserver_1.CompletionItemKind.Property,
};
const namespaceTwo = {
label: 'two',
kind: vscode_languageserver_1.CompletionItemKind.Property,
};
//#endregion
(0, vitest_1.test)('@@id([|])', () => {
assertCompletion({
schema: /* Prisma */ `
model ThirdUser {
firstName String
lastName String
isAdmin Boolean @default(false)
@@id([|])
}`,
expected: {
isIncomplete: false,
items: [
{ label: 'firstName', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'lastName', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'isAdmin', kind: vscode_languageserver_1.CompletionItemKind.Field },
],
},
});
});
(0, vitest_1.describe)('First in a line', () => {
(0, vitest_1.test)('Empty model', () => {
assertCompletion({
schema: /* Prisma */ `
model user {
|
}`,
expected: {
isIncomplete: false,
items: [
blockAttributeMap,
blockAttributeId,
blockAttributeUnique,
blockAttributeIndex,
blockAttributeIgnore,
],
},
});
});
(0, vitest_1.test)('Model', () => {
assertCompletion({
schema: /* Prisma */ `
model User {
firstName String
lastName String
email String @unique
isAdmin Boolean @default(false)
|
}`,
expected: {
isIncomplete: false,
items: [
blockAttributeMap,
blockAttributeId,
blockAttributeUnique,
blockAttributeIndex,
blockAttributeIgnore,
],
},
});
assertCompletion({
schema: /* Prisma */ `
model Post {
id Int @id @default()
email String? @unique
name String
|
}`,
expected: {
isIncomplete: false,
items: [blockAttributeMap, blockAttributeUnique, blockAttributeIndex, blockAttributeIgnore],
},
});
});
(0, vitest_1.test)('View', () => {
assertCompletion({
schema: /* Prisma */ `
view User {
firstName String
lastName String
email String @unique
isAdmin Boolean @default(false)
|
}
`,
expected: {
isIncomplete: false,
items: [
blockAttributeMap,
blockAttributeId,
blockAttributeUnique,
blockAttributeIndex,
blockAttributeIgnore,
],
},
});
});
(0, vitest_1.describe)('fullTextIndex', () => {
(0, vitest_1.test)('MySQL', () => {
assertCompletion({
provider: 'mysql',
previewFeatures: ['fullTextIndex'],
schema: /* Prisma */ `
model Fulltext {
id Int @id
title String @db.VarChar(255)
content String @db.Text
|
@@fulltext()
@@fulltext([title, content], )
}
`,
expected: {
isIncomplete: false,
items: [
blockAttributeMap,
// blockAttributeId,
blockAttributeUnique,
blockAttributeIndex,
blockAttributeFulltextIndex,
blockAttributeIgnore,
],
},
});
});
(0, vitest_1.test)('MongoDB', () => {
assertCompletion({
provider: 'mongodb',
previewFeatures: ['fullTextIndex'],
schema: /* Prisma */ `
model Fulltext {
id String @id @map("_id") @db.ObjectId
title String
content String
|
@@fulltext()
@@fulltext([title, content], )
}`,
expected: {
isIncomplete: false,
items: [
blockAttributeMap,
// blockAttributeId,
blockAttributeUnique,
blockAttributeIndex,
blockAttributeFulltextIndex,
blockAttributeIgnore,
],
},
});
});
(0, vitest_1.test)('PostgreSQL', () => {
assertCompletion({
provider: 'postgresql',
previewFeatures: ['fullTextIndex'],
schema: /* Prisma */ `
model A {
id Int @id
title String
content String
|
}
`,
expected: {
isIncomplete: false,
items: [
blockAttributeMap,
// blockAttributeId,
blockAttributeUnique,
blockAttributeIndex,
blockAttributeIgnore,
],
},
});
});
});
});
(0, vitest_1.describe)('@@unique()', function () {
(0, vitest_1.describe)('No provider', function () {
(0, vitest_1.test)('@@unique([|])', () => {
assertCompletion({
schema: /* Prisma */ `
model SecondUser {
firstName String
lastName String
isAdmin Boolean @default(false)
@@unique([|])
}`,
expected: {
isIncomplete: false,
items: [
{ label: 'firstName', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'lastName', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'isAdmin', kind: vscode_languageserver_1.CompletionItemKind.Field },
],
},
});
});
(0, vitest_1.test)('@@unique(fields: [|])', () => {
assertCompletion({
schema: /* Prisma */ `
model SecondUser {
firstName String
lastName String
isAdmin Boolean @default(false)
@@unique(fields: [|])
}`,
expected: {
isIncomplete: false,
items: [
{ label: 'firstName', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'lastName', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'isAdmin', kind: vscode_languageserver_1.CompletionItemKind.Field },
],
},
});
});
});
(0, vitest_1.describe)('MongoDB', function () {
(0, vitest_1.test)('@@unique([|])', () => {
assertCompletion({
provider: 'mongodb',
schema: /* Prisma */ `
type Address {
street String
number Int
}
model User {
id Int @id @map("_id")
email String
address Address
@@unique([|])
}`,
expected: {
isIncomplete: false,
items: [
{ label: 'id', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'email', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'address', kind: vscode_languageserver_1.CompletionItemKind.Field },
],
},
});
});
(0, vitest_1.test)('@@unique(fields: [|])', () => {
assertCompletion({
provider: 'mongodb',
schema: /* Prisma */ `
type Address {
street String
number Int
}
model User {
id Int @id @map("_id")
email String
address Address
@@unique(fields: [|])
}`,
expected: {
isIncomplete: false,
items: [
{ label: 'id', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'email', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'address', kind: vscode_languageserver_1.CompletionItemKind.Field },
],
},
});
});
});
});
(0, vitest_1.describe)('@@index()', function () {
(0, vitest_1.describe)('No provider', function () {
(0, vitest_1.test)('@@index([|])', () => {
assertCompletion({
schema: /* Prisma */ `
model ThirdUser {
firstName String
lastName String
isAdmin Boolean @default(false)
@@index([|])
}`,
expected: {
isIncomplete: false,
items: [
{ label: 'firstName', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'lastName', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'isAdmin', kind: vscode_languageserver_1.CompletionItemKind.Field },
],
},
});
});
(0, vitest_1.test)('@@index(fields: [|])', () => {
assertCompletion({
schema: /* Prisma */ `
model ThirdUser {
firstName String
lastName String
isAdmin Boolean @default(false)
@@index(field: [|])
}`,
expected: {
isIncomplete: false,
items: [
{ label: 'firstName', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'lastName', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'isAdmin', kind: vscode_languageserver_1.CompletionItemKind.Field },
],
},
});
});
});
(0, vitest_1.describe)('MongoDB', function () {
(0, vitest_1.test)('@@index([|])', () => {
assertCompletion({
provider: 'mongodb',
schema: /* Prisma */ `
type Address {
street String
number Int
}
model User {
id Int @id @map("_id")
email String
address Address
@@index([|])
}`,
expected: {
isIncomplete: false,
items: [
{ label: 'id', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'email', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'address', kind: vscode_languageserver_1.CompletionItemKind.Field },
],
},
});
});
(0, vitest_1.test)('@@index([a|])', () => {
assertCompletion({
provider: 'mongodb',
schema: /* Prisma */ `
type Address {
street String
number Int
}
model User {
id Int @id @map("_id")
email String
address Address
account Int
@@index([a|])
}`,
expected: {
isIncomplete: false,
items: [
// These are returned, but `onCompletionResolve` will only complete with the current match
// which means the completion will actually be
// address and account
// TODO create a test that shows that
{ label: 'id', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'email', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'address', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'account', kind: vscode_languageserver_1.CompletionItemKind.Field },
],
},
});
});
(0, vitest_1.test)('@@index([address|])', () => {
assertCompletion({
provider: 'mongodb',
schema: /* Prisma */ `
type Address {
street String
number Int
}
model User {
id Int @id @map("_id")
email String
address Address
account Int
@@index([address|])
}`,
expected: {
isIncomplete: false,
items: [
// These are returned though the completion will actually be
// No suggestions
// TODO create a test that shows that
{ label: 'id', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'email', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'account', kind: vscode_languageserver_1.CompletionItemKind.Field },
],
},
});
});
(0, vitest_1.test)('@@index([address,|])', () => {
assertCompletion({
provider: 'mongodb',
schema: /* Prisma */ `
type Address {
street String
number Int
}
model User {
id Int @id @map("_id")
email String
address Address
@@index([address,|])
}`,
expected: {
isIncomplete: false,
items: [
{ label: 'id', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'email', kind: vscode_languageserver_1.CompletionItemKind.Field },
],
},
});
});
(0, vitest_1.test)('@@index([address, |])', () => {
assertCompletion({
provider: 'mongodb',
schema: /* Prisma */ `
type Address {
street String
number Int
}
model User {
id Int @id @map("_id")
email String
address Address
@@index([address, |])
}`,
expected: {
isIncomplete: false,
items: [
{ label: 'id', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'email', kind: vscode_languageserver_1.CompletionItemKind.Field },
],
},
});
});
(0, vitest_1.test)('@@index([address.|]) first position, with only one type', () => {
assertCompletion({
provider: 'mongodb',
schema: /* Prisma */ `
type Address {
street String
number Int
}
model User {
id Int @id @map("_id")
email String
address Address
@@index([address.|])
}`,
expected: {
isIncomplete: false,
items: [
{ label: 'street', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'number', kind: vscode_languageserver_1.CompletionItemKind.Field },
],
},
});
});
(0, vitest_1.test)('@@index([address.|]) with composite type suggestion 1', () => {
assertCompletion({
provider: 'mongodb',
schema: /* Prisma */ `
type Address {
street String
number Int
alpha Alpha
}
type Alpha {
bravo Bravo
helloA Int
}
type Bravo {
something String
helloBravo Int
}
model User {
id Int @id @map("_id")
email String
address Address
@@index([address.|])
}`,
expected: {
isIncomplete: false,
items: [
{ label: 'street', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'number', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'alpha', kind: vscode_languageserver_1.CompletionItemKind.Field },
],
},
});
});
(0, vitest_1.test)('@@index([address.a|]) with composite type suggestion 1', () => {
assertCompletion({
provider: 'mongodb',
schema: /* Prisma */ `
type Address {
street String
number Int
alpha Alpha
}
type Alpha {
bravo Bravo
helloA Int
}
type Bravo {
something String
helloBravo Int
}
model User {
id Int @id @map("_id")
email String
address Address
@@index([address.a|])
}`,
expected: {
isIncomplete: false,
// TODO, see if we can have better suggestions here, should suggest `alpha`
items: [],
},
});
});
(0, vitest_1.test)('@@index([email,address.|]) with composite type suggestion, depth 1', () => {
assertCompletion({
provider: 'mongodb',
schema: /* Prisma */ `
type Address {
street String
number Int
alpha Alpha
}
type Alpha {
bravo Bravo
helloA Int
}
type Bravo {
something String
helloBravo Int
}
model User {
id Int @id @map("_id")
email String
address Address
@@index([email,address.|])
}`,
expected: {
isIncomplete: false,
items: [
{ label: 'street', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'number', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'alpha', kind: vscode_languageserver_1.CompletionItemKind.Field },
],
},
});
});
(0, vitest_1.test)('@@index([email, address.|]) with composite type suggestion, depth 1', () => {
assertCompletion({
provider: 'mongodb',
schema: /* Prisma */ `
type Address {
street String
number Int
alpha Alpha
}
type Alpha {
bravo Bravo
helloA Int
}
type Bravo {
something String
helloBravo Int
}
model User {
id Int @id @map("_id")
email String
address Address
@@index([email, address.|])
}`,
expected: {
isIncomplete: false,
items: [
{ label: 'street', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'number', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'alpha', kind: vscode_languageserver_1.CompletionItemKind.Field },
],
},
});
});
(0, vitest_1.test)('@@index([email, address.alpha.|]) with composite type suggestion, depth 2', () => {
assertCompletion({
provider: 'mongodb',
schema: /* Prisma */ `
type Address {
street String
number Int
alpha Alpha
}
type Alpha {
bravo Bravo
helloA Int
}
type Bravo {
something String
helloBravo Int
}
model User {
id Int @id @map("_id")
email String
address Address
@@index([email, address.alpha.|])
}`,
expected: {
isIncomplete: false,
items: [
{ label: 'bravo', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'helloA', kind: vscode_languageserver_1.CompletionItemKind.Field },
],
},
});
});
(0, vitest_1.test)('@@index([email, address.alpha.bravo.|]) with composite type suggestion, depth 3', () => {
assertCompletion({
provider: 'mongodb',
schema: /* Prisma */ `
type Address {
street String
number Int
alpha Alpha
}
type Alpha {
bravo Bravo
helloA Int
}
type Bravo {
something String
helloBravo Int
}
model User {
id Int @id @map("_id")
email String
address Address
@@index([email, address.alpha.bravo.|])
}`,
expected: {
isIncomplete: false,
items: [
{ label: 'something', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'helloBravo', kind: vscode_languageserver_1.CompletionItemKind.Field },
],
},
});
});
(0, vitest_1.test)('@@index([email, address.alpha.bravo.hello|]) with composite type suggestion, depth 3', () => {
assertCompletion({
provider: 'mongodb',
schema: /* Prisma */ `
type Address {
street String
number Int
alpha Alpha
}
type Alpha {
bravo Bravo
helloA Int
}
type Bravo {
something String
helloBravo Int
}
model User {
id Int @id @map("_id")
email String
address Address
@@index([email, address.alpha.bravo.hello||])
}`,
expected: {
isIncomplete: false,
// TODO, see if we can have better suggestions here, should suggest `helloBravo`
items: [],
},
});
});
(0, vitest_1.test)('@@index(fields: [|])', () => {
assertCompletion({
provider: 'mongodb',
schema: /* Prisma */ `
type Address {
street String
number Int
}
model User {
id Int @id @map("_id")
email String
address Address
@@index(fields: [|])
}`,
expected: {
isIncomplete: false,
items: [
{ label: 'id', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'email', kind: vscode_languageserver_1.CompletionItemKind.Field },
{ label: 'address', kind: vscode_languageserver_1.CompletionItemKind.Field },
],
},
});
});
});
(0, vitest_1.describe)('extendedIndexes - PostgreSQL', function () {
(0, vitest_1.test)('@@index(|)', () => {
assertComple