UNPKG

@prisma/language-server

Version:
1,263 lines (1,261 loc) • 158 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}" }`; } 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 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, }; (0, vitest_1.test)('Diagnoses datasource field suggestions in empty block', () => { assertCompletion({ schema: /* Prisma */ ` datasource db { | }`, expected: { isIncomplete: false, items: [fieldProvider, fieldRelationMode], }, }); }); (0, vitest_1.test)('Diagnoses datasource field suggestions with existing field', () => { assertCompletion({ schema: /* Prisma */ ` datasource db { provider = "sqlite" | }`, expected: { isIncomplete: false, items: [fieldRelationMode], }, }); assertCompletion({ schema: /* Prisma */ ` datasource db { | }`, expected: { isIncomplete: false, items: [fieldProvider, fieldRelationMode], }, }); }); (0, vitest_1.test)('Diagnoses field extensions availability', () => { assertCompletion({ schema: /* Prisma */ ` generator client { provider = "prisma-client-js" previewFeatures = ["postgresqlExtensions"] } datasource db { provider = "postgresql" | } `, expected: { isIncomplete: false, items: [fieldRelationMode, fieldPostgresqlExtensions, fieldSchemas], }, }); }); (0, vitest_1.test)('Diagnoses field schemas', () => { assertCompletion({ schema: /* Prisma */ ` generator client { provider = "prisma-client-js" } datasource db { provider = "cockroachdb" | } `, expected: { isIncomplete: false, items: [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 fieldPreviewFeatures = { label: 'previewFeatures', kind: vscode_languageserver_1.CompletionItemKind.Field, }; const fieldRuntime = { label: 'runtime', kind: vscode_languageserver_1.CompletionItemKind.Field, }; const fieldModuleFormat = { label: 'moduleFormat', kind: vscode_languageserver_1.CompletionItemKind.Field, }; const fieldGeneratedFileExtension = { label: 'generatedFileExtension', kind: vscode_languageserver_1.CompletionItemKind.Field, }; const fieldImportFileExtension = { label: 'importFileExtension', kind: vscode_languageserver_1.CompletionItemKind.Field, }; const fieldCompilerBuild = { label: 'compilerBuild', 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], }, }); }); (0, vitest_1.describe)('no generator', () => { (0, vitest_1.test)('with output defined', () => { assertCompletion({ schema: /* Prisma */ ` generator gen { output = "../generated/prisma" | }`, expected: { isIncomplete: false, items: [fieldProvider], }, }); }); (0, vitest_1.test)('with preview features defined', () => { assertCompletion({ schema: /* Prisma */ ` generator gen { previewFeatures = [] | }`, expected: { isIncomplete: false, items: [fieldProvider], }, }); }); }); (0, vitest_1.describe)('prisma-client', () => { (0, vitest_1.test)('Diagnoses generator field suggestions with existing fields', () => { assertCompletion({ schema: /* Prisma */ ` generator gen { provider = "prisma-client" | }`, expected: { isIncomplete: false, items: [ fieldPreviewFeatures, fieldOutput, fieldRuntime, fieldModuleFormat, fieldGeneratedFileExtension, fieldImportFileExtension, fieldCompilerBuild, ], }, }); }); (0, vitest_1.test)('runtime = |', () => { assertCompletion({ schema: /* Prisma */ ` generator gen { provider = "prisma-client" runtime = | }`, expected: { isIncomplete: true, items: [ { label: '""', kind: vscode_languageserver_1.CompletionItemKind.Property, }, ], }, }); }); (0, vitest_1.test)('runtime = "|"', () => { assertCompletion({ schema: /* Prisma */ ` generator gen { provider = "prisma-client" runtime = "|" }`, expected: { isIncomplete: true, items: [ { label: 'nodejs', kind: vscode_languageserver_1.CompletionItemKind.Constant, }, { label: 'deno', kind: vscode_languageserver_1.CompletionItemKind.Constant, }, { label: 'bun', kind: vscode_languageserver_1.CompletionItemKind.Constant, }, { label: 'workerd', kind: vscode_languageserver_1.CompletionItemKind.Constant, }, { label: 'cloudflare', kind: vscode_languageserver_1.CompletionItemKind.Constant, }, { label: 'vercel-edge', kind: vscode_languageserver_1.CompletionItemKind.Constant, }, { label: 'edge-light', kind: vscode_languageserver_1.CompletionItemKind.Constant, }, { label: 'react-native', kind: vscode_languageserver_1.CompletionItemKind.Constant, }, ], }, }); }); (0, vitest_1.test)('moduleFormat = |', () => { assertCompletion({ schema: /* Prisma */ ` generator gen { provider = "prisma-client" moduleFormat = | }`, expected: { isIncomplete: true, items: [ { label: '""', kind: vscode_languageserver_1.CompletionItemKind.Property, }, ], }, }); }); (0, vitest_1.test)('moduleFormat = "|"', () => { assertCompletion({ schema: /* Prisma */ ` generator gen { provider = "prisma-client" moduleFormat = "|" }`, expected: { isIncomplete: true, items: [ { label: 'esm', kind: vscode_languageserver_1.CompletionItemKind.Constant, }, { label: 'cjs', kind: vscode_languageserver_1.CompletionItemKind.Constant, }, ], }, }); }); (0, vitest_1.test)('generatedFileExtension = |', () => { assertCompletion({ schema: /* Prisma */ ` generator gen { provider = "prisma-client" generatedFileExtension = | }`, expected: { isIncomplete: true, items: [ { label: '""', kind: vscode_languageserver_1.CompletionItemKind.Property, }, ], }, }); }); (0, vitest_1.test)('generatedFileExtension = "|"', () => { assertCompletion({ schema: /* Prisma */ ` generator gen { provider = "prisma-client" generatedFileExtension = "|" }`, expected: { isIncomplete: true, items: [ { label: 'ts', kind: vscode_languageserver_1.CompletionItemKind.Constant, }, { label: 'mts', kind: vscode_languageserver_1.CompletionItemKind.Constant, }, { label: 'cts', kind: vscode_languageserver_1.CompletionItemKind.Constant, }, ], }, }); }); (0, vitest_1.test)('importFileExtension = |', () => { assertCompletion({ schema: /* Prisma */ ` generator gen { provider = "prisma-client" importFileExtension = | }`, expected: { isIncomplete: true, items: [ { label: '""', kind: vscode_languageserver_1.CompletionItemKind.Property, }, ], }, }); }); (0, vitest_1.test)('importFileExtension = "|"', () => { assertCompletion({ schema: /* Prisma */ ` generator gen { provider = "prisma-client" importFileExtension = "|" }`, expected: { isIncomplete: true, items: [ { label: 'ts', kind: vscode_languageserver_1.CompletionItemKind.Constant, }, { label: 'mts', kind: vscode_languageserver_1.CompletionItemKind.Constant, }, { label: 'cts', kind: vscode_languageserver_1.CompletionItemKind.Constant, }, { label: 'js', kind: vscode_languageserver_1.CompletionItemKind.Constant, }, { label: 'mjs', kind: vscode_languageserver_1.CompletionItemKind.Constant, }, { label: 'cjs', kind: vscode_languageserver_1.CompletionItemKind.Constant, }, { label: '', kind: vscode_languageserver_1.CompletionItemKind.Constant, }, ], }, }); }); (0, vitest_1.test)('compilerBuild = "|"', () => { assertCompletion({ schema: /* Prisma */ ` generator gen { provider = "prisma-client" compilerBuild = "|" }`, expected: { isIncomplete: true, items: [ { label: 'fast', kind: vscode_languageserver_1.CompletionItemKind.Constant, }, { label: 'small', kind: vscode_languageserver_1.CompletionItemKind.Constant, }, ], }, }); }); }); (0, vitest_1.describe)('prisma-client-js', () => { (0, vitest_1.test)('Diagnoses generator field suggestions with existing fields', () => { assertCompletion({ schema: /* Prisma */ ` generator asd { provider = "prisma-client-js" | }`, expected: { isIncomplete: false, items: [fieldPreviewFeatures, fieldOutput, fieldCompilerBuild], }, }); }); (0, vitest_1.test)('compilerBuild = "|"', () => { assertCompletion({ schema: /* Prisma */ ` generator gen { provider = "prisma-client-js" compilerBuild = "|" }`, expected: { isIncomplete: true, items: [ { label: 'fast', kind: vscode_languageserver_1.CompletionItemKind.Constant, }, { label: 'small', 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 blockAttributeShardKey = { label: '@@shardKey', 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, blockAttributeSchema, ], }, }); }); }); }); (0, vitest_1.describe)('shardKey', () => { (0, vitest_1.test)('MySQL', () => { assertCompletion({ provider: 'mysql', previewFeatures: ['shardKeys'], schema: /* Prisma */ ` model Shard { id Int @id | } `, expected: { isIncomplete: false, items: [ blockAttributeMap, blockAttributeUnique, blockAttributeIndex, blockAttributeIgnore, blockAttributeShardKey, ], }, }); }); (0, vitest_1.test)('PostgreSQL', () => { assertCompletion({ provider: 'postgresql', previewFeatures: ['shardKeys'], schema: /* Prisma */ ` model A { id Int @id | } `, expected: { isIncomplete: false, items: [ blockAttributeMap, blockAttributeUnique, blockAttributeIndex, blockAttributeIgnore, blockAttributeSchema, // blockAttributeShardKey, ], }, }); }); }); (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 { stree