UNPKG

@prisma/language-server

Version:
1,285 lines (1,283 loc) • 146 kB
"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