@prisma-next/language-server 0.14.0-dev.46 → 0.14.0-dev.48

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["#data","#sourceFile","#rangeOffsets","#intersectsRange","#addMultilineSplitToken","#encode","#first","#previousLine","#previousCharacter"],"sources":["../../src/diagnostic-mapping.ts","../../src/completion-context.ts","../../src/completion-provider.ts","../../src/schema-inputs.ts","../../src/config-resolution.ts","../../src/folding-ranges.ts","../../src/pipeline.ts","../../src/document-diagnostics.ts","../../src/project-artifacts.ts","../../src/semantic-tokens.ts","../../src/server.ts","../../src/start-server.ts"],"sourcesContent":["import type { ParseDiagnostic, Range } from '@prisma-next/psl-parser/syntax';\n\nexport const ParseDiagnosticSeverity = {\n Error: 1,\n Warning: 2,\n Information: 3,\n Hint: 4,\n} as const;\n\nexport interface LspDiagnostic {\n readonly range: Range;\n readonly message: string;\n readonly code: string;\n readonly severity: number;\n}\n\nexport function mapParseDiagnostics(\n diagnostics: readonly ParseDiagnostic[],\n): readonly LspDiagnostic[] {\n return diagnostics.map((diagnostic) => ({\n range: diagnostic.range,\n message: diagnostic.message,\n code: diagnostic.code,\n severity: ParseDiagnosticSeverity.Error,\n }));\n}\n","import {\n AttributeArgListAst,\n any,\n type BracedBlock,\n CompositeTypeDeclarationAst,\n type DocumentAst,\n FieldAttributeAst,\n FieldDeclarationAst,\n GenericBlockDeclarationAst,\n KeyValuePairAst,\n ModelAttributeAst,\n ModelDeclarationAst,\n NamespaceDeclarationAst,\n type Position,\n type QualifiedNameAst,\n type SourceFile,\n type SyntaxNode,\n type SyntaxToken,\n skipTriviaToken,\n type TokenAtOffset,\n TypesBlockAst,\n} from '@prisma-next/psl-parser/syntax';\n\nexport interface ClassifyPslCompletionContextInput {\n readonly document: DocumentAst;\n readonly sourceFile: SourceFile;\n readonly position: Position;\n}\n\nexport interface ModelTypeCompletionContext {\n readonly kind: 'modelType';\n readonly offset: number;\n readonly fieldName: string;\n readonly replacementStartOffset: number;\n}\n\nexport interface SpaceMemberCompletionContext {\n readonly kind: 'spaceMember';\n readonly offset: number;\n readonly fieldName: string;\n readonly replacementStartOffset: number;\n readonly space: string;\n}\n\nexport interface NamespaceMemberCompletionContext {\n readonly kind: 'namespaceMember';\n readonly offset: number;\n readonly fieldName: string;\n readonly replacementStartOffset: number;\n readonly namespace: string;\n readonly space?: string;\n}\n\nexport interface GenericBlockKeyCompletionContext {\n readonly kind: 'genericBlockKey';\n readonly offset: number;\n readonly blockKeyword: string;\n readonly replacementStartOffset: number;\n readonly block: GenericBlockDeclarationAst;\n}\n\nexport interface GenericBlockValueCompletionContext {\n readonly kind: 'genericBlockValue';\n readonly offset: number;\n readonly blockKeyword: string;\n readonly replacementStartOffset: number;\n}\n\nexport type DeclarationKeywordCompletionScope = 'document' | 'namespace';\n\nexport interface DeclarationKeywordCompletionContext {\n readonly kind: 'declarationKeyword';\n readonly offset: number;\n readonly scope: DeclarationKeywordCompletionScope;\n readonly replacementStartOffset: number;\n}\n\nexport interface UnsupportedPslCompletionContext {\n readonly kind: 'unsupported';\n}\n\nexport type PslCompletionContext =\n | DeclarationKeywordCompletionContext\n | GenericBlockKeyCompletionContext\n | GenericBlockValueCompletionContext\n | ModelTypeCompletionContext\n | NamespaceMemberCompletionContext\n | SpaceMemberCompletionContext\n | UnsupportedPslCompletionContext;\n\nconst UNSUPPORTED: UnsupportedPslCompletionContext = { kind: 'unsupported' };\n\nexport function classifyPslCompletionContext(\n input: ClassifyPslCompletionContextInput,\n): PslCompletionContext {\n const root = input.document.syntax;\n const offset = input.sourceFile.offsetAt(input.position);\n const at = root.tokenAtOffset(offset);\n\n // Completion is never offered when the cursor sits inside a comment.\n if (at.leftBiased()?.kind === 'Comment') {\n return UNSUPPORTED;\n }\n\n // The edit replaces the identifier under the cursor, or is empty when the\n // cursor sits in trivia.\n const edit = cursorIdentifier(at, offset);\n\n // Anchor on the significant token preceding the cursor and navigate outward\n // via `token.parent` rather than scanning the whole tree.\n const preceding = precedingToken(at, edit);\n const precedingNode = preceding?.parent;\n const replacementStartOffset = edit?.offset ?? offset;\n\n const declarationKeywordContext = classifyDeclarationKeyword({\n node: precedingNode,\n offset,\n replacementStartOffset,\n });\n if (declarationKeywordContext !== undefined) {\n return declarationKeywordContext;\n }\n\n const genericBlockContext = classifyGenericBlockParameter({\n offset,\n at,\n precedingToken: preceding,\n replacementStartOffset,\n });\n if (genericBlockContext !== undefined) {\n return genericBlockContext;\n }\n\n const field = fieldForTypeSlot(precedingNode);\n if (field === undefined) {\n return UNSUPPORTED;\n }\n if (\n field.syntax.findAncestor(any(ModelDeclarationAst.cast, CompositeTypeDeclarationAst.cast)) ===\n undefined\n ) {\n return UNSUPPORTED;\n }\n\n return classifyModelFieldType({\n field,\n offset,\n replacementStartOffset,\n precedingToken: preceding,\n });\n}\n\n/**\n * Locates the field whose type position the cursor occupies. The preceding token\n * climbs to the field whether the cursor sits inside a present type (the type\n * identifier's predecessor still belongs to the field) or in the empty type slot\n * of a typeless field (whose trailing trivia lives in the enclosing block, so\n * the nearest significant token to the left is the field's own name).\n */\nfunction fieldForTypeSlot(precedingNode: SyntaxNode | undefined): FieldDeclarationAst | undefined {\n return precedingNode?.findAncestor(FieldDeclarationAst.cast);\n}\n\nfunction classifyModelFieldType(input: {\n readonly field: FieldDeclarationAst;\n readonly offset: number;\n readonly replacementStartOffset: number;\n readonly precedingToken: SyntaxToken | undefined;\n}): PslCompletionContext {\n const fieldName = input.field.name();\n if (fieldName === undefined) {\n return UNSUPPORTED;\n }\n const fieldNameText = fieldName.name();\n if (fieldNameText === undefined) {\n return UNSUPPORTED;\n }\n\n if (fieldName.syntax.isInside(input.offset)) {\n return UNSUPPORTED;\n }\n\n const typeAnnotation = input.field.typeAnnotation();\n if (typeAnnotation === undefined) {\n if (\n input.precedingToken !== undefined &&\n fieldName.syntax.isInside(input.precedingToken.offset)\n ) {\n return {\n kind: 'modelType',\n offset: input.offset,\n fieldName: fieldNameText,\n replacementStartOffset: input.offset,\n };\n }\n return UNSUPPORTED;\n }\n\n if (typeAnnotation.syntax.isOutside(input.offset)) {\n return UNSUPPORTED;\n }\n\n const constructorArgList = typeAnnotation.argList();\n if (constructorArgList?.syntax.isInside(input.offset)) {\n return UNSUPPORTED;\n }\n\n const name = typeAnnotation.name();\n if (name === undefined) {\n return UNSUPPORTED;\n }\n if (name.syntax.isOutside(input.offset)) {\n return UNSUPPORTED;\n }\n if (name.isOverQualified()) {\n return UNSUPPORTED;\n }\n\n return classifyTypePosition(name, input.offset, fieldNameText, input.replacementStartOffset);\n}\n\n/**\n * Builds the type-completion context for a qualified name. Roles are read\n * straight off the separator-positional accessors: a populated namespace\n * segment is a `.`-qualified name, a populated space segment is a `:`-qualified\n * name, and the absence of both is a bare model type.\n *\n * Behaviour change: a `:`-qualified name with no `.` (e.g. `supabase:`,\n * `supabase:U`) is a `spaceMember` position rather than falling through to bare\n * model-type completions. A malformed leading-separator name (`:User`, `.User`)\n * carries no populated segment and resolves to `modelType` rather than\n * `unsupported`.\n */\nfunction classifyTypePosition(\n name: QualifiedNameAst,\n offset: number,\n fieldName: string,\n replacementStartOffset: number,\n): ModelTypeCompletionContext | SpaceMemberCompletionContext | NamespaceMemberCompletionContext {\n const namespace = name.namespace()?.name();\n if (namespace !== undefined && namespace.length > 0) {\n const namespaceSpace = name.space()?.name();\n return {\n kind: 'namespaceMember',\n offset,\n fieldName,\n replacementStartOffset,\n namespace,\n ...(namespaceSpace !== undefined && namespaceSpace.length > 0\n ? { space: namespaceSpace }\n : {}),\n };\n }\n const space = name.space()?.name();\n if (space !== undefined && space.length > 0) {\n return { kind: 'spaceMember', offset, fieldName, replacementStartOffset, space };\n }\n return { kind: 'modelType', offset, fieldName, replacementStartOffset };\n}\n\nconst declarationCast = any(\n ModelDeclarationAst.cast,\n CompositeTypeDeclarationAst.cast,\n TypesBlockAst.cast,\n GenericBlockDeclarationAst.cast,\n NamespaceDeclarationAst.cast,\n);\n\ntype DeclarationAst = NonNullable<ReturnType<typeof declarationCast>>;\n\nfunction classifyDeclarationKeyword(input: {\n readonly node: SyntaxNode | undefined;\n readonly offset: number;\n readonly replacementStartOffset: number;\n}): DeclarationKeywordCompletionContext | undefined {\n const precedingDeclaration = input.node?.findAncestor(declarationCast);\n const namespace = input.node?.findAncestor(NamespaceDeclarationAst.cast);\n const inNamespaceBody = blockBodyContainsOffset(namespace, input.offset);\n\n if (\n precedingDeclaration !== undefined &&\n !canCompleteDeclaration(precedingDeclaration, input.offset, inNamespaceBody)\n ) {\n return undefined;\n }\n\n return {\n kind: 'declarationKeyword',\n offset: input.offset,\n scope: inNamespaceBody ? 'namespace' : 'document',\n replacementStartOffset: input.replacementStartOffset,\n };\n}\n\n/**\n * Whether a new declaration can begin at the cursor, given the nearest enclosing\n * declaration. Allowed when that declaration is still nascent (only its keyword\n * typed, no name or body yet), when it is a namespace whose body holds further\n * declarations, or when the cursor sits past its closing `}`.\n */\nfunction canCompleteDeclaration(\n precedingDeclaration: DeclarationAst,\n offset: number,\n inNamespaceBody: boolean,\n): boolean {\n const keywordOnly =\n precedingDeclaration.lbrace() === undefined &&\n (precedingDeclaration instanceof TypesBlockAst || precedingDeclaration.name() === undefined);\n if (keywordOnly) {\n return true;\n }\n if (precedingDeclaration instanceof NamespaceDeclarationAst && inNamespaceBody) {\n return true;\n }\n const rbrace = precedingDeclaration.rbrace();\n return rbrace !== undefined && offset >= rbrace.endOffset;\n}\n\nfunction blockBodyContainsOffset(block: BracedBlock | undefined, offset: number): boolean {\n if (block === undefined) {\n return false;\n }\n const lbrace = block.lbrace();\n if (lbrace === undefined) {\n return false;\n }\n const bodyStart = lbrace.endOffset;\n const bodyEnd = block.rbrace()?.offset ?? block.syntax.endOffset;\n return offset >= bodyStart && offset <= bodyEnd;\n}\n\nfunction classifyGenericBlockParameter(input: {\n readonly offset: number;\n readonly at: TokenAtOffset;\n readonly precedingToken: SyntaxToken | undefined;\n readonly replacementStartOffset: number;\n}): PslCompletionContext | undefined {\n // Whether the cursor sits in a key, value, or attribute slot is a structural\n // question, so it anchors on the cursor's own node — including any in-progress\n // identifier — rather than the edit-skipped `precedingToken` used for gaps.\n const node = input.at.leftBiased()?.parent;\n const block = node?.findAncestor(GenericBlockDeclarationAst.cast);\n if (block === undefined) {\n return undefined;\n }\n\n if (hasUnsupportedAncestor(node)) {\n return UNSUPPORTED;\n }\n\n if (!blockBodyContainsOffset(block, input.offset)) {\n return UNSUPPORTED;\n }\n\n const field = node?.findAncestor(FieldDeclarationAst.cast);\n if (field?.syntax.isInside(input.offset)) {\n return UNSUPPORTED;\n }\n\n const keyword = block.keyword()?.text;\n if (keyword === undefined || keyword.length === 0) {\n return UNSUPPORTED;\n }\n\n // Value position: the cursor follows a `=`. The position is now classified\n // distinctly from keys; populating value candidates is the provider's concern.\n if (input.precedingToken?.kind === 'Equals') {\n return {\n kind: 'genericBlockValue',\n offset: input.offset,\n blockKeyword: keyword,\n replacementStartOffset: input.replacementStartOffset,\n };\n }\n\n const activePair = activeKeyValuePair(node, input.offset);\n if (activePair !== undefined && isAfterEquals(activePair, input.offset)) {\n return UNSUPPORTED;\n }\n\n return {\n kind: 'genericBlockKey',\n offset: input.offset,\n blockKeyword: keyword,\n replacementStartOffset: input.replacementStartOffset,\n block,\n };\n}\n\nfunction activeKeyValuePair(\n node: SyntaxNode | undefined,\n offset: number,\n): KeyValuePairAst | undefined {\n const pair = node?.findAncestor(KeyValuePairAst.cast);\n if (pair === undefined || pair.syntax.isOutside(offset)) {\n return undefined;\n }\n return pair;\n}\n\nfunction isAfterEquals(pair: KeyValuePairAst, offset: number): boolean {\n const equals = pair.equals();\n return equals !== undefined && offset > equals.offset;\n}\n\nfunction hasUnsupportedAncestor(node: SyntaxNode | undefined): boolean {\n return (\n node?.findAncestor(\n any(AttributeArgListAst.cast, FieldAttributeAst.cast, ModelAttributeAst.cast),\n ) !== undefined\n );\n}\n\n/** The significant token preceding the cursor — the in-progress edit identifier\n * is skipped, so the result is the token the classifier anchors on. */\nfunction precedingToken(at: TokenAtOffset, edit: SyntaxToken | undefined): SyntaxToken | undefined {\n const start = edit !== undefined ? edit.prevToken : at.leftBiased();\n return start === undefined ? undefined : skipTriviaToken(start, 'prev');\n}\n\n/** The identifier token the cursor is editing, if any. */\nfunction cursorIdentifier(at: TokenAtOffset, offset: number): SyntaxToken | undefined {\n const right = at.rightBiased();\n if (right?.kind === 'Ident' && offset < right.endOffset) {\n return right;\n }\n const left = at.leftBiased();\n if (left?.kind === 'Ident' && left.endOffset === offset) {\n return left;\n }\n return undefined;\n}\n","import {\n type AuthoringPslBlockDescriptorNamespace,\n isAuthoringPslBlockDescriptor,\n} from '@prisma-next/framework-components/authoring';\nimport {\n findBlockDescriptor,\n type NamespaceSymbol,\n type SymbolTable,\n} from '@prisma-next/psl-parser';\nimport type { GenericBlockDeclarationAst, SourceFile } from '@prisma-next/psl-parser/syntax';\nimport { type CompletionItem, CompletionItemKind, InsertTextFormat } from 'vscode-languageserver';\nimport type {\n DeclarationKeywordCompletionContext,\n GenericBlockKeyCompletionContext,\n ModelTypeCompletionContext,\n NamespaceMemberCompletionContext,\n PslCompletionContext,\n} from './completion-context';\n\nexport interface PslCompletionCandidateSource {\n readonly scalarTypes: readonly string[];\n readonly pslBlockDescriptors: AuthoringPslBlockDescriptorNamespace;\n readonly symbolTable?: SymbolTable;\n}\n\nexport interface ProvidePslCompletionItemsInput {\n readonly context: PslCompletionContext;\n readonly sourceFile: SourceFile;\n readonly candidates: PslCompletionCandidateSource;\n readonly clientSupportsSnippets: boolean;\n}\n\ntype DeclarationKeywordCompletionCandidateCategory = 'native' | 'genericBlock';\n\ntype ModelTypeCompletionCandidateCategory =\n | 'configuredScalar'\n | 'topLevelModel'\n | 'topLevelCompositeType'\n | 'scalar'\n | 'typeAlias'\n | 'namespace'\n | 'namespaceModel'\n | 'namespaceCompositeType';\n\ninterface DeclarationKeywordCompletionCandidate {\n readonly category: DeclarationKeywordCompletionCandidateCategory;\n readonly label: string;\n readonly insertText: string;\n readonly snippetText: string;\n readonly detail: string;\n readonly kind: CompletionItemKind;\n}\n\ninterface ModelTypeCompletionCandidate {\n readonly category: ModelTypeCompletionCandidateCategory;\n readonly label: string;\n readonly insertText: string;\n readonly filterText: string;\n readonly detail: string;\n readonly kind: CompletionItemKind;\n}\n\nconst categoryOrder: Record<ModelTypeCompletionCandidateCategory, number> = {\n configuredScalar: 0,\n topLevelModel: 1,\n topLevelCompositeType: 2,\n scalar: 3,\n typeAlias: 4,\n namespace: 5,\n namespaceModel: 6,\n namespaceCompositeType: 7,\n};\n\nconst declarationKeywordCategoryOrder: Record<\n DeclarationKeywordCompletionCandidateCategory,\n number\n> = {\n native: 0,\n genericBlock: 1,\n};\n\nconst nameSnippetPlaceholder = '$' + '{1:Name}';\nconst namespaceSnippetPlaceholder = '$' + '{1:name}';\n\nconst documentNativeDeclarationKeywords: readonly DeclarationKeywordCompletionCandidate[] = [\n nativeDeclarationKeyword('model', 'model ', `model ${nameSnippetPlaceholder} {\\n $0\\n}`),\n nativeDeclarationKeyword('type', 'type ', `type ${nameSnippetPlaceholder} {\\n $0\\n}`),\n nativeDeclarationKeyword('types', 'types ', 'types {\\n $0\\n}'),\n nativeDeclarationKeyword(\n 'namespace',\n 'namespace ',\n `namespace ${namespaceSnippetPlaceholder} {\\n $0\\n}`,\n ),\n];\n\nconst namespaceNativeDeclarationKeywords: readonly DeclarationKeywordCompletionCandidate[] = [\n nativeDeclarationKeyword('model', 'model ', `model ${nameSnippetPlaceholder} {\\n $0\\n}`),\n nativeDeclarationKeyword('type', 'type ', `type ${nameSnippetPlaceholder} {\\n $0\\n}`),\n];\n\nexport function providePslCompletionItems(\n input: ProvidePslCompletionItemsInput,\n): readonly CompletionItem[] {\n const { context } = input;\n switch (context.kind) {\n case 'unsupported':\n return [];\n // Foreign contract-space members require the multi-input symbol table; no\n // contract-space registry exists today, so this position yields nothing yet.\n case 'spaceMember':\n return [];\n // Parameter-value completion (option allowed-values / ref scopes) is future\n // work.\n case 'genericBlockValue':\n return [];\n case 'declarationKeyword':\n return provideDeclarationKeywordCompletionItems(\n context,\n input.sourceFile,\n input.candidates,\n input.clientSupportsSnippets,\n );\n case 'genericBlockKey':\n return provideGenericBlockKeyCompletionItems(context, input.sourceFile, input.candidates);\n case 'modelType':\n return provideModelTypeCompletionItems(context, input.sourceFile, input.candidates);\n case 'namespaceMember':\n return provideNamespaceMemberCompletionItems(context, input.sourceFile, input.candidates);\n }\n}\n\nfunction provideDeclarationKeywordCompletionItems(\n context: DeclarationKeywordCompletionContext,\n sourceFile: SourceFile,\n source: PslCompletionCandidateSource,\n clientSupportsSnippets: boolean,\n): readonly CompletionItem[] {\n const replacementRange = {\n start: sourceFile.positionAt(context.replacementStartOffset),\n end: sourceFile.positionAt(context.offset),\n };\n\n return declarationKeywordCandidates(context.scope, source).map((candidate) => ({\n label: candidate.label,\n kind: candidate.kind,\n detail: candidate.detail,\n sortText: declarationKeywordSortText(candidate),\n filterText: candidate.label,\n ...(clientSupportsSnippets ? { insertTextFormat: InsertTextFormat.Snippet } : {}),\n textEdit: {\n range: replacementRange,\n newText: clientSupportsSnippets ? candidate.snippetText : candidate.insertText,\n },\n }));\n}\n\nfunction declarationKeywordCandidates(\n scope: DeclarationKeywordCompletionContext['scope'],\n source: PslCompletionCandidateSource,\n): readonly DeclarationKeywordCompletionCandidate[] {\n const nativeCandidates =\n scope === 'namespace' ? namespaceNativeDeclarationKeywords : documentNativeDeclarationKeywords;\n return [\n ...nativeCandidates,\n ...genericBlockDeclarationKeywordCandidates(source.pslBlockDescriptors),\n ];\n}\n\nfunction nativeDeclarationKeyword(\n label: string,\n insertText: string,\n snippetText: string,\n): DeclarationKeywordCompletionCandidate {\n return {\n category: 'native',\n label,\n insertText,\n snippetText,\n detail: 'PSL declaration keyword',\n kind: CompletionItemKind.Keyword,\n };\n}\n\nfunction genericBlockDeclarationKeywordCandidates(\n descriptors: AuthoringPslBlockDescriptorNamespace,\n): readonly DeclarationKeywordCompletionCandidate[] {\n return descriptorBlockKeywords(descriptors).map((keyword) => ({\n category: 'genericBlock',\n label: keyword,\n insertText: `${keyword} `,\n snippetText: `${keyword} ${nameSnippetPlaceholder} {\\n $0\\n}`,\n detail: 'Generic block keyword',\n kind: CompletionItemKind.Keyword,\n }));\n}\n\nfunction descriptorBlockKeywords(\n descriptors: AuthoringPslBlockDescriptorNamespace,\n): readonly string[] {\n const keywords: string[] = [];\n collectDescriptorBlockKeywords(descriptors, keywords);\n return sortedUnique(keywords);\n}\n\nfunction collectDescriptorBlockKeywords(\n descriptors: AuthoringPslBlockDescriptorNamespace,\n keywords: string[],\n): void {\n for (const value of Object.values(descriptors)) {\n if (isAuthoringPslBlockDescriptor(value)) {\n keywords.push(value.keyword);\n continue;\n }\n collectDescriptorBlockKeywords(value, keywords);\n }\n}\n\nfunction declarationKeywordSortText(candidate: DeclarationKeywordCompletionCandidate): string {\n return `${declarationKeywordCategoryOrder[candidate.category]}:${candidate.label}`;\n}\n\nfunction provideGenericBlockKeyCompletionItems(\n context: GenericBlockKeyCompletionContext,\n sourceFile: SourceFile,\n source: PslCompletionCandidateSource,\n): readonly CompletionItem[] {\n const descriptor = findBlockDescriptor(source.pslBlockDescriptors, context.blockKeyword);\n if (descriptor === undefined) {\n return [];\n }\n\n const existing = existingGenericBlockParameterNames(context.block, context.offset);\n const replacementRange = {\n start: sourceFile.positionAt(context.replacementStartOffset),\n end: sourceFile.positionAt(context.offset),\n };\n\n return Object.keys(descriptor.parameters)\n .filter((parameterName) => !existing.has(parameterName))\n .map((parameterName, index) => ({\n label: parameterName,\n kind: CompletionItemKind.Property,\n detail: 'Generic block parameter',\n sortText: genericBlockParameterSortText(index, parameterName),\n filterText: parameterName,\n textEdit: {\n range: replacementRange,\n newText: parameterName,\n },\n }));\n}\n\nfunction existingGenericBlockParameterNames(\n block: GenericBlockDeclarationAst,\n cursorOffset: number,\n): Set<string> {\n const names = new Set<string>();\n for (const entry of block.entries()) {\n if (!entry.syntax.isOutside(cursorOffset)) {\n continue;\n }\n const name = entry.key()?.name();\n if (name !== undefined) {\n names.add(name);\n }\n }\n return names;\n}\n\nfunction provideModelTypeCompletionItems(\n context: ModelTypeCompletionContext,\n sourceFile: SourceFile,\n source: PslCompletionCandidateSource,\n): readonly CompletionItem[] {\n return modelTypeCompletionItems(context, sourceFile, [\n ...configuredScalarCandidates(source.scalarTypes),\n ...topLevelSymbolCandidates(source.symbolTable),\n ...allNamespaceCandidates(source.symbolTable),\n ]);\n}\n\nfunction provideNamespaceMemberCompletionItems(\n context: NamespaceMemberCompletionContext,\n sourceFile: SourceFile,\n source: PslCompletionCandidateSource,\n): readonly CompletionItem[] {\n // A foreign contract-space reference resolves against external symbols that no\n // registry exposes yet; local namespace members must not stand in for them.\n if (context.space !== undefined) {\n return [];\n }\n return modelTypeCompletionItems(\n context,\n sourceFile,\n namespaceCandidates(source.symbolTable?.topLevel.namespaces[context.namespace]),\n );\n}\n\nfunction modelTypeCompletionItems(\n context: ModelTypeCompletionContext | NamespaceMemberCompletionContext,\n sourceFile: SourceFile,\n candidates: readonly ModelTypeCompletionCandidate[],\n): readonly CompletionItem[] {\n const replacementRange = {\n start: sourceFile.positionAt(context.replacementStartOffset),\n end: sourceFile.positionAt(context.offset),\n };\n\n return candidates.map((candidate) => ({\n label: candidate.label,\n kind: candidate.kind,\n detail: candidate.detail,\n sortText: sortText(candidate),\n filterText: candidate.filterText,\n textEdit: {\n range: replacementRange,\n newText: candidate.insertText,\n },\n }));\n}\n\nfunction configuredScalarCandidates(\n scalarTypes: readonly string[],\n): readonly ModelTypeCompletionCandidate[] {\n return sortedUnique(scalarTypes).map((name) => ({\n category: 'configuredScalar',\n label: name,\n insertText: name,\n filterText: name,\n detail: 'Configured scalar type',\n kind: CompletionItemKind.Keyword,\n }));\n}\n\nfunction topLevelSymbolCandidates(\n symbolTable: SymbolTable | undefined,\n): readonly ModelTypeCompletionCandidate[] {\n if (symbolTable === undefined) {\n return [];\n }\n const { topLevel } = symbolTable;\n return [\n ...symbolCandidates(\n recordNames(topLevel.models),\n 'topLevelModel',\n 'Model',\n CompletionItemKind.Class,\n ),\n ...symbolCandidates(\n recordNames(topLevel.compositeTypes),\n 'topLevelCompositeType',\n 'Composite type',\n CompletionItemKind.Struct,\n ),\n ...symbolCandidates(\n recordNames(topLevel.scalars),\n 'scalar',\n 'Scalar type',\n CompletionItemKind.Unit,\n ),\n ...symbolCandidates(\n recordNames(topLevel.typeAliases),\n 'typeAlias',\n 'Type alias',\n CompletionItemKind.Reference,\n ),\n ];\n}\n\nfunction allNamespaceCandidates(\n symbolTable: SymbolTable | undefined,\n): readonly ModelTypeCompletionCandidate[] {\n if (symbolTable === undefined) {\n return [];\n }\n return Object.values(symbolTable.topLevel.namespaces)\n .sort((left, right) => compareNames(left.name, right.name))\n .map(namespaceQualifierCandidate);\n}\n\nfunction namespaceCandidates(\n namespace: NamespaceSymbol | undefined,\n): readonly ModelTypeCompletionCandidate[] {\n if (namespace === undefined) {\n return [];\n }\n return [\n ...symbolCandidates(\n recordNames(namespace.models),\n 'namespaceModel',\n `Model in namespace ${namespace.name}`,\n CompletionItemKind.Class,\n ),\n ...symbolCandidates(\n recordNames(namespace.compositeTypes),\n 'namespaceCompositeType',\n `Composite type in namespace ${namespace.name}`,\n CompletionItemKind.Struct,\n ),\n ];\n}\n\nfunction namespaceQualifierCandidate(namespace: NamespaceSymbol): ModelTypeCompletionCandidate {\n return {\n category: 'namespace',\n label: namespace.name,\n insertText: namespace.name,\n filterText: namespace.name,\n detail: 'Namespace',\n kind: CompletionItemKind.Module,\n };\n}\n\nfunction symbolCandidates(\n names: readonly string[],\n category: ModelTypeCompletionCandidateCategory,\n detail: string,\n kind: CompletionItemKind,\n): readonly ModelTypeCompletionCandidate[] {\n return names.map((name) => ({\n category,\n label: name,\n insertText: name,\n filterText: name,\n detail,\n kind,\n }));\n}\n\nfunction recordNames<T extends { readonly name: string }>(\n record: Record<string, T>,\n): readonly string[] {\n return Object.values(record)\n .map((symbol) => symbol.name)\n .sort(compareNames);\n}\n\nfunction sortedUnique(names: readonly string[]): readonly string[] {\n return [...new Set(names)].sort(compareNames);\n}\n\nfunction sortText(candidate: ModelTypeCompletionCandidate): string {\n return `${categoryOrder[candidate.category]}:${candidate.label}`;\n}\n\nfunction genericBlockParameterSortText(index: number, label: string): string {\n return `${index.toString().padStart(4, '0')}:${label}`;\n}\n\nfunction compareNames(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n","import { pathToFileURL } from 'node:url';\n\nexport interface SchemaInputConfig {\n readonly contract?: {\n readonly source: {\n readonly sourceFormat?: string;\n readonly inputs?: readonly string[];\n };\n };\n}\n\nexport interface SchemaInputSet {\n includes(uri: string): boolean;\n}\n\nexport function hasPslInputs(config: SchemaInputConfig): boolean {\n const source = config.contract?.source;\n return source?.sourceFormat === 'psl' && source.inputs !== undefined;\n}\n\nexport function resolveSchemaInputs(config: SchemaInputConfig): SchemaInputSet {\n const inputs = hasPslInputs(config) ? config.contract?.source.inputs : undefined;\n const uris = new Set(inputs?.map((input) => pathToFileURL(input).toString()));\n\n return {\n includes: (uri) => uris.has(uri),\n };\n}\n\nexport const emptySchemaInputSet: SchemaInputSet = {\n includes: () => false,\n};\n","import { loadConfig, type PrismaNextConfig } from '@prisma-next/config-loader';\nimport { createControlStack } from '@prisma-next/framework-components/control';\nimport type { FormatOptions } from '@prisma-next/psl-parser/format';\nimport type { PipelineInputs } from './pipeline';\nimport { hasPslInputs, resolveSchemaInputs, type SchemaInputSet } from './schema-inputs';\n\nexport const CONFIG_FILENAME = 'prisma-next.config.ts';\n\nexport interface ConfigResolution {\n readonly inputs: SchemaInputSet;\n readonly formatter?: FormatOptions;\n readonly controlStack: PipelineInputs;\n}\n\nconst emptyPipelineInputs: PipelineInputs = {\n scalarTypes: [],\n pslBlockDescriptors: {},\n};\n\nexport async function resolveConfigInputs(configPath: string): Promise<ConfigResolution> {\n const config = await loadConfig(configPath);\n const inputs = resolveSchemaInputs(config);\n const controlStack = resolveControlStackInputs(config) ?? emptyPipelineInputs;\n return config.formatter === undefined\n ? { inputs, controlStack }\n : { inputs, formatter: config.formatter, controlStack };\n}\n\nexport function resolveControlStackInputs(config: PrismaNextConfig): PipelineInputs | undefined {\n if (!hasPslInputs(config)) {\n return undefined;\n }\n const stack = createControlStack(config);\n return {\n scalarTypes: [...stack.scalarTypeDescriptors.keys()],\n pslBlockDescriptors: stack.authoringContributions.pslBlockDescriptors,\n };\n}\n","import {\n type DocumentAst,\n NamespaceDeclarationAst,\n type NamespaceMemberAst,\n type SourceFile,\n type TypesBlockAst,\n} from '@prisma-next/psl-parser/syntax';\nimport { type FoldingRange, FoldingRangeKind } from 'vscode-languageserver';\n\ntype Declaration = NamespaceMemberAst | TypesBlockAst | NamespaceDeclarationAst;\n\n/**\n * Computes folding ranges for block declarations in a PSL document.\n *\n * Block types that produce folding ranges:\n * - model (e.g., `model User { ... }`)\n * - composite type (e.g., `type Address { ... }`)\n * - namespace (e.g., `namespace billing { ... }`)\n * - generic blocks (generator, datasource, extension blocks)\n * - types block (e.g., `types { ... }`)\n *\n * The range spans from the line containing `{` to the line containing `}`.\n */\nexport function computeFoldingRanges(\n document: DocumentAst,\n sourceFile: SourceFile,\n): FoldingRange[] {\n const ranges: FoldingRange[] = [];\n collectFoldingRanges(document, sourceFile, ranges);\n return ranges;\n}\n\nfunction collectFoldingRanges(\n document: DocumentAst,\n sourceFile: SourceFile,\n ranges: FoldingRange[],\n): void {\n for (const declaration of document.declarations()) {\n addFoldingRange(declaration, sourceFile, ranges);\n\n const namespace = NamespaceDeclarationAst.cast(declaration.syntax);\n if (namespace !== undefined) {\n for (const nested of namespace.declarations()) {\n addFoldingRange(nested, sourceFile, ranges);\n }\n }\n }\n}\n\nfunction addFoldingRange(\n declaration: Declaration,\n sourceFile: SourceFile,\n ranges: FoldingRange[],\n): void {\n const lbrace = declaration.lbrace();\n const rbrace = declaration.rbrace();\n\n if (lbrace === undefined || rbrace === undefined) {\n return;\n }\n\n const startLine = sourceFile.positionAt(lbrace.offset).line;\n const endLine = sourceFile.positionAt(rbrace.offset).line;\n\n ranges.push({\n startLine,\n endLine,\n kind: FoldingRangeKind.Region,\n });\n}\n","import type { AuthoringPslBlockDescriptorNamespace } from '@prisma-next/framework-components/authoring';\nimport { buildSymbolTable, type SymbolTable } from '@prisma-next/psl-parser';\nimport { type DocumentAst, parse, type SourceFile } from '@prisma-next/psl-parser/syntax';\nimport { type LspDiagnostic, mapParseDiagnostics } from './diagnostic-mapping';\n\n/**\n * `pslBlockDescriptors` is kept complete on the live path so extension-block\n * validation matches the build; the structural diagnostics (duplicate\n * declaration, invalid qualified type) hold even without descriptors.\n */\nexport interface PipelineInputs {\n readonly scalarTypes: readonly string[];\n readonly pslBlockDescriptors: AuthoringPslBlockDescriptorNamespace;\n}\n\nexport interface PipelineResult {\n readonly document: DocumentAst;\n readonly sourceFile: SourceFile;\n readonly symbolTable: SymbolTable;\n readonly diagnostics: readonly LspDiagnostic[];\n}\n\n/**\n * Composes the stages exactly as the contract-psl provider does, so the editor\n * and the build agree: `parse` then `buildSymbolTable`, parse diagnostics ahead\n * of symbol-table diagnostics. Never throws on malformed input — `parse`\n * recovers and `buildSymbolTable` is documented not to throw.\n */\nexport function runPipeline(text: string, inputs: PipelineInputs): PipelineResult {\n const { document, sourceFile, diagnostics: parseDiagnostics } = parse(text);\n const { table: symbolTable, diagnostics: symbolTableDiagnostics } = buildSymbolTable({\n document,\n sourceFile,\n scalarTypes: inputs.scalarTypes,\n pslBlockDescriptors: inputs.pslBlockDescriptors,\n });\n\n return {\n document,\n sourceFile,\n symbolTable,\n diagnostics: mapParseDiagnostics([...parseDiagnostics, ...symbolTableDiagnostics]),\n };\n}\n","import type { SymbolTable } from '@prisma-next/psl-parser';\nimport type { DocumentAst, SourceFile } from '@prisma-next/psl-parser/syntax';\nimport type { LspDiagnostic } from './diagnostic-mapping';\nimport { type PipelineInputs, runPipeline } from './pipeline';\nimport type { SchemaInputSet } from './schema-inputs';\n\nexport interface DocumentDiagnostics {\n readonly diagnostics: readonly LspDiagnostic[];\n readonly document: DocumentAst;\n readonly sourceFile: SourceFile;\n readonly symbolTable: SymbolTable;\n}\n\n/**\n * `null` (not a configured input) is distinct from a `DocumentDiagnostics` whose\n * `diagnostics` are `[]` (an input that parsed clean): the caller treats both as\n * \"publish no diagnostics\", but only the latter is a document we own and keep\n * diagnosing.\n */\nexport function computeDocumentDiagnostics(\n uri: string,\n text: string,\n inputs: SchemaInputSet,\n controlStack: PipelineInputs,\n): DocumentDiagnostics | null {\n if (!inputs.includes(uri)) {\n return null;\n }\n const { document, sourceFile, symbolTable, diagnostics } = runPipeline(text, controlStack);\n return { diagnostics, document, sourceFile, symbolTable };\n}\n","import type { SymbolTable } from '@prisma-next/psl-parser';\nimport type { DocumentAst, SourceFile } from '@prisma-next/psl-parser/syntax';\nimport type { LspDiagnostic } from './diagnostic-mapping';\nimport { computeDocumentDiagnostics } from './document-diagnostics';\nimport type { PipelineInputs } from './pipeline';\nimport type { SchemaInputSet } from './schema-inputs';\n\nexport interface CachedDocument {\n readonly document: DocumentAst;\n readonly sourceFile: SourceFile;\n readonly text: string;\n}\n\nexport interface ProjectArtifacts {\n getDocument(uri: string): CachedDocument | undefined;\n getSymbolTable(): SymbolTable | undefined;\n update(\n uri: string,\n text: string,\n inputs: SchemaInputSet,\n controlStack: PipelineInputs,\n ): readonly LspDiagnostic[] | null;\n remove(uri: string): void;\n}\n\nexport function createProjectArtifacts(): ProjectArtifacts {\n const documents = new Map<string, CachedDocument>();\n let symbolTable: SymbolTable | undefined;\n\n return {\n getDocument: (uri) => documents.get(uri),\n getSymbolTable: () => symbolTable,\n update: (uri, text, inputs, controlStack) => {\n const computed = computeDocumentDiagnostics(uri, text, inputs, controlStack);\n if (computed === null) {\n if (documents.delete(uri)) {\n symbolTable = undefined;\n }\n return null;\n }\n documents.set(uri, {\n document: computed.document,\n sourceFile: computed.sourceFile,\n text,\n });\n // One symbol table per project. Single-input reality: it is (re)built from\n // the one open configured input on every edit. Merging several open inputs\n // into one project table — and reading unopened `inputs` from disk — is the\n // deferred cross-file work; `buildSymbolTable`'s single-document signature\n // is left untouched for it.\n symbolTable = computed.symbolTable;\n return computed.diagnostics;\n },\n remove: (uri) => {\n if (documents.delete(uri)) {\n symbolTable = undefined;\n }\n },\n };\n}\n","import type { SymbolTable } from '@prisma-next/psl-parser';\nimport {\n ArrayLiteralAst,\n type AttributeArgAst,\n type AttributeArgListAst,\n type AttributeAst,\n type BlockMemberAst,\n BooleanLiteralExprAst,\n CompositeTypeDeclarationAst,\n type DeclarationAst,\n type DocumentAst,\n type ExpressionAst,\n FieldDeclarationAst,\n FunctionCallAst,\n filterChildren,\n findChildToken,\n type GenericBlockMemberAst,\n IdentifierAst,\n ModelDeclarationAst,\n type NamedTypeDeclarationAst,\n NamespaceDeclarationAst,\n NumberLiteralExprAst,\n ObjectLiteralExprAst,\n type QualifiedNameAst,\n type SourceFile,\n StringLiteralExprAst,\n type SyntaxToken,\n type TypeAnnotationAst,\n TypesBlockAst,\n} from '@prisma-next/psl-parser/syntax';\nimport {\n type Range,\n SemanticTokenModifiers,\n type SemanticTokens,\n type SemanticTokensLegend,\n SemanticTokenTypes,\n} from 'vscode-languageserver';\n\nexport type SemanticTokenType =\n | 'keyword'\n | 'namespace'\n | 'class'\n | 'struct'\n | 'type'\n | 'property'\n | 'decorator'\n | 'string'\n | 'number'\n | 'comment';\n\nexport type SemanticTokenModifier = 'declaration' | 'defaultLibrary';\n\nexport const semanticTokenTypes: readonly SemanticTokenType[] = [\n SemanticTokenTypes.keyword,\n SemanticTokenTypes.namespace,\n SemanticTokenTypes.class,\n SemanticTokenTypes.struct,\n SemanticTokenTypes.type,\n SemanticTokenTypes.property,\n SemanticTokenTypes.decorator,\n SemanticTokenTypes.string,\n SemanticTokenTypes.number,\n SemanticTokenTypes.comment,\n];\n\nexport const semanticTokenModifiers = [\n SemanticTokenModifiers.declaration,\n SemanticTokenModifiers.defaultLibrary,\n] as const satisfies readonly SemanticTokenModifier[];\n\nexport const semanticTokenModifierIndexes = {\n declaration: 0,\n defaultLibrary: 1,\n} as const satisfies Record<SemanticTokenModifier, number>;\n\nexport const semanticTokenModifierBits = {\n declaration: 1 << semanticTokenModifierIndexes.declaration,\n defaultLibrary: 1 << semanticTokenModifierIndexes.defaultLibrary,\n} as const satisfies Record<SemanticTokenModifier, number>;\n\nexport const semanticTokensLegend: SemanticTokensLegend = {\n tokenTypes: [...semanticTokenTypes],\n tokenModifiers: [...semanticTokenModifiers],\n};\n\nexport interface SemanticTokenSource {\n readonly document: DocumentAst;\n readonly sourceFile: SourceFile;\n readonly symbolTable: SymbolTable | undefined;\n readonly scalarTypes: readonly string[];\n}\n\nexport interface PendingSemanticToken {\n readonly startOffset: number;\n readonly endOffset: number;\n readonly tokenTypeIndex: number;\n readonly modifierBitset: number;\n readonly splitMultiline: boolean;\n}\n\ntype TypeReferenceKind = 'class' | 'struct' | 'type';\n\ninterface TypeReferenceClassification {\n readonly tokenType: TypeReferenceKind;\n readonly modifierBitset?: number;\n}\n\ninterface IdentifierSegment {\n readonly identifier: IdentifierAst;\n readonly text: string;\n}\n\ninterface ExpressionContext {\n readonly bareIdentifierTokenType?: SemanticTokenType;\n}\n\nexport function buildSemanticTokens(source: SemanticTokenSource, range?: Range): SemanticTokens {\n const builder = new SemanticTokensBuilder(source.sourceFile, range);\n for (const token of collectSemanticTokenEvents(source)) {\n builder.add(token);\n }\n return builder.build();\n}\n\nexport function collectSemanticTokenEvents(\n source: SemanticTokenSource,\n): readonly PendingSemanticToken[] {\n const comments = collectCommentTokens(source.document);\n const tokens: PendingSemanticToken[] = [];\n collectDeclarations(source, tokens);\n return mergeSourceOrderedTokens(comments, tokens);\n}\n\nexport class SemanticTokensBuilder {\n readonly #data: number[] = [];\n readonly #sourceFile: SourceFile;\n readonly #rangeOffsets: { readonly lower: number; readonly upper: number } | undefined;\n #previousLine = 0;\n #previousCharacter = 0;\n #first = true;\n\n constructor(sourceFile: SourceFile, range?: Range) {\n this.#sourceFile = sourceFile;\n if (range !== undefined) {\n const startOffset = sourceFile.offsetAt(range.start);\n const endOffset = sourceFile.offsetAt(range.end);\n this.#rangeOffsets = {\n lower: Math.min(startOffset, endOffset),\n upper: Math.max(startOffset, endOffset),\n };\n }\n }\n\n add(token: PendingSemanticToken): void {\n if (!this.#intersectsRange(token.startOffset, token.endOffset)) {\n return;\n }\n\n if (token.splitMultiline) {\n this.#addMultilineSplitToken(token);\n return;\n }\n\n this.#encode(token.startOffset, token.endOffset, token.tokenTypeIndex, token.modifierBitset);\n }\n\n build(): SemanticTokens {\n return { data: this.#data };\n }\n\n #intersectsRange(startOffset: number, endOffset: number): boolean {\n const rangeOffsets = this.#rangeOffsets;\n return (\n rangeOffsets === undefined ||\n (startOffset < rangeOffsets.upper && endOffset > rangeOffsets.lower)\n );\n }\n\n #addMultilineSplitToken(token: PendingSemanticToken): void {\n const start = this.#sourceFile.positionAt(token.startOffset);\n const end = this.#sourceFile.positionAt(token.endOffset);\n if (start.line === end.line) {\n this.#encode(token.startOffset, token.endOffset, token.tokenTypeIndex, token.modifierBitset);\n return;\n }\n\n for (let line = start.line; line <= end.line; line++) {\n const startOffset =\n line === start.line ? token.startOffset : this.#sourceFile.lineStartOffset(line);\n const endOffset = line === end.line ? token.endOffset : this.#sourceFile.lineEndOffset(line);\n if (endOffset > startOffset && this.#intersectsRange(startOffset, endOffset)) {\n this.#encode(startOffset, endOffset, token.tokenTypeIndex, token.modifierBitset);\n }\n }\n }\n\n #encode(\n startOffset: number,\n endOffset: number,\n tokenTypeIndex: number,\n modifierBitset: number,\n ): void {\n const start = this.#sourceFile.positionAt(startOffset);\n const deltaLine = this.#first ? start.line : start.line - this.#previousLine;\n const deltaStart =\n this.#first || deltaLine !== 0 ? start.character : start.character - this.#previousCharacter;\n this.#data.push(deltaLine, deltaStart, endOffset - startOffset, tokenTypeIndex, modifierBitset);\n this.#previousLine = start.line;\n this.#previousCharacter = start.character;\n this.#first = false;\n }\n}\n\nfunction collectCommentTokens(document: DocumentAst): readonly PendingSemanticToken[] {\n const tokens: PendingSemanticToken[] = [];\n for (const token of document.syntax.tokens()) {\n if (token.kind === 'Comment') {\n tokens.push(pendingTokenForToken(token, 'comment'));\n }\n }\n return tokens;\n}\n\nfunction collectDeclarations(source: SemanticTokenSource, tokens: PendingSemanticToken[]): void {\n for (const declaration of source.document.declarations()) {\n collectDeclaration(declaration, source, tokens, undefined);\n }\n}\n\nfunction collectDeclaration(\n declaration: DeclarationAst,\n source: SemanticTokenSource,\n tokens: PendingSemanticToken[],\n namespace: string | undefined,\n): void {\n if (declaration instanceof ModelDeclarationAst) {\n addToken(declaration.keyword(), 'keyword', tokens);\n addIdentifier(declaration.name(), 'class', tokens, semanticTokenModifierBits.declaration);\n collectBlockMembers(declaration.members(), source, tokens, namespace);\n return;\n }\n\n if (declaration instanceof CompositeTypeDeclarationAst) {\n addToken(declaration.keyword(), 'keyword', tokens);\n addIdentifier(declaration.name(), 'struct', tokens, semanticTokenModifierBits.declaration);\n collectBlockMembers(declaration.members(), source, tokens, namespace);\n return;\n }\n\n if (declaration instanceof NamespaceDeclarationAst) {\n addToken(declaration.keyword(), 'keyword', tokens);\n addIdentifier(declaration.name(), 'namespace', tokens, semanticTokenModifierBits.declaration);\n const nestedNamespace = declaration.name()?.name();\n for (const nested of declaration.declarations()) {\n collectDeclaration(nested, source, tokens, nestedNamespace);\n }\n return;\n }\n\n if (declaration instanceof TypesBlockAst) {\n addToken(declaration.keyword(), 'keyword', tokens);\n for (const namedType of declaration.declarations()) {\n collectNamedTypeDeclaration(namedType, source, tokens, namespace);\n }\n return;\n }\n\n addToken(declaration.keyword(), 'keyword', tokens);\n addIdentifier(declaration.name(), 'type', tokens, semanticTokenModifierBits.declaration);\n collectGenericBlockMembers(declaration.members(), source, tokens, namespace);\n}\n\nfunction collectNamedTypeDeclaration(\n declaration: NamedTypeDeclarationAst,\n source: SemanticTokenSource,\n tokens: PendingSemanticToken[],\n namespace: string | undefined,\n): void {\n addIdentifier(declaration.name(), 'type', tokens, semanticTokenModifierBits.declaration);\n collectTypeAnnotation(declaration.typeAnnotation(), source, tokens, namespace);\n collectAttributes(declaration.attributes(), source, tokens, namespace);\n}\n\nfunction collectGenericBlockMembers(\n members: Iterable<GenericBlockMemberAst>,\n source: SemanticTokenSource,\n tokens: PendingSemanticToken[],\n namespace: string | undefined,\n): void {\n for (const member of members) {\n if ('key' in member) {\n addIdentifier(member.key(), 'property', tokens);\n collectExpression(member.value(), source, tokens, namespace);\n continue;\n }\n collectAttribute(member, source, tokens, namespace);\n }\n}\n\nfunction collectBlockMembers(\n members: Iterable<BlockMemberAst>,\n source: SemanticTokenSource,\n tokens: PendingSemanticToken[],\n namespace: string | undefined,\n): void {\n for (const member of members) {\n if (member instanceof FieldDeclarationAst) {\n collectField(member, source, tokens, namespace);\n continue;\n }\n collectAttribute(member, source, tokens, namespace);\n }\n}\n\nfunction collectField(\n field: FieldDeclarationAst,\n source: SemanticTokenSource,\n tokens: PendingSemanticToken[],\n namespace: string | undefined,\n): void {\n addIdentifier(field.name(), 'property', tokens, semanticTokenModifierBits.declaration);\n collectTypeAnnotation(field.typeAnnotation(), source, tokens, namespace);\n collectAttributes(field.attributes(), source, tokens, namespace);\n}\n\nfunction collectTypeAnnotation(\n annotation: TypeAnnotationAst | undefined,\n source: SemanticTokenSource,\n tokens: PendingSemanticToken[],\n namespace: string | undefined,\n): void {\n if (annotation === undefined) {\n return;\n }\n collectTypeReference(annotation.name(), source, tokens, namespace);\n collectAttributeArgList(annotation.argList(), source, tokens, namespace);\n}\n\nfunction collectAttributes(\n attributes: Iterable<AttributeAst>,\n source: SemanticTokenSource,\n tokens: PendingSemanticToken[],\n namespace: string | undefined,\n): void {\n for (const attribute of attributes) {\n collectAttribute(attribute, source, tokens, namespace);\n }\n}\n\nfunction collectAttribute(\n attribute: AttributeAst,\n source: SemanticTokenSource,\n tokens: PendingSemanticToken[],\n namespace: string | undefined,\n): void {\n const marker =\n findChildToken(attribute.syntax, 'At') ?? findChildToken(attribute.syntax, 'DoubleAt');\n collectDecoratorName(attribute.name(), marker, tokens);\n collectAttributeArgList(attribute.argList(), source, tokens, namespace);\n}\n\nfunction collectDecoratorName(\n name: QualifiedNameAst | undefined,\n marker: SyntaxToken | undefined,\n tokens: PendingSemanticToken[],\n): void {\n if (name === undefined) {\n return;\n }\n const segments = identifierSegments(name);\n for (const [index, segment] of segments.entries()) {\n tokens.push(rangeForDecoratorIdentifier(segment.identifier, index === 0 ? marker : undefined));\n }\n}\n\nfunction collectAttributeArgList(\n argList: AttributeArgListAst | undefined,\n source: SemanticTokenSource,\n tokens: PendingSemanticToken[],\n namespace: string | undefined,\n): void {\n if (argList === undefined) {\n return;\n }\n for (const arg of argList.args()) {\n collectAttributeArg(arg, source, tokens, namespace);\n }\n}\n\nfunction collectAttributeArg(\n arg: AttributeArgAst,\n source: SemanticTokenSource,\n tokens: PendingSemanticToken[],\n namespace: string | undefined,\n): void {\n const name = arg.name();\n addIdentifier(name, 'property', tokens);\n collectExpression(arg.value(), source, tokens, namespace, expressionContextForAttributeArg(name));\n}\n\nfunction collectExpression(\n expression: ExpressionAst | undefined,\n source: SemanticTokenSource,\n tokens: PendingSemanticToken[],\n namespace: string | undefined,\n context: ExpressionContext = {},\n): void {\n if (expression === undefined) {\n return;\n }\n\n if (expression instanceof StringLiteralExprAst) {\n addToken(expression.token(), 'string', tokens);\n return;\n }\n\n if (expression instanceof NumberLiteralExprAst) {\n addToken(expression.token(), 'number', tokens);\n return;\n }\n\n if (expression instanceof BooleanLiteralExprAst) {\n addToken(expression.token(), 'keyword', tokens);\n return;\n }\n\n if (expression instanceof FunctionCallAst) {\n collectTypeReference(expression.name(), source, tokens, namespace);\n for (const arg of expression.args()) {\n collectAttributeArg(arg, source, tokens, namespace);\n }\n return;\n }\n\n if (expression instanceof ArrayLiteralAst) {\n for (const element of expression.elements()) {\n collectExpression(element, source, tokens, namespace, context);\n }\n return;\n }\n\n if (expression instanceof ObjectLiteralExprAst) {\n for (const field of expression.fields()) {\n addIdentifier(field.key(), 'property', tokens);\n collectExpression(field.value(), source, tokens, namespace);\n }\n return;\n }\n\n collectIdentifierExpression(expression, source, tokens, namespace, context);\n}\n\nfunction collectIdentifierExpression(\n identifier: IdentifierAst,\n source: SemanticTokenSource,\n tokens: PendingSemanticToken[],\n namespace: string | undefined,\n context: ExpressionContext,\n): void {\n const text = identifier.name();\n if (text === undefined) {\n return;\n }\n const bareIdentifierTokenType = context.bareIdentifierTokenType;\n if (bareIdentifierTokenType !== undefined) {\n tokens.push(rangeForIdentifier(identifier, bareIdentifierTokenType));\n return;\n }\n const classification = classifyTypeReference([text], source, namespace);\n tokens.push(\n rangeForIdentifier(identifier, classification.tokenType, classification.modifierBitset),\n );\n}\n\nfunction expressionContextForAttributeArg(name: IdentifierAst | undefined): ExpressionContext {\n const argName = name?.name();\n return argName === 'fields' || argName === 'references'\n ? { bareIdentifierTokenType: 'property' }\n : {};\n}\n\nfunction collectTypeReference(\n name: QualifiedNameAst | undefined,\n source: SemanticTokenSource,\n tokens: PendingSemanticToken[],\n namespace: string | undefined,\n): void {\n if (name === undefined) {\n return;\n }\n\n const segments = identifierSegments(name);\n if (segments.length === 0) {\n return;\n }\n\n const path = segments.map((segment) => segment.text);\n for (const segment of segments.slice(0, -1)) {\n if (isKnownNamespace(segment.text, source.symbolTable)) {\n tokens.push(rangeForIdentifier(segment.identifier, 'namespace'));\n }\n }\n\n const finalSegment = segments[segments.length - 1];\n if (finalSegment === undefined) {\n return;\n }\n const classification = classifyTypeReference(path, source, namespace);\n tokens.push(\n rangeForIdentifier(\n finalSegment.identifier,\n classification.tokenType,\n classification.modifierBitset,\n ),\n );\n}\n\nfunction classifyTypeReference(\n path: readonly string[],\n source: SemanticTokenSource,\n namespace: string | undefined,\n): TypeReferenceClassification {\n const name = path[path.length - 1];\n if (name === undefined) {\n return { tokenType: 'type' };\n }\n\n const table = source.symbolTable;\n const namespaceName = path.length > 1 ? path[path.length - 2] : namespace;\n const namespaceScope =\n namespaceName !== undefined ? table?.topLevel.namespaces[namespaceName] : undefined;\n\n if (namespaceScope !== undefined) {\n if (Object.hasOwn(namespaceScope.models, name)) {\n return { tokenType: 'class' };\n }\n if (Object.hasOwn(namespaceScope.compositeTypes, name)) {\n return { tokenType: 'struct' };\n }\n if (Object.hasOwn(namespaceScope.blocks, name)) {\n return { tokenType: 'type' };\n }\n }\n\n if (table !== undefined) {\n if (Object.hasOwn(table.topLevel.models, name)) {\n return { tokenType: 'class' };\n }\n if (Object.hasOwn(table.topLevel.compositeTypes, name)) {\n return { tokenType: 'struct' };\n }\n if (Object.hasOwn(table.topLevel.scalars, name)) {\n return { tokenType: 'type', modifierBitset: semanticTokenModifierBits.defaultLibrary };\n }\n if (\n Object.hasOwn(table.topLevel.typeAliases, name) ||\n Object.hasOwn(table.topLevel.blocks, name)\n ) {\n return { tokenType: 'type' };\n }\n }\n\n if (source.scalarTypes.includes(name)) {\n return { tokenType: 'type', modifierBitset: semanticTokenModifierBits.defaultLibrary };\n }\n\n return { tokenType: 'type' };\n}\n\nfunction isKnownNamespace(name: string, table: SymbolTable | undefined): boolean {\n return table !== undefined && Object.hasOwn(table.topLevel.namespaces, name);\n}\n\nfunction identifierSegments(name: QualifiedNameAst): readonly IdentifierSegment[] {\n const segments: IdentifierSegment[] = [];\n for (const identifier of filterChildren(name.syntax, IdentifierAst.cast)) {\n const text = identifier.name();\n if (text !== undefined) {\n segments.push({ identifier, text });\n }\n }\n return segments;\n}\n\nfunction addIdentifier(\n identifier: IdentifierAst | undefined,\n tokenType: SemanticTokenType,\n tokens: PendingSemanticToken[],\n modifierBitset = 0,\n): void {\n if (identifier === undefined) {\n return;\n }\n tokens.push(rangeForIdentifier(identifier, tokenType, modifierBitset));\n}\n\nfunction addToken(\n token: SyntaxToken | undefined,\n tokenType: SemanticTokenType,\n tokens: PendingSemanticToken[],\n modifierBitset = 0,\n): void {\n if (token === undefined) {\n return;\n }\n tokens.push(pendingTokenForToken(token, tokenType, modifierBitset));\n}\n\nfunction rangeForIdentifier(\n identifier: IdentifierAst,\n tokenType: SemanticTokenType,\n modifierBitset = 0,\n): PendingSemanticToken {\n const token = identifier.token();\n if (token === undefined) {\n return createPendingSemanticToken(\n identifier.syntax.offset,\n identifier.syntax.offset,\n tokenType,\n modifierBitset,\n );\n }\n return pendingTokenForToken(token, tokenType, modifierBitset);\n}\n\nfunction rangeForDecoratorIdentifier(\n identifier: IdentifierAst,\n marker: SyntaxToken | undefined,\n): PendingSemanticToken {\n const range = rangeForIdentifier(identifier, 'decorator');\n if (marker === undefined || marker.offset >= range.startOffset) {\n return range;\n }\n return createPendingSemanticToken(\n marker.offset,\n range.endOffset,\n 'decorator',\n range.modifierBitset,\n );\n}\n\nfunction pendingTokenForToken(\n token: SyntaxToken,\n tokenType: SemanticTokenType,\n modifierBitset = 0,\n): PendingSemanticToken {\n return createPendingSemanticToken(\n token.offset,\n token.offset + token.text.length,\n tokenType,\n modifierBitset,\n );\n}\n\nfunction mergeSourceOrderedTokens(\n left: readonly PendingSemanticToken[],\n right: readonly PendingSemanticToken[],\n): readonly PendingSemanticToken[] {\n const result: PendingSemanticToken[] = [];\n let leftIndex = 0;\n let rightIndex = 0;\n\n while (leftIndex < left.length || rightIndex < right.length) {\n const leftToken = left[leftIndex];\n const rightToken = right[rightIndex];\n if (\n leftToken !== undefined &&\n (rightToken === undefined || leftToken.startOffset <= rightToken.startOffset)\n ) {\n result.push(leftToken);\n leftIndex++;\n } else if (rightToken !== undefined) {\n result.push(rightToken);\n rightIndex++;\n }\n }\n\n return result;\n}\n\nfunction createPendingSemanticToken(\n startOffset: number,\n endOffset: number,\n tokenType: SemanticTokenType,\n modifierBitset = 0,\n): PendingSemanticToken {\n return {\n startOffset,\n endOffset,\n tokenTypeIndex: tokenTypeIndex(tokenType),\n modifierBitset,\n splitMultiline: tokenType === 'string' || tokenType === 'comment',\n };\n}\n\nfunction tokenTypeIndex(tokenType: SemanticTokenType): number {\n return semanticTokenTypes.indexOf(tokenType);\n}\n","import { join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { findNearestConfigPathForFile } from '@prisma-next/config-loader';\nimport type { SymbolTable } from '@prisma-next/psl-parser';\nimport { type FormatOptions, format } from '@prisma-next/psl-parser/format';\nimport {\n type CompletionItem,\n type Connection,\n type Diagnostic,\n DiagnosticSeverity,\n DidChangeWatchedFilesNotification,\n type FoldingRange,\n type InitializeParams,\n type InitializeResult,\n type Position,\n type PublishDiagnosticsParams,\n type Range,\n RegistrationRequest,\n type SemanticTokens,\n TextDocumentSyncKind,\n TextDocuments,\n type TextEdit,\n} from 'vscode-languageserver';\nimport { TextDocument } from 'vscode-languageserver-textdocument';\nimport { classifyPslCompletionContext } from './completion-context';\nimport { providePslCompletionItems } from './completion-provider';\nimport { CONFIG_FILENAME, resolveConfigInputs } from './config-resolution';\nimport { ParseDiagnosticSeverity } from './diagnostic-mapping';\nimport { computeFoldingRanges } from './folding-ranges';\nimport type { PipelineInputs } from './pipeline';\nimport {\n type CachedDocument,\n createProjectArtifacts,\n type ProjectArtifacts,\n} from './project-artifacts';\nimport type { SchemaInputSet } from './schema-inputs';\nimport { buildSemanticTokens, semanticTokensLegend } from './semantic-tokens';\n\nexport interface LanguageServer {\n dispose(): void;\n /**\n * Exposed for future features (completion, semantic tokens); nothing consumes\n * them yet.\n */\n getDocumentAst(uri: string): CachedDocument | undefined;\n getProjectSymbolTable(uri: string): SymbolTable | undefined;\n}\n\ninterface ProjectState {\n readonly configPath: string;\n readonly inputs: SchemaInputSet;\n readonly formatter?: FormatOptions;\n /**\n * Resolved once per config and refreshed by the config-watch path — never\n * rebuilt per document.\n */\n readonly controlStack: PipelineInputs;\n readonly artifacts: ProjectArtifacts;\n}\n\nconst semanticTokenSourceLimit = 100_000;\n\nexport function createServer(connection: Connection): LanguageServer {\n const documents = new TextDocuments(TextDocument);\n const projects = new Map<string, ProjectState>();\n const projectLoads = new Map<string, Promise<ProjectState>>();\n const documentConfigPaths = new Map<string, string>();\n let rootPath = process.cwd();\n let watchedConfigGlob = join(rootPath, '**', CONFIG_FILENAME);\n let supportsWatchedFilesRegistration = false;\n let clientSupportsSnippets = false;\n let disposed = false;\n\n function sendDiagnostics(params: PublishDiagnosticsParams): void {\n if (disposed) {\n return;\n }\n void connection.sendDiagnostics(params);\n }\n\n function logWarn(message: string): void {\n if (disposed) {\n return;\n }\n connection.console.warn(message);\n }\n\n async function publish(uri: string): Promise<void> {\n const project = await resolveProjectForDocument(uri);\n if (project === undefined) {\n return;\n }\n const document = documents.get(uri);\n if (document === undefined) {\n documentConfigPaths.delete(uri);\n return;\n }\n const computed = project.artifacts.update(\n uri,\n document.getText(),\n project.inputs,\n project.controlStack,\n );\n if (computed === null) {\n sendDiagnostics({ uri, diagnostics: [] });\n return;\n }\n const diagnostics: Diagnostic[] = computed.map((diagnostic) => ({\n range: diagnostic.range,\n message: diagnostic.message,\n code: diagnostic.code,\n severity: toLspSeverity(diagnostic.severity),\n source: 'prisma-next',\n }));\n sendDiagnostics({ uri, diagnostics });\n }\n\n async function resolveProjectForDocument(uri: string): Promise<ProjectState | undefined> {\n const knownConfigPath = documentConfigPaths.get(uri);\n if (knownConfigPath !== undefined) {\n const project = await resolveProjectIfLoadable(knownConfigPath);\n if (project === undefined) {\n documentConfigPaths.delete(uri);\n }\n return project;\n }\n\n const filePath = filePathFromUri(uri);\n if (filePath === undefined) {\n return undefined;\n }\n\n const configPath = await findNearestConfigPathForFile(filePath);\n if (configPath === undefined) {\n return undefined;\n }\n\n documentConfigPaths.set(uri, configPath);\n const project = await resolveProjectIfLoadable(configPath);\n if (project === undefined) {\n documentConfigPaths.delete(uri);\n }\n return project;\n }\n\n async function resolveProjectIfLoadable(configPath: string): Promise<ProjectState | undefined> {\n try {\n return await resolveProject(configPath);\n } catch {\n stopManagingProject(configPath);\n return undefined;\n }\n }\n\n async function resolveProject(configPath: string): Promise<ProjectState> {\n const existing = projects.get(configPath);\n if (existing !== undefined) {\n return existing;\n }\n const existingLoad = projectLoads.get(configPath);\n if (existingLoad !== undefined) {\n return existingLoad;\n }\n return queueProjectLoad(configPath);\n }\n\n function refreshProject(configPath: string): Promise<ProjectState> {\n return queueProjectLoad(configPath);\n }\n\n function queueProjectLoad(configPath: string): Promise<ProjectState> {\n const previousLoad = projectLoads.get(configPath) ?? Promise.resolve();\n const load = previousLoad\n .catch(() => undefined)\n .then(() => loadProject(configPath))\n .finally(() => {\n if (projectLoads.get(configPath) === load) {\n projectLoads.delete(configPath);\n }\n });\n projectLoads.set(configPath, load);\n return load;\n }\n\n async function loadProject(configPath: string): Promise<ProjectState> {\n const resolution = await resolveConfigInputs(configPath);\n // Preserve open-document ASTs across config reloads; the project symbol table\n // refreshes on the next publish against the new stack.\n const artifacts = projects.get(configPath)?.artifacts ?? createProjectArtifacts();\n const project: ProjectState =\n resolution.formatter === undefined\n ? {\n configPath,\n inputs: resolution.inputs,\n controlStack: resolution.controlStack,\n artifacts,\n }\n : {\n configPath,\n inputs: resolution.inputs,\n formatter: resolution.formatter,\n controlStack: resolution.controlStack,\n artifacts,\n };\n projects.set(configPath, project);\n return project;\n }\n\n function stopManagingProject(configPath: string): void {\n const hadProject = projects.delete(configPath);\n for (const document of documents.all()) {\n if (documentConfigPaths.get(document.uri) === configPath) {\n documentConfigPaths.delete(document.uri);\n if (hadProject) {\n sendDiagnostics({ uri: document.uri, diagnostics: [] });\n }\n }\n }\n }\n\n async function republishOpenDocumentsForConfig(configPath: string): Promise<void> {\n for (const document of documents.all()) {\n const knownConfigPath = documentConfigPaths.get(document.uri);\n if (knownConfigPath === configPath) {\n await publish(document.uri);\n continue;\n }\n\n const filePath = filePathFromUri(document.uri);\n if (filePath === undefined) {\n continue;\n }\n const nearestConfigPath = await findNearestConfigPathForFile(filePath);\n if (nearestConfigPath === configPath) {\n documentConfigPaths.set(document.uri, configPath);\n await publish(document.uri);\n }\n }\n }\n\n function publishSafely(uri: string): void {\n void publish(uri).catch((error: unknown) => {\n if (disposed) {\n return;\n }\n connection.console.error(error instanceof Error ? error.message : String(error));\n });\n }\n\n async function formatDocument(uri: string): Promise<TextEdit[]> {\n const document = documents.get(uri);\n if (document === undefined) {\n return [];\n }\n\n let project: ProjectState | undefined;\n try {\n project = await resolveProjectForDocument(uri);\n } catch {\n return [];\n }\n if (project === undefined || !project.inputs.includes(uri)) {\n return [];\n }\n\n const source = document.getText();\n let formatted: string;\n try {\n formatted = format(source, project.formatter);\n } catch {\n return [];\n }\n\n if (formatted === source) {\n return [];\n }\n\n return [\n {\n range: { start: { line: 0, character: 0 }, end: document.positionAt(source.length) },\n newText: formatted,\n },\n ];\n }\n\n async function semanticTokensForDocument(uri: string, range?: Range): Promise<SemanticTokens> {\n const document = documents.get(uri);\n if (document === undefined) {\n return emptySemanticTokens();\n }\n const text = document.getText();\n if (text.length > semanticTokenSourceLimit) {\n return emptySemanticTokens();\n }\n\n const project = await resolveProjectForDocument(uri);\n if (project === undefined) {\n return emptySemanticTokens();\n }\n\n const cached = project.artifacts.getDocument(uri);\n if (cached === undefined || cached.text !== text) {\n return emptySemanticTokens();\n }\n\n const source = {\n document: cached.document,\n sourceFile: cached.sourceFile,\n symbolTable: project.artifacts.getSymbolTable(),\n scalarTypes: project.controlStack.scalarTypes,\n };\n return buildSemanticTokens(source, range);\n }\n\n async function completeDocument(uri: string, position: Position): Promise<CompletionItem[]> {\n const document = documents.get(uri);\n if (document === undefined) {\n return [];\n }\n\n let project: ProjectState | undefined;\n try {\n project = await resolveProjectForDocument(uri);\n } catch {\n return [];\n }\n if (project === undefined || !project.inputs.includes(uri)) {\n return [];\n }\n\n const cached = currentDocumentArtifact(project, uri, document.getText());\n const symbolTable = project.artifacts.getSymbolTable();\n if (cached === undefined || symbolTable === undefined) {\n return [];\n }\n\n try {\n const context = classifyPslCompletionContext({\n document: cached.document,\n sourceFile: cached.sourceFile,\n position,\n });\n return [\n ...providePslCompletionItems({\n context,\n sourceFile: cached.sourceFile,\n candidates: {\n scalarTypes: project.controlStack.scalarTypes,\n pslBlockDescriptors: project.controlStack.pslBlockDescriptors,\n symbolTable,\n },\n clientSupportsSnippets,\n }),\n ];\n } catch {\n return [];\n }\n }\n\n function currentDocumentArtifact(\n project: ProjectState,\n uri: string,\n text: string,\n ): CachedDocument | undefined {\n const cached = project.artifacts.getDocument(uri);\n if (cached?.sourceFile.text === text) {\n return cached;\n }\n\n if (project.artifacts.update(uri, text, project.inputs, project.controlStack) === null) {\n return undefined;\n }\n return project.artifacts.getDocument(uri);\n }\n\n connection.onInitialize(async (params): Promise<InitializeResult> => {\n rootPath = resolveRootPath(params.rootUri, params.rootPath);\n watchedConfigGlob = join(rootPath, '**', CONFIG_FILENAME);\n supportsWatchedFilesRegistration = clientSupportsWatchedFilesRegistration(params);\n clientSupportsSnippets = clientSupportsCompletionSnippets(params);\n\n return {\n capabilities: {\n textDocumentSync: TextDocumentSyncKind.Incremental,\n documentFormattingProvider: true,\n foldingRangeProvider: true,\n semanticTokensProvider: {\n legend: semanticTokensLegend,\n full: true,\n range: true,\n },\n completionProvider: { triggerCharacters: ['.'] },\n },\n };\n });\n\n connection.onInitialized(() => {\n if (supportsWatchedFilesRegistration) {\n void connection\n .sendRequest(RegistrationRequest.type, {\n registrations: [\n {\n id: 'prisma-next-config-watcher',\n method: DidChangeWatchedFilesNotification.type.method,\n registerOptions: { watchers: [{ globPattern: watchedConfigGlob }] },\n },\n ],\n })\n .catch(() => undefined);\n } else {\n logWarn(\n 'Client does not support dynamic file-watcher registration; Prisma Next config changes will not be picked up without a restart.',\n );\n }\n });\n\n connection.onDidChangeWatchedFiles(async (params) => {\n const changedConfigPaths = configPathsFromWatchedChanges(\n params.changes.map((change) => filePathFromUri(change.uri)),\n );\n for (const configPath of changedConfigPaths) {\n try {\n await refreshProject(configPath);\n } catch {\n stopManagingProject(configPath);\n continue;\n }\n await republishOpenDocumentsForConfig(configPath);\n }\n });\n\n connection.onDocumentFormatting((params) => formatDocument(params.textDocument.uri));\n connection.onCompletion((params) => completeDocument(params.textDocument.uri, params.position));\n\n connection.languages.semanticTokens.on((params) =>\n semanticTokensForDocument(params.textDocument.uri),\n );\n connection.languages.semanticTokens.onRange((params) =>\n semanticTokensForDocument(params.textDocument.uri, params.range),\n );\n\n connection.onFoldingRanges(async (params): Promise<FoldingRange[]> => {\n let project: ProjectState | undefined;\n try {\n project = await resolveProjectForDocument(params.textDocument.uri);\n } catch {\n return [];\n }\n if (project === undefined) {\n return [];\n }\n const cached = project.artifacts.getDocument(params.textDocument.uri);\n if (cached === undefined) {\n return [];\n }\n return computeFoldingRanges(cached.document, cached.sourceFile);\n });\n\n documents.onDidOpen((event) => {\n publishSafely(event.document.uri);\n });\n documents.onDidChangeContent((event) => {\n publishSafely(event.document.uri);\n });\n documents.onDidClose((event) => {\n const uri = event.document.uri;\n const configPath = documentConfigPaths.get(uri);\n if (configPath !== undefined) {\n projects.get(configPath)?.artifacts.remove(uri);\n }\n documentConfigPaths.delete(uri);\n sendDiagnostics({ uri, diagnostics: [] });\n });\n\n documents.listen(connection);\n connection.listen();\n\n function artifactsForDocument(uri: string): ProjectArtifacts | undefined {\n const configPath = documentConfigPaths.get(uri);\n return configPath === undefined ? undefined : projects.get(configPath)?.artifacts;\n }\n\n return {\n dispose: () => {\n disposed = true;\n connection.dispose();\n },\n getDocumentAst: (uri) => artifactsForDocument(uri)?.getDocument(uri),\n getProjectSymbolTable: (uri) => artifactsForDocument(uri)?.getSymbolTable(),\n };\n}\n\nfunction emptySemanticTokens(): SemanticTokens {\n return { data: [] };\n}\n\nfunction toLspSeverity(severity: number): DiagnosticSeverity {\n switch (severity) {\n case ParseDiagnosticSeverity.Warning:\n return DiagnosticSeverity.Warning;\n case ParseDiagnosticSeverity.Information:\n return DiagnosticSeverity.Information;\n case ParseDiagnosticSeverity.Hint:\n return DiagnosticSeverity.Hint;\n default:\n return DiagnosticSeverity.Error;\n }\n}\n\nfunction clientSupportsWatchedFilesRegistration(params: InitializeParams): boolean {\n return params.capabilities.workspace?.didChangeWatchedFiles?.dynamicRegistration === true;\n}\n\nfunction clientSupportsCompletionSnippets(params: InitializeParams): boolean {\n return params.capabilities.textDocument?.completion?.completionItem?.snippetSupport === true;\n}\n\nfunction resolveRootPath(\n rootUri: string | null | undefined,\n rootPath: string | null | undefined,\n): string {\n if (rootUri) {\n return fileURLToPath(rootUri);\n }\n if (rootPath) {\n return rootPath;\n }\n return process.cwd();\n}\n\nfunction filePathFromUri(uri: string): string | undefined {\n try {\n return fileURLToPath(uri);\n } catch {\n return undefined;\n }\n}\n\nfunction configPathsFromWatchedChanges(paths: readonly (string | undefined)[]): Set<string> {\n const configPaths = new Set<string>();\n for (const path of paths) {\n if (path?.endsWith(CONFIG_FILENAME)) {\n configPaths.add(path);\n }\n }\n return configPaths;\n}\n","import { createConnection, ProposedFeatures } from 'vscode-languageserver/node';\nimport { createServer, type LanguageServer } from './server';\n\nexport function startServer(): LanguageServer {\n const connection = createConnection(ProposedFeatures.all);\n return createServer(connection);\n}\n"],"mappings":";;;;;;;;;;;;AAEA,MAAa,0BAA0B;CACrC,OAAO;CACP,SAAS;CACT,aAAa;CACb,MAAM;AACR;AASA,SAAgB,oBACd,aAC0B;CAC1B,OAAO,YAAY,KAAK,gBAAgB;EACtC,OAAO,WAAW;EAClB,SAAS,WAAW;EACpB,MAAM,WAAW;EACjB,UAAU,wBAAwB;CACpC,EAAE;AACJ;;;ACiEA,MAAM,cAA+C,EAAE,MAAM,cAAc;AAE3E,SAAgB,6BACd,OACsB;CACtB,MAAM,OAAO,MAAM,SAAS;CAC5B,MAAM,SAAS,MAAM,WAAW,SAAS,MAAM,QAAQ;CACvD,MAAM,KAAK,KAAK,cAAc,MAAM;CAGpC,IAAI,GAAG,WAAW,CAAC,EAAE,SAAS,WAC5B,OAAO;CAKT,MAAM,OAAO,iBAAiB,IAAI,MAAM;CAIxC,MAAM,YAAY,eAAe,IAAI,IAAI;CACzC,MAAM,gBAAgB,WAAW;CACjC,MAAM,yBAAyB,MAAM,UAAU;CAE/C,MAAM,4BAA4B,2BAA2B;EAC3D,MAAM;EACN;EACA;CACF,CAAC;CACD,IAAI,8BAA8B,KAAA,GAChC,OAAO;CAGT,MAAM,sBAAsB,8BAA8B;EACxD;EACA;EACA,gBAAgB;EAChB;CACF,CAAC;CACD,IAAI,wBAAwB,KAAA,GAC1B,OAAO;CAGT,MAAM,QAAQ,iBAAiB,aAAa;CAC5C,IAAI,UAAU,KAAA,GACZ,OAAO;CAET,IACE,MAAM,OAAO,aAAa,IAAI,oBAAoB,MAAM,4BAA4B,IAAI,CAAC,MACzF,KAAA,GAEA,OAAO;CAGT,OAAO,uBAAuB;EAC5B;EACA;EACA;EACA,gBAAgB;CAClB,CAAC;AACH;;;;;;;;AASA,SAAS,iBAAiB,eAAwE;CAChG,OAAO,eAAe,aAAa,oBAAoB,IAAI;AAC7D;AAEA,SAAS,uBAAuB,OAKP;CACvB,MAAM,YAAY,MAAM,MAAM,KAAK;CACnC,IAAI,cAAc,KAAA,GAChB,OAAO;CAET,MAAM,gBAAgB,UAAU,KAAK;CACrC,IAAI,kBAAkB,KAAA,GACpB,OAAO;CAGT,IAAI,UAAU,OAAO,SAAS,MAAM,MAAM,GACxC,OAAO;CAGT,MAAM,iBAAiB,MAAM,MAAM,eAAe;CAClD,IAAI,mBAAmB,KAAA,GAAW;EAChC,IACE,MAAM,mBAAmB,KAAA,KACzB,UAAU,OAAO,SAAS,MAAM,eAAe,MAAM,GAErD,OAAO;GACL,MAAM;GACN,QAAQ,MAAM;GACd,WAAW;GACX,wBAAwB,MAAM;EAChC;EAEF,OAAO;CACT;CAEA,IAAI,eAAe,OAAO,UAAU,MAAM,MAAM,GAC9C,OAAO;CAIT,IAD2B,eAAe,QACrB,CAAC,EAAE,OAAO,SAAS,MAAM,MAAM,GAClD,OAAO;CAGT,MAAM,OAAO,eAAe,KAAK;CACjC,IAAI,SAAS,KAAA,GACX,OAAO;CAET,IAAI,KAAK,OAAO,UAAU,MAAM,MAAM,GACpC,OAAO;CAET,IAAI,KAAK,gBAAgB,GACvB,OAAO;CAGT,OAAO,qBAAqB,MAAM,MAAM,QAAQ,eAAe,MAAM,sBAAsB;AAC7F;;;;;;;;;;;;;AAcA,SAAS,qBACP,MACA,QACA,WACA,wBAC8F;CAC9F,MAAM,YAAY,KAAK,UAAU,CAAC,EAAE,KAAK;CACzC,IAAI,cAAc,KAAA,KAAa,UAAU,SAAS,GAAG;EACnD,MAAM,iBAAiB,KAAK,MAAM,CAAC,EAAE,KAAK;EAC1C,OAAO;GACL,MAAM;GACN;GACA;GACA;GACA;GACA,GAAI,mBAAmB,KAAA,KAAa,eAAe,SAAS,IACxD,EAAE,OAAO,eAAe,IACxB,CAAC;EACP;CACF;CACA,MAAM,QAAQ,KAAK,MAAM,CAAC,EAAE,KAAK;CACjC,IAAI,UAAU,KAAA,KAAa,MAAM,SAAS,GACxC,OAAO;EAAE,MAAM;EAAe;EAAQ;EAAW;EAAwB;CAAM;CAEjF,OAAO;EAAE,MAAM;EAAa;EAAQ;EAAW;CAAuB;AACxE;AAEA,MAAM,kBAAkB,IACtB,oBAAoB,MACpB,4BAA4B,MAC5B,cAAc,MACd,2BAA2B,MAC3B,wBAAwB,IAC1B;AAIA,SAAS,2BAA2B,OAIgB;CAClD,MAAM,uBAAuB,MAAM,MAAM,aAAa,eAAe;CACrE,MAAM,YAAY,MAAM,MAAM,aAAa,wBAAwB,IAAI;CACvE,MAAM,kBAAkB,wBAAwB,WAAW,MAAM,MAAM;CAEvE,IACE,yBAAyB,KAAA,KACzB,CAAC,uBAAuB,sBAAsB,MAAM,QAAQ,eAAe,GAE3E;CAGF,OAAO;EACL,MAAM;EACN,QAAQ,MAAM;EACd,OAAO,kBAAkB,cAAc;EACvC,wBAAwB,MAAM;CAChC;AACF;;;;;;;AAQA,SAAS,uBACP,sBACA,QACA,iBACS;CAIT,IAFE,qBAAqB,OAAO,MAAM,KAAA,MACjC,gCAAgC,iBAAiB,qBAAqB,KAAK,MAAM,KAAA,IAElF,OAAO;CAET,IAAI,gCAAgC,2BAA2B,iBAC7D,OAAO;CAET,MAAM,SAAS,qBAAqB,OAAO;CAC3C,OAAO,WAAW,KAAA,KAAa,UAAU,OAAO;AAClD;AAEA,SAAS,wBAAwB,OAAgC,QAAyB;CACxF,IAAI,UAAU,KAAA,GACZ,OAAO;CAET,MAAM,SAAS,MAAM,OAAO;CAC5B,IAAI,WAAW,KAAA,GACb,OAAO;CAET,MAAM,YAAY,OAAO;CACzB,MAAM,UAAU,MAAM,OAAO,CAAC,EAAE,UAAU,MAAM,OAAO;CACvD,OAAO,UAAU,aAAa,UAAU;AAC1C;AAEA,SAAS,8BAA8B,OAKF;CAInC,MAAM,OAAO,MAAM,GAAG,WAAW,CAAC,EAAE;CACpC,MAAM,QAAQ,MAAM,aAAa,2BAA2B,IAAI;CAChE,IAAI,UAAU,KAAA,GACZ;CAGF,IAAI,uBAAuB,IAAI,GAC7B,OAAO;CAGT,IAAI,CAAC,wBAAwB,OAAO,MAAM,MAAM,GAC9C,OAAO;CAIT,KADc,MAAM,aAAa,oBAAoB,IAAI,CAAC,GAC/C,OAAO,SAAS,MAAM,MAAM,GACrC,OAAO;CAGT,MAAM,UAAU,MAAM,QAAQ,CAAC,EAAE;CACjC,IAAI,YAAY,KAAA,KAAa,QAAQ,WAAW,GAC9C,OAAO;CAKT,IAAI,MAAM,gBAAgB,SAAS,UACjC,OAAO;EACL,MAAM;EACN,QAAQ,MAAM;EACd,cAAc;EACd,wBAAwB,MAAM;CAChC;CAGF,MAAM,aAAa,mBAAmB,MAAM,MAAM,MAAM;CACxD,IAAI,eAAe,KAAA,KAAa,cAAc,YAAY,MAAM,MAAM,GACpE,OAAO;CAGT,OAAO;EACL,MAAM;EACN,QAAQ,MAAM;EACd,cAAc;EACd,wBAAwB,MAAM;EAC9B;CACF;AACF;AAEA,SAAS,mBACP,MACA,QAC6B;CAC7B,MAAM,OAAO,MAAM,aAAa,gBAAgB,IAAI;CACpD,IAAI,SAAS,KAAA,KAAa,KAAK,OAAO,UAAU,MAAM,GACpD;CAEF,OAAO;AACT;AAEA,SAAS,cAAc,MAAuB,QAAyB;CACrE,MAAM,SAAS,KAAK,OAAO;CAC3B,OAAO,WAAW,KAAA,KAAa,SAAS,OAAO;AACjD;AAEA,SAAS,uBAAuB,MAAuC;CACrE,OACE,MAAM,aACJ,IAAI,oBAAoB,MAAM,kBAAkB,MAAM,kBAAkB,IAAI,CAC9E,MAAM,KAAA;AAEV;;;AAIA,SAAS,eAAe,IAAmB,MAAwD;CACjG,MAAM,QAAQ,SAAS,KAAA,IAAY,KAAK,YAAY,GAAG,WAAW;CAClE,OAAO,UAAU,KAAA,IAAY,KAAA,IAAY,gBAAgB,OAAO,MAAM;AACxE;;AAGA,SAAS,iBAAiB,IAAmB,QAAyC;CACpF,MAAM,QAAQ,GAAG,YAAY;CAC7B,IAAI,OAAO,SAAS,WAAW,SAAS,MAAM,WAC5C,OAAO;CAET,MAAM,OAAO,GAAG,WAAW;CAC3B,IAAI,MAAM,SAAS,WAAW,KAAK,cAAc,QAC/C,OAAO;AAGX;;;ACjXA,MAAM,gBAAsE;CAC1E,kBAAkB;CAClB,eAAe;CACf,uBAAuB;CACvB,QAAQ;CACR,WAAW;CACX,WAAW;CACX,gBAAgB;CAChB,wBAAwB;AAC1B;AAEA,MAAM,kCAGF;CACF,QAAQ;CACR,cAAc;AAChB;AAEA,MAAM,yBAAyB;AAG/B,MAAM,oCAAsF;CAC1F,yBAAyB,SAAS,UAAU,SAAS,uBAAuB,YAAY;CACxF,yBAAyB,QAAQ,SAAS,QAAQ,uBAAuB,YAAY;CACrF,yBAAyB,SAAS,UAAU,kBAAkB;CAC9D,yBACE,aACA,cACA,iCACF;AACF;AAEA,MAAM,qCAAuF,CAC3F,yBAAyB,SAAS,UAAU,SAAS,uBAAuB,YAAY,GACxF,yBAAyB,QAAQ,SAAS,QAAQ,uBAAuB,YAAY,CACvF;AAEA,SAAgB,0BACd,OAC2B;CAC3B,MAAM,EAAE,YAAY;CACpB,QAAQ,QAAQ,MAAhB;EACE,KAAK,eACH,OAAO,CAAC;EAGV,KAAK,eACH,OAAO,CAAC;EAGV,KAAK,qBACH,OAAO,CAAC;EACV,KAAK,sBACH,OAAO,yCACL,SACA,MAAM,YACN,MAAM,YACN,MAAM,sBACR;EACF,KAAK,mBACH,OAAO,sCAAsC,SAAS,MAAM,YAAY,MAAM,UAAU;EAC1F,KAAK,aACH,OAAO,gCAAgC,SAAS,MAAM,YAAY,MAAM,UAAU;EACpF,KAAK,mBACH,OAAO,sCAAsC,SAAS,MAAM,YAAY,MAAM,UAAU;CAC5F;AACF;AAEA,SAAS,yCACP,SACA,YACA,QACA,wBAC2B;CAC3B,MAAM,mBAAmB;EACvB,OAAO,WAAW,WAAW,QAAQ,sBAAsB;EAC3D,KAAK,WAAW,WAAW,QAAQ,MAAM;CAC3C;CAEA,OAAO,6BAA6B,QAAQ,OAAO,MAAM,CAAC,CAAC,KAAK,eAAe;EAC7E,OAAO,UAAU;EACjB,MAAM,UAAU;EAChB,QAAQ,UAAU;EAClB,UAAU,2BAA2B,SAAS;EAC9C,YAAY,UAAU;EACtB,GAAI,yBAAyB,EAAE,kBAAkB,iBAAiB,QAAQ,IAAI,CAAC;EAC/E,UAAU;GACR,OAAO;GACP,SAAS,yBAAyB,UAAU,cAAc,UAAU;EACtE;CACF,EAAE;AACJ;AAEA,SAAS,6BACP,OACA,QACkD;CAGlD,OAAO,CACL,GAFA,UAAU,cAAc,qCAAqC,mCAG7D,GAAG,yCAAyC,OAAO,mBAAmB,CACxE;AACF;AAEA,SAAS,yBACP,OACA,YACA,aACuC;CACvC,OAAO;EACL,UAAU;EACV;EACA;EACA;EACA,QAAQ;EACR,MAAM,mBAAmB;CAC3B;AACF;AAEA,SAAS,yCACP,aACkD;CAClD,OAAO,wBAAwB,WAAW,CAAC,CAAC,KAAK,aAAa;EAC5D,UAAU;EACV,OAAO;EACP,YAAY,GAAG,QAAQ;EACvB,aAAa,GAAG,QAAQ,GAAG,uBAAuB;EAClD,QAAQ;EACR,MAAM,mBAAmB;CAC3B,EAAE;AACJ;AAEA,SAAS,wBACP,aACmB;CACnB,MAAM,WAAqB,CAAC;CAC5B,+BAA+B,aAAa,QAAQ;CACpD,OAAO,aAAa,QAAQ;AAC9B;AAEA,SAAS,+BACP,aACA,UACM;CACN,KAAK,MAAM,SAAS,OAAO,OAAO,WAAW,GAAG;EAC9C,IAAI,8BAA8B,KAAK,GAAG;GACxC,SAAS,KAAK,MAAM,OAAO;GAC3B;EACF;EACA,+BAA+B,OAAO,QAAQ;CAChD;AACF;AAEA,SAAS,2BAA2B,WAA0D;CAC5F,OAAO,GAAG,gCAAgC,UAAU,UAAU,GAAG,UAAU;AAC7E;AAEA,SAAS,sCACP,SACA,YACA,QAC2B;CAC3B,MAAM,aAAa,oBAAoB,OAAO,qBAAqB,QAAQ,YAAY;CACvF,IAAI,eAAe,KAAA,GACjB,OAAO,CAAC;CAGV,MAAM,WAAW,mCAAmC,QAAQ,OAAO,QAAQ,MAAM;CACjF,MAAM,mBAAmB;EACvB,OAAO,WAAW,WAAW,QAAQ,sBAAsB;EAC3D,KAAK,WAAW,WAAW,QAAQ,MAAM;CAC3C;CAEA,OAAO,OAAO,KAAK,WAAW,UAAU,CAAC,CACtC,QAAQ,kBAAkB,CAAC,SAAS,IAAI,aAAa,CAAC,CAAC,CACvD,KAAK,eAAe,WAAW;EAC9B,OAAO;EACP,MAAM,mBAAmB;EACzB,QAAQ;EACR,UAAU,8BAA8B,OAAO,aAAa;EAC5D,YAAY;EACZ,UAAU;GACR,OAAO;GACP,SAAS;EACX;CACF,EAAE;AACN;AAEA,SAAS,mCACP,OACA,cACa;CACb,MAAM,wBAAQ,IAAI,IAAY;CAC9B,KAAK,MAAM,SAAS,MAAM,QAAQ,GAAG;EACnC,IAAI,CAAC,MAAM,OAAO,UAAU,YAAY,GACtC;EAEF,MAAM,OAAO,MAAM,IAAI,CAAC,EAAE,KAAK;EAC/B,IAAI,SAAS,KAAA,GACX,MAAM,IAAI,IAAI;CAElB;CACA,OAAO;AACT;AAEA,SAAS,gCACP,SACA,YACA,QAC2B;CAC3B,OAAO,yBAAyB,SAAS,YAAY;EACnD,GAAG,2BAA2B,OAAO,WAAW;EAChD,GAAG,yBAAyB,OAAO,WAAW;EAC9C,GAAG,uBAAuB,OAAO,WAAW;CAC9C,CAAC;AACH;AAEA,SAAS,sCACP,SACA,YACA,QAC2B;CAG3B,IAAI,QAAQ,UAAU,KAAA,GACpB,OAAO,CAAC;CAEV,OAAO,yBACL,SACA,YACA,oBAAoB,OAAO,aAAa,SAAS,WAAW,QAAQ,UAAU,CAChF;AACF;AAEA,SAAS,yBACP,SACA,YACA,YAC2B;CAC3B,MAAM,mBAAmB;EACvB,OAAO,WAAW,WAAW,QAAQ,sBAAsB;EAC3D,KAAK,WAAW,WAAW,QAAQ,MAAM;CAC3C;CAEA,OAAO,WAAW,KAAK,eAAe;EACpC,OAAO,UAAU;EACjB,MAAM,UAAU;EAChB,QAAQ,UAAU;EAClB,UAAU,SAAS,SAAS;EAC5B,YAAY,UAAU;EACtB,UAAU;GACR,OAAO;GACP,SAAS,UAAU;EACrB;CACF,EAAE;AACJ;AAEA,SAAS,2BACP,aACyC;CACzC,OAAO,aAAa,WAAW,CAAC,CAAC,KAAK,UAAU;EAC9C,UAAU;EACV,OAAO;EACP,YAAY;EACZ,YAAY;EACZ,QAAQ;EACR,MAAM,mBAAmB;CAC3B,EAAE;AACJ;AAEA,SAAS,yBACP,aACyC;CACzC,IAAI,gBAAgB,KAAA,GAClB,OAAO,CAAC;CAEV,MAAM,EAAE,aAAa;CACrB,OAAO;EACL,GAAG,iBACD,YAAY,SAAS,MAAM,GAC3B,iBACA,SACA,mBAAmB,KACrB;EACA,GAAG,iBACD,YAAY,SAAS,cAAc,GACnC,yBACA,kBACA,mBAAmB,MACrB;EACA,GAAG,iBACD,YAAY,SAAS,OAAO,GAC5B,UACA,eACA,mBAAmB,IACrB;EACA,GAAG,iBACD,YAAY,SAAS,WAAW,GAChC,aACA,cACA,mBAAmB,SACrB;CACF;AACF;AAEA,SAAS,uBACP,aACyC;CACzC,IAAI,gBAAgB,KAAA,GAClB,OAAO,CAAC;CAEV,OAAO,OAAO,OAAO,YAAY,SAAS,UAAU,CAAC,CAClD,MAAM,MAAM,UAAU,aAAa,KAAK,MAAM,MAAM,IAAI,CAAC,CAAC,CAC1D,IAAI,2BAA2B;AACpC;AAEA,SAAS,oBACP,WACyC;CACzC,IAAI,cAAc,KAAA,GAChB,OAAO,CAAC;CAEV,OAAO,CACL,GAAG,iBACD,YAAY,UAAU,MAAM,GAC5B,kBACA,sBAAsB,UAAU,QAChC,mBAAmB,KACrB,GACA,GAAG,iBACD,YAAY,UAAU,cAAc,GACpC,0BACA,+BAA+B,UAAU,QACzC,mBAAmB,MACrB,CACF;AACF;AAEA,SAAS,4BAA4B,WAA0D;CAC7F,OAAO;EACL,UAAU;EACV,OAAO,UAAU;EACjB,YAAY,UAAU;EACtB,YAAY,UAAU;EACtB,QAAQ;EACR,MAAM,mBAAmB;CAC3B;AACF;AAEA,SAAS,iBACP,OACA,UACA,QACA,MACyC;CACzC,OAAO,MAAM,KAAK,UAAU;EAC1B;EACA,OAAO;EACP,YAAY;EACZ,YAAY;EACZ;EACA;CACF,EAAE;AACJ;AAEA,SAAS,YACP,QACmB;CACnB,OAAO,OAAO,OAAO,MAAM,CAAC,CACzB,KAAK,WAAW,OAAO,IAAI,CAAC,CAC5B,KAAK,YAAY;AACtB;AAEA,SAAS,aAAa,OAA6C;CACjE,OAAO,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,YAAY;AAC9C;AAEA,SAAS,SAAS,WAAiD;CACjE,OAAO,GAAG,cAAc,UAAU,UAAU,GAAG,UAAU;AAC3D;AAEA,SAAS,8BAA8B,OAAe,OAAuB;CAC3E,OAAO,GAAG,MAAM,SAAS,CAAC,CAAC,SAAS,GAAG,GAAG,EAAE,GAAG;AACjD;AAEA,SAAS,aAAa,MAAc,OAAuB;CACzD,IAAI,OAAO,OAAO,OAAO;CACzB,IAAI,OAAO,OAAO,OAAO;CACzB,OAAO;AACT;;;ACtbA,SAAgB,aAAa,QAAoC;CAC/D,MAAM,SAAS,OAAO,UAAU;CAChC,OAAO,QAAQ,iBAAiB,SAAS,OAAO,WAAW,KAAA;AAC7D;AAEA,SAAgB,oBAAoB,QAA2C;CAC7E,MAAM,SAAS,aAAa,MAAM,IAAI,OAAO,UAAU,OAAO,SAAS,KAAA;CACvE,MAAM,OAAO,IAAI,IAAI,QAAQ,KAAK,UAAU,cAAc,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC;CAE5E,OAAO,EACL,WAAW,QAAQ,KAAK,IAAI,GAAG,EACjC;AACF;;;ACrBA,MAAa,kBAAkB;AAQ/B,MAAM,sBAAsC;CAC1C,aAAa,CAAC;CACd,qBAAqB,CAAC;AACxB;AAEA,eAAsB,oBAAoB,YAA+C;CACvF,MAAM,SAAS,MAAM,WAAW,UAAU;CAC1C,MAAM,SAAS,oBAAoB,MAAM;CACzC,MAAM,eAAe,0BAA0B,MAAM,KAAK;CAC1D,OAAO,OAAO,cAAc,KAAA,IACxB;EAAE;EAAQ;CAAa,IACvB;EAAE;EAAQ,WAAW,OAAO;EAAW;CAAa;AAC1D;AAEA,SAAgB,0BAA0B,QAAsD;CAC9F,IAAI,CAAC,aAAa,MAAM,GACtB;CAEF,MAAM,QAAQ,mBAAmB,MAAM;CACvC,OAAO;EACL,aAAa,CAAC,GAAG,MAAM,sBAAsB,KAAK,CAAC;EACnD,qBAAqB,MAAM,uBAAuB;CACpD;AACF;;;;;;;;;;;;;;;ACdA,SAAgB,qBACd,UACA,YACgB;CAChB,MAAM,SAAyB,CAAC;CAChC,qBAAqB,UAAU,YAAY,MAAM;CACjD,OAAO;AACT;AAEA,SAAS,qBACP,UACA,YACA,QACM;CACN,KAAK,MAAM,eAAe,SAAS,aAAa,GAAG;EACjD,gBAAgB,aAAa,YAAY,MAAM;EAE/C,MAAM,YAAY,wBAAwB,KAAK,YAAY,MAAM;EACjE,IAAI,cAAc,KAAA,GAChB,KAAK,MAAM,UAAU,UAAU,aAAa,GAC1C,gBAAgB,QAAQ,YAAY,MAAM;CAGhD;AACF;AAEA,SAAS,gBACP,aACA,YACA,QACM;CACN,MAAM,SAAS,YAAY,OAAO;CAClC,MAAM,SAAS,YAAY,OAAO;CAElC,IAAI,WAAW,KAAA,KAAa,WAAW,KAAA,GACrC;CAGF,MAAM,YAAY,WAAW,WAAW,OAAO,MAAM,CAAC,CAAC;CACvD,MAAM,UAAU,WAAW,WAAW,OAAO,MAAM,CAAC,CAAC;CAErD,OAAO,KAAK;EACV;EACA;EACA,MAAM,iBAAiB;CACzB,CAAC;AACH;;;;;;;;;ACzCA,SAAgB,YAAY,MAAc,QAAwC;CAChF,MAAM,EAAE,UAAU,YAAY,aAAa,qBAAqB,MAAM,IAAI;CAC1E,MAAM,EAAE,OAAO,aAAa,aAAa,2BAA2B,iBAAiB;EACnF;EACA;EACA,aAAa,OAAO;EACpB,qBAAqB,OAAO;CAC9B,CAAC;CAED,OAAO;EACL;EACA;EACA;EACA,aAAa,oBAAoB,CAAC,GAAG,kBAAkB,GAAG,sBAAsB,CAAC;CACnF;AACF;;;;;;;;;ACxBA,SAAgB,2BACd,KACA,MACA,QACA,cAC4B;CAC5B,IAAI,CAAC,OAAO,SAAS,GAAG,GACtB,OAAO;CAET,MAAM,EAAE,UAAU,YAAY,aAAa,gBAAgB,YAAY,MAAM,YAAY;CACzF,OAAO;EAAE;EAAa;EAAU;EAAY;CAAY;AAC1D;;;ACLA,SAAgB,yBAA2C;CACzD,MAAM,4BAAY,IAAI,IAA4B;CAClD,IAAI;CAEJ,OAAO;EACL,cAAc,QAAQ,UAAU,IAAI,GAAG;EACvC,sBAAsB;EACtB,SAAS,KAAK,MAAM,QAAQ,iBAAiB;GAC3C,MAAM,WAAW,2BAA2B,KAAK,MAAM,QAAQ,YAAY;GAC3E,IAAI,aAAa,MAAM;IACrB,IAAI,UAAU,OAAO,GAAG,GACtB,cAAc,KAAA;IAEhB,OAAO;GACT;GACA,UAAU,IAAI,KAAK;IACjB,UAAU,SAAS;IACnB,YAAY,SAAS;IACrB;GACF,CAAC;GAMD,cAAc,SAAS;GACvB,OAAO,SAAS;EAClB;EACA,SAAS,QAAQ;GACf,IAAI,UAAU,OAAO,GAAG,GACtB,cAAc,KAAA;EAElB;CACF;AACF;;;ACPA,MAAa,qBAAmD;CAC9D,mBAAmB;CACnB,mBAAmB;CACnB,mBAAmB;CACnB,mBAAmB;CACnB,mBAAmB;CACnB,mBAAmB;CACnB,mBAAmB;CACnB,mBAAmB;CACnB,mBAAmB;CACnB,mBAAmB;AACrB;AAEA,MAAa,yBAAyB,CACpC,uBAAuB,aACvB,uBAAuB,cACzB;AAEA,MAAa,+BAA+B;CAC1C,aAAa;CACb,gBAAgB;AAClB;AAEA,MAAa,4BAA4B;CACvC,aAAa,KAAK,6BAA6B;CAC/C,gBAAgB,KAAK,6BAA6B;AACpD;AAEA,MAAa,uBAA6C;CACxD,YAAY,CAAC,GAAG,kBAAkB;CAClC,gBAAgB,CAAC,GAAG,sBAAsB;AAC5C;AAiCA,SAAgB,oBAAoB,QAA6B,OAA+B;CAC9F,MAAM,UAAU,IAAI,sBAAsB,OAAO,YAAY,KAAK;CAClE,KAAK,MAAM,SAAS,2BAA2B,MAAM,GACnD,QAAQ,IAAI,KAAK;CAEnB,OAAO,QAAQ,MAAM;AACvB;AAEA,SAAgB,2BACd,QACiC;CACjC,MAAM,WAAW,qBAAqB,OAAO,QAAQ;CACrD,MAAM,SAAiC,CAAC;CACxC,oBAAoB,QAAQ,MAAM;CAClC,OAAO,yBAAyB,UAAU,MAAM;AAClD;AAEA,IAAa,wBAAb,MAAmC;CACjC,QAA2B,CAAC;CAC5B;CACA;CACA,gBAAgB;CAChB,qBAAqB;CACrB,SAAS;CAET,YAAY,YAAwB,OAAe;EACjD,KAAKC,cAAc;EACnB,IAAI,UAAU,KAAA,GAAW;GACvB,MAAM,cAAc,WAAW,SAAS,MAAM,KAAK;GACnD,MAAM,YAAY,WAAW,SAAS,MAAM,GAAG;GAC/C,KAAKC,gBAAgB;IACnB,OAAO,KAAK,IAAI,aAAa,SAAS;IACtC,OAAO,KAAK,IAAI,aAAa,SAAS;GACxC;EACF;CACF;CAEA,IAAI,OAAmC;EACrC,IAAI,CAAC,KAAKC,iBAAiB,MAAM,aAAa,MAAM,SAAS,GAC3D;EAGF,IAAI,MAAM,gBAAgB;GACxB,KAAKC,wBAAwB,KAAK;GAClC;EACF;EAEA,KAAKC,QAAQ,MAAM,aAAa,MAAM,WAAW,MAAM,gBAAgB,MAAM,cAAc;CAC7F;CAEA,QAAwB;EACtB,OAAO,EAAE,MAAM,KAAKL,MAAM;CAC5B;CAEA,iBAAiB,aAAqB,WAA4B;EAChE,MAAM,eAAe,KAAKE;EAC1B,OACE,iBAAiB,KAAA,KAChB,cAAc,aAAa,SAAS,YAAY,aAAa;CAElE;CAEA,wBAAwB,OAAmC;EACzD,MAAM,QAAQ,KAAKD,YAAY,WAAW,MAAM,WAAW;EAC3D,MAAM,MAAM,KAAKA,YAAY,WAAW,MAAM,SAAS;EACvD,IAAI,MAAM,SAAS,IAAI,MAAM;GAC3B,KAAKI,QAAQ,MAAM,aAAa,MAAM,WAAW,MAAM,gBAAgB,MAAM,cAAc;GAC3F;EACF;EAEA,KAAK,IAAI,OAAO,MAAM,MAAM,QAAQ,IAAI,MAAM,QAAQ;GACpD,MAAM,cACJ,SAAS,MAAM,OAAO,MAAM,cAAc,KAAKJ,YAAY,gBAAgB,IAAI;GACjF,MAAM,YAAY,SAAS,IAAI,OAAO,MAAM,YAAY,KAAKA,YAAY,cAAc,IAAI;GAC3F,IAAI,YAAY,eAAe,KAAKE,iBAAiB,aAAa,SAAS,GACzE,KAAKE,QAAQ,aAAa,WAAW,MAAM,gBAAgB,MAAM,cAAc;EAEnF;CACF;CAEA,QACE,aACA,WACA,gBACA,gBACM;EACN,MAAM,QAAQ,KAAKJ,YAAY,WAAW,WAAW;EACrD,MAAM,YAAY,KAAKK,SAAS,MAAM,OAAO,MAAM,OAAO,KAAKC;EAC/D,MAAM,aACJ,KAAKD,UAAU,cAAc,IAAI,MAAM,YAAY,MAAM,YAAY,KAAKE;EAC5E,KAAKR,MAAM,KAAK,WAAW,YAAY,YAAY,aAAa,gBAAgB,cAAc;EAC9F,KAAKO,gBAAgB,MAAM;EAC3B,KAAKC,qBAAqB,MAAM;EAChC,KAAKF,SAAS;CAChB;AACF;AAEA,SAAS,qBAAqB,UAAwD;CACpF,MAAM,SAAiC,CAAC;CACxC,KAAK,MAAM,SAAS,SAAS,OAAO,OAAO,GACzC,IAAI,MAAM,SAAS,WACjB,OAAO,KAAK,qBAAqB,OAAO,SAAS,CAAC;CAGtD,OAAO;AACT;AAEA,SAAS,oBAAoB,QAA6B,QAAsC;CAC9F,KAAK,MAAM,eAAe,OAAO,SAAS,aAAa,GACrD,mBAAmB,aAAa,QAAQ,QAAQ,KAAA,CAAS;AAE7D;AAEA,SAAS,mBACP,aACA,QACA,QACA,WACM;CACN,IAAI,uBAAuB,qBAAqB;EAC9C,SAAS,YAAY,QAAQ,GAAG,WAAW,MAAM;EACjD,cAAc,YAAY,KAAK,GAAG,SAAS,QAAQ,0BAA0B,WAAW;EACxF,oBAAoB,YAAY,QAAQ,GAAG,QAAQ,QAAQ,SAAS;EACpE;CACF;CAEA,IAAI,uBAAuB,6BAA6B;EACtD,SAAS,YAAY,QAAQ,GAAG,WAAW,MAAM;EACjD,cAAc,YAAY,KAAK,GAAG,UAAU,QAAQ,0BAA0B,WAAW;EACzF,oBAAoB,YAAY,QAAQ,GAAG,QAAQ,QAAQ,SAAS;EACpE;CACF;CAEA,IAAI,uBAAuB,yBAAyB;EAClD,SAAS,YAAY,QAAQ,GAAG,WAAW,MAAM;EACjD,cAAc,YAAY,KAAK,GAAG,aAAa,QAAQ,0BAA0B,WAAW;EAC5F,MAAM,kBAAkB,YAAY,KAAK,CAAC,EAAE,KAAK;EACjD,KAAK,MAAM,UAAU,YAAY,aAAa,GAC5C,mBAAmB,QAAQ,QAAQ,QAAQ,eAAe;EAE5D;CACF;CAEA,IAAI,uBAAuB,eAAe;EACxC,SAAS,YAAY,QAAQ,GAAG,WAAW,MAAM;EACjD,KAAK,MAAM,aAAa,YAAY,aAAa,GAC/C,4BAA4B,WAAW,QAAQ,QAAQ,SAAS;EAElE;CACF;CAEA,SAAS,YAAY,QAAQ,GAAG,WAAW,MAAM;CACjD,cAAc,YAAY,KAAK,GAAG,QAAQ,QAAQ,0BAA0B,WAAW;CACvF,2BAA2B,YAAY,QAAQ,GAAG,QAAQ,QAAQ,SAAS;AAC7E;AAEA,SAAS,4BACP,aACA,QACA,QACA,WACM;CACN,cAAc,YAAY,KAAK,GAAG,QAAQ,QAAQ,0BAA0B,WAAW;CACvF,sBAAsB,YAAY,eAAe,GAAG,QAAQ,QAAQ,SAAS;CAC7E,kBAAkB,YAAY,WAAW,GAAG,QAAQ,QAAQ,SAAS;AACvE;AAEA,SAAS,2BACP,SACA,QACA,QACA,WACM;CACN,KAAK,MAAM,UAAU,SAAS;EAC5B,IAAI,SAAS,QAAQ;GACnB,cAAc,OAAO,IAAI,GAAG,YAAY,MAAM;GAC9C,kBAAkB,OAAO,MAAM,GAAG,QAAQ,QAAQ,SAAS;GAC3D;EACF;EACA,iBAAiB,QAAQ,QAAQ,QAAQ,SAAS;CACpD;AACF;AAEA,SAAS,oBACP,SACA,QACA,QACA,WACM;CACN,KAAK,MAAM,UAAU,SAAS;EAC5B,IAAI,kBAAkB,qBAAqB;GACzC,aAAa,QAAQ,QAAQ,QAAQ,SAAS;GAC9C;EACF;EACA,iBAAiB,QAAQ,QAAQ,QAAQ,SAAS;CACpD;AACF;AAEA,SAAS,aACP,OACA,QACA,QACA,WACM;CACN,cAAc,MAAM,KAAK,GAAG,YAAY,QAAQ,0BAA0B,WAAW;CACrF,sBAAsB,MAAM,eAAe,GAAG,QAAQ,QAAQ,SAAS;CACvE,kBAAkB,MAAM,WAAW,GAAG,QAAQ,QAAQ,SAAS;AACjE;AAEA,SAAS,sBACP,YACA,QACA,QACA,WACM;CACN,IAAI,eAAe,KAAA,GACjB;CAEF,qBAAqB,WAAW,KAAK,GAAG,QAAQ,QAAQ,SAAS;CACjE,wBAAwB,WAAW,QAAQ,GAAG,QAAQ,QAAQ,SAAS;AACzE;AAEA,SAAS,kBACP,YACA,QACA,QACA,WACM;CACN,KAAK,MAAM,aAAa,YACtB,iBAAiB,WAAW,QAAQ,QAAQ,SAAS;AAEzD;AAEA,SAAS,iBACP,WACA,QACA,QACA,WACM;CACN,MAAM,SACJ,eAAe,UAAU,QAAQ,IAAI,KAAK,eAAe,UAAU,QAAQ,UAAU;CACvF,qBAAqB,UAAU,KAAK,GAAG,QAAQ,MAAM;CACrD,wBAAwB,UAAU,QAAQ,GAAG,QAAQ,QAAQ,SAAS;AACxE;AAEA,SAAS,qBACP,MACA,QACA,QACM;CACN,IAAI,SAAS,KAAA,GACX;CAEF,MAAM,WAAW,mBAAmB,IAAI;CACxC,KAAK,MAAM,CAAC,OAAO,YAAY,SAAS,QAAQ,GAC9C,OAAO,KAAK,4BAA4B,QAAQ,YAAY,UAAU,IAAI,SAAS,KAAA,CAAS,CAAC;AAEjG;AAEA,SAAS,wBACP,SACA,QACA,QACA,WACM;CACN,IAAI,YAAY,KAAA,GACd;CAEF,KAAK,MAAM,OAAO,QAAQ,KAAK,GAC7B,oBAAoB,KAAK,QAAQ,QAAQ,SAAS;AAEtD;AAEA,SAAS,oBACP,KACA,QACA,QACA,WACM;CACN,MAAM,OAAO,IAAI,KAAK;CACtB,cAAc,MAAM,YAAY,MAAM;CACtC,kBAAkB,IAAI,MAAM,GAAG,QAAQ,QAAQ,WAAW,iCAAiC,IAAI,CAAC;AAClG;AAEA,SAAS,kBACP,YACA,QACA,QACA,WACA,UAA6B,CAAC,GACxB;CACN,IAAI,eAAe,KAAA,GACjB;CAGF,IAAI,sBAAsB,sBAAsB;EAC9C,SAAS,WAAW,MAAM,GAAG,UAAU,MAAM;EAC7C;CACF;CAEA,IAAI,sBAAsB,sBAAsB;EAC9C,SAAS,WAAW,MAAM,GAAG,UAAU,MAAM;EAC7C;CACF;CAEA,IAAI,sBAAsB,uBAAuB;EAC/C,SAAS,WAAW,MAAM,GAAG,WAAW,MAAM;EAC9C;CACF;CAEA,IAAI,sBAAsB,iBAAiB;EACzC,qBAAqB,WAAW,KAAK,GAAG,QAAQ,QAAQ,SAAS;EACjE,KAAK,MAAM,OAAO,WAAW,KAAK,GAChC,oBAAoB,KAAK,QAAQ,QAAQ,SAAS;EAEpD;CACF;CAEA,IAAI,sBAAsB,iBAAiB;EACzC,KAAK,MAAM,WAAW,WAAW,SAAS,GACxC,kBAAkB,SAAS,QAAQ,QAAQ,WAAW,OAAO;EAE/D;CACF;CAEA,IAAI,sBAAsB,sBAAsB;EAC9C,KAAK,MAAM,SAAS,WAAW,OAAO,GAAG;GACvC,cAAc,MAAM,IAAI,GAAG,YAAY,MAAM;GAC7C,kBAAkB,MAAM,MAAM,GAAG,QAAQ,QAAQ,SAAS;EAC5D;EACA;CACF;CAEA,4BAA4B,YAAY,QAAQ,QAAQ,WAAW,OAAO;AAC5E;AAEA,SAAS,4BACP,YACA,QACA,QACA,WACA,SACM;CACN,MAAM,OAAO,WAAW,KAAK;CAC7B,IAAI,SAAS,KAAA,GACX;CAEF,MAAM,0BAA0B,QAAQ;CACxC,IAAI,4BAA4B,KAAA,GAAW;EACzC,OAAO,KAAK,mBAAmB,YAAY,uBAAuB,CAAC;EACnE;CACF;CACA,MAAM,iBAAiB,sBAAsB,CAAC,IAAI,GAAG,QAAQ,SAAS;CACtE,OAAO,KACL,mBAAmB,YAAY,eAAe,WAAW,eAAe,cAAc,CACxF;AACF;AAEA,SAAS,iCAAiC,MAAoD;CAC5F,MAAM,UAAU,MAAM,KAAK;CAC3B,OAAO,YAAY,YAAY,YAAY,eACvC,EAAE,yBAAyB,WAAW,IACtC,CAAC;AACP;AAEA,SAAS,qBACP,MACA,QACA,QACA,WACM;CACN,IAAI,SAAS,KAAA,GACX;CAGF,MAAM,WAAW,mBAAmB,IAAI;CACxC,IAAI,SAAS,WAAW,GACtB;CAGF,MAAM,OAAO,SAAS,KAAK,YAAY,QAAQ,IAAI;CACnD,KAAK,MAAM,WAAW,SAAS,MAAM,GAAG,EAAE,GACxC,IAAI,iBAAiB,QAAQ,MAAM,OAAO,WAAW,GACnD,OAAO,KAAK,mBAAmB,QAAQ,YAAY,WAAW,CAAC;CAInE,MAAM,eAAe,SAAS,SAAS,SAAS;CAChD,IAAI,iBAAiB,KAAA,GACnB;CAEF,MAAM,iBAAiB,sBAAsB,MAAM,QAAQ,SAAS;CACpE,OAAO,KACL,mBACE,aAAa,YACb,eAAe,WACf,eAAe,cACjB,CACF;AACF;AAEA,SAAS,sBACP,MACA,QACA,WAC6B;CAC7B,MAAM,OAAO,KAAK,KAAK,SAAS;CAChC,IAAI,SAAS,KAAA,GACX,OAAO,EAAE,WAAW,OAAO;CAG7B,MAAM,QAAQ,OAAO;CACrB,MAAM,gBAAgB,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,KAAK;CAChE,MAAM,iBACJ,kBAAkB,KAAA,IAAY,OAAO,SAAS,WAAW,iBAAiB,KAAA;CAE5E,IAAI,mBAAmB,KAAA,GAAW;EAChC,IAAI,OAAO,OAAO,eAAe,QAAQ,IAAI,GAC3C,OAAO,EAAE,WAAW,QAAQ;EAE9B,IAAI,OAAO,OAAO,eAAe,gBAAgB,IAAI,GACnD,OAAO,EAAE,WAAW,SAAS;EAE/B,IAAI,OAAO,OAAO,eAAe,QAAQ,IAAI,GAC3C,OAAO,EAAE,WAAW,OAAO;CAE/B;CAEA,IAAI,UAAU,KAAA,GAAW;EACvB,IAAI,OAAO,OAAO,MAAM,SAAS,QAAQ,IAAI,GAC3C,OAAO,EAAE,WAAW,QAAQ;EAE9B,IAAI,OAAO,OAAO,MAAM,SAAS,gBAAgB,IAAI,GACnD,OAAO,EAAE,WAAW,SAAS;EAE/B,IAAI,OAAO,OAAO,MAAM,SAAS,SAAS,IAAI,GAC5C,OAAO;GAAE,WAAW;GAAQ,gBAAgB,0BAA0B;EAAe;EAEvF,IACE,OAAO,OAAO,MAAM,SAAS,aAAa,IAAI,KAC9C,OAAO,OAAO,MAAM,SAAS,QAAQ,IAAI,GAEzC,OAAO,EAAE,WAAW,OAAO;CAE/B;CAEA,IAAI,OAAO,YAAY,SAAS,IAAI,GAClC,OAAO;EAAE,WAAW;EAAQ,gBAAgB,0BAA0B;CAAe;CAGvF,OAAO,EAAE,WAAW,OAAO;AAC7B;AAEA,SAAS,iBAAiB,MAAc,OAAyC;CAC/E,OAAO,UAAU,KAAA,KAAa,OAAO,OAAO,MAAM,SAAS,YAAY,IAAI;AAC7E;AAEA,SAAS,mBAAmB,MAAsD;CAChF,MAAM,WAAgC,CAAC;CACvC,KAAK,MAAM,cAAc,eAAe,KAAK,QAAQ,cAAc,IAAI,GAAG;EACxE,MAAM,OAAO,WAAW,KAAK;EAC7B,IAAI,SAAS,KAAA,GACX,SAAS,KAAK;GAAE;GAAY;EAAK,CAAC;CAEtC;CACA,OAAO;AACT;AAEA,SAAS,cACP,YACA,WACA,QACA,iBAAiB,GACX;CACN,IAAI,eAAe,KAAA,GACjB;CAEF,OAAO,KAAK,mBAAmB,YAAY,WAAW,cAAc,CAAC;AACvE;AAEA,SAAS,SACP,OACA,WACA,QACA,iBAAiB,GACX;CACN,IAAI,UAAU,KAAA,GACZ;CAEF,OAAO,KAAK,qBAAqB,OAAO,WAAW,cAAc,CAAC;AACpE;AAEA,SAAS,mBACP,YACA,WACA,iBAAiB,GACK;CACtB,MAAM,QAAQ,WAAW,MAAM;CAC/B,IAAI,UAAU,KAAA,GACZ,OAAO,2BACL,WAAW,OAAO,QAClB,WAAW,OAAO,QAClB,WACA,cACF;CAEF,OAAO,qBAAqB,OAAO,WAAW,cAAc;AAC9D;AAEA,SAAS,4BACP,YACA,QACsB;CACtB,MAAM,QAAQ,mBAAmB,YAAY,WAAW;CACxD,IAAI,WAAW,KAAA,KAAa,OAAO,UAAU,MAAM,aACjD,OAAO;CAET,OAAO,2BACL,OAAO,QACP,MAAM,WACN,aACA,MAAM,cACR;AACF;AAEA,SAAS,qBACP,OACA,WACA,iBAAiB,GACK;CACtB,OAAO,2BACL,MAAM,QACN,MAAM,SAAS,MAAM,KAAK,QAC1B,WACA,cACF;AACF;AAEA,SAAS,yBACP,MACA,OACiC;CACjC,MAAM,SAAiC,CAAC;CACxC,IAAI,YAAY;CAChB,IAAI,aAAa;CAEjB,OAAO,YAAY,KAAK,UAAU,aAAa,MAAM,QAAQ;EAC3D,MAAM,YAAY,KAAK;EACvB,MAAM,aAAa,MAAM;EACzB,IACE,cAAc,KAAA,MACb,eAAe,KAAA,KAAa,UAAU,eAAe,WAAW,cACjE;GACA,OAAO,KAAK,SAAS;GACrB;EACF,OAAO,IAAI,eAAe,KAAA,GAAW;GACnC,OAAO,KAAK,UAAU;GACtB;EACF;CACF;CAEA,OAAO;AACT;AAEA,SAAS,2BACP,aACA,WACA,WACA,iBAAiB,GACK;CACtB,OAAO;EACL;EACA;EACA,gBAAgB,eAAe,SAAS;EACxC;EACA,gBAAgB,cAAc,YAAY,cAAc;CAC1D;AACF;AAEA,SAAS,eAAe,WAAsC;CAC5D,OAAO,mBAAmB,QAAQ,SAAS;AAC7C;;;AC7nBA,MAAM,2BAA2B;AAEjC,SAAgB,aAAa,YAAwC;CACnE,MAAM,YAAY,IAAI,cAAc,YAAY;CAChD,MAAM,2BAAW,IAAI,IAA0B;CAC/C,MAAM,+BAAe,IAAI,IAAmC;CAC5D,MAAM,sCAAsB,IAAI,IAAoB;CACpD,IAAI,WAAW,QAAQ,IAAI;CAC3B,IAAI,oBAAoB,KAAK,UAAU,MAAM,eAAe;CAC5D,IAAI,mCAAmC;CACvC,IAAI,yBAAyB;CAC7B,IAAI,WAAW;CAEf,SAAS,gBAAgB,QAAwC;EAC/D,IAAI,UACF;EAEF,WAAgB,gBAAgB,MAAM;CACxC;CAEA,SAAS,QAAQ,SAAuB;EACtC,IAAI,UACF;EAEF,WAAW,QAAQ,KAAK,OAAO;CACjC;CAEA,eAAe,QAAQ,KAA4B;EACjD,MAAM,UAAU,MAAM,0BAA0B,GAAG;EACnD,IAAI,YAAY,KAAA,GACd;EAEF,MAAM,WAAW,UAAU,IAAI,GAAG;EAClC,IAAI,aAAa,KAAA,GAAW;GAC1B,oBAAoB,OAAO,GAAG;GAC9B;EACF;EACA,MAAM,WAAW,QAAQ,UAAU,OACjC,KACA,SAAS,QAAQ,GACjB,QAAQ,QACR,QAAQ,YACV;EACA,IAAI,aAAa,MAAM;GACrB,gBAAgB;IAAE;IAAK,aAAa,CAAC;GAAE,CAAC;GACxC;EACF;EAQA,gBAAgB;GAAE;GAAK,aAPW,SAAS,KAAK,gBAAgB;IAC9D,OAAO,WAAW;IAClB,SAAS,WAAW;IACpB,MAAM,WAAW;IACjB,UAAU,cAAc,WAAW,QAAQ;IAC3C,QAAQ;GACV,EACiC;EAAE,CAAC;CACtC;CAEA,eAAe,0BAA0B,KAAgD;EACvF,MAAM,kBAAkB,oBAAoB,IAAI,GAAG;EACnD,IAAI,oBAAoB,KAAA,GAAW;GACjC,MAAM,UAAU,MAAM,yBAAyB,eAAe;GAC9D,IAAI,YAAY,KAAA,GACd,oBAAoB,OAAO,GAAG;GAEhC,OAAO;EACT;EAEA,MAAM,WAAW,gBAAgB,GAAG;EACpC,IAAI,aAAa,KAAA,GACf;EAGF,MAAM,aAAa,MAAM,6BAA6B,QAAQ;EAC9D,IAAI,eAAe,KAAA,GACjB;EAGF,oBAAoB,IAAI,KAAK,UAAU;EACvC,MAAM,UAAU,MAAM,yBAAyB,UAAU;EACzD,IAAI,YAAY,KAAA,GACd,oBAAoB,OAAO,GAAG;EAEhC,OAAO;CACT;CAEA,eAAe,yBAAyB,YAAuD;EAC7F,IAAI;GACF,OAAO,MAAM,eAAe,UAAU;EACxC,QAAQ;GACN,oBAAoB,UAAU;GAC9B;EACF;CACF;CAEA,eAAe,eAAe,YAA2C;EACvE,MAAM,WAAW,SAAS,IAAI,UAAU;EACxC,IAAI,aAAa,KAAA,GACf,OAAO;EAET,MAAM,eAAe,aAAa,IAAI,UAAU;EAChD,IAAI,iBAAiB,KAAA,GACnB,OAAO;EAET,OAAO,iBAAiB,UAAU;CACpC;CAEA,SAAS,eAAe,YAA2C;EACjE,OAAO,iBAAiB,UAAU;CACpC;CAEA,SAAS,iBAAiB,YAA2C;EAEnE,MAAM,QADe,aAAa,IAAI,UAAU,KAAK,QAAQ,QAAQ,EAAA,CAElE,YAAY,KAAA,CAAS,CAAC,CACtB,WAAW,YAAY,UAAU,CAAC,CAAC,CACnC,cAAc;GACb,IAAI,aAAa,IAAI,UAAU,MAAM,MACnC,aAAa,OAAO,UAAU;EAElC,CAAC;EACH,aAAa,IAAI,YAAY,IAAI;EACjC,OAAO;CACT;CAEA,eAAe,YAAY,YAA2C;EACpE,MAAM,aAAa,MAAM,oBAAoB,UAAU;EAGvD,MAAM,YAAY,SAAS,IAAI,UAAU,CAAC,EAAE,aAAa,uBAAuB;EAChF,MAAM,UACJ,WAAW,cAAc,KAAA,IACrB;GACE;GACA,QAAQ,WAAW;GACnB,cAAc,WAAW;GACzB;EACF,IACA;GACE;GACA,QAAQ,WAAW;GACnB,WAAW,WAAW;GACtB,cAAc,WAAW;GACzB;EACF;EACN,SAAS,IAAI,YAAY,OAAO;EAChC,OAAO;CACT;CAEA,SAAS,oBAAoB,YAA0B;EACrD,MAAM,aAAa,SAAS,OAAO,UAAU;EAC7C,KAAK,MAAM,YAAY,UAAU,IAAI,GACnC,IAAI,oBAAoB,IAAI,SAAS,GAAG,MAAM,YAAY;GACxD,oBAAoB,OAAO,SAAS,GAAG;GACvC,IAAI,YACF,gBAAgB;IAAE,KAAK,SAAS;IAAK,aAAa,CAAC;GAAE,CAAC;EAE1D;CAEJ;CAEA,eAAe,gCAAgC,YAAmC;EAChF,KAAK,MAAM,YAAY,UAAU,IAAI,GAAG;GAEtC,IADwB,oBAAoB,IAAI,SAAS,GACvC,MAAM,YAAY;IAClC,MAAM,QAAQ,SAAS,GAAG;IAC1B;GACF;GAEA,MAAM,WAAW,gBAAgB,SAAS,GAAG;GAC7C,IAAI,aAAa,KAAA,GACf;GAGF,IAAI,MAD4B,6BAA6B,QAAQ,MAC3C,YAAY;IACpC,oBAAoB,IAAI,SAAS,KAAK,UAAU;IAChD,MAAM,QAAQ,SAAS,GAAG;GAC5B;EACF;CACF;CAEA,SAAS,cAAc,KAAmB;EACxC,QAAa,GAAG,CAAC,CAAC,OAAO,UAAmB;GAC1C,IAAI,UACF;GAEF,WAAW,QAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;EACjF,CAAC;CACH;CAEA,eAAe,eAAe,KAAkC;EAC9D,MAAM,WAAW,UAAU,IAAI,GAAG;EAClC,IAAI,aAAa,KAAA,GACf,OAAO,CAAC;EAGV,IAAI;EACJ,IAAI;GACF,UAAU,MAAM,0BAA0B,GAAG;EAC/C,QAAQ;GACN,OAAO,CAAC;EACV;EACA,IAAI,YAAY,KAAA,KAAa,CAAC,QAAQ,OAAO,SAAS,GAAG,GACvD,OAAO,CAAC;EAGV,MAAM,SAAS,SAAS,QAAQ;EAChC,IAAI;EACJ,IAAI;GACF,YAAY,OAAO,QAAQ,QAAQ,SAAS;EAC9C,QAAQ;GACN,OAAO,CAAC;EACV;EAEA,IAAI,cAAc,QAChB,OAAO,CAAC;EAGV,OAAO,CACL;GACE,OAAO;IAAE,OAAO;KAAE,MAAM;KAAG,WAAW;IAAE;IAAG,KAAK,SAAS,WAAW,OAAO,MAAM;GAAE;GACnF,SAAS;EACX,CACF;CACF;CAEA,eAAe,0BAA0B,KAAa,OAAwC;EAC5F,MAAM,WAAW,UAAU,IAAI,GAAG;EAClC,IAAI,aAAa,KAAA,GACf,OAAO,oBAAoB;EAE7B,MAAM,OAAO,SAAS,QAAQ;EAC9B,IAAI,KAAK,SAAS,0BAChB,OAAO,oBAAoB;EAG7B,MAAM,UAAU,MAAM,0BAA0B,GAAG;EACnD,IAAI,YAAY,KAAA,GACd,OAAO,oBAAoB;EAG7B,MAAM,SAAS,QAAQ,UAAU,YAAY,GAAG;EAChD,IAAI,WAAW,KAAA,KAAa,OAAO,SAAS,MAC1C,OAAO,oBAAoB;EAS7B,OAAO,oBAAoB;GALzB,UAAU,OAAO;GACjB,YAAY,OAAO;GACnB,aAAa,QAAQ,UAAU,eAAe;GAC9C,aAAa,QAAQ,aAAa;EAEJ,GAAG,KAAK;CAC1C;CAEA,eAAe,iBAAiB,KAAa,UAA+C;EAC1F,MAAM,WAAW,UAAU,IAAI,GAAG;EAClC,IAAI,aAAa,KAAA,GACf,OAAO,CAAC;EAGV,IAAI;EACJ,IAAI;GACF,UAAU,MAAM,0BAA0B,GAAG;EAC/C,QAAQ;GACN,OAAO,CAAC;EACV;EACA,IAAI,YAAY,KAAA,KAAa,CAAC,QAAQ,OAAO,SAAS,GAAG,GACvD,OAAO,CAAC;EAGV,MAAM,SAAS,wBAAwB,SAAS,KAAK,SAAS,QAAQ,CAAC;EACvE,MAAM,cAAc,QAAQ,UAAU,eAAe;EACrD,IAAI,WAAW,KAAA,KAAa,gBAAgB,KAAA,GAC1C,OAAO,CAAC;EAGV,IAAI;GAMF,OAAO,CACL,GAAG,0BAA0B;IAC3B,SAPY,6BAA6B;KAC3C,UAAU,OAAO;KACjB,YAAY,OAAO;KACnB;IACF,CAGU;IACN,YAAY,OAAO;IACnB,YAAY;KACV,aAAa,QAAQ,aAAa;KAClC,qBAAqB,QAAQ,aAAa;KAC1C;IACF;IACA;GACF,CAAC,CACH;EACF,QAAQ;GACN,OAAO,CAAC;EACV;CACF;CAEA,SAAS,wBACP,SACA,KACA,MAC4B;EAC5B,MAAM,SAAS,QAAQ,UAAU,YAAY,GAAG;EAChD,IAAI,QAAQ,WAAW,SAAS,MAC9B,OAAO;EAGT,IAAI,QAAQ,UAAU,OAAO,KAAK,MAAM,QAAQ,QAAQ,QAAQ,YAAY,MAAM,MAChF;EAEF,OAAO,QAAQ,UAAU,YAAY,GAAG;CAC1C;CAEA,WAAW,aAAa,OAAO,WAAsC;EACnE,WAAW,gBAAgB,OAAO,SAAS,OAAO,QAAQ;EAC1D,oBAAoB,KAAK,UAAU,MAAM,eAAe;EACxD,mCAAmC,uCAAuC,MAAM;EAChF,yBAAyB,iCAAiC,MAAM;EAEhE,OAAO,EACL,cAAc;GACZ,kBAAkB,qBAAqB;GACvC,4BAA4B;GAC5B,sBAAsB;GACtB,wBAAwB;IACtB,QAAQ;IACR,MAAM;IACN,OAAO;GACT;GACA,oBAAoB,EAAE,mBAAmB,CAAC,GAAG,EAAE;EACjD,EACF;CACF,CAAC;CAED,WAAW,oBAAoB;EAC7B,IAAI,kCACF,WACG,YAAY,oBAAoB,MAAM,EACrC,eAAe,CACb;GACE,IAAI;GACJ,QAAQ,kCAAkC,KAAK;GAC/C,iBAAiB,EAAE,UAAU,CAAC,EAAE,aAAa,kBAAkB,CAAC,EAAE;EACpE,CACF,EACF,CAAC,CAAC,CACD,YAAY,KAAA,CAAS;OAExB,QACE,gIACF;CAEJ,CAAC;CAED,WAAW,wBAAwB,OAAO,WAAW;EACnD,MAAM,qBAAqB,8BACzB,OAAO,QAAQ,KAAK,WAAW,gBAAgB,OAAO,GAAG,CAAC,CAC5D;EACA,KAAK,MAAM,cAAc,oBAAoB;GAC3C,IAAI;IACF,MAAM,eAAe,UAAU;GACjC,QAAQ;IACN,oBAAoB,UAAU;IAC9B;GACF;GACA,MAAM,gCAAgC,UAAU;EAClD;CACF,CAAC;CAED,WAAW,sBAAsB,WAAW,eAAe,OAAO,aAAa,GAAG,CAAC;CACnF,WAAW,cAAc,WAAW,iBAAiB,OAAO,aAAa,KAAK,OAAO,QAAQ,CAAC;CAE9F,WAAW,UAAU,eAAe,IAAI,WACtC,0BAA0B,OAAO,aAAa,GAAG,CACnD;CACA,WAAW,UAAU,eAAe,SAAS,WAC3C,0BAA0B,OAAO,aAAa,KAAK,OAAO,KAAK,CACjE;CAEA,WAAW,gBAAgB,OAAO,WAAoC;EACpE,IAAI;EACJ,IAAI;GACF,UAAU,MAAM,0BAA0B,OAAO,aAAa,GAAG;EACnE,QAAQ;GACN,OAAO,CAAC;EACV;EACA,IAAI,YAAY,KAAA,GACd,OAAO,CAAC;EAEV,MAAM,SAAS,QAAQ,UAAU,YAAY,OAAO,aAAa,GAAG;EACpE,IAAI,WAAW,KAAA,GACb,OAAO,CAAC;EAEV,OAAO,qBAAqB,OAAO,UAAU,OAAO,UAAU;CAChE,CAAC;CAED,UAAU,WAAW,UAAU;EAC7B,cAAc,MAAM,SAAS,GAAG;CAClC,CAAC;CACD,UAAU,oBAAoB,UAAU;EACtC,cAAc,MAAM,SAAS,GAAG;CAClC,CAAC;CACD,UAAU,YAAY,UAAU;EAC9B,MAAM,MAAM,MAAM,SAAS;EAC3B,MAAM,aAAa,oBAAoB,IAAI,GAAG;EAC9C,IAAI,eAAe,KAAA,GACjB,SAAS,IAAI,UAAU,CAAC,EAAE,UAAU,OAAO,GAAG;EAEhD,oBAAoB,OAAO,GAAG;EAC9B,gBAAgB;GAAE;GAAK,aAAa,CAAC;EAAE,CAAC;CAC1C,CAAC;CAED,UAAU,OAAO,UAAU;CAC3B,WAAW,OAAO;CAElB,SAAS,qBAAqB,KAA2C;EACvE,MAAM,aAAa,oBAAoB,IAAI,GAAG;EAC9C,OAAO,eAAe,KAAA,IAAY,KAAA,IAAY,SAAS,IAAI,UAAU,CAAC,EAAE;CAC1E;CAEA,OAAO;EACL,eAAe;GACb,WAAW;GACX,WAAW,QAAQ;EACrB;EACA,iBAAiB,QAAQ,qBAAqB,GAAG,CAAC,EAAE,YAAY,GAAG;EACnE,wBAAwB,QAAQ,qBAAqB,GAAG,CAAC,EAAE,eAAe;CAC5E;AACF;AAEA,SAAS,sBAAsC;CAC7C,OAAO,EAAE,MAAM,CAAC,EAAE;AACpB;AAEA,SAAS,cAAc,UAAsC;CAC3D,QAAQ,UAAR;EACE,KAAK,wBAAwB,SAC3B,OAAO,mBAAmB;EAC5B,KAAK,wBAAwB,aAC3B,OAAO,mBAAmB;EAC5B,KAAK,wBAAwB,MAC3B,OAAO,mBAAmB;EAC5B,SACE,OAAO,mBAAmB;CAC9B;AACF;AAEA,SAAS,uCAAuC,QAAmC;CACjF,OAAO,OAAO,aAAa,WAAW,uBAAuB,wBAAwB;AACvF;AAEA,SAAS,iCAAiC,QAAmC;CAC3E,OAAO,OAAO,aAAa,cAAc,YAAY,gBAAgB,mBAAmB;AAC1F;AAEA,SAAS,gBACP,SACA,UACQ;CACR,IAAI,SACF,OAAO,cAAc,OAAO;CAE9B,IAAI,UACF,OAAO;CAET,OAAO,QAAQ,IAAI;AACrB;AAEA,SAAS,gBAAgB,KAAiC;CACxD,IAAI;EACF,OAAO,cAAc,GAAG;CAC1B,QAAQ;EACN;CACF;AACF;AAEA,SAAS,8BAA8B,OAAqD;CAC1F,MAAM,8BAAc,IAAI,IAAY;CACpC,KAAK,MAAM,QAAQ,OACjB,IAAI,MAAM,SAAA,uBAAwB,GAChC,YAAY,IAAI,IAAI;CAGxB,OAAO;AACT;;;AC/hBA,SAAgB,cAA8B;CAE5C,OAAO,aADY,iBAAiB,iBAAiB,GACxB,CAAC;AAChC"}
1
+ {"version":3,"file":"index.mjs","names":["#data","#sourceFile","#rangeOffsets","#intersectsRange","#addMultilineSplitToken","#encode","#first","#previousLine","#previousCharacter"],"sources":["../../src/diagnostic-mapping.ts","../../src/completion-context.ts","../../src/completion-provider.ts","../../src/schema-inputs.ts","../../src/config-resolution.ts","../../src/folding-ranges.ts","../../src/pipeline.ts","../../src/document-diagnostics.ts","../../src/project-artifacts.ts","../../src/semantic-tokens.ts","../../src/server.ts","../../src/start-server.ts"],"sourcesContent":["import type { ParseDiagnostic, Range } from '@prisma-next/psl-parser/syntax';\n\nexport const ParseDiagnosticSeverity = {\n Error: 1,\n Warning: 2,\n Information: 3,\n Hint: 4,\n} as const;\n\nexport interface LspDiagnostic {\n readonly range: Range;\n readonly message: string;\n readonly code: string;\n readonly severity: number;\n}\n\nexport function mapParseDiagnostics(\n diagnostics: readonly ParseDiagnostic[],\n): readonly LspDiagnostic[] {\n return diagnostics.map((diagnostic) => ({\n range: diagnostic.range,\n message: diagnostic.message,\n code: diagnostic.code,\n severity: ParseDiagnosticSeverity.Error,\n }));\n}\n","import {\n AttributeArgListAst,\n any,\n type BracedBlock,\n CompositeTypeDeclarationAst,\n type DocumentAst,\n FieldAttributeAst,\n FieldDeclarationAst,\n GenericBlockDeclarationAst,\n KeyValuePairAst,\n ModelAttributeAst,\n ModelDeclarationAst,\n NamespaceDeclarationAst,\n type Position,\n type QualifiedNameAst,\n type SourceFile,\n type SyntaxNode,\n type SyntaxToken,\n skipTriviaToken,\n type TokenAtOffset,\n TypesBlockAst,\n} from '@prisma-next/psl-parser/syntax';\n\nexport interface ClassifyPslCompletionContextInput {\n readonly document: DocumentAst;\n readonly sourceFile: SourceFile;\n readonly position: Position;\n}\n\nexport interface ModelTypeCompletionContext {\n readonly kind: 'modelType';\n readonly offset: number;\n readonly fieldName: string;\n readonly replacementStartOffset: number;\n}\n\nexport interface SpaceMemberCompletionContext {\n readonly kind: 'spaceMember';\n readonly offset: number;\n readonly fieldName: string;\n readonly replacementStartOffset: number;\n readonly space: string;\n}\n\nexport interface NamespaceMemberCompletionContext {\n readonly kind: 'namespaceMember';\n readonly offset: number;\n readonly fieldName: string;\n readonly replacementStartOffset: number;\n readonly namespace: string;\n readonly space?: string;\n}\n\nexport interface GenericBlockKeyCompletionContext {\n readonly kind: 'genericBlockKey';\n readonly offset: number;\n readonly blockKeyword: string;\n readonly replacementStartOffset: number;\n readonly block: GenericBlockDeclarationAst;\n}\n\nexport interface GenericBlockValueCompletionContext {\n readonly kind: 'genericBlockValue';\n readonly offset: number;\n readonly blockKeyword: string;\n readonly replacementStartOffset: number;\n}\n\nexport type DeclarationKeywordCompletionScope = 'document' | 'namespace';\n\nexport interface DeclarationKeywordCompletionContext {\n readonly kind: 'declarationKeyword';\n readonly offset: number;\n readonly scope: DeclarationKeywordCompletionScope;\n readonly replacementStartOffset: number;\n}\n\nexport interface UnsupportedPslCompletionContext {\n readonly kind: 'unsupported';\n}\n\nexport type PslCompletionContext =\n | DeclarationKeywordCompletionContext\n | GenericBlockKeyCompletionContext\n | GenericBlockValueCompletionContext\n | ModelTypeCompletionContext\n | NamespaceMemberCompletionContext\n | SpaceMemberCompletionContext\n | UnsupportedPslCompletionContext;\n\nconst UNSUPPORTED: UnsupportedPslCompletionContext = { kind: 'unsupported' };\n\nexport function classifyPslCompletionContext(\n input: ClassifyPslCompletionContextInput,\n): PslCompletionContext {\n const root = input.document.syntax;\n const offset = input.sourceFile.offsetAt(input.position);\n const at = root.tokenAtOffset(offset);\n\n // Completion is never offered when the cursor sits inside a comment.\n if (at.leftBiased()?.kind === 'Comment') {\n return UNSUPPORTED;\n }\n\n // The edit replaces the identifier under the cursor, or is empty when the\n // cursor sits in trivia.\n const edit = cursorIdentifier(at, offset);\n\n // Anchor on the significant token preceding the cursor and navigate outward\n // via `token.parent` rather than scanning the whole tree.\n const preceding = precedingToken(at, edit);\n const precedingNode = preceding?.parent;\n const replacementStartOffset = edit?.offset ?? offset;\n\n const declarationKeywordContext = classifyDeclarationKeyword({\n node: precedingNode,\n offset,\n replacementStartOffset,\n });\n if (declarationKeywordContext !== undefined) {\n return declarationKeywordContext;\n }\n\n const genericBlockContext = classifyGenericBlockParameter({\n offset,\n at,\n precedingToken: preceding,\n replacementStartOffset,\n });\n if (genericBlockContext !== undefined) {\n return genericBlockContext;\n }\n\n const field = fieldForTypeSlot(precedingNode);\n if (field === undefined) {\n return UNSUPPORTED;\n }\n if (\n field.syntax.findAncestor(any(ModelDeclarationAst.cast, CompositeTypeDeclarationAst.cast)) ===\n undefined\n ) {\n return UNSUPPORTED;\n }\n\n return classifyModelFieldType({\n field,\n offset,\n replacementStartOffset,\n precedingToken: preceding,\n });\n}\n\n/**\n * Locates the field whose type position the cursor occupies. The preceding token\n * climbs to the field whether the cursor sits inside a present type (the type\n * identifier's predecessor still belongs to the field) or in the empty type slot\n * of a typeless field (whose trailing trivia lives in the enclosing block, so\n * the nearest significant token to the left is the field's own name).\n */\nfunction fieldForTypeSlot(precedingNode: SyntaxNode | undefined): FieldDeclarationAst | undefined {\n return precedingNode?.findAncestor(FieldDeclarationAst.cast);\n}\n\nfunction classifyModelFieldType(input: {\n readonly field: FieldDeclarationAst;\n readonly offset: number;\n readonly replacementStartOffset: number;\n readonly precedingToken: SyntaxToken | undefined;\n}): PslCompletionContext {\n const fieldName = input.field.name();\n if (fieldName === undefined) {\n return UNSUPPORTED;\n }\n const fieldNameText = fieldName.name();\n if (fieldNameText === undefined) {\n return UNSUPPORTED;\n }\n\n if (fieldName.syntax.isInside(input.offset)) {\n return UNSUPPORTED;\n }\n\n const typeAnnotation = input.field.typeAnnotation();\n if (typeAnnotation === undefined) {\n if (\n input.precedingToken !== undefined &&\n fieldName.syntax.isInside(input.precedingToken.offset)\n ) {\n return {\n kind: 'modelType',\n offset: input.offset,\n fieldName: fieldNameText,\n replacementStartOffset: input.offset,\n };\n }\n return UNSUPPORTED;\n }\n\n if (typeAnnotation.syntax.isOutside(input.offset)) {\n return UNSUPPORTED;\n }\n\n const constructorArgList = typeAnnotation.argList();\n if (constructorArgList?.syntax.isInside(input.offset)) {\n return UNSUPPORTED;\n }\n\n const name = typeAnnotation.name();\n if (name === undefined) {\n return UNSUPPORTED;\n }\n if (name.syntax.isOutside(input.offset)) {\n return UNSUPPORTED;\n }\n if (name.isOverQualified()) {\n return UNSUPPORTED;\n }\n\n return classifyTypePosition(name, input.offset, fieldNameText, input.replacementStartOffset);\n}\n\n/**\n * Builds the type-completion context for a qualified name. Roles are read\n * straight off the separator-positional accessors: a populated namespace\n * segment is a `.`-qualified name, a populated space segment is a `:`-qualified\n * name, and the absence of both is a bare model type.\n *\n * Behaviour change: a `:`-qualified name with no `.` (e.g. `supabase:`,\n * `supabase:U`) is a `spaceMember` position rather than falling through to bare\n * model-type completions. A malformed leading-separator name (`:User`, `.User`)\n * carries no populated segment and resolves to `modelType` rather than\n * `unsupported`.\n */\nfunction classifyTypePosition(\n name: QualifiedNameAst,\n offset: number,\n fieldName: string,\n replacementStartOffset: number,\n): ModelTypeCompletionContext | SpaceMemberCompletionContext | NamespaceMemberCompletionContext {\n const namespace = name.namespace()?.name();\n if (namespace !== undefined && namespace.length > 0) {\n const namespaceSpace = name.space()?.name();\n return {\n kind: 'namespaceMember',\n offset,\n fieldName,\n replacementStartOffset,\n namespace,\n ...(namespaceSpace !== undefined && namespaceSpace.length > 0\n ? { space: namespaceSpace }\n : {}),\n };\n }\n const space = name.space()?.name();\n if (space !== undefined && space.length > 0) {\n return { kind: 'spaceMember', offset, fieldName, replacementStartOffset, space };\n }\n return { kind: 'modelType', offset, fieldName, replacementStartOffset };\n}\n\nconst declarationCast = any(\n ModelDeclarationAst.cast,\n CompositeTypeDeclarationAst.cast,\n TypesBlockAst.cast,\n GenericBlockDeclarationAst.cast,\n NamespaceDeclarationAst.cast,\n);\n\ntype DeclarationAst = NonNullable<ReturnType<typeof declarationCast>>;\n\nfunction classifyDeclarationKeyword(input: {\n readonly node: SyntaxNode | undefined;\n readonly offset: number;\n readonly replacementStartOffset: number;\n}): DeclarationKeywordCompletionContext | undefined {\n const precedingDeclaration = input.node?.findAncestor(declarationCast);\n const namespace = input.node?.findAncestor(NamespaceDeclarationAst.cast);\n const inNamespaceBody = blockBodyContainsOffset(namespace, input.offset);\n\n if (\n precedingDeclaration !== undefined &&\n !canCompleteDeclaration(precedingDeclaration, input.offset, inNamespaceBody)\n ) {\n return undefined;\n }\n\n return {\n kind: 'declarationKeyword',\n offset: input.offset,\n scope: inNamespaceBody ? 'namespace' : 'document',\n replacementStartOffset: input.replacementStartOffset,\n };\n}\n\n/**\n * Whether a new declaration can begin at the cursor, given the nearest enclosing\n * declaration. Allowed when that declaration is still nascent (only its keyword\n * typed, no name or body yet), when it is a namespace whose body holds further\n * declarations, or when the cursor sits past its closing `}`.\n */\nfunction canCompleteDeclaration(\n precedingDeclaration: DeclarationAst,\n offset: number,\n inNamespaceBody: boolean,\n): boolean {\n const keywordOnly =\n precedingDeclaration.lbrace() === undefined &&\n (precedingDeclaration instanceof TypesBlockAst || precedingDeclaration.name() === undefined);\n if (keywordOnly) {\n return true;\n }\n if (precedingDeclaration instanceof NamespaceDeclarationAst && inNamespaceBody) {\n return true;\n }\n const rbrace = precedingDeclaration.rbrace();\n return rbrace !== undefined && offset >= rbrace.endOffset;\n}\n\nfunction blockBodyContainsOffset(block: BracedBlock | undefined, offset: number): boolean {\n if (block === undefined) {\n return false;\n }\n const lbrace = block.lbrace();\n if (lbrace === undefined) {\n return false;\n }\n const bodyStart = lbrace.endOffset;\n const bodyEnd = block.rbrace()?.offset ?? block.syntax.endOffset;\n return offset >= bodyStart && offset <= bodyEnd;\n}\n\nfunction classifyGenericBlockParameter(input: {\n readonly offset: number;\n readonly at: TokenAtOffset;\n readonly precedingToken: SyntaxToken | undefined;\n readonly replacementStartOffset: number;\n}): PslCompletionContext | undefined {\n // Whether the cursor sits in a key, value, or attribute slot is a structural\n // question, so it anchors on the cursor's own node — including any in-progress\n // identifier — rather than the edit-skipped `precedingToken` used for gaps.\n const node = input.at.leftBiased()?.parent;\n const block = node?.findAncestor(GenericBlockDeclarationAst.cast);\n if (block === undefined) {\n return undefined;\n }\n\n if (hasUnsupportedAncestor(node)) {\n return UNSUPPORTED;\n }\n\n if (!blockBodyContainsOffset(block, input.offset)) {\n return UNSUPPORTED;\n }\n\n const field = node?.findAncestor(FieldDeclarationAst.cast);\n if (field?.syntax.isInside(input.offset)) {\n return UNSUPPORTED;\n }\n\n const keyword = block.keyword()?.text;\n if (keyword === undefined || keyword.length === 0) {\n return UNSUPPORTED;\n }\n\n // Value position: the cursor follows a `=`. The position is now classified\n // distinctly from keys; populating value candidates is the provider's concern.\n if (input.precedingToken?.kind === 'Equals') {\n return {\n kind: 'genericBlockValue',\n offset: input.offset,\n blockKeyword: keyword,\n replacementStartOffset: input.replacementStartOffset,\n };\n }\n\n const activePair = activeKeyValuePair(node, input.offset);\n if (activePair !== undefined && isAfterEquals(activePair, input.offset)) {\n return UNSUPPORTED;\n }\n\n return {\n kind: 'genericBlockKey',\n offset: input.offset,\n blockKeyword: keyword,\n replacementStartOffset: input.replacementStartOffset,\n block,\n };\n}\n\nfunction activeKeyValuePair(\n node: SyntaxNode | undefined,\n offset: number,\n): KeyValuePairAst | undefined {\n const pair = node?.findAncestor(KeyValuePairAst.cast);\n if (pair === undefined || pair.syntax.isOutside(offset)) {\n return undefined;\n }\n return pair;\n}\n\nfunction isAfterEquals(pair: KeyValuePairAst, offset: number): boolean {\n const equals = pair.equals();\n return equals !== undefined && offset > equals.offset;\n}\n\nfunction hasUnsupportedAncestor(node: SyntaxNode | undefined): boolean {\n return (\n node?.findAncestor(\n any(AttributeArgListAst.cast, FieldAttributeAst.cast, ModelAttributeAst.cast),\n ) !== undefined\n );\n}\n\n/** The significant token preceding the cursor — the in-progress edit identifier\n * is skipped, so the result is the token the classifier anchors on. */\nfunction precedingToken(at: TokenAtOffset, edit: SyntaxToken | undefined): SyntaxToken | undefined {\n const start = edit !== undefined ? edit.prevToken : at.leftBiased();\n return start === undefined ? undefined : skipTriviaToken(start, 'prev');\n}\n\n/** The identifier token the cursor is editing, if any. */\nfunction cursorIdentifier(at: TokenAtOffset, offset: number): SyntaxToken | undefined {\n const right = at.rightBiased();\n if (right?.kind === 'Ident' && offset < right.endOffset) {\n return right;\n }\n const left = at.leftBiased();\n if (left?.kind === 'Ident' && left.endOffset === offset) {\n return left;\n }\n return undefined;\n}\n","import {\n type AuthoringPslBlockDescriptorNamespace,\n isAuthoringPslBlockDescriptor,\n} from '@prisma-next/framework-components/authoring';\nimport {\n findBlockDescriptor,\n type NamespaceSymbol,\n type SymbolTable,\n} from '@prisma-next/psl-parser';\nimport type { GenericBlockDeclarationAst, SourceFile } from '@prisma-next/psl-parser/syntax';\nimport { type CompletionItem, CompletionItemKind, InsertTextFormat } from 'vscode-languageserver';\nimport type {\n DeclarationKeywordCompletionContext,\n GenericBlockKeyCompletionContext,\n ModelTypeCompletionContext,\n NamespaceMemberCompletionContext,\n PslCompletionContext,\n} from './completion-context';\n\nexport interface PslCompletionCandidateSource {\n readonly scalarTypes: readonly string[];\n readonly pslBlockDescriptors: AuthoringPslBlockDescriptorNamespace;\n readonly symbolTable: SymbolTable;\n}\n\nexport interface ProvidePslCompletionItemsInput {\n readonly context: PslCompletionContext;\n readonly sourceFile: SourceFile;\n readonly candidates: PslCompletionCandidateSource;\n readonly clientSupportsSnippets: boolean;\n}\n\ntype DeclarationKeywordCompletionCandidateCategory = 'native' | 'genericBlock';\n\ntype ModelTypeCompletionCandidateCategory =\n | 'configuredScalar'\n | 'topLevelModel'\n | 'topLevelCompositeType'\n | 'scalar'\n | 'typeAlias'\n | 'namespace'\n | 'namespaceModel'\n | 'namespaceCompositeType';\n\ninterface DeclarationKeywordCompletionCandidate {\n readonly category: DeclarationKeywordCompletionCandidateCategory;\n readonly label: string;\n readonly insertText: string;\n readonly snippetText: string;\n readonly detail: string;\n readonly kind: CompletionItemKind;\n}\n\ninterface ModelTypeCompletionCandidate {\n readonly category: ModelTypeCompletionCandidateCategory;\n readonly label: string;\n readonly insertText: string;\n readonly filterText: string;\n readonly detail: string;\n readonly kind: CompletionItemKind;\n}\n\nconst categoryOrder: Record<ModelTypeCompletionCandidateCategory, number> = {\n configuredScalar: 0,\n topLevelModel: 1,\n topLevelCompositeType: 2,\n scalar: 3,\n typeAlias: 4,\n namespace: 5,\n namespaceModel: 6,\n namespaceCompositeType: 7,\n};\n\nconst declarationKeywordCategoryOrder: Record<\n DeclarationKeywordCompletionCandidateCategory,\n number\n> = {\n native: 0,\n genericBlock: 1,\n};\n\nconst nameSnippetPlaceholder = '$' + '{1:Name}';\nconst namespaceSnippetPlaceholder = '$' + '{1:name}';\n\nconst documentNativeDeclarationKeywords: readonly DeclarationKeywordCompletionCandidate[] = [\n nativeDeclarationKeyword('model', 'model ', `model ${nameSnippetPlaceholder} {\\n $0\\n}`),\n nativeDeclarationKeyword('type', 'type ', `type ${nameSnippetPlaceholder} {\\n $0\\n}`),\n nativeDeclarationKeyword('types', 'types ', 'types {\\n $0\\n}'),\n nativeDeclarationKeyword(\n 'namespace',\n 'namespace ',\n `namespace ${namespaceSnippetPlaceholder} {\\n $0\\n}`,\n ),\n];\n\nconst namespaceNativeDeclarationKeywords: readonly DeclarationKeywordCompletionCandidate[] = [\n nativeDeclarationKeyword('model', 'model ', `model ${nameSnippetPlaceholder} {\\n $0\\n}`),\n nativeDeclarationKeyword('type', 'type ', `type ${nameSnippetPlaceholder} {\\n $0\\n}`),\n];\n\nexport function providePslCompletionItems(\n input: ProvidePslCompletionItemsInput,\n): readonly CompletionItem[] {\n const { context } = input;\n switch (context.kind) {\n case 'unsupported':\n return [];\n // Foreign contract-space members require the multi-input symbol table; no\n // contract-space registry exists today, so this position yields nothing yet.\n case 'spaceMember':\n return [];\n // Parameter-value completion (option allowed-values / ref scopes) is future\n // work.\n case 'genericBlockValue':\n return [];\n case 'declarationKeyword':\n return provideDeclarationKeywordCompletionItems(\n context,\n input.sourceFile,\n input.candidates,\n input.clientSupportsSnippets,\n );\n case 'genericBlockKey':\n return provideGenericBlockKeyCompletionItems(context, input.sourceFile, input.candidates);\n case 'modelType':\n return provideModelTypeCompletionItems(context, input.sourceFile, input.candidates);\n case 'namespaceMember':\n return provideNamespaceMemberCompletionItems(context, input.sourceFile, input.candidates);\n }\n}\n\nfunction provideDeclarationKeywordCompletionItems(\n context: DeclarationKeywordCompletionContext,\n sourceFile: SourceFile,\n source: PslCompletionCandidateSource,\n clientSupportsSnippets: boolean,\n): readonly CompletionItem[] {\n const replacementRange = {\n start: sourceFile.positionAt(context.replacementStartOffset),\n end: sourceFile.positionAt(context.offset),\n };\n\n return declarationKeywordCandidates(context.scope, source).map((candidate) => ({\n label: candidate.label,\n kind: candidate.kind,\n detail: candidate.detail,\n sortText: declarationKeywordSortText(candidate),\n filterText: candidate.label,\n ...(clientSupportsSnippets ? { insertTextFormat: InsertTextFormat.Snippet } : {}),\n textEdit: {\n range: replacementRange,\n newText: clientSupportsSnippets ? candidate.snippetText : candidate.insertText,\n },\n }));\n}\n\nfunction declarationKeywordCandidates(\n scope: DeclarationKeywordCompletionContext['scope'],\n source: PslCompletionCandidateSource,\n): readonly DeclarationKeywordCompletionCandidate[] {\n const nativeCandidates =\n scope === 'namespace' ? namespaceNativeDeclarationKeywords : documentNativeDeclarationKeywords;\n return [\n ...nativeCandidates,\n ...genericBlockDeclarationKeywordCandidates(source.pslBlockDescriptors),\n ];\n}\n\nfunction nativeDeclarationKeyword(\n label: string,\n insertText: string,\n snippetText: string,\n): DeclarationKeywordCompletionCandidate {\n return {\n category: 'native',\n label,\n insertText,\n snippetText,\n detail: 'PSL declaration keyword',\n kind: CompletionItemKind.Keyword,\n };\n}\n\nfunction genericBlockDeclarationKeywordCandidates(\n descriptors: AuthoringPslBlockDescriptorNamespace,\n): readonly DeclarationKeywordCompletionCandidate[] {\n return descriptorBlockKeywords(descriptors).map((keyword) => ({\n category: 'genericBlock',\n label: keyword,\n insertText: `${keyword} `,\n snippetText: `${keyword} ${nameSnippetPlaceholder} {\\n $0\\n}`,\n detail: 'Generic block keyword',\n kind: CompletionItemKind.Keyword,\n }));\n}\n\nfunction descriptorBlockKeywords(\n descriptors: AuthoringPslBlockDescriptorNamespace,\n): readonly string[] {\n const keywords: string[] = [];\n collectDescriptorBlockKeywords(descriptors, keywords);\n return sortedUnique(keywords);\n}\n\nfunction collectDescriptorBlockKeywords(\n descriptors: AuthoringPslBlockDescriptorNamespace,\n keywords: string[],\n): void {\n for (const value of Object.values(descriptors)) {\n if (isAuthoringPslBlockDescriptor(value)) {\n keywords.push(value.keyword);\n continue;\n }\n collectDescriptorBlockKeywords(value, keywords);\n }\n}\n\nfunction declarationKeywordSortText(candidate: DeclarationKeywordCompletionCandidate): string {\n return `${declarationKeywordCategoryOrder[candidate.category]}:${candidate.label}`;\n}\n\nfunction provideGenericBlockKeyCompletionItems(\n context: GenericBlockKeyCompletionContext,\n sourceFile: SourceFile,\n source: PslCompletionCandidateSource,\n): readonly CompletionItem[] {\n const descriptor = findBlockDescriptor(source.pslBlockDescriptors, context.blockKeyword);\n if (descriptor === undefined) {\n return [];\n }\n\n const existing = existingGenericBlockParameterNames(context.block, context.offset);\n const replacementRange = {\n start: sourceFile.positionAt(context.replacementStartOffset),\n end: sourceFile.positionAt(context.offset),\n };\n\n return Object.keys(descriptor.parameters)\n .filter((parameterName) => !existing.has(parameterName))\n .map((parameterName, index) => ({\n label: parameterName,\n kind: CompletionItemKind.Property,\n detail: 'Generic block parameter',\n sortText: genericBlockParameterSortText(index, parameterName),\n filterText: parameterName,\n textEdit: {\n range: replacementRange,\n newText: parameterName,\n },\n }));\n}\n\nfunction existingGenericBlockParameterNames(\n block: GenericBlockDeclarationAst,\n cursorOffset: number,\n): Set<string> {\n const names = new Set<string>();\n for (const entry of block.entries()) {\n if (!entry.syntax.isOutside(cursorOffset)) {\n continue;\n }\n const name = entry.key()?.name();\n if (name !== undefined) {\n names.add(name);\n }\n }\n return names;\n}\n\nfunction provideModelTypeCompletionItems(\n context: ModelTypeCompletionContext,\n sourceFile: SourceFile,\n source: PslCompletionCandidateSource,\n): readonly CompletionItem[] {\n return modelTypeCompletionItems(context, sourceFile, [\n ...configuredScalarCandidates(source.scalarTypes),\n ...topLevelSymbolCandidates(source.symbolTable),\n ...allNamespaceCandidates(source.symbolTable),\n ]);\n}\n\nfunction provideNamespaceMemberCompletionItems(\n context: NamespaceMemberCompletionContext,\n sourceFile: SourceFile,\n source: PslCompletionCandidateSource,\n): readonly CompletionItem[] {\n // A foreign contract-space reference resolves against external symbols that no\n // registry exposes yet; local namespace members must not stand in for them.\n if (context.space !== undefined) {\n return [];\n }\n return modelTypeCompletionItems(\n context,\n sourceFile,\n namespaceCandidates(source.symbolTable.topLevel.namespaces[context.namespace]),\n );\n}\n\nfunction modelTypeCompletionItems(\n context: ModelTypeCompletionContext | NamespaceMemberCompletionContext,\n sourceFile: SourceFile,\n candidates: readonly ModelTypeCompletionCandidate[],\n): readonly CompletionItem[] {\n const replacementRange = {\n start: sourceFile.positionAt(context.replacementStartOffset),\n end: sourceFile.positionAt(context.offset),\n };\n\n return candidates.map((candidate) => ({\n label: candidate.label,\n kind: candidate.kind,\n detail: candidate.detail,\n sortText: sortText(candidate),\n filterText: candidate.filterText,\n textEdit: {\n range: replacementRange,\n newText: candidate.insertText,\n },\n }));\n}\n\nfunction configuredScalarCandidates(\n scalarTypes: readonly string[],\n): readonly ModelTypeCompletionCandidate[] {\n return sortedUnique(scalarTypes).map((name) => ({\n category: 'configuredScalar',\n label: name,\n insertText: name,\n filterText: name,\n detail: 'Configured scalar type',\n kind: CompletionItemKind.Keyword,\n }));\n}\n\nfunction topLevelSymbolCandidates(\n symbolTable: SymbolTable,\n): readonly ModelTypeCompletionCandidate[] {\n const { topLevel } = symbolTable;\n return [\n ...symbolCandidates(\n recordNames(topLevel.models),\n 'topLevelModel',\n 'Model',\n CompletionItemKind.Class,\n ),\n ...symbolCandidates(\n recordNames(topLevel.compositeTypes),\n 'topLevelCompositeType',\n 'Composite type',\n CompletionItemKind.Struct,\n ),\n ...symbolCandidates(\n recordNames(topLevel.scalars),\n 'scalar',\n 'Scalar type',\n CompletionItemKind.Unit,\n ),\n ...symbolCandidates(\n recordNames(topLevel.typeAliases),\n 'typeAlias',\n 'Type alias',\n CompletionItemKind.Reference,\n ),\n ];\n}\n\nfunction allNamespaceCandidates(symbolTable: SymbolTable): readonly ModelTypeCompletionCandidate[] {\n return Object.values(symbolTable.topLevel.namespaces)\n .sort((left, right) => compareNames(left.name, right.name))\n .map(namespaceQualifierCandidate);\n}\n\nfunction namespaceCandidates(\n namespace: NamespaceSymbol | undefined,\n): readonly ModelTypeCompletionCandidate[] {\n if (namespace === undefined) {\n return [];\n }\n return [\n ...symbolCandidates(\n recordNames(namespace.models),\n 'namespaceModel',\n `Model in namespace ${namespace.name}`,\n CompletionItemKind.Class,\n ),\n ...symbolCandidates(\n recordNames(namespace.compositeTypes),\n 'namespaceCompositeType',\n `Composite type in namespace ${namespace.name}`,\n CompletionItemKind.Struct,\n ),\n ];\n}\n\nfunction namespaceQualifierCandidate(namespace: NamespaceSymbol): ModelTypeCompletionCandidate {\n return {\n category: 'namespace',\n label: namespace.name,\n insertText: namespace.name,\n filterText: namespace.name,\n detail: 'Namespace',\n kind: CompletionItemKind.Module,\n };\n}\n\nfunction symbolCandidates(\n names: readonly string[],\n category: ModelTypeCompletionCandidateCategory,\n detail: string,\n kind: CompletionItemKind,\n): readonly ModelTypeCompletionCandidate[] {\n return names.map((name) => ({\n category,\n label: name,\n insertText: name,\n filterText: name,\n detail,\n kind,\n }));\n}\n\nfunction recordNames<T extends { readonly name: string }>(\n record: Record<string, T>,\n): readonly string[] {\n return Object.values(record)\n .map((symbol) => symbol.name)\n .sort(compareNames);\n}\n\nfunction sortedUnique(names: readonly string[]): readonly string[] {\n return [...new Set(names)].sort(compareNames);\n}\n\nfunction sortText(candidate: ModelTypeCompletionCandidate): string {\n return `${categoryOrder[candidate.category]}:${candidate.label}`;\n}\n\nfunction genericBlockParameterSortText(index: number, label: string): string {\n return `${index.toString().padStart(4, '0')}:${label}`;\n}\n\nfunction compareNames(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n","import { pathToFileURL } from 'node:url';\n\nexport interface SchemaInputConfig {\n readonly contract?: {\n readonly source: {\n readonly sourceFormat?: string;\n readonly inputs?: readonly string[];\n };\n };\n}\n\nexport interface SchemaInputSet {\n includes(uri: string): boolean;\n uris(): Iterable<string>;\n}\n\nexport function hasPslInputs(config: SchemaInputConfig): boolean {\n const source = config.contract?.source;\n return source?.sourceFormat === 'psl' && source.inputs !== undefined;\n}\n\nexport function resolveSchemaInputs(config: SchemaInputConfig): SchemaInputSet {\n const inputs = hasPslInputs(config) ? config.contract?.source.inputs : undefined;\n const uris = new Set(inputs?.map((input) => pathToFileURL(input).toString()));\n\n return {\n includes: (uri) => uris.has(uri),\n uris: () => uris,\n };\n}\n\nexport const emptySchemaInputSet: SchemaInputSet = {\n includes: () => false,\n uris: () => [],\n};\n","import { loadConfig, type PrismaNextConfig } from '@prisma-next/config-loader';\nimport { createControlStack } from '@prisma-next/framework-components/control';\nimport type { FormatOptions } from '@prisma-next/psl-parser/format';\nimport type { PipelineInputs } from './pipeline';\nimport { hasPslInputs, resolveSchemaInputs, type SchemaInputSet } from './schema-inputs';\n\nexport const CONFIG_FILENAME = 'prisma-next.config.ts';\n\nexport interface ConfigResolution {\n readonly inputs: SchemaInputSet;\n readonly formatter?: FormatOptions;\n readonly controlStack: PipelineInputs;\n}\n\nconst emptyPipelineInputs: PipelineInputs = {\n scalarTypes: [],\n pslBlockDescriptors: {},\n};\n\nexport async function resolveConfigInputs(configPath: string): Promise<ConfigResolution> {\n const config = await loadConfig(configPath);\n const inputs = resolveSchemaInputs(config);\n const controlStack = resolveControlStackInputs(config) ?? emptyPipelineInputs;\n return config.formatter === undefined\n ? { inputs, controlStack }\n : { inputs, formatter: config.formatter, controlStack };\n}\n\nexport function resolveControlStackInputs(config: PrismaNextConfig): PipelineInputs | undefined {\n if (!hasPslInputs(config)) {\n return undefined;\n }\n const stack = createControlStack(config);\n return {\n scalarTypes: [...stack.scalarTypeDescriptors.keys()],\n pslBlockDescriptors: stack.authoringContributions.pslBlockDescriptors,\n };\n}\n","import {\n type DocumentAst,\n NamespaceDeclarationAst,\n type NamespaceMemberAst,\n type SourceFile,\n type TypesBlockAst,\n} from '@prisma-next/psl-parser/syntax';\nimport { type FoldingRange, FoldingRangeKind } from 'vscode-languageserver';\n\ntype Declaration = NamespaceMemberAst | TypesBlockAst | NamespaceDeclarationAst;\n\n/**\n * Computes folding ranges for block declarations in a PSL document.\n *\n * Block types that produce folding ranges:\n * - model (e.g., `model User { ... }`)\n * - composite type (e.g., `type Address { ... }`)\n * - namespace (e.g., `namespace billing { ... }`)\n * - generic blocks (generator, datasource, extension blocks)\n * - types block (e.g., `types { ... }`)\n *\n * The range spans from the line containing `{` to the line containing `}`.\n */\nexport function computeFoldingRanges(\n document: DocumentAst,\n sourceFile: SourceFile,\n): FoldingRange[] {\n const ranges: FoldingRange[] = [];\n collectFoldingRanges(document, sourceFile, ranges);\n return ranges;\n}\n\nfunction collectFoldingRanges(\n document: DocumentAst,\n sourceFile: SourceFile,\n ranges: FoldingRange[],\n): void {\n for (const declaration of document.declarations()) {\n addFoldingRange(declaration, sourceFile, ranges);\n\n const namespace = NamespaceDeclarationAst.cast(declaration.syntax);\n if (namespace !== undefined) {\n for (const nested of namespace.declarations()) {\n addFoldingRange(nested, sourceFile, ranges);\n }\n }\n }\n}\n\nfunction addFoldingRange(\n declaration: Declaration,\n sourceFile: SourceFile,\n ranges: FoldingRange[],\n): void {\n const lbrace = declaration.lbrace();\n const rbrace = declaration.rbrace();\n\n if (lbrace === undefined || rbrace === undefined) {\n return;\n }\n\n const startLine = sourceFile.positionAt(lbrace.offset).line;\n const endLine = sourceFile.positionAt(rbrace.offset).line;\n\n ranges.push({\n startLine,\n endLine,\n kind: FoldingRangeKind.Region,\n });\n}\n","import type { AuthoringPslBlockDescriptorNamespace } from '@prisma-next/framework-components/authoring';\nimport { buildSymbolTable, type SymbolTable } from '@prisma-next/psl-parser';\nimport { type DocumentAst, parse, type SourceFile } from '@prisma-next/psl-parser/syntax';\nimport { type LspDiagnostic, mapParseDiagnostics } from './diagnostic-mapping';\n\n/**\n * `pslBlockDescriptors` is kept complete on the live path so extension-block\n * validation matches the build; the structural diagnostics (duplicate\n * declaration, invalid qualified type) hold even without descriptors.\n */\nexport interface PipelineInputs {\n readonly scalarTypes: readonly string[];\n readonly pslBlockDescriptors: AuthoringPslBlockDescriptorNamespace;\n}\n\nexport interface PipelineResult {\n readonly document: DocumentAst;\n readonly sourceFile: SourceFile;\n readonly symbolTable: SymbolTable;\n readonly diagnostics: readonly LspDiagnostic[];\n}\n\n/**\n * Composes the stages exactly as the contract-psl provider does, so the editor\n * and the build agree: `parse` then `buildSymbolTable`, parse diagnostics ahead\n * of symbol-table diagnostics. Never throws on malformed input — `parse`\n * recovers and `buildSymbolTable` is documented not to throw.\n */\nexport function runPipeline(text: string, inputs: PipelineInputs): PipelineResult {\n const { document, sourceFile, diagnostics: parseDiagnostics } = parse(text);\n const { table: symbolTable, diagnostics: symbolTableDiagnostics } = buildSymbolTable({\n document,\n sourceFile,\n scalarTypes: inputs.scalarTypes,\n pslBlockDescriptors: inputs.pslBlockDescriptors,\n });\n\n return {\n document,\n sourceFile,\n symbolTable,\n diagnostics: mapParseDiagnostics([...parseDiagnostics, ...symbolTableDiagnostics]),\n };\n}\n","import type { SymbolTable } from '@prisma-next/psl-parser';\nimport type { DocumentAst, SourceFile } from '@prisma-next/psl-parser/syntax';\nimport type { LspDiagnostic } from './diagnostic-mapping';\nimport { type PipelineInputs, runPipeline } from './pipeline';\nimport type { SchemaInputSet } from './schema-inputs';\n\nexport interface DocumentDiagnostics {\n readonly diagnostics: readonly LspDiagnostic[];\n readonly document: DocumentAst;\n readonly sourceFile: SourceFile;\n readonly symbolTable: SymbolTable;\n}\n\n/**\n * `null` (not a configured input) is distinct from a `DocumentDiagnostics` whose\n * `diagnostics` are `[]` (an input that parsed clean): the caller treats both as\n * \"publish no diagnostics\", but only the latter is a document we own and keep\n * diagnosing.\n */\nexport function computeDocumentDiagnostics(\n uri: string,\n text: string,\n inputs: SchemaInputSet,\n controlStack: PipelineInputs,\n): DocumentDiagnostics | null {\n if (!inputs.includes(uri)) {\n return null;\n }\n const { document, sourceFile, symbolTable, diagnostics } = runPipeline(text, controlStack);\n return { diagnostics, document, sourceFile, symbolTable };\n}\n","import { buildSymbolTable, type SymbolTable } from '@prisma-next/psl-parser';\nimport type { DocumentAst, SourceFile } from '@prisma-next/psl-parser/syntax';\nimport type { LspDiagnostic } from './diagnostic-mapping';\nimport { computeDocumentDiagnostics } from './document-diagnostics';\nimport type { PipelineInputs } from './pipeline';\nimport type { SchemaInputSet } from './schema-inputs';\n\nexport interface DocumentArtifacts {\n readonly document: DocumentAst;\n readonly sourceFile: SourceFile;\n readonly diagnostics: readonly LspDiagnostic[];\n}\n\nexport interface ProjectArtifactsOptions {\n readonly inputs: SchemaInputSet;\n readonly controlStack: PipelineInputs;\n readonly getText: (uri: string) => string | undefined;\n}\n\n/**\n * Reads can never observe stale artifacts: the vscode-languageserver runtime\n * dispatches messages in order and the server raises `documentChanged` /\n * `documentClosed` synchronously against the already-updated text mirror, so\n * every mutation that could affect a read lands before that read runs. A\n * config reload replaces the store wholesale.\n */\nexport interface ProjectArtifacts {\n /**\n * `undefined` when the document is not open in the text mirror or is not\n * one of the project's configured inputs.\n */\n document(uri: string): DocumentArtifacts | undefined;\n symbolTable(): SymbolTable;\n documentChanged(uri: string): void;\n documentClosed(uri: string): void;\n}\n\nexport function createProjectArtifacts(options: ProjectArtifactsOptions): ProjectArtifacts {\n const { inputs, controlStack, getText } = options;\n const documents = new Map<string, DocumentArtifacts>();\n let symbolTable: SymbolTable | undefined;\n\n function drop(uri: string): void {\n if (documents.delete(uri)) {\n symbolTable = undefined;\n }\n }\n\n function readDocument(uri: string): DocumentArtifacts | undefined {\n const existing = documents.get(uri);\n if (existing !== undefined) {\n return existing;\n }\n const text = getText(uri);\n if (text === undefined) {\n return undefined;\n }\n const computed = computeDocumentDiagnostics(uri, text, inputs, controlStack);\n if (computed === null) {\n return undefined;\n }\n const artifacts: DocumentArtifacts = {\n document: computed.document,\n sourceFile: computed.sourceFile,\n diagnostics: computed.diagnostics,\n };\n documents.set(uri, artifacts);\n // Single-input by design: the project-wide symbolTable is rebuilt from the\n // one open configured input; merging multiple inputs (and reading unopened\n // ones from disk) is deferred cross-file work.\n symbolTable = computed.symbolTable;\n return artifacts;\n }\n\n return {\n document: readDocument,\n symbolTable: () => {\n if (symbolTable !== undefined) {\n return symbolTable;\n }\n for (const uri of inputs.uris()) {\n const artifacts = readDocument(uri);\n if (artifacts === undefined) {\n continue;\n }\n // A read that hits existing artifacts leaves the slot unset (the\n // contributing input may have closed since); rebuild from the\n // artifacts without reparsing.\n symbolTable ??= buildSymbolTable({\n document: artifacts.document,\n sourceFile: artifacts.sourceFile,\n scalarTypes: controlStack.scalarTypes,\n pslBlockDescriptors: controlStack.pslBlockDescriptors,\n }).table;\n return symbolTable;\n }\n // The server's lifecycle makes this unreachable: it drops a project\n // once its last open input closes. Throwing loudly beats serving a\n // fabricated empty symbolTable that would mask the broken invariant.\n throw new Error(\n 'invariant violated: project has no open configured input — the server must drop such projects',\n );\n },\n documentChanged: drop,\n documentClosed: drop,\n };\n}\n","import type { SymbolTable } from '@prisma-next/psl-parser';\nimport {\n ArrayLiteralAst,\n type AttributeArgAst,\n type AttributeArgListAst,\n type AttributeAst,\n type BlockMemberAst,\n BooleanLiteralExprAst,\n CompositeTypeDeclarationAst,\n type DeclarationAst,\n type DocumentAst,\n type ExpressionAst,\n FieldDeclarationAst,\n FunctionCallAst,\n filterChildren,\n findChildToken,\n type GenericBlockMemberAst,\n IdentifierAst,\n ModelDeclarationAst,\n type NamedTypeDeclarationAst,\n NamespaceDeclarationAst,\n NumberLiteralExprAst,\n ObjectLiteralExprAst,\n type QualifiedNameAst,\n type SourceFile,\n StringLiteralExprAst,\n type SyntaxToken,\n type TypeAnnotationAst,\n TypesBlockAst,\n} from '@prisma-next/psl-parser/syntax';\nimport {\n type Range,\n SemanticTokenModifiers,\n type SemanticTokens,\n type SemanticTokensLegend,\n SemanticTokenTypes,\n} from 'vscode-languageserver';\n\nexport type SemanticTokenType =\n | 'keyword'\n | 'namespace'\n | 'class'\n | 'struct'\n | 'type'\n | 'property'\n | 'decorator'\n | 'string'\n | 'number'\n | 'comment';\n\nexport type SemanticTokenModifier = 'declaration' | 'defaultLibrary';\n\nexport const semanticTokenTypes: readonly SemanticTokenType[] = [\n SemanticTokenTypes.keyword,\n SemanticTokenTypes.namespace,\n SemanticTokenTypes.class,\n SemanticTokenTypes.struct,\n SemanticTokenTypes.type,\n SemanticTokenTypes.property,\n SemanticTokenTypes.decorator,\n SemanticTokenTypes.string,\n SemanticTokenTypes.number,\n SemanticTokenTypes.comment,\n];\n\nexport const semanticTokenModifiers = [\n SemanticTokenModifiers.declaration,\n SemanticTokenModifiers.defaultLibrary,\n] as const satisfies readonly SemanticTokenModifier[];\n\nexport const semanticTokenModifierIndexes = {\n declaration: 0,\n defaultLibrary: 1,\n} as const satisfies Record<SemanticTokenModifier, number>;\n\nexport const semanticTokenModifierBits = {\n declaration: 1 << semanticTokenModifierIndexes.declaration,\n defaultLibrary: 1 << semanticTokenModifierIndexes.defaultLibrary,\n} as const satisfies Record<SemanticTokenModifier, number>;\n\nexport const semanticTokensLegend: SemanticTokensLegend = {\n tokenTypes: [...semanticTokenTypes],\n tokenModifiers: [...semanticTokenModifiers],\n};\n\nexport interface SemanticTokenSource {\n readonly document: DocumentAst;\n readonly sourceFile: SourceFile;\n readonly symbolTable: SymbolTable;\n readonly scalarTypes: readonly string[];\n}\n\nexport interface PendingSemanticToken {\n readonly startOffset: number;\n readonly endOffset: number;\n readonly tokenTypeIndex: number;\n readonly modifierBitset: number;\n readonly splitMultiline: boolean;\n}\n\ntype TypeReferenceKind = 'class' | 'struct' | 'type';\n\ninterface TypeReferenceClassification {\n readonly tokenType: TypeReferenceKind;\n readonly modifierBitset?: number;\n}\n\ninterface IdentifierSegment {\n readonly identifier: IdentifierAst;\n readonly text: string;\n}\n\ninterface ExpressionContext {\n readonly bareIdentifierTokenType?: SemanticTokenType;\n}\n\nexport function buildSemanticTokens(source: SemanticTokenSource, range?: Range): SemanticTokens {\n const builder = new SemanticTokensBuilder(source.sourceFile, range);\n for (const token of collectSemanticTokenEvents(source)) {\n builder.add(token);\n }\n return builder.build();\n}\n\nexport function collectSemanticTokenEvents(\n source: SemanticTokenSource,\n): readonly PendingSemanticToken[] {\n const comments = collectCommentTokens(source.document);\n const tokens: PendingSemanticToken[] = [];\n collectDeclarations(source, tokens);\n return mergeSourceOrderedTokens(comments, tokens);\n}\n\nexport class SemanticTokensBuilder {\n readonly #data: number[] = [];\n readonly #sourceFile: SourceFile;\n readonly #rangeOffsets: { readonly lower: number; readonly upper: number } | undefined;\n #previousLine = 0;\n #previousCharacter = 0;\n #first = true;\n\n constructor(sourceFile: SourceFile, range?: Range) {\n this.#sourceFile = sourceFile;\n if (range !== undefined) {\n const startOffset = sourceFile.offsetAt(range.start);\n const endOffset = sourceFile.offsetAt(range.end);\n this.#rangeOffsets = {\n lower: Math.min(startOffset, endOffset),\n upper: Math.max(startOffset, endOffset),\n };\n }\n }\n\n add(token: PendingSemanticToken): void {\n if (!this.#intersectsRange(token.startOffset, token.endOffset)) {\n return;\n }\n\n if (token.splitMultiline) {\n this.#addMultilineSplitToken(token);\n return;\n }\n\n this.#encode(token.startOffset, token.endOffset, token.tokenTypeIndex, token.modifierBitset);\n }\n\n build(): SemanticTokens {\n return { data: this.#data };\n }\n\n #intersectsRange(startOffset: number, endOffset: number): boolean {\n const rangeOffsets = this.#rangeOffsets;\n return (\n rangeOffsets === undefined ||\n (startOffset < rangeOffsets.upper && endOffset > rangeOffsets.lower)\n );\n }\n\n #addMultilineSplitToken(token: PendingSemanticToken): void {\n const start = this.#sourceFile.positionAt(token.startOffset);\n const end = this.#sourceFile.positionAt(token.endOffset);\n if (start.line === end.line) {\n this.#encode(token.startOffset, token.endOffset, token.tokenTypeIndex, token.modifierBitset);\n return;\n }\n\n for (let line = start.line; line <= end.line; line++) {\n const startOffset =\n line === start.line ? token.startOffset : this.#sourceFile.lineStartOffset(line);\n const endOffset = line === end.line ? token.endOffset : this.#sourceFile.lineEndOffset(line);\n if (endOffset > startOffset && this.#intersectsRange(startOffset, endOffset)) {\n this.#encode(startOffset, endOffset, token.tokenTypeIndex, token.modifierBitset);\n }\n }\n }\n\n #encode(\n startOffset: number,\n endOffset: number,\n tokenTypeIndex: number,\n modifierBitset: number,\n ): void {\n const start = this.#sourceFile.positionAt(startOffset);\n const deltaLine = this.#first ? start.line : start.line - this.#previousLine;\n const deltaStart =\n this.#first || deltaLine !== 0 ? start.character : start.character - this.#previousCharacter;\n this.#data.push(deltaLine, deltaStart, endOffset - startOffset, tokenTypeIndex, modifierBitset);\n this.#previousLine = start.line;\n this.#previousCharacter = start.character;\n this.#first = false;\n }\n}\n\nfunction collectCommentTokens(document: DocumentAst): readonly PendingSemanticToken[] {\n const tokens: PendingSemanticToken[] = [];\n for (const token of document.syntax.tokens()) {\n if (token.kind === 'Comment') {\n tokens.push(pendingTokenForToken(token, 'comment'));\n }\n }\n return tokens;\n}\n\nfunction collectDeclarations(source: SemanticTokenSource, tokens: PendingSemanticToken[]): void {\n for (const declaration of source.document.declarations()) {\n collectDeclaration(declaration, source, tokens, undefined);\n }\n}\n\nfunction collectDeclaration(\n declaration: DeclarationAst,\n source: SemanticTokenSource,\n tokens: PendingSemanticToken[],\n namespace: string | undefined,\n): void {\n if (declaration instanceof ModelDeclarationAst) {\n addToken(declaration.keyword(), 'keyword', tokens);\n addIdentifier(declaration.name(), 'class', tokens, semanticTokenModifierBits.declaration);\n collectBlockMembers(declaration.members(), source, tokens, namespace);\n return;\n }\n\n if (declaration instanceof CompositeTypeDeclarationAst) {\n addToken(declaration.keyword(), 'keyword', tokens);\n addIdentifier(declaration.name(), 'struct', tokens, semanticTokenModifierBits.declaration);\n collectBlockMembers(declaration.members(), source, tokens, namespace);\n return;\n }\n\n if (declaration instanceof NamespaceDeclarationAst) {\n addToken(declaration.keyword(), 'keyword', tokens);\n addIdentifier(declaration.name(), 'namespace', tokens, semanticTokenModifierBits.declaration);\n const nestedNamespace = declaration.name()?.name();\n for (const nested of declaration.declarations()) {\n collectDeclaration(nested, source, tokens, nestedNamespace);\n }\n return;\n }\n\n if (declaration instanceof TypesBlockAst) {\n addToken(declaration.keyword(), 'keyword', tokens);\n for (const namedType of declaration.declarations()) {\n collectNamedTypeDeclaration(namedType, source, tokens, namespace);\n }\n return;\n }\n\n addToken(declaration.keyword(), 'keyword', tokens);\n addIdentifier(declaration.name(), 'type', tokens, semanticTokenModifierBits.declaration);\n collectGenericBlockMembers(declaration.members(), source, tokens, namespace);\n}\n\nfunction collectNamedTypeDeclaration(\n declaration: NamedTypeDeclarationAst,\n source: SemanticTokenSource,\n tokens: PendingSemanticToken[],\n namespace: string | undefined,\n): void {\n addIdentifier(declaration.name(), 'type', tokens, semanticTokenModifierBits.declaration);\n collectTypeAnnotation(declaration.typeAnnotation(), source, tokens, namespace);\n collectAttributes(declaration.attributes(), source, tokens, namespace);\n}\n\nfunction collectGenericBlockMembers(\n members: Iterable<GenericBlockMemberAst>,\n source: SemanticTokenSource,\n tokens: PendingSemanticToken[],\n namespace: string | undefined,\n): void {\n for (const member of members) {\n if ('key' in member) {\n addIdentifier(member.key(), 'property', tokens);\n collectExpression(member.value(), source, tokens, namespace);\n continue;\n }\n collectAttribute(member, source, tokens, namespace);\n }\n}\n\nfunction collectBlockMembers(\n members: Iterable<BlockMemberAst>,\n source: SemanticTokenSource,\n tokens: PendingSemanticToken[],\n namespace: string | undefined,\n): void {\n for (const member of members) {\n if (member instanceof FieldDeclarationAst) {\n collectField(member, source, tokens, namespace);\n continue;\n }\n collectAttribute(member, source, tokens, namespace);\n }\n}\n\nfunction collectField(\n field: FieldDeclarationAst,\n source: SemanticTokenSource,\n tokens: PendingSemanticToken[],\n namespace: string | undefined,\n): void {\n addIdentifier(field.name(), 'property', tokens, semanticTokenModifierBits.declaration);\n collectTypeAnnotation(field.typeAnnotation(), source, tokens, namespace);\n collectAttributes(field.attributes(), source, tokens, namespace);\n}\n\nfunction collectTypeAnnotation(\n annotation: TypeAnnotationAst | undefined,\n source: SemanticTokenSource,\n tokens: PendingSemanticToken[],\n namespace: string | undefined,\n): void {\n if (annotation === undefined) {\n return;\n }\n collectTypeReference(annotation.name(), source, tokens, namespace);\n collectAttributeArgList(annotation.argList(), source, tokens, namespace);\n}\n\nfunction collectAttributes(\n attributes: Iterable<AttributeAst>,\n source: SemanticTokenSource,\n tokens: PendingSemanticToken[],\n namespace: string | undefined,\n): void {\n for (const attribute of attributes) {\n collectAttribute(attribute, source, tokens, namespace);\n }\n}\n\nfunction collectAttribute(\n attribute: AttributeAst,\n source: SemanticTokenSource,\n tokens: PendingSemanticToken[],\n namespace: string | undefined,\n): void {\n const marker =\n findChildToken(attribute.syntax, 'At') ?? findChildToken(attribute.syntax, 'DoubleAt');\n collectDecoratorName(attribute.name(), marker, tokens);\n collectAttributeArgList(attribute.argList(), source, tokens, namespace);\n}\n\nfunction collectDecoratorName(\n name: QualifiedNameAst | undefined,\n marker: SyntaxToken | undefined,\n tokens: PendingSemanticToken[],\n): void {\n if (name === undefined) {\n return;\n }\n const segments = identifierSegments(name);\n for (const [index, segment] of segments.entries()) {\n tokens.push(rangeForDecoratorIdentifier(segment.identifier, index === 0 ? marker : undefined));\n }\n}\n\nfunction collectAttributeArgList(\n argList: AttributeArgListAst | undefined,\n source: SemanticTokenSource,\n tokens: PendingSemanticToken[],\n namespace: string | undefined,\n): void {\n if (argList === undefined) {\n return;\n }\n for (const arg of argList.args()) {\n collectAttributeArg(arg, source, tokens, namespace);\n }\n}\n\nfunction collectAttributeArg(\n arg: AttributeArgAst,\n source: SemanticTokenSource,\n tokens: PendingSemanticToken[],\n namespace: string | undefined,\n): void {\n const name = arg.name();\n addIdentifier(name, 'property', tokens);\n collectExpression(arg.value(), source, tokens, namespace, expressionContextForAttributeArg(name));\n}\n\nfunction collectExpression(\n expression: ExpressionAst | undefined,\n source: SemanticTokenSource,\n tokens: PendingSemanticToken[],\n namespace: string | undefined,\n context: ExpressionContext = {},\n): void {\n if (expression === undefined) {\n return;\n }\n\n if (expression instanceof StringLiteralExprAst) {\n addToken(expression.token(), 'string', tokens);\n return;\n }\n\n if (expression instanceof NumberLiteralExprAst) {\n addToken(expression.token(), 'number', tokens);\n return;\n }\n\n if (expression instanceof BooleanLiteralExprAst) {\n addToken(expression.token(), 'keyword', tokens);\n return;\n }\n\n if (expression instanceof FunctionCallAst) {\n collectTypeReference(expression.name(), source, tokens, namespace);\n for (const arg of expression.args()) {\n collectAttributeArg(arg, source, tokens, namespace);\n }\n return;\n }\n\n if (expression instanceof ArrayLiteralAst) {\n for (const element of expression.elements()) {\n collectExpression(element, source, tokens, namespace, context);\n }\n return;\n }\n\n if (expression instanceof ObjectLiteralExprAst) {\n for (const field of expression.fields()) {\n addIdentifier(field.key(), 'property', tokens);\n collectExpression(field.value(), source, tokens, namespace);\n }\n return;\n }\n\n collectIdentifierExpression(expression, source, tokens, namespace, context);\n}\n\nfunction collectIdentifierExpression(\n identifier: IdentifierAst,\n source: SemanticTokenSource,\n tokens: PendingSemanticToken[],\n namespace: string | undefined,\n context: ExpressionContext,\n): void {\n const text = identifier.name();\n if (text === undefined) {\n return;\n }\n const bareIdentifierTokenType = context.bareIdentifierTokenType;\n if (bareIdentifierTokenType !== undefined) {\n tokens.push(rangeForIdentifier(identifier, bareIdentifierTokenType));\n return;\n }\n const classification = classifyTypeReference([text], source, namespace);\n tokens.push(\n rangeForIdentifier(identifier, classification.tokenType, classification.modifierBitset),\n );\n}\n\nfunction expressionContextForAttributeArg(name: IdentifierAst | undefined): ExpressionContext {\n const argName = name?.name();\n return argName === 'fields' || argName === 'references'\n ? { bareIdentifierTokenType: 'property' }\n : {};\n}\n\nfunction collectTypeReference(\n name: QualifiedNameAst | undefined,\n source: SemanticTokenSource,\n tokens: PendingSemanticToken[],\n namespace: string | undefined,\n): void {\n if (name === undefined) {\n return;\n }\n\n const segments = identifierSegments(name);\n if (segments.length === 0) {\n return;\n }\n\n const path = segments.map((segment) => segment.text);\n for (const segment of segments.slice(0, -1)) {\n if (isKnownNamespace(segment.text, source.symbolTable)) {\n tokens.push(rangeForIdentifier(segment.identifier, 'namespace'));\n }\n }\n\n const finalSegment = segments[segments.length - 1];\n if (finalSegment === undefined) {\n return;\n }\n const classification = classifyTypeReference(path, source, namespace);\n tokens.push(\n rangeForIdentifier(\n finalSegment.identifier,\n classification.tokenType,\n classification.modifierBitset,\n ),\n );\n}\n\nfunction classifyTypeReference(\n path: readonly string[],\n source: SemanticTokenSource,\n namespace: string | undefined,\n): TypeReferenceClassification {\n const name = path[path.length - 1];\n if (name === undefined) {\n return { tokenType: 'type' };\n }\n\n const table = source.symbolTable;\n const namespaceName = path.length > 1 ? path[path.length - 2] : namespace;\n const namespaceScope =\n namespaceName !== undefined ? table.topLevel.namespaces[namespaceName] : undefined;\n\n if (namespaceScope !== undefined) {\n if (Object.hasOwn(namespaceScope.models, name)) {\n return { tokenType: 'class' };\n }\n if (Object.hasOwn(namespaceScope.compositeTypes, name)) {\n return { tokenType: 'struct' };\n }\n if (Object.hasOwn(namespaceScope.blocks, name)) {\n return { tokenType: 'type' };\n }\n }\n\n if (Object.hasOwn(table.topLevel.models, name)) {\n return { tokenType: 'class' };\n }\n if (Object.hasOwn(table.topLevel.compositeTypes, name)) {\n return { tokenType: 'struct' };\n }\n if (Object.hasOwn(table.topLevel.scalars, name)) {\n return { tokenType: 'type', modifierBitset: semanticTokenModifierBits.defaultLibrary };\n }\n if (\n Object.hasOwn(table.topLevel.typeAliases, name) ||\n Object.hasOwn(table.topLevel.blocks, name)\n ) {\n return { tokenType: 'type' };\n }\n\n if (source.scalarTypes.includes(name)) {\n return { tokenType: 'type', modifierBitset: semanticTokenModifierBits.defaultLibrary };\n }\n\n return { tokenType: 'type' };\n}\n\nfunction isKnownNamespace(name: string, table: SymbolTable): boolean {\n return Object.hasOwn(table.topLevel.namespaces, name);\n}\n\nfunction identifierSegments(name: QualifiedNameAst): readonly IdentifierSegment[] {\n const segments: IdentifierSegment[] = [];\n for (const identifier of filterChildren(name.syntax, IdentifierAst.cast)) {\n const text = identifier.name();\n if (text !== undefined) {\n segments.push({ identifier, text });\n }\n }\n return segments;\n}\n\nfunction addIdentifier(\n identifier: IdentifierAst | undefined,\n tokenType: SemanticTokenType,\n tokens: PendingSemanticToken[],\n modifierBitset = 0,\n): void {\n if (identifier === undefined) {\n return;\n }\n tokens.push(rangeForIdentifier(identifier, tokenType, modifierBitset));\n}\n\nfunction addToken(\n token: SyntaxToken | undefined,\n tokenType: SemanticTokenType,\n tokens: PendingSemanticToken[],\n modifierBitset = 0,\n): void {\n if (token === undefined) {\n return;\n }\n tokens.push(pendingTokenForToken(token, tokenType, modifierBitset));\n}\n\nfunction rangeForIdentifier(\n identifier: IdentifierAst,\n tokenType: SemanticTokenType,\n modifierBitset = 0,\n): PendingSemanticToken {\n const token = identifier.token();\n if (token === undefined) {\n return createPendingSemanticToken(\n identifier.syntax.offset,\n identifier.syntax.offset,\n tokenType,\n modifierBitset,\n );\n }\n return pendingTokenForToken(token, tokenType, modifierBitset);\n}\n\nfunction rangeForDecoratorIdentifier(\n identifier: IdentifierAst,\n marker: SyntaxToken | undefined,\n): PendingSemanticToken {\n const range = rangeForIdentifier(identifier, 'decorator');\n if (marker === undefined || marker.offset >= range.startOffset) {\n return range;\n }\n return createPendingSemanticToken(\n marker.offset,\n range.endOffset,\n 'decorator',\n range.modifierBitset,\n );\n}\n\nfunction pendingTokenForToken(\n token: SyntaxToken,\n tokenType: SemanticTokenType,\n modifierBitset = 0,\n): PendingSemanticToken {\n return createPendingSemanticToken(\n token.offset,\n token.offset + token.text.length,\n tokenType,\n modifierBitset,\n );\n}\n\nfunction mergeSourceOrderedTokens(\n left: readonly PendingSemanticToken[],\n right: readonly PendingSemanticToken[],\n): readonly PendingSemanticToken[] {\n const result: PendingSemanticToken[] = [];\n let leftIndex = 0;\n let rightIndex = 0;\n\n while (leftIndex < left.length || rightIndex < right.length) {\n const leftToken = left[leftIndex];\n const rightToken = right[rightIndex];\n if (\n leftToken !== undefined &&\n (rightToken === undefined || leftToken.startOffset <= rightToken.startOffset)\n ) {\n result.push(leftToken);\n leftIndex++;\n } else if (rightToken !== undefined) {\n result.push(rightToken);\n rightIndex++;\n }\n }\n\n return result;\n}\n\nfunction createPendingSemanticToken(\n startOffset: number,\n endOffset: number,\n tokenType: SemanticTokenType,\n modifierBitset = 0,\n): PendingSemanticToken {\n return {\n startOffset,\n endOffset,\n tokenTypeIndex: tokenTypeIndex(tokenType),\n modifierBitset,\n splitMultiline: tokenType === 'string' || tokenType === 'comment',\n };\n}\n\nfunction tokenTypeIndex(tokenType: SemanticTokenType): number {\n return semanticTokenTypes.indexOf(tokenType);\n}\n","import { fileURLToPath } from 'node:url';\nimport { findNearestConfigPathForFile } from '@prisma-next/config-loader';\nimport type { SymbolTable } from '@prisma-next/psl-parser';\nimport { type FormatOptions, format } from '@prisma-next/psl-parser/format';\nimport { join } from 'pathe';\nimport {\n type CompletionItem,\n type Connection,\n type Diagnostic,\n DiagnosticSeverity,\n DidChangeWatchedFilesNotification,\n type DocumentDiagnosticReport,\n DocumentDiagnosticReportKind,\n type FoldingRange,\n type FullDocumentDiagnosticReport,\n type InitializeParams,\n type InitializeResult,\n type Position,\n type PublishDiagnosticsParams,\n type Range,\n RegistrationRequest,\n type SemanticTokens,\n TextDocumentSyncKind,\n TextDocuments,\n type TextEdit,\n} from 'vscode-languageserver';\nimport { TextDocument } from 'vscode-languageserver-textdocument';\nimport { classifyPslCompletionContext } from './completion-context';\nimport { providePslCompletionItems } from './completion-provider';\nimport { CONFIG_FILENAME, resolveConfigInputs } from './config-resolution';\nimport { type LspDiagnostic, ParseDiagnosticSeverity } from './diagnostic-mapping';\nimport { computeFoldingRanges } from './folding-ranges';\nimport type { PipelineInputs } from './pipeline';\nimport {\n createProjectArtifacts,\n type DocumentArtifacts,\n type ProjectArtifacts,\n} from './project-artifacts';\nimport type { SchemaInputSet } from './schema-inputs';\nimport { buildSemanticTokens, semanticTokensLegend } from './semantic-tokens';\n\nexport interface LanguageServer {\n dispose(): void;\n /**\n * Exposed for future features (completion, semantic tokens); nothing consumes\n * them yet.\n */\n getDocumentAst(uri: string): DocumentArtifacts | undefined;\n getProjectSymbolTable(uri: string): SymbolTable | undefined;\n}\n\ninterface ProjectState {\n readonly configPath: string;\n readonly inputs: SchemaInputSet;\n readonly formatter?: FormatOptions;\n /**\n * Resolved once per config and refreshed by the config-watch path — never\n * rebuilt per document.\n */\n readonly controlStack: PipelineInputs;\n readonly artifacts: ProjectArtifacts;\n}\n\n/**\n * One entry per managed config: either the load in flight or the loaded\n * project — never both, never a settled load without an entry decision.\n */\ntype ManagedProject =\n | {\n readonly status: 'loading';\n readonly load: Promise<ProjectState>;\n /**\n * Whether a loaded project existed when this load (chain) began — a\n * failed reload must still clear the markers push clients were shown,\n * while a failed first load must not publish anything.\n */\n readonly hadLoadedProject: boolean;\n }\n | { readonly status: 'loaded'; readonly project: ProjectState };\n\nconst semanticTokenSourceLimit = 100_000;\n\nexport function createServer(connection: Connection): LanguageServer {\n const documents = new TextDocuments(TextDocument);\n const managedProjects = new Map<string, ManagedProject>();\n const documentConfigPaths = new Map<string, string>();\n let rootPath = process.cwd();\n let watchedConfigGlob = join(rootPath, '**', CONFIG_FILENAME);\n let clientCapabilities = noClientCapabilities;\n let disposed = false;\n\n function sendDiagnostics(params: PublishDiagnosticsParams): void {\n if (disposed) {\n return;\n }\n void connection.sendDiagnostics(params);\n }\n\n function logWarn(message: string): void {\n if (disposed) {\n return;\n }\n connection.console.warn(message);\n }\n\n async function publish(uri: string): Promise<void> {\n const project = await resolveProjectForDocument(uri);\n if (project === undefined) {\n return;\n }\n const document = documents.get(uri);\n if (document === undefined) {\n documentConfigPaths.delete(uri);\n return;\n }\n const artifacts = project.artifacts.document(uri);\n if (artifacts === undefined) {\n sendDiagnostics({ uri, diagnostics: [] });\n return;\n }\n sendDiagnostics({ uri, diagnostics: toDiagnostics(artifacts.diagnostics) });\n }\n\n /**\n * Project-scoped so a future multi-input symbol table can attach\n * `relatedDocuments` for cross-file effects.\n */\n function buildDocumentDiagnosticReport(\n project: ProjectState,\n uri: string,\n ): FullDocumentDiagnosticReport {\n const artifacts = project.artifacts.document(uri);\n return {\n kind: DocumentDiagnosticReportKind.Full,\n items: artifacts === undefined ? [] : toDiagnostics(artifacts.diagnostics),\n };\n }\n\n async function resolveProjectForDocument(uri: string): Promise<ProjectState | undefined> {\n const project = await projectForNearestConfig(uri);\n if (project === undefined || project.inputs.includes(uri)) {\n return project;\n }\n // Only the config's declared inputs are managed: a stray document beside\n // a config keeps no association, so reads and events never reach it — and\n // a project it alone caused to load is dropped again.\n documentConfigPaths.delete(uri);\n dropProjectWithoutManagedDocuments(project.configPath);\n return undefined;\n }\n\n async function projectForNearestConfig(uri: string): Promise<ProjectState | undefined> {\n const knownConfigPath = documentConfigPaths.get(uri);\n if (knownConfigPath !== undefined) {\n const project = await resolveProjectIfLoadable(knownConfigPath);\n if (project === undefined) {\n documentConfigPaths.delete(uri);\n }\n return project;\n }\n\n const filePath = filePathFromUri(uri);\n if (filePath === undefined) {\n return undefined;\n }\n\n let configPath: string | undefined;\n try {\n configPath = await findNearestConfigPathForFile(filePath);\n } catch {\n // Config discovery walks the filesystem; a failure means \"no project\".\n return undefined;\n }\n if (configPath === undefined) {\n return undefined;\n }\n\n documentConfigPaths.set(uri, configPath);\n const project = await resolveProjectIfLoadable(configPath);\n if (project === undefined) {\n documentConfigPaths.delete(uri);\n }\n return project;\n }\n\n async function resolveProjectIfLoadable(configPath: string): Promise<ProjectState | undefined> {\n try {\n return await resolveProject(configPath);\n } catch {\n stopManagingProject(configPath);\n return undefined;\n }\n }\n\n async function resolveProject(configPath: string): Promise<ProjectState> {\n const entry = managedProjects.get(configPath);\n if (entry === undefined) {\n return startProjectLoad(configPath);\n }\n return entry.status === 'loaded' ? entry.project : entry.load;\n }\n\n function refreshProject(configPath: string): Promise<ProjectState> {\n return startProjectLoad(configPath);\n }\n\n // A load replaces the entry with `loading` immediately, so reads during a\n // config reload await the fresh resolution instead of the pre-reload\n // project. A failed load leaves its entry in place — every awaiter funnels\n // the failure into `stopManagingProject`, which needs the entry to decide\n // whether push clears are owed.\n function startProjectLoad(configPath: string): Promise<ProjectState> {\n const existing = managedProjects.get(configPath);\n const previousLoad = existing?.status === 'loading' ? existing.load : undefined;\n const hadLoadedProject =\n existing?.status === 'loaded' ||\n (existing?.status === 'loading' && existing.hadLoadedProject);\n const load: Promise<ProjectState> = (previousLoad ?? Promise.resolve(undefined))\n .catch(() => undefined)\n .then(() => loadProject(configPath))\n .then((project) => {\n // A load that outlives the last association must not keep a project\n // entry alive.\n if (isCurrentLoad(configPath, load)) {\n if (hasManagedDocuments(configPath)) {\n managedProjects.set(configPath, { status: 'loaded', project });\n } else {\n managedProjects.delete(configPath);\n }\n }\n return project;\n });\n managedProjects.set(configPath, { status: 'loading', load, hadLoadedProject });\n return load;\n }\n\n function isCurrentLoad(configPath: string, load: Promise<ProjectState>): boolean {\n const entry = managedProjects.get(configPath);\n return entry?.status === 'loading' && entry.load === load;\n }\n\n async function loadProject(configPath: string): Promise<ProjectState> {\n const resolution = await resolveConfigInputs(configPath);\n // A fresh store per load: a config reload can change what a parse\n // produces (inputs, control stack), so later reads must derive from the\n // new resolution rather than anything computed under the old one.\n const artifacts = createProjectArtifacts({\n inputs: resolution.inputs,\n controlStack: resolution.controlStack,\n getText: (uri) => documents.get(uri)?.getText(),\n });\n const project: ProjectState =\n resolution.formatter === undefined\n ? {\n configPath,\n inputs: resolution.inputs,\n controlStack: resolution.controlStack,\n artifacts,\n }\n : {\n configPath,\n inputs: resolution.inputs,\n formatter: resolution.formatter,\n controlStack: resolution.controlStack,\n artifacts,\n };\n return project;\n }\n\n function stopManagingProject(configPath: string): void {\n const entry = managedProjects.get(configPath);\n const hadProject =\n entry?.status === 'loaded' || (entry?.status === 'loading' && entry.hadLoadedProject);\n managedProjects.delete(configPath);\n for (const document of documents.all()) {\n if (documentConfigPaths.get(document.uri) === configPath) {\n documentConfigPaths.delete(document.uri);\n if (hadProject && !clientCapabilities.pullDiagnostics) {\n sendDiagnostics({ uri: document.uri, diagnostics: [] });\n }\n }\n }\n }\n\n async function republishOpenDocumentsForConfig(configPath: string): Promise<void> {\n for (const document of documents.all()) {\n const knownConfigPath = documentConfigPaths.get(document.uri);\n if (knownConfigPath === configPath) {\n if ((await resolveProjectForDocument(document.uri)) === undefined) {\n // The reload dropped a previously managed document; clear its markers.\n sendDiagnostics({ uri: document.uri, diagnostics: [] });\n continue;\n }\n await publish(document.uri);\n continue;\n }\n\n const filePath = filePathFromUri(document.uri);\n if (filePath === undefined) {\n continue;\n }\n const nearestConfigPath = await findNearestConfigPathForFile(filePath);\n if (nearestConfigPath === configPath) {\n documentConfigPaths.set(document.uri, configPath);\n await publish(document.uri);\n }\n }\n }\n\n function publishSafely(uri: string): void {\n void publish(uri).catch((error: unknown) => {\n if (disposed) {\n return;\n }\n connection.console.error(error instanceof Error ? error.message : String(error));\n });\n }\n\n async function formatDocument(uri: string): Promise<TextEdit[]> {\n const document = documents.get(uri);\n if (document === undefined) {\n return [];\n }\n\n const project = await resolveProjectForDocument(uri);\n if (project === undefined) {\n return [];\n }\n\n const source = document.getText();\n let formatted: string;\n try {\n formatted = format(source, project.formatter);\n } catch {\n return [];\n }\n\n if (formatted === source) {\n return [];\n }\n\n return [\n {\n range: { start: { line: 0, character: 0 }, end: document.positionAt(source.length) },\n newText: formatted,\n },\n ];\n }\n\n async function semanticTokensForDocument(uri: string, range?: Range): Promise<SemanticTokens> {\n const document = documents.get(uri);\n if (document === undefined) {\n return emptySemanticTokens();\n }\n const text = document.getText();\n if (text.length > semanticTokenSourceLimit) {\n return emptySemanticTokens();\n }\n\n const project = await resolveProjectForDocument(uri);\n if (project === undefined) {\n return emptySemanticTokens();\n }\n\n const artifacts = project.artifacts.document(uri);\n if (artifacts === undefined) {\n return emptySemanticTokens();\n }\n\n const source = {\n document: artifacts.document,\n sourceFile: artifacts.sourceFile,\n symbolTable: project.artifacts.symbolTable(),\n scalarTypes: project.controlStack.scalarTypes,\n };\n return buildSemanticTokens(source, range);\n }\n\n async function completeDocument(uri: string, position: Position): Promise<CompletionItem[]> {\n const document = documents.get(uri);\n if (document === undefined) {\n return [];\n }\n\n const project = await resolveProjectForDocument(uri);\n if (project === undefined) {\n return [];\n }\n\n const artifacts = project.artifacts.document(uri);\n if (artifacts === undefined) {\n return [];\n }\n\n try {\n const context = classifyPslCompletionContext({\n document: artifacts.document,\n sourceFile: artifacts.sourceFile,\n position,\n });\n return [\n ...providePslCompletionItems({\n context,\n sourceFile: artifacts.sourceFile,\n candidates: {\n scalarTypes: project.controlStack.scalarTypes,\n pslBlockDescriptors: project.controlStack.pslBlockDescriptors,\n symbolTable: project.artifacts.symbolTable(),\n },\n clientSupportsSnippets: clientCapabilities.completionSnippets,\n }),\n ];\n } catch {\n return [];\n }\n }\n\n connection.onInitialize(async (params): Promise<InitializeResult> => {\n rootPath = resolveRootPath(params);\n watchedConfigGlob = join(rootPath, '**', CONFIG_FILENAME);\n clientCapabilities = resolveClientCapabilities(params);\n\n return {\n capabilities: {\n textDocumentSync: TextDocumentSyncKind.Incremental,\n documentFormattingProvider: true,\n foldingRangeProvider: true,\n semanticTokensProvider: {\n legend: semanticTokensLegend,\n full: true,\n range: true,\n },\n completionProvider: { triggerCharacters: ['.'] },\n // Both flags reflect the current single-input implementation scope —\n // not a property of PSL. Once the project symbol table merges multiple\n // inputs, an edit in one file can change diagnostics in another and\n // these must flip alongside that work.\n ...(clientCapabilities.pullDiagnostics\n ? {\n diagnosticProvider: {\n interFileDependencies: false,\n workspaceDiagnostics: false,\n },\n }\n : {}),\n },\n };\n });\n\n connection.onInitialized(() => {\n if (clientCapabilities.watchedFilesRegistration) {\n void connection\n .sendRequest(RegistrationRequest.type, {\n registrations: [\n {\n id: 'prisma-next-config-watcher',\n method: DidChangeWatchedFilesNotification.type.method,\n registerOptions: { watchers: [{ globPattern: watchedConfigGlob }] },\n },\n ],\n })\n .catch(() => undefined);\n } else {\n logWarn(\n 'Client does not support dynamic file-watcher registration; Prisma Next config changes will not be picked up without a restart.',\n );\n }\n });\n\n connection.onDidChangeWatchedFiles(async (params) => {\n const changedConfigPaths = configPathsFromWatchedChanges(\n params.changes.map((change) => filePathFromUri(change.uri)),\n );\n for (const configPath of changedConfigPaths) {\n // Only live (or currently loading) projects are refreshed eagerly, so a\n // config change cannot resurrect a project dropped when its last input\n // closed; a config that newly gains an open input is still picked up\n // lazily below through per-document rediscovery.\n if (managedProjects.has(configPath)) {\n try {\n await refreshProject(configPath);\n } catch {\n stopManagingProject(configPath);\n continue;\n }\n }\n if (!clientCapabilities.pullDiagnostics) {\n await republishOpenDocumentsForConfig(configPath);\n }\n }\n if (\n clientCapabilities.pullDiagnostics &&\n clientCapabilities.diagnosticsRefresh &&\n changedConfigPaths.size > 0 &&\n !disposed\n ) {\n void connection.languages.diagnostics.refresh().catch(() => undefined);\n }\n });\n\n connection.onDocumentFormatting((params) => formatDocument(params.textDocument.uri));\n connection.onCompletion((params) => completeDocument(params.textDocument.uri, params.position));\n\n connection.languages.semanticTokens.on((params) =>\n semanticTokensForDocument(params.textDocument.uri),\n );\n connection.languages.semanticTokens.onRange((params) =>\n semanticTokensForDocument(params.textDocument.uri, params.range),\n );\n\n connection.languages.diagnostics.on(async (params): Promise<DocumentDiagnosticReport> => {\n const project = await resolveProjectForDocument(params.textDocument.uri);\n if (project === undefined) {\n return { kind: DocumentDiagnosticReportKind.Full, items: [] };\n }\n return buildDocumentDiagnosticReport(project, params.textDocument.uri);\n });\n\n connection.onFoldingRanges(async (params): Promise<FoldingRange[]> => {\n const project = await resolveProjectForDocument(params.textDocument.uri);\n if (project === undefined) {\n return [];\n }\n const artifacts = project.artifacts.document(params.textDocument.uri);\n if (artifacts === undefined) {\n return [];\n }\n return computeFoldingRanges(artifacts.document, artifacts.sourceFile);\n });\n\n documents.onDidOpen((event) => {\n artifactsForDocument(event.document.uri)?.documentChanged(event.document.uri);\n if (clientCapabilities.pullDiagnostics) {\n return;\n }\n publishSafely(event.document.uri);\n });\n documents.onDidChangeContent((event) => {\n artifactsForDocument(event.document.uri)?.documentChanged(event.document.uri);\n if (clientCapabilities.pullDiagnostics) {\n return;\n }\n publishSafely(event.document.uri);\n });\n documents.onDidClose((event) => {\n const uri = event.document.uri;\n const configPath = documentConfigPaths.get(uri);\n artifactsForDocument(uri)?.documentClosed(uri);\n documentConfigPaths.delete(uri);\n // A live project always has at least one open input; when the last one\n // closes the project is dropped, and a reopen re-resolves and reloads the\n // config from scratch.\n if (configPath !== undefined) {\n dropProjectWithoutManagedDocuments(configPath);\n }\n if (!clientCapabilities.pullDiagnostics) {\n sendDiagnostics({ uri, diagnostics: [] });\n }\n });\n\n documents.listen(connection);\n connection.listen();\n\n function artifactsForDocument(uri: string): ProjectArtifacts | undefined {\n const configPath = documentConfigPaths.get(uri);\n if (configPath === undefined) {\n return undefined;\n }\n const entry = managedProjects.get(configPath);\n return entry?.status === 'loaded' ? entry.project.artifacts : undefined;\n }\n\n function hasManagedDocuments(configPath: string): boolean {\n for (const managedConfigPath of documentConfigPaths.values()) {\n if (managedConfigPath === configPath) {\n return true;\n }\n }\n return false;\n }\n\n // Deletes only loaded entries: an in-flight load settles through the\n // association check in startProjectLoad and cleans up after itself.\n function dropProjectWithoutManagedDocuments(configPath: string): void {\n if (hasManagedDocuments(configPath)) {\n return;\n }\n if (managedProjects.get(configPath)?.status === 'loaded') {\n managedProjects.delete(configPath);\n }\n }\n\n return {\n dispose: () => {\n disposed = true;\n connection.dispose();\n },\n getDocumentAst: (uri) => artifactsForDocument(uri)?.document(uri),\n // `| undefined` only because the uri may be unmanaged (closed, non-input,\n // or projectless); a managed document's project always yields a symbolTable.\n getProjectSymbolTable: (uri) => artifactsForDocument(uri)?.symbolTable(),\n };\n}\n\nfunction emptySemanticTokens(): SemanticTokens {\n return { data: [] };\n}\n\nfunction toDiagnostics(computed: readonly LspDiagnostic[]): Diagnostic[] {\n return computed.map((diagnostic) => ({\n range: diagnostic.range,\n message: diagnostic.message,\n code: diagnostic.code,\n severity: toLspSeverity(diagnostic.severity),\n source: 'prisma-next',\n }));\n}\n\nfunction toLspSeverity(severity: number): DiagnosticSeverity {\n switch (severity) {\n case ParseDiagnosticSeverity.Warning:\n return DiagnosticSeverity.Warning;\n case ParseDiagnosticSeverity.Information:\n return DiagnosticSeverity.Information;\n case ParseDiagnosticSeverity.Hint:\n return DiagnosticSeverity.Hint;\n default:\n return DiagnosticSeverity.Error;\n }\n}\n\ninterface ResolvedClientCapabilities {\n readonly watchedFilesRegistration: boolean;\n readonly completionSnippets: boolean;\n readonly pullDiagnostics: boolean;\n readonly diagnosticsRefresh: boolean;\n}\n\nconst noClientCapabilities: ResolvedClientCapabilities = {\n watchedFilesRegistration: false,\n completionSnippets: false,\n pullDiagnostics: false,\n diagnosticsRefresh: false,\n};\n\nfunction resolveClientCapabilities(params: InitializeParams): ResolvedClientCapabilities {\n return {\n watchedFilesRegistration:\n params.capabilities.workspace?.didChangeWatchedFiles?.dynamicRegistration === true,\n completionSnippets:\n params.capabilities.textDocument?.completion?.completionItem?.snippetSupport === true,\n pullDiagnostics: params.capabilities.textDocument?.diagnostic !== undefined,\n diagnosticsRefresh: params.capabilities.workspace?.diagnostics?.refreshSupport === true,\n };\n}\n\nfunction resolveRootPath(params: InitializeParams): string {\n // Single-root scope: the first workspace folder wins; multi-root workspaces\n // are out of scope. `rootUri` / `rootPath` are the deprecated fallbacks.\n const workspaceFolder = params.workspaceFolders?.[0];\n if (workspaceFolder !== undefined) {\n return fileURLToPath(workspaceFolder.uri);\n }\n if (params.rootUri) {\n return fileURLToPath(params.rootUri);\n }\n if (params.rootPath) {\n return params.rootPath;\n }\n return process.cwd();\n}\n\nfunction filePathFromUri(uri: string): string | undefined {\n try {\n return fileURLToPath(uri);\n } catch {\n return undefined;\n }\n}\n\nfunction configPathsFromWatchedChanges(paths: readonly (string | undefined)[]): Set<string> {\n const configPaths = new Set<string>();\n for (const path of paths) {\n if (path?.endsWith(CONFIG_FILENAME)) {\n configPaths.add(path);\n }\n }\n return configPaths;\n}\n","import { createConnection, ProposedFeatures } from 'vscode-languageserver/node';\nimport { createServer, type LanguageServer } from './server';\n\nexport function startServer(): LanguageServer {\n const connection = createConnection(ProposedFeatures.all);\n return createServer(connection);\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,23 +1,24 @@
1
1
  {
2
2
  "name": "@prisma-next/language-server",
3
- "version": "0.14.0-dev.46",
3
+ "version": "0.14.0-dev.48",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "sideEffects": false,
7
7
  "description": "Prisma Next language server: PSL diagnostics and whole-document formatting over LSP",
8
8
  "dependencies": {
9
- "@prisma-next/config-loader": "0.14.0-dev.46",
10
- "@prisma-next/errors": "0.14.0-dev.46",
11
- "@prisma-next/framework-components": "0.14.0-dev.46",
12
- "@prisma-next/psl-parser": "0.14.0-dev.46",
13
- "@prisma-next/utils": "0.14.0-dev.46",
9
+ "@prisma-next/config-loader": "0.14.0-dev.48",
10
+ "@prisma-next/errors": "0.14.0-dev.48",
11
+ "@prisma-next/framework-components": "0.14.0-dev.48",
12
+ "@prisma-next/psl-parser": "0.14.0-dev.48",
13
+ "@prisma-next/utils": "0.14.0-dev.48",
14
+ "pathe": "^2.0.3",
14
15
  "vscode-languageserver": "10.0.0",
15
16
  "vscode-languageserver-textdocument": "1.0.12"
16
17
  },
17
18
  "devDependencies": {
18
- "@prisma-next/test-utils": "0.14.0-dev.46",
19
- "@prisma-next/tsconfig": "0.14.0-dev.46",
20
- "@prisma-next/tsdown": "0.14.0-dev.46",
19
+ "@prisma-next/test-utils": "0.14.0-dev.48",
20
+ "@prisma-next/tsconfig": "0.14.0-dev.48",
21
+ "@prisma-next/tsdown": "0.14.0-dev.48",
21
22
  "@types/node": "25.9.1",
22
23
  "tsdown": "0.22.1",
23
24
  "typescript": "5.9.3",
@@ -20,7 +20,7 @@ import type {
20
20
  export interface PslCompletionCandidateSource {
21
21
  readonly scalarTypes: readonly string[];
22
22
  readonly pslBlockDescriptors: AuthoringPslBlockDescriptorNamespace;
23
- readonly symbolTable?: SymbolTable;
23
+ readonly symbolTable: SymbolTable;
24
24
  }
25
25
 
26
26
  export interface ProvidePslCompletionItemsInput {
@@ -292,7 +292,7 @@ function provideNamespaceMemberCompletionItems(
292
292
  return modelTypeCompletionItems(
293
293
  context,
294
294
  sourceFile,
295
- namespaceCandidates(source.symbolTable?.topLevel.namespaces[context.namespace]),
295
+ namespaceCandidates(source.symbolTable.topLevel.namespaces[context.namespace]),
296
296
  );
297
297
  }
298
298
 
@@ -333,11 +333,8 @@ function configuredScalarCandidates(
333
333
  }
334
334
 
335
335
  function topLevelSymbolCandidates(
336
- symbolTable: SymbolTable | undefined,
336
+ symbolTable: SymbolTable,
337
337
  ): readonly ModelTypeCompletionCandidate[] {
338
- if (symbolTable === undefined) {
339
- return [];
340
- }
341
338
  const { topLevel } = symbolTable;
342
339
  return [
343
340
  ...symbolCandidates(
@@ -367,12 +364,7 @@ function topLevelSymbolCandidates(
367
364
  ];
368
365
  }
369
366
 
370
- function allNamespaceCandidates(
371
- symbolTable: SymbolTable | undefined,
372
- ): readonly ModelTypeCompletionCandidate[] {
373
- if (symbolTable === undefined) {
374
- return [];
375
- }
367
+ function allNamespaceCandidates(symbolTable: SymbolTable): readonly ModelTypeCompletionCandidate[] {
376
368
  return Object.values(symbolTable.topLevel.namespaces)
377
369
  .sort((left, right) => compareNames(left.name, right.name))
378
370
  .map(namespaceQualifierCandidate);