@prisma/language-server
Version:
Prisma Language Server
1,263 lines (1,261 loc) • 158 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}"
}`;
}
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