UNPKG

@prisma/language-server

Version:
60 lines (50 loc) 1.99 kB
import type { PreviewFeatures } from '../types' import { PrismaSchema } from '../Schema' export function getFirstDatasourceName(schema: PrismaSchema): string | undefined { const datasourceBlockFirstLine = schema .linesAsArray() .find((line) => line.text.startsWith('datasource') && line.text.includes('{')) if (!datasourceBlockFirstLine) { return undefined } const indexOfBracket = datasourceBlockFirstLine.text.indexOf('{') return datasourceBlockFirstLine.text.slice('datasource'.length, indexOfBracket).trim() } export function getFirstDatasourceProvider(schema: PrismaSchema): string | undefined { // matches provider inside datasource in any position // thanks to https://regex101.com for the online scratchpad const result = schema.findWithRegex(/datasource.*\{(\n|\N)\s*(.*\n)?\n*\s*provider\s=\s(\"(.*)\")[^}]+}/) if (!result || !result.match[4]) { return undefined } const datasourceProvider = result.match[4] if (typeof datasourceProvider === 'string' && datasourceProvider.length >= 1) { return datasourceProvider } } export function getAllPreviewFeaturesFromGenerators(schema: PrismaSchema): PreviewFeatures[] | undefined { /** * ```prisma * generator client { * provider = "prisma-client-js" * // previewFeatures = [] // This will be ignored * previewFeatures = ["views"] * } * ``` * * ? for more info: https://regex101.com/r/ezoTU2/2 */ const previewFeaturesRegex = /^\s*(?!\/\/\s)previewFeatures\s*=\s*(\[.*\])/m const result = schema.findWithRegex(previewFeaturesRegex) if (!result || !result.match[1]) { return undefined } try { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment const previewFeatures = JSON.parse(result.match[1]) if (Array.isArray(previewFeatures) && previewFeatures.length > 0) { return previewFeatures.map((it: string) => it.toLowerCase()) as PreviewFeatures[] } } catch (e) {} return undefined }