UNPKG

@prisma/language-server

Version:
148 lines • 6.19 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getNativeTypes = getNativeTypes; exports.getSuggestionForNativeTypes = getSuggestionForNativeTypes; exports.getSuggestionsForFieldTypes = getSuggestionsForFieldTypes; const vscode_languageserver_1 = require("vscode-languageserver"); const internals_1 = require("./internals"); const completions = __importStar(require("./completions.json")); const nativeTypes_1 = __importDefault(require("../prisma-schema-wasm/nativeTypes")); const functions_1 = require("./functions"); const ast_1 = require("../ast"); const constants_1 = require("../constants"); /** * ```prisma * model A { * field | * } * ``` */ const corePrimitiveTypes = (0, internals_1.convertToCompletionItems)(completions.primitiveTypes, vscode_languageserver_1.CompletionItemKind.TypeParameter); const nativeTypeCompletion = (items, element) => items.push({ label: element.name, kind: vscode_languageserver_1.CompletionItemKind.TypeParameter, }); const relationSingleTypeCompletion = (items, sugg) => items.push({ label: `${sugg.label}?`, kind: sugg.kind, documentation: sugg.documentation, }); const relationManyTypeCompletion = (items, sugg) => items.push({ label: `${sugg.label}[]`, kind: sugg.kind, documentation: sugg.documentation, }); function getNativeTypes(schema, prismaType, onError) { let nativeTypes = (0, nativeTypes_1.default)(schema, (errorMessage) => { if (onError) { onError(errorMessage); } }); if (nativeTypes.length === 0) { console.log('Did not receive any native type suggestions from prisma-schema-wasm call.'); return []; } const suggestions = []; nativeTypes = nativeTypes.filter((n) => n.prisma_types.includes(prismaType)); nativeTypes.forEach((element) => { if (element._number_of_args + element._number_of_optional_args !== 0) { const documentation = (0, internals_1.buildDocumentation)(element); (0, functions_1.nativeFunctionCompletion)(suggestions, element, documentation); } else { nativeTypeCompletion(suggestions, element); } }); return suggestions; } function getSuggestionForNativeTypes(foundBlock, schema, wordsBeforePosition, onError) { const activeFeatureFlag = (0, ast_1.declaredNativeTypes)(schema, onError); if ( // TODO type? native "@db." types? foundBlock.type !== 'model' || !activeFeatureFlag || wordsBeforePosition.length < 2) { return undefined; } const datasourceName = (0, ast_1.getFirstDatasourceName)(schema); if (!datasourceName || wordsBeforePosition[wordsBeforePosition.length - 1] !== `@${datasourceName}`) { return undefined; } // line const prismaType = wordsBeforePosition[1].replace('?', '').replace('[]', ''); const suggestions = getNativeTypes(schema, prismaType, onError); return { items: suggestions, isIncomplete: true, }; } function getSuggestionsForFieldTypes(schema, position, currentLineUntrimmed) { const suggestions = []; const datasourceProvider = (0, ast_1.getFirstDatasourceProvider)(schema); // MongoDB doesn't support Decimal if (datasourceProvider === 'mongodb') { suggestions.push(...corePrimitiveTypes.filter((s) => s.label !== 'Decimal')); } else if (datasourceProvider === 'sqlite') { // TODO(@druue) remove once resolved: https://github.com/prisma/prisma/issues/3786 suggestions.push(...corePrimitiveTypes.filter((s) => s.label !== 'Json')); } else { suggestions.push(...corePrimitiveTypes); } // get all model names const modelNames = datasourceProvider === 'mongodb' ? (0, ast_1.getAllRelationNames)(schema, constants_1.relationNamesMongoDBRegexFilter) : (0, ast_1.getAllRelationNames)(schema, constants_1.relationNamesRegexFilter); suggestions.push(...(0, internals_1.toCompletionItems)(modelNames, vscode_languageserver_1.CompletionItemKind.Reference)); const wordsBeforePosition = currentLineUntrimmed.slice(0, position.character).split(' '); const wordBeforePosition = wordsBeforePosition[wordsBeforePosition.length - 1]; const completeSuggestions = suggestions.filter((s) => s.label.length === wordBeforePosition.length); if (completeSuggestions.length !== 0) { for (const sugg of completeSuggestions) { relationSingleTypeCompletion(suggestions, sugg); relationManyTypeCompletion(suggestions, sugg); } } return { items: suggestions, isIncomplete: true, }; } //# sourceMappingURL=types.js.map