From 76309003d07b0a4553cebd8d9cd18e07fae67008 Mon Sep 17 00:00:00 2001 From: ayecue Date: Sat, 7 Mar 2026 23:41:15 +0100 Subject: [PATCH 1/8] 3.0.0 update core to latest version --- package-lock.json | 36 +++--- package.json | 6 +- packages/browser/package.json | 10 +- packages/core/package-lock.json | 40 +++---- packages/core/package.json | 8 +- .../src/features/autocomplete/operators.ts | 2 +- packages/core/src/features/color.ts | 19 ++-- packages/core/src/features/definition.ts | 42 +++---- packages/core/src/features/diagnostic.ts | 18 ++- packages/core/src/features/formatter.ts | 5 +- packages/core/src/features/hover.ts | 1 - packages/core/src/features/signature.ts | 4 +- packages/core/src/features/symbol.ts | 4 + packages/core/src/helper/document-manager.ts | 6 +- .../core/src/helper/folding-range-builder.ts | 17 +-- packages/core/src/helper/lookup-type.ts | 10 +- .../core/src/helper/semantic-token-builder.ts | 103 +++++++++--------- packages/core/src/helper/tooltip.ts | 5 + packages/node/package.json | 10 +- 19 files changed, 177 insertions(+), 169 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3c731cb..0cc3d98 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,9 +23,9 @@ "esbuild-plugin-polyfill-node": "0.3.0", "fast-toposort": "^0.1.1", "glob": "^11.0.0", - "greybel-core": ">=2.6.0", - "greybel-transpiler": ">=3.8.0", - "greybel-type-analyzer": "~1.1.0", + "greybel-core": ">=3.0.0", + "greybel-transpiler": ">=4.0.0", + "greybel-type-analyzer": "~2.0.0", "jest": "^27.4.5", "lru-cache": "^11.1.0", "miniscript-meta": ">=1.4.0", @@ -4501,35 +4501,35 @@ "license": "ISC" }, "node_modules/greybel-core": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/greybel-core/-/greybel-core-2.6.0.tgz", - "integrity": "sha512-fQLHeCxj63fpS3iHoeY5rb8Y9U+wOdgMrFxF2S7rM8qEQ3O9aKDSMBFklzbgc4yCn4TtUJ3l68DAjQkSZgvmkQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/greybel-core/-/greybel-core-3.0.0.tgz", + "integrity": "sha512-xniWqEJnaIOYX64r6ll35xePlHAqhziQGFtsMujhAVrEM5fHS1derYaeCPDkAxIUf8BXaHui9Wropr10yktG3A==", "dev": true, "license": "MIT", "dependencies": { - "miniscript-core": "~1.6.0" + "miniscript-core": "~2.0.0" } }, "node_modules/greybel-transpiler": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/greybel-transpiler/-/greybel-transpiler-3.8.0.tgz", - "integrity": "sha512-Tf16UtauN0UnvZy/P04ZZlmL8yifkxt8MInK1XTtlHA6hQ0CrpAMnhg5jNARarsDDW3ygCsKk1f+AbpawtW1UA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/greybel-transpiler/-/greybel-transpiler-4.0.0.tgz", + "integrity": "sha512-YqLmCUu7NJlIVN0MDIICgn6jqNeVnRSiqnqKIvN4nBFlSE8ABk9Nl4g6oDZkgQZPMv/J3tqXww2UwmZItokpzw==", "dev": true, "license": "MIT", "dependencies": { "blueimp-md5": "^2.19.0", - "greybel-core": "~2.6.0" + "greybel-core": "~3.0.0" } }, "node_modules/greybel-type-analyzer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/greybel-type-analyzer/-/greybel-type-analyzer-1.1.0.tgz", - "integrity": "sha512-sihIBUaLwFr/RqFK20KhYS3VTRM36X2YyWGh5GzZXdjroljNOuRbkiQlcfdB48oe8eP4KM/2sKDV7ftJ7Jsw5A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/greybel-type-analyzer/-/greybel-type-analyzer-2.0.0.tgz", + "integrity": "sha512-VcNfhmVN4AG4dX51Q2n93cbBmsG0LGwy7CqCV4mBUBybesYLhDZy4J7j4NHK/vPd3gliaYCuV5hkRF3elJDoNw==", "dev": true, "license": "MIT", "dependencies": { "comment-parser": "^1.4.1", - "greybel-core": "~2.6.0", + "greybel-core": "~3.0.0", "meta-utils": "~3.0.0" } }, @@ -6126,9 +6126,9 @@ } }, "node_modules/miniscript-core": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/miniscript-core/-/miniscript-core-1.6.0.tgz", - "integrity": "sha512-kpTgf2dtHk2zxS5Hs0BP/95mh70cL3qf2gBGraCSWp6Q5ERDx9w6wUNMyqBOh3Jx/OTk/WNpuyNctochY4p/VA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/miniscript-core/-/miniscript-core-2.0.0.tgz", + "integrity": "sha512-yI651VvD41fsOcF/2HKfnyJwkRhqAZWpp/Lro7NrzIlIi4BrdqK9V4RF2mwn4HWfEKZsyjYxnEAq0ZzFFlTPqw==", "dev": true, "license": "MIT" }, diff --git a/package.json b/package.json index e39ac72..0dccef4 100644 --- a/package.json +++ b/package.json @@ -29,12 +29,12 @@ "esbuild-plugin-globals": "0.2.0", "esbuild-plugin-polyfill-node": "0.3.0", "glob": "^11.0.0", - "greybel-core": ">=2.6.0", - "greybel-transpiler": ">=3.8.0", + "greybel-core": ">=3.0.0", + "greybel-transpiler": ">=4.0.0", "jest": "^27.4.5", "lru-cache": "^11.1.0", "miniscript-meta": ">=1.4.0", - "greybel-type-analyzer": "~1.1.0", + "greybel-type-analyzer": "~2.0.0", "fast-toposort": "^0.1.1", "mocha": "^10.7.3", "non-blocking-schedule": "^0.2.0", diff --git a/packages/browser/package.json b/packages/browser/package.json index 468d9bd..495cded 100644 --- a/packages/browser/package.json +++ b/packages/browser/package.json @@ -1,6 +1,6 @@ { "name": "miniscript-languageserver-browser", - "version": "2.1.1", + "version": "2.2.0", "description": "Language server for MiniScript", "main": "./index.js", "scripts": { @@ -64,11 +64,11 @@ "typescript": "^4.5.4" }, "dependencies": { - "greybel-core": "~2.6.0", + "greybel-core": "~3.0.0", "lru-cache": "^11.1.0", "miniscript-meta": "~1.4.0", - "greybel-transpiler": "~3.8.1", - "greybel-type-analyzer": "~1.1.1", - "miniscript-languageserver-core": "^2.1.0" + "greybel-transpiler": "~4.0.0", + "greybel-type-analyzer": "~2.0.0", + "miniscript-languageserver-core": "^2.2.0" } } \ No newline at end of file diff --git a/packages/core/package-lock.json b/packages/core/package-lock.json index 8b5c193..56d6a18 100644 --- a/packages/core/package-lock.json +++ b/packages/core/package-lock.json @@ -1,12 +1,12 @@ { "name": "miniscript-languageserver-core", - "version": "2.1.0", + "version": "2.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "miniscript-languageserver-core", - "version": "2.1.0", + "version": "2.2.0", "license": "ISC", "dependencies": { "color-convert": "^2.0.1", @@ -47,9 +47,9 @@ "node": "*" }, "peerDependencies": { - "greybel-core": ">=2.6.0", - "greybel-transpiler": ">=3.8.0", - "greybel-type-analyzer": ">=1.1.0", + "greybel-core": ">=3.0.0", + "greybel-transpiler": ">=4.0.0", + "greybel-type-analyzer": ">=2.0.0", "miniscript-meta": ">=1.4.0" } }, @@ -5577,35 +5577,35 @@ "license": "MIT" }, "node_modules/greybel-core": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/greybel-core/-/greybel-core-2.6.0.tgz", - "integrity": "sha512-fQLHeCxj63fpS3iHoeY5rb8Y9U+wOdgMrFxF2S7rM8qEQ3O9aKDSMBFklzbgc4yCn4TtUJ3l68DAjQkSZgvmkQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/greybel-core/-/greybel-core-3.0.0.tgz", + "integrity": "sha512-xniWqEJnaIOYX64r6ll35xePlHAqhziQGFtsMujhAVrEM5fHS1derYaeCPDkAxIUf8BXaHui9Wropr10yktG3A==", "license": "MIT", "peer": true, "dependencies": { - "miniscript-core": "~1.6.0" + "miniscript-core": "~2.0.0" } }, "node_modules/greybel-transpiler": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/greybel-transpiler/-/greybel-transpiler-3.8.0.tgz", - "integrity": "sha512-Tf16UtauN0UnvZy/P04ZZlmL8yifkxt8MInK1XTtlHA6hQ0CrpAMnhg5jNARarsDDW3ygCsKk1f+AbpawtW1UA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/greybel-transpiler/-/greybel-transpiler-4.0.0.tgz", + "integrity": "sha512-YqLmCUu7NJlIVN0MDIICgn6jqNeVnRSiqnqKIvN4nBFlSE8ABk9Nl4g6oDZkgQZPMv/J3tqXww2UwmZItokpzw==", "license": "MIT", "peer": true, "dependencies": { "blueimp-md5": "^2.19.0", - "greybel-core": "~2.6.0" + "greybel-core": "~3.0.0" } }, "node_modules/greybel-type-analyzer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/greybel-type-analyzer/-/greybel-type-analyzer-1.1.0.tgz", - "integrity": "sha512-sihIBUaLwFr/RqFK20KhYS3VTRM36X2YyWGh5GzZXdjroljNOuRbkiQlcfdB48oe8eP4KM/2sKDV7ftJ7Jsw5A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/greybel-type-analyzer/-/greybel-type-analyzer-2.0.0.tgz", + "integrity": "sha512-VcNfhmVN4AG4dX51Q2n93cbBmsG0LGwy7CqCV4mBUBybesYLhDZy4J7j4NHK/vPd3gliaYCuV5hkRF3elJDoNw==", "license": "MIT", "peer": true, "dependencies": { "comment-parser": "^1.4.1", - "greybel-core": "~2.6.0", + "greybel-core": "~3.0.0", "meta-utils": "~3.0.0" } }, @@ -7440,9 +7440,9 @@ } }, "node_modules/miniscript-core": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/miniscript-core/-/miniscript-core-1.6.0.tgz", - "integrity": "sha512-kpTgf2dtHk2zxS5Hs0BP/95mh70cL3qf2gBGraCSWp6Q5ERDx9w6wUNMyqBOh3Jx/OTk/WNpuyNctochY4p/VA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/miniscript-core/-/miniscript-core-2.0.0.tgz", + "integrity": "sha512-yI651VvD41fsOcF/2HKfnyJwkRhqAZWpp/Lro7NrzIlIi4BrdqK9V4RF2mwn4HWfEKZsyjYxnEAq0ZzFFlTPqw==", "license": "MIT", "peer": true }, diff --git a/packages/core/package.json b/packages/core/package.json index 8ff3f0f..3860ae9 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "miniscript-languageserver-core", - "version": "2.1.0", + "version": "3.0.0", "description": "Core functionality of language server for MiniScript", "main": "./dist/index.js", "typings": "./dist/index.d.ts", @@ -60,10 +60,10 @@ "typescript": "^4.5.4" }, "peerDependencies": { - "greybel-core": ">=2.6.0", - "greybel-transpiler": ">=3.8.0", + "greybel-core": ">=3.0.0", + "greybel-transpiler": ">=4.0.0", "miniscript-meta": ">=1.4.0", - "greybel-type-analyzer": ">=1.1.0" + "greybel-type-analyzer": ">=2.0.0" }, "dependencies": { "color-convert": "^2.0.1", diff --git a/packages/core/src/features/autocomplete/operators.ts b/packages/core/src/features/autocomplete/operators.ts index 00a136c..4278197 100644 --- a/packages/core/src/features/autocomplete/operators.ts +++ b/packages/core/src/features/autocomplete/operators.ts @@ -4,7 +4,7 @@ import { Operator } from 'miniscript-core'; export const AVAILABLE_OPERATORS: CompletionItem[] = [ Operator.Plus, - Operator.Asterik, + Operator.Asterisk, Operator.Minus, Operator.Slash, Operator.Power, diff --git a/packages/core/src/features/color.ts b/packages/core/src/features/color.ts index 3a72b73..cade147 100644 --- a/packages/core/src/features/color.ts +++ b/packages/core/src/features/color.ts @@ -3,7 +3,6 @@ import { ASTBase, ASTChunk, ASTLiteral, - ASTPosition, ASTType } from 'miniscript-core'; import type { @@ -81,24 +80,26 @@ export function activate(context: IContext) { match, markup, value, - astPosition, + astStartLine, + astStartChar, lineIndex }: { match: RegExpExecArray; markup: string; value: string; - astPosition: ASTPosition; + astStartLine: number; + astStartChar: number; lineIndex: number; }): Range => { const colorStartIndex = match.index + markup.indexOf('=') + 1; const colorEndIndex = colorStartIndex + value.length; - const line = astPosition.line - 1 + lineIndex; + const line = astStartLine - 1 + lineIndex; let start = colorStartIndex; let end = colorEndIndex; if (lineIndex === 0) { - start += astPosition.character; - end += astPosition.character; + start += astStartChar; + end += astStartChar; } const colorStart: Position = { @@ -119,9 +120,6 @@ export function activate(context: IContext) { for (let index = 0; index < allAvailableStrings.length; index++) { const strLiteral = allAvailableStrings[index]; - if (!strLiteral.start) continue; - - const start = strLiteral.start; const lines = strLiteral.value.toString().split('\n'); for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) { @@ -135,7 +133,8 @@ export function activate(context: IContext) { match, markup, value, - astPosition: start, + astStartLine: strLiteral.startLine, + astStartChar: strLiteral.startChar, lineIndex }); diff --git a/packages/core/src/features/definition.ts b/packages/core/src/features/definition.ts index ab4ec8c..31d294e 100644 --- a/packages/core/src/features/definition.ts +++ b/packages/core/src/features/definition.ts @@ -1,62 +1,64 @@ import { TypeSource } from 'greybel-type-analyzer'; import { ASTBase, - ASTMemberExpression, + ASTBaseBlockWithScope, ASTForGenericStatement, + ASTMemberExpression, ASTType } from 'miniscript-core'; import type { - DefinitionLink, DefinitionParams, + Location, Position } from 'vscode-languageserver'; import { LookupHelper } from '../helper/lookup-type'; import { IContext } from '../types'; -const definitionLinkToString = (link: DefinitionLink): string => { - return `${link.targetUri}:${link.targetRange.start.line}:${link.targetRange.start.character}-${link.targetRange.end.line}:${link.targetRange.end.character}`; +const definitionLinkToString = (link: Location): string => { + return `${link.uri}:${link.range.start.line}:${link.range.start.character}-${link.range.end.line}:${link.range.end.character}`; }; -const getLocation = (item: TypeSource): DefinitionLink => { +const getLocation = (item: TypeSource): Location => { const node = item.astRef; let start: Position; let end: Position; + switch (node.type) { case ASTType.ForGenericStatement: { const stmt = node as ASTForGenericStatement; start = { - line: stmt.variable.start.line - 1, - character: stmt.variable.start.character - 1 + line: stmt.variable.startLine - 1, + character: stmt.variable.startChar - 1 }; end = { - line: stmt.variable.end.line - 1, - character: stmt.variable.end.character - 1 + line: stmt.variable.endLine - 1, + character: stmt.variable.endChar - 1 }; break; } default: { start = { - line: node.start.line - 1, - character: node.start.character - 1 + line: node.startLine - 1, + character: node.startChar - 1 }; end = { - line: node.end.line - 1, - character: node.end.character - 1 + line: node.endLine - 1, + character: node.endChar - 1 }; } } + return { - targetUri: item.document, - targetRange: { start, end }, - targetSelectionRange: { start, end } + uri: item.document, + range: { start, end } }; }; const findAllDefinitions = async ( helper: LookupHelper, item: ASTBase -): Promise => { +): Promise => { const result = await helper.findAllAssignmentsOfItem(item); const sources = result?.getSource(); @@ -64,17 +66,17 @@ const findAllDefinitions = async ( return []; } - const definitions: DefinitionLink[] = []; + const definitions: Location[] = []; const visited = new Set(); for (const source of sources) { const node = source.astRef; - if (!node.start || !node.end) { + if (node == null) { continue; } - const definitionLink = getLocation(source); + const definitionLink: Location = getLocation(source); const linkString = definitionLinkToString(definitionLink); if (visited.has(linkString)) { diff --git a/packages/core/src/features/diagnostic.ts b/packages/core/src/features/diagnostic.ts index 9b32505..e27212f 100644 --- a/packages/core/src/features/diagnostic.ts +++ b/packages/core/src/features/diagnostic.ts @@ -20,12 +20,12 @@ async function lookupErrors( return { range: { start: { - line: range.start.line - 1, - character: range.start.character - 1 + line: range.start[0] - 1, + character: range.start[1] - 1 }, end: { - line: range.end.line - 1, - character: range.end.character - 1 + line: range.end[0] - 1, + character: range.end[1] - 1 } }, message: err.message, @@ -35,8 +35,14 @@ async function lookupErrors( return { range: { - start: activeDocument.parsedPayload.start, - end: activeDocument.parsedPayload.end + start: { + line: activeDocument.parsedPayload.startLine - 1, + character: activeDocument.parsedPayload.startChar - 1 + }, + end: { + line: activeDocument.parsedPayload.endLine - 1, + character: activeDocument.parsedPayload.endChar - 1 + } }, message: err.message, severity: 1 // Error diff --git a/packages/core/src/features/formatter.ts b/packages/core/src/features/formatter.ts index e39930f..9275912 100644 --- a/packages/core/src/features/formatter.ts +++ b/packages/core/src/features/formatter.ts @@ -46,7 +46,10 @@ export function activate(context: IContext) { const textRange: Range = { start: { line: 0, character: 0 }, - end: activeDocument.parsedPayload.end + end: { + line: activeDocument.parsedPayload.endLine - 1, + character: activeDocument.parsedPayload.endChar - 1 + } }; return [ diff --git a/packages/core/src/features/hover.ts b/packages/core/src/features/hover.ts index b8f7925..55c1d50 100644 --- a/packages/core/src/features/hover.ts +++ b/packages/core/src/features/hover.ts @@ -4,7 +4,6 @@ import { } from 'greybel-core'; import { isFunctionType, isUnionType } from 'greybel-type-analyzer'; import { - SignatureDefinitionBaseType, SignatureDefinitionTypeMeta } from 'meta-utils'; import path from 'path'; diff --git a/packages/core/src/features/signature.ts b/packages/core/src/features/signature.ts index 5eb7da2..ffb58e1 100644 --- a/packages/core/src/features/signature.ts +++ b/packages/core/src/features/signature.ts @@ -69,8 +69,8 @@ export function activate(context: IContext) { // figure out argument position const astArgs = closestCallExpr.arguments; const selectedIndex = astArgs.findIndex((argItem: ASTBase) => { - const leftIndex = argItem.start!.character - 1; - const rightIndex = argItem.end!.character; + const leftIndex = argItem.startChar - 1; + const rightIndex = argItem.endChar; return ( leftIndex <= params.position.character && diff --git a/packages/core/src/features/symbol.ts b/packages/core/src/features/symbol.ts index 5e011dc..c59fb74 100644 --- a/packages/core/src/features/symbol.ts +++ b/packages/core/src/features/symbol.ts @@ -20,6 +20,10 @@ const handleItem = ( const result: SymbolInformation[] = []; for (const source of item.source) { + if (item.name == "") { + continue; + } + const start = { line: source.start.line - 1, character: source.start.character - 1 diff --git a/packages/core/src/helper/document-manager.ts b/packages/core/src/helper/document-manager.ts index d9d6e61..9074e37 100644 --- a/packages/core/src/helper/document-manager.ts +++ b/packages/core/src/helper/document-manager.ts @@ -1,5 +1,5 @@ import EventEmitter from 'events'; -import { ASTChunkGreybel, Parser } from 'greybel-core'; +import { ASTChunkGreybel, UnsafeParser } from 'greybel-core'; import { LRUCache as LRU } from 'lru-cache'; import { schedule } from 'non-blocking-schedule'; import { TextDocument } from 'vscode-languageserver-textdocument'; @@ -59,9 +59,7 @@ export class DocumentManager extends EventEmitter implements IDocumentManager { this._context.documentMerger.cache.flushCacheKey(textDocument.uri); const content = textDocument.getText(); - const parser = new Parser(content, { - unsafe: true - }); + const parser = new UnsafeParser(content); const parsedPayload = parser.parseChunk() as ASTChunkGreybel; const typeDocument = typeManager.analyze(textDocument.uri, parsedPayload); diff --git a/packages/core/src/helper/folding-range-builder.ts b/packages/core/src/helper/folding-range-builder.ts index d34ddee..5fe7aad 100644 --- a/packages/core/src/helper/folding-range-builder.ts +++ b/packages/core/src/helper/folding-range-builder.ts @@ -8,16 +8,9 @@ import { ScraperWalker } from './ast-scraper'; export function buildFoldingRanges(item: IActiveDocument): FoldingRange[] { const ranges: FoldingRange[] = []; const walker = new ScraperWalker((item: ASTBase, level: number) => { - if (item.start.line === item.end.line) return null; + if (item.startLine === item.endLine) return null; switch (item.type) { - case ASTType.Comment: - ranges.push({ - startLine: item.start.line - 1, - endLine: item.end.line - 1, - kind: FoldingRangeKind.Comment - }); - return null; case ASTType.MapConstructorExpression: case ASTType.ListConstructorExpression: case ASTType.StringLiteral: @@ -25,8 +18,8 @@ export function buildFoldingRanges(item: IActiveDocument): FoldingRange[] { case ASTType.ForGenericStatement: case ASTType.FunctionDeclaration: { ranges.push({ - startLine: item.start.line - 1, - endLine: item.end.line - 1, + startLine: item.startLine - 1, + endLine: item.endLine - 1, kind: FoldingRangeKind.Region }); return null; @@ -35,8 +28,8 @@ export function buildFoldingRanges(item: IActiveDocument): FoldingRange[] { case ASTType.ElseifClause: case ASTType.ElseClause: { ranges.push({ - startLine: item.start.line - 1, - endLine: item.end.line - 2, + startLine: item.startLine - 1, + endLine: item.endLine - 2, kind: FoldingRangeKind.Region }); return null; diff --git a/packages/core/src/helper/lookup-type.ts b/packages/core/src/helper/lookup-type.ts index 82a25dd..5c9fa1e 100644 --- a/packages/core/src/helper/lookup-type.ts +++ b/packages/core/src/helper/lookup-type.ts @@ -179,7 +179,7 @@ export class LookupHelper { const property = locationDependendProperties[index]; const source = property.type.getSource()[0]; - if (source.start.line >= item.end!.line) break; + if (source.start.line >= item.endLine) break; result.set(property.name, { kind: property.kind, line: source.start.line - 1 @@ -201,10 +201,10 @@ export class LookupHelper { for (let index = 0; index < lineItems.length; index++) { const lineItem = lineItems[index]; const outer = ASTScraper.findEx((item: ASTBase, _level: number) => { - const startLine = item.start!.line - 1; - const startCharacter = item.start!.character - 1; - const endLine = item.end!.line - 1; - const endCharacter = item.end!.character - 1; + const startLine = item.startLine - 1; + const startCharacter = item.startChar - 1; + const endLine = item.endLine - 1; + const endCharacter = item.endChar - 1; if (startLine > position.line) { return { diff --git a/packages/core/src/helper/semantic-token-builder.ts b/packages/core/src/helper/semantic-token-builder.ts index 1863ecd..9dd5e16 100644 --- a/packages/core/src/helper/semantic-token-builder.ts +++ b/packages/core/src/helper/semantic-token-builder.ts @@ -1,12 +1,13 @@ import { GreybelKeyword, - Lexer, + UnsafeLexer, SelectorGroups as GreybelSelectorGroups, Selectors as GreybelSelectors } from 'greybel-core'; import { ASTType, Keyword, + Lexer, LiteralToken, Operator, Selector, @@ -138,8 +139,8 @@ export class TokenHandler { private processMultilineToken(token: Token, lines: string[], type: SemanticTokenType) { if (lines.length > 1) { this._builder.push( - token.start.line - 1, - token.start.character - 1, + token.line - 1, + token.startChar - 1, lines[0].length, type, 0 @@ -147,7 +148,7 @@ export class TokenHandler { for (let offset = 1; offset < lines.length; offset++) { this._builder.push( - (token.start.line + offset) - 1, + (token.line + offset) - 1, 0, lines[offset].length, type, @@ -156,8 +157,8 @@ export class TokenHandler { } } else { this._builder.push( - token.start.line - 1, - token.start.character - 1, + token.line - 1, + token.startChar - 1, lines[0].length, type, 0 @@ -171,8 +172,8 @@ export class TokenHandler { if (!SelectorGroups.BlockEndOfLine(me.token)) { if (!me.consume(Selectors.LParenthesis)) return; me._builder.push( - me.previousToken.start.line - 1, - me.previousToken.start.character - 1, + me.previousToken.line - 1, + me.previousToken.startChar - 1, me.previousToken.value.length, SemanticTokenType.Punctuator, 0 @@ -184,8 +185,8 @@ export class TokenHandler { } me._builder.push( - me.token.start.line - 1, - me.token.start.character - 1, + me.token.line - 1, + me.token.startChar - 1, me.token.value.length, SemanticTokenType.Parameter, 0 @@ -194,23 +195,23 @@ export class TokenHandler { if (me.consume(Selectors.Assign)) { me._builder.push( - me.previousToken.start.line - 1, - me.previousToken.start.character - 1, + me.previousToken.line - 1, + me.previousToken.startChar - 1, me.previousToken.value.length, SemanticTokenType.Operator, 0 ); - while (!Selectors.ArgumentSeperator(me.token) && !Selectors.RParenthesis(me.token) && !Selectors.EndOfLine(me.token)) { + while (!Selectors.ArgumentSeparator(me.token) && !Selectors.RParenthesis(me.token) && !Selectors.EndOfLine(me.token)) { me.process(); } } if (!Selectors.RParenthesis(me.token)) { - if (!Selectors.ArgumentSeperator(me.token)) return; + if (!Selectors.ArgumentSeparator(me.token)) return; me._builder.push( - me.token.start.line - 1, - me.token.start.character - 1, + me.token.line - 1, + me.token.startChar - 1, me.token.value.length, SemanticTokenType.Punctuator, 0 @@ -221,8 +222,8 @@ export class TokenHandler { if (me.consume(Selectors.RParenthesis)) { me._builder.push( - me.previousToken.start.line - 1, - me.previousToken.start.character - 1, + me.previousToken.line - 1, + me.previousToken.startChar - 1, me.previousToken.value.length, SemanticTokenType.Punctuator, 0 @@ -235,11 +236,11 @@ export class TokenHandler { private processPathSegment() { const me = this; - if (this.token.type === ASTType.StringLiteral) { + if (this.token.type === TokenType.StringLiteral) { const token = this.token as LiteralToken; me._builder.push( - token.start.line - 1, - token.start.character - 1, + token.line - 1, + token.startChar - 1, token.raw.length, SemanticTokenType.String, 0 @@ -252,8 +253,8 @@ export class TokenHandler { while (!GreybelSelectorGroups.PathSegmentEnd(me.token)) { me._builder.push( - me.token.start.line - 1, - me.token.start.character - 1, + me.token.line - 1, + me.token.startChar - 1, me.token.value.length, SemanticTokenType.String, 0 @@ -264,8 +265,8 @@ export class TokenHandler { if (me.consumeMany(GreybelSelectorGroups.PathSegmentEnd)) { me._builder.push( - me.previousToken.start.line - 1, - me.previousToken.start.character - 1, + me.previousToken.line - 1, + me.previousToken.startChar - 1, me.previousToken.value.length, SemanticTokenType.Punctuator, 0 @@ -283,8 +284,8 @@ export class TokenHandler { } me._builder.push( - me.token.start.line - 1, - me.token.start.character - 1, + me.token.line - 1, + me.token.startChar - 1, me.token.value.length, SemanticTokenType.String, 0 @@ -305,8 +306,8 @@ export class TokenHandler { } me._builder.push( - me.token.start.line - 1, - me.token.start.character - 1, + me.token.line - 1, + me.token.startChar - 1, me.token.value.length, SemanticTokenType.Variable, 0 @@ -318,8 +319,8 @@ export class TokenHandler { } me._builder.push( - me.previousToken.start.line - 1, - me.previousToken.start.character - 1, + me.previousToken.line - 1, + me.previousToken.startChar - 1, me.previousToken.value.length, SemanticTokenType.Keyword, 0 @@ -336,8 +337,8 @@ export class TokenHandler { const token = this.token; this._builder.push( - token.start.line - 1, - token.start.character - 1, + token.line - 1, + token.startChar - 1, token.value.length, SemanticTokenType.Keyword, 0 @@ -382,8 +383,8 @@ export class TokenHandler { private processNumericLiteral() { const token = this.token as LiteralToken; this._builder.push( - token.start.line - 1, - token.start.character - 1, + token.line - 1, + token.startChar - 1, token.raw.length, SemanticTokenType.Number, 0 @@ -394,8 +395,8 @@ export class TokenHandler { private processBooleanLiteral() { const token = this.token as LiteralToken; this._builder.push( - token.start.line - 1, - token.start.character - 1, + token.line - 1, + token.startChar - 1, token.raw.length, SemanticTokenType.Constant, 0 @@ -406,8 +407,8 @@ export class TokenHandler { private processNilLiteral() { const token = this.token as LiteralToken; this._builder.push( - token.start.line - 1, - token.start.character - 1, + token.line - 1, + token.startChar - 1, token.raw.length, SemanticTokenType.Constant, 0 @@ -418,15 +419,15 @@ export class TokenHandler { private processIdentifier() { const token = this.token; - if (Selectors.MemberSeperator(this.previousToken)) { + if (Selectors.MemberSeparator(this.previousToken)) { const isNativeIdentifier = isNative(['any'], token.value); const modifier = isNativeIdentifier ? getSingularModifier(SemanticTokenModifier.DefaultLibrary) : 0; this._builder.push( - token.start.line - 1, - token.start.character - 1, + token.line - 1, + token.startChar - 1, token.value.length, SemanticTokenType.Property, modifier @@ -441,8 +442,8 @@ export class TokenHandler { : 0; this._builder.push( - token.start.line - 1, - token.start.character - 1, + token.line - 1, + token.startChar - 1, token.value.length, SemanticTokenType.Variable, modifier @@ -455,7 +456,7 @@ export class TokenHandler { switch (token.value) { case Operator.Plus: - case Operator.Asterik: + case Operator.Asterisk: case Operator.Minus: case Operator.Slash: case Operator.Power: @@ -475,8 +476,8 @@ export class TokenHandler { case Operator.PowerShorthand: case Operator.Reference: { this._builder.push( - token.start.line - 1, - token.start.character - 1, + token.line - 1, + token.startChar - 1, token.value.length, SemanticTokenType.Operator, 0 @@ -485,8 +486,8 @@ export class TokenHandler { } default: { this._builder.push( - token.start.line - 1, - token.start.character - 1, + token.line - 1, + token.startChar - 1, token.value.length, SemanticTokenType.Punctuator, 0 @@ -565,9 +566,7 @@ export function buildTokens( builder: SemanticTokensBuilder, document: IActiveDocument ): SemanticTokensBuilder { - const lexer = new Lexer(document.textDocument.getText(), { - unsafe: true - }); + const lexer = new UnsafeLexer(document.textDocument.getText()); const handler = new TokenHandler(lexer, builder); handler.digest(); return builder; diff --git a/packages/core/src/helper/tooltip.ts b/packages/core/src/helper/tooltip.ts index 5300795..2c77bf6 100644 --- a/packages/core/src/helper/tooltip.ts +++ b/packages/core/src/helper/tooltip.ts @@ -179,6 +179,11 @@ export const createHover = (entity: IResolveNamespaceResult): Hover => { const text = new MarkdownString(''); const fnDef = item.signature as SignatureDefinitionFunction; + // Skip functions without description + if (fnDef.getDescription() == null) { + continue; + } + appendTooltipHeader(text, entity, fnDef); appendTooltipBody(text, fnDef); diff --git a/packages/node/package.json b/packages/node/package.json index b80a647..bd07f11 100644 --- a/packages/node/package.json +++ b/packages/node/package.json @@ -1,6 +1,6 @@ { "name": "miniscript-languageserver", - "version": "2.1.1", + "version": "2.2.0", "description": "Language server for MiniScript", "main": "./index.js", "scripts": { @@ -69,10 +69,10 @@ "dependencies": { "glob": "^11.0.0", "lru-cache": "^11.1.0", - "greybel-core": "~2.6.0", - "greybel-transpiler": "~3.8.1", - "miniscript-languageserver-core": "^2.1.0", + "greybel-core": "~3.0.0", + "greybel-transpiler": "~4.0.0", + "miniscript-languageserver-core": "^2.2.0", "miniscript-meta": "~1.4.0", - "greybel-type-analyzer": "~1.1.1" + "greybel-type-analyzer": "~2.0.0" } } \ No newline at end of file From a147fb6896f284a8463b306a85bb158745a712b4 Mon Sep 17 00:00:00 2001 From: ayecue Date: Sun, 8 Mar 2026 00:13:40 +0100 Subject: [PATCH 2/8] 3.0.0 use new lines getter --- packages/core/src/helper/lookup-type.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/helper/lookup-type.ts b/packages/core/src/helper/lookup-type.ts index 5c9fa1e..1acdde7 100644 --- a/packages/core/src/helper/lookup-type.ts +++ b/packages/core/src/helper/lookup-type.ts @@ -192,7 +192,7 @@ export class LookupHelper { async lookupAST(position: Position): Promise { const me = this; const chunk = me.document.parsedPayload as ASTChunk; - const lineItems = chunk.lines[position.line + 1]; + const lineItems = chunk.lines.get(position.line + 1); if (!lineItems) { return null; From 90b4ff400765ab95795797eee4fa0be83553b138 Mon Sep 17 00:00:00 2001 From: ayecue Date: Sun, 8 Mar 2026 00:34:19 +0100 Subject: [PATCH 3/8] 3.0.0 add more docs --- README.md | 46 +++- packages/node/README.md | 308 +++------------------------ packages/node/setup/bbedit.md | 252 ++++++++++++++++++++++ packages/node/setup/intellij.md | 12 ++ packages/node/setup/neovim.md | 43 ++++ packages/node/setup/sublime.md | 34 +++ packages/node/setup/visual-studio.md | 118 ++++++++++ packages/node/setup/vscode.md | 39 ++++ packages/node/setup/zed.md | 197 +++++++++++++++++ 9 files changed, 760 insertions(+), 289 deletions(-) create mode 100644 packages/node/setup/bbedit.md create mode 100644 packages/node/setup/intellij.md create mode 100644 packages/node/setup/neovim.md create mode 100644 packages/node/setup/sublime.md create mode 100644 packages/node/setup/visual-studio.md create mode 100644 packages/node/setup/vscode.md create mode 100644 packages/node/setup/zed.md diff --git a/README.md b/README.md index 3b6c761..b4cb77f 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,29 @@ [![miniscript-languageserver](https://circleci.com/gh/ayecue/miniscript-languageserver.svg?style=svg)](https://circleci.com/gh/ayecue/miniscript-languageserver) -Language server related tooling. - -## Contains - -- [Core](https://github.com/ayecue/miniscript-languageserver/tree/main/packages/core) -- [Browser Language Server](https://github.com/ayecue/miniscript-languageserver/tree/main/packages/browser) -- [Node Language Server](https://github.com/ayecue/miniscript-languageserver/tree/main/packages/node) +A [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) implementation for [MiniScript](https://miniscript.org) written in TypeScript. It provides IDE features such as autocompletion, hover documentation, go-to-definition, diagnostics, and more. For GreyScript-specific support, see [greybel-languageserver](../greybel-lsp). + +## Features + +* Autocompletion with type-aware suggestions +* Hover documentation for functions and variables +* Go-to-definition and symbol lookup +* Diagnostics (syntax errors and type warnings) +* Signature help for function calls +* Document and workspace symbol search +* Semantic token highlighting +* Code formatting via the built-in transpiler (beautify) +* Color picker support +* Folding ranges +* Configurable type analyzer strategy (dependency-based or workspace-wide) + +## Packages + +| Package | Description | +|---------|-------------| +| [core](packages/core) | Shared LSP feature implementations | +| [node](packages/node) | Node.js language server binary | +| [browser](packages/browser) | Browser-compatible language server | ## Install @@ -16,6 +32,18 @@ Language server related tooling. npm install -g miniscript-languageserver ``` -## How to use +## Usage + +After installing globally the server can be started from the command line: -For more info on how to use the language server please take a look [here](https://github.com/ayecue/miniscript-languageserver/blob/main/packages/node/README.md). \ No newline at end of file +```bash +miniscript-languageserver --stdio +``` + +Point your editor's LSP client at this command to enable MiniScript support. For detailed configuration options, see the [node package README](packages/node/README.md). + +## Testing + +```bash +npm test +``` \ No newline at end of file diff --git a/packages/node/README.md b/packages/node/README.md index c34be3f..c139c73 100644 --- a/packages/node/README.md +++ b/packages/node/README.md @@ -2,30 +2,20 @@ [![miniscript-languageserver](https://circleci.com/gh/ayecue/miniscript-languageserver.svg?style=svg)](https://circleci.com/gh/ayecue/miniscript-languageserver) -`miniscript-languageserver` is a Language Server for MiniScript that offers a variety of features, including: - -- Auto-completion -- Hover tooltips -- Syntax highlighting and more - -This language server is compatible with any client that follows the [LSP standards](https://code.visualstudio.com/api/language-extensions/language-server-extension-guide). - -For an example of how it integrates with a popular editor, take a look at the [examples](#example-implementations). +A [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) implementation for [MiniScript](https://miniscript.org). Compatible with any editor that supports the LSP standard. ## Supported Providers -`miniscript-languageserver` supports the following language server protocol (LSP) features: - -- **Completion**: Auto-completion suggestions for code. -- **Hover**: Displays information about a symbol when you hover over it. -- **Color**: Color information for syntax highlighting and theming. -- **Definition**: Navigate to the definition of a symbol. -- **Formatter**: Automatically format the code according to set rules. -- **Signature Help**: Shows function or method signatures while typing. -- **Document Symbol**: Lists all symbols in a document (e.g., functions, classes). -- **Workspace Symbol**: Search for symbols across the workspace. -- **Diagnostic**: Provides error, warning, and information diagnostics. -- **Semantic Tokens**: Enhanced token classification for syntax highlighting and analysis. +- **Completion** - auto-completion suggestions +- **Hover** - symbol information on hover +- **Color** - color information for syntax highlighting and theming +- **Definition** - navigate to a symbol's definition +- **Formatter** - automatic code formatting +- **Signature Help** - function/method signature display +- **Document Symbol** - list all symbols in a document +- **Workspace Symbol** - search symbols across the workspace +- **Diagnostic** - error, warning, and info diagnostics +- **Semantic Tokens** - enhanced token classification for highlighting ## Install @@ -34,11 +24,13 @@ npm install -g miniscript-languageserver ``` ## Usage + ```bash -miniscript-languageserver +miniscript-languageserver --stdio ``` ## Configuration + ```ts { fileExtensions: string; // default: "ms" @@ -60,266 +52,21 @@ miniscript-languageserver } ``` -## Example Implementations - -This section provides a collection of IDEs that implement the `miniscript-languageserver`. - -- [VSCode](#vscode): Visual Studio Code setup for `miniscript-languageserver`. -- [Sublime Text](#sublime): Instructions for integrating with Sublime Text. -- [IntelliJ](#intellij): Guide for using `miniscript-languageserver` with IntelliJ. -- [Neovim (nvim)](#nvim): Configuration for Neovim users. -- [Visual Studio](#visual-studio): Learn how to set up a Visual Studio extension using LSP to add support for the MiniScript language in Visual Studio. - -Any other IDEs that follow the [LSP standards](https://code.visualstudio.com/api/language-extensions/language-server-extension-guide) should also work with `miniscript-languageserver`. - -#### VSCode - -1. Create language client file. -```ts -import * as path from 'path'; -import { - LanguageClient, - LanguageClientOptions, - ServerOptions, - TransportKind -} from 'vscode-languageclient/node'; - -const serverModule = context.asAbsolutePath( - path.join('node_modules', 'miniscript-languageserver', 'index.js') -); - -const serverOptions: ServerOptions = { - run: { module: serverModule, transport: TransportKind.ipc } -}; - -const clientOptions: LanguageClientOptions = { - documentSelector: [{ scheme: 'file', language: 'miniscript' }], - synchronize: { - fileEvents: workspace.createFileSystemWatcher('**/*') - }, - diagnosticCollectionName: 'miniscript' -}; - -const client = new LanguageClient( - 'languageServerExample', - 'Language Server Example', - serverOptions, - clientOptions -); - -client.registerProposedFeatures(); -client.start(); -``` - -#### Sublime - -1. Install the [LSP Package](https://lsp.sublimetext.io/) from the Sublime Text Package Control. -2. Create the following LSP client configuration in your Sublime settings: -```json -{ - "show_diagnostics_panel_on_save": 0, - "clients": { - "miniscript": { - "enabled": true, - "command": ["miniscript-languageserver", "--stdio"], - "selector": "source.miniscript" - } - }, - "semantic_highlighting": true -} -``` - -3. Create a Sublime syntax file for miniscript. The highlighting will be provided via the semantic provider, so there's no need to add additional patterns here. Use the following configuration: -```yaml -%YAML 1.2 ---- -name: miniscript -file_extensions: - - src -scope: source.miniscript - -contexts: - main: - - match: '.+' - scope: text.miniscript -``` - -#### IntelliJ - -To set up `miniscript-languageserver` in IntelliJ, follow these steps: - -1. [Install miniscript-languageserver](#install). -2. Install the `LSP4IJ` plugin from the JetBrains Plugin Marketplace. -3. Go to **Languages & Frameworks > Language Servers**. -4. Click the "+" icon to add a new language server configuration. -5. In the **Name** field, enter `miniscript`. -6. In the **Command** field, enter `miniscript-languageserver --stdio`. -7. In the **Filename Patterns** section: - - Set **File Name Pattern** to `*.src`. - - Set **Language Id** to `miniscript`. -8. Restart IntelliJ. - -You should now have `miniscript-languageserver` set up and ready to use with IntelliJ. - - -#### nvim - -1. Add the following configuration to your `init.vim`: -```vim -" Install vim-plug if it's not already installed -call plug#begin('~/.vim/plugged') - -" Install LSP config plugin -Plug 'neovim/nvim-lspconfig' - -call plug#end() - -" LSP configuration for miniscript-languageserver -lua <lua vim.lsp.buf.hover()', { noremap = true, silent = true }) - end, - }, - } - end - - -- Register and start the miniscript LSP - lspconfig.miniscript.setup{} -EOF - -autocmd BufRead,BufNewFile *.src set filetype=miniscript -``` -2. Don't forget to run :PlugInstall to install the necessary plugins. - -This configuration ensures that miniscript-languageserver will be properly integrated into Neovim, and that .src files will be recognized with the correct syntax highlighting and LSP features. - -#### Visual Studio - -1. Begin by following the [official Visual Studio Extensibility Tutorial](https://learn.microsoft.com/de-de/visualstudio/extensibility/adding-an-lsp-extension?view=vs-2022#get-started) to create a new Visual Studio extension. This will set up the basic structure for the extension project. -2. In this step, we define a custom content type for the language we are adding (e.g., MiniScript). This will help Visual Studio identify files based on their extension or content type. Create a new class called ContentTypeDefinitions.cs: -```csharp -using Microsoft.VisualStudio.LanguageServer.Client; -using Microsoft.VisualStudio.Utilities; -using System.ComponentModel.Composition; - -namespace MiniScript -{ - internal static class MiniScriptContentDefinition - { - [Export] - [Name("miniscript")] - [BaseDefinition(CodeRemoteContentDefinition.CodeRemoteContentTypeName)] - public static ContentTypeDefinition MiniScriptContentTypeDefinition; - - [Export] - [FileExtension(".ms")] - [ContentType("miniscript")] - public static FileExtensionToContentTypeDefinition MiniScriptFileExtensionDefinition; - } -} -``` -3. Next, you will create the LanguageClient.cs class that connects Visual Studio to the language server. This class implements ILanguageClient, which is essential for interacting with the LSP. Create a new file called LanguageClient.cs: -```csharp -using Microsoft.VisualStudio.LanguageServer.Client; -using Microsoft.VisualStudio.Threading; -using Microsoft.VisualStudio.Utilities; -using System; -using System.Collections.Generic; -using System.ComponentModel.Composition; -using System.Diagnostics; -using System.Threading; -using System.Threading.Tasks; - -namespace MiniScript -{ - [Export(typeof(ILanguageClient))] - [ContentType("miniscript")] - [RunOnContext(RunningContext.RunOnHost)] - public class MiniScriptLanguageClient : ILanguageClient - { - public event AsyncEventHandler StartAsync; - public event AsyncEventHandler StopAsync; - public object InitializationOptions => null; - public IEnumerable FilesToWatch => null; - public bool ShowNotificationOnInitializeFailed => true; - public string Name => "MiniScript Language Client"; - public IEnumerable ConfigurationSections => new[] { "miniscript" }; - - public Task ActivateAsync(CancellationToken token) - { - var info = new ProcessStartInfo - { - FileName = @"C:\Users\myUser\AppData\Roaming\npm\miniscript-languageserver.cmd", - Arguments = "--stdio", - RedirectStandardInput = true, - RedirectStandardOutput = true, - UseShellExecute = false, - CreateNoWindow = true - }; - var process = new Process { StartInfo = info }; - - if (process.Start()) - { - Debug.WriteLine("Language server started successfully."); - return Task.FromResult(new Connection(process.StandardOutput.BaseStream, process.StandardInput.BaseStream)); - } +## Editor Setup - Debug.WriteLine("Failed to start language server."); - return Task.FromResult(null); - } +Detailed setup instructions for each editor are in the [setup/](setup/) folder: - public async Task OnLoadedAsync() - { - if (StartAsync != null) - { - await StartAsync.InvokeAsync(this, EventArgs.Empty); - } - } +| Editor | Guide | +|--------|-------| +| VSCode | [setup/vscode.md](setup/vscode.md) | +| Sublime Text | [setup/sublime.md](setup/sublime.md) | +| IntelliJ | [setup/intellij.md](setup/intellij.md) | +| Neovim | [setup/neovim.md](setup/neovim.md) | +| Visual Studio | [setup/visual-studio.md](setup/visual-studio.md) | +| Zed | [setup/zed.md](setup/zed.md) | +| BBEdit | [setup/bbedit.md](setup/bbedit.md) | - public async Task StopServerAsync() - { - if (StopAsync != null) - { - await StopAsync.InvokeAsync(this, EventArgs.Empty); - } - } - - public Task OnServerInitializedAsync() - { - return Task.CompletedTask; - } - - public Task OnServerInitializeFailedAsync(ILanguageClientInitializationInfo initializationState) - { - string message = "MiniScript failed to activate, now we can't test LSP! :("; - string exception = initializationState.InitializationException?.ToString() ?? string.Empty; - message = $"{message}\n {exception}"; - - var failureContext = new InitializationFailureContext() - { - FailureMessage = message, - }; - - return Task.FromResult(failureContext); - } - } -} -``` -4. At this point, you have a basic framework for integrating a custom language server into Visual Studio. You can customize the content type, server activation, or extend the language client. +Any other editor that follows the [LSP standard](https://microsoft.github.io/language-server-protocol/) should also work. ## How to Add Tooltips @@ -328,7 +75,8 @@ Tooltips in `miniscript-languageserver` can help provide additional context, suc 1. Fork and create a pull request (PR) with your changes to the [miniscript-meta repository](https://github.com/ayecue/miniscript-meta), where the meta descriptions are stored. 2. Once your changes are merged, create a separate PR in this repository to update the version of `miniscript-languageserver` to include the new meta descriptions. -Additionally, you can define method-specific tooltips directly in the code using comments. This allows for quick, tooltips for individual methods. +Additionally, you can define method-specific tooltips directly in the code using comments: + ```js // @type Bar // @property {string} virtualMoo diff --git a/packages/node/setup/bbedit.md b/packages/node/setup/bbedit.md new file mode 100644 index 0000000..b6bee7a --- /dev/null +++ b/packages/node/setup/bbedit.md @@ -0,0 +1,252 @@ +# BBEdit Setup + +BBEdit supports language servers natively. This guide walks through setting up `miniscript-languageserver` with MiniScript syntax highlighting. + +## Prerequisites + +Install the language server globally and make sure the npm global bin directory is on your PATH: + +```bash +npm install -g miniscript-languageserver +``` + +Add the following to your `~/.bashrc` or `~/.zshrc`: + +```bash +export PATH=~/.npm-global/bin:$PATH +``` + +## Required Files + +You need two files: a language module plist and an LSP configuration JSON. + +### miniscript.plist + +Save the following as `miniscript.plist`: + +```xml + + + + + BBEditDocumentType + CodelessLanguageModule + BBLMLanguageDisplayName + MiniScript + BBLMLanguageCode + MNSC + BBLMLanguageID + miniscript + + BBLMSuffixMap + + + BBLMLanguageSuffix + .ms + + + + BBLMColorsSyntax + + BBLMUsesLSPSemanticTokensForColoring + + BBLMSupportsLSP + + BBLMIsCaseInsensitive + + + Language Features + + Identifier and Keyword Character Class + a-zA-Z0-9_ + Comment Pattern + (\/\/.*$)|(\/\*[\s\S]*?\*\/) + String Pattern + ".*?" + Open Block Comments + /* + Close Block Comments + */ + Open Line Comments + // + Open Strings 1 + " + Close Strings 1 + " + Escape Char in Strings 1 + "" + End-of-line Ends Strings 1 + + Open Parameter Lists + ( + Close Parameter Lists + ) + Prefix for Functions + function + + + BBLMKeywordList + + if + then + else + end + while + for + from + in + function + return + break + continue + repeat + and + or + not + isa + new + true + false + null + self + super + locals + globals + outer + params + list + map + number + string + funcRef + + + BBLMPredefinedNameList + + print + hasIndex + typeof + indexes + values + indexOf + len + shuffle + val + lower + upper + sum + pop + pull + push + sort + remove + wait + abs + acos + asin + atan + tan + cos + code + char + sin + floor + range + round + rnd + sign + sqrt + str + ceil + pi + slice + hash + time + bitAnd + bitOr + bitXor + log + yield + insert + to_int + join + split + reverse + replace + trim + lastIndexOf + user_input + exit + + + BBLMLanguageServerInfo + + ServerCommand + miniscript-languageserver + ServerArguments + + --stdio + + ServerLanguageID + miniscript + + + +``` + +### miniscript.json + +Save the following as `miniscript.json`: + +```json +{ + "initializationOptions": { + "miniscript": {} + }, + "workspaceConfigurations": { + "*": { + "miniscript": { + "fileExtensions": "ms", + "formatter": true, + "autocomplete": true, + "hoverdocs": true, + "diagnostic": true, + "transpiler": { + "beautify": { + "keepParentheses": true, + "indentation": "Tab", + "indentationSpaces": 2 + } + }, + "typeAnalyzer": { + "strategy": "Workspace" + } + } + } + } +} +``` + +## Steps + +1. Copy `miniscript.plist` into: + + ``` + ~/Library/Application Support/BBEdit/Language Modules/ + ``` + +2. Copy `miniscript.json` into: + + ``` + ~/Library/Application Support/BBEdit/Language Servers/Configuration/ + ``` + +3. Open BBEdit and go to **BBEdit > Settings > Application** and enable **Allow sandbox access**. + +4. Go to **BBEdit > Settings > Languages > Custom Settings**, click the **+** button, and select **MiniScript**. In the **Server** tab, confirm the LSP is enabled. The server settings should already be populated from the plist file. Change the configuration from **default** to **miniscript**. + +5. Restart BBEdit. + +## Notes + +The language server should now be active for `.ms` files. Unfortunately BBEdit does not support semantic highlighting via the LSP. Semantic token colors can only be defined through the plist file itself. diff --git a/packages/node/setup/intellij.md b/packages/node/setup/intellij.md new file mode 100644 index 0000000..81b2d85 --- /dev/null +++ b/packages/node/setup/intellij.md @@ -0,0 +1,12 @@ +# IntelliJ Setup + +1. [Install miniscript-languageserver](../README.md#install). +2. Install the `LSP4IJ` plugin from the JetBrains Plugin Marketplace. +3. Go to **Languages & Frameworks > Language Servers**. +4. Click the "+" icon to add a new language server configuration. +5. In the **Name** field, enter `miniscript`. +6. In the **Command** field, enter `miniscript-languageserver --stdio`. +7. In the **Filename Patterns** section: + - Set **File Name Pattern** to `*.src`. + - Set **Language Id** to `miniscript`. +8. Restart IntelliJ. diff --git a/packages/node/setup/neovim.md b/packages/node/setup/neovim.md new file mode 100644 index 0000000..97f49fd --- /dev/null +++ b/packages/node/setup/neovim.md @@ -0,0 +1,43 @@ +# Neovim Setup + +Add the following configuration to your `init.vim`: + +```vim +" Install vim-plug if it's not already installed +call plug#begin('~/.vim/plugged') + +" Install LSP config plugin +Plug 'neovim/nvim-lspconfig' + +call plug#end() + +" LSP configuration for miniscript-languageserver +lua <lua vim.lsp.buf.hover()', { noremap = true, silent = true }) + end, + }, + } + end + + -- Register and start the miniscript LSP + lspconfig.miniscript.setup{} +EOF + +autocmd BufRead,BufNewFile *.src set filetype=miniscript +``` + +Run `:PlugInstall` to install the necessary plugins. diff --git a/packages/node/setup/sublime.md b/packages/node/setup/sublime.md new file mode 100644 index 0000000..b76e4ff --- /dev/null +++ b/packages/node/setup/sublime.md @@ -0,0 +1,34 @@ +# Sublime Text Setup + +1. Install the [LSP Package](https://lsp.sublimetext.io/) from the Sublime Text Package Control. +2. Create the following LSP client configuration in your Sublime settings: + +```json +{ + "show_diagnostics_panel_on_save": 0, + "clients": { + "miniscript": { + "enabled": true, + "command": ["miniscript-languageserver", "--stdio"], + "selector": "source.miniscript" + } + }, + "semantic_highlighting": true +} +``` + +3. Create a Sublime syntax file for MiniScript. The highlighting will be provided via the semantic provider, so there is no need to add additional patterns here: + +```yaml +%YAML 1.2 +--- +name: miniscript +file_extensions: + - src +scope: source.miniscript + +contexts: + main: + - match: '.+' + scope: text.miniscript +``` diff --git a/packages/node/setup/visual-studio.md b/packages/node/setup/visual-studio.md new file mode 100644 index 0000000..5eeee93 --- /dev/null +++ b/packages/node/setup/visual-studio.md @@ -0,0 +1,118 @@ +# Visual Studio Setup + +1. Begin by following the [official Visual Studio Extensibility Tutorial](https://learn.microsoft.com/de-de/visualstudio/extensibility/adding-an-lsp-extension?view=vs-2022#get-started) to create a new Visual Studio extension. + +2. Define a custom content type for MiniScript. Create a new class called `ContentTypeDefinitions.cs`: + +```csharp +using Microsoft.VisualStudio.LanguageServer.Client; +using Microsoft.VisualStudio.Utilities; +using System.ComponentModel.Composition; + +namespace MiniScript +{ + internal static class MiniScriptContentDefinition + { + [Export] + [Name("miniscript")] + [BaseDefinition(CodeRemoteContentDefinition.CodeRemoteContentTypeName)] + public static ContentTypeDefinition MiniScriptContentTypeDefinition; + + [Export] + [FileExtension(".ms")] + [ContentType("miniscript")] + public static FileExtensionToContentTypeDefinition MiniScriptFileExtensionDefinition; + } +} +``` + +3. Create the `LanguageClient.cs` class that connects Visual Studio to the language server: + +```csharp +using Microsoft.VisualStudio.LanguageServer.Client; +using Microsoft.VisualStudio.Threading; +using Microsoft.VisualStudio.Utilities; +using System; +using System.Collections.Generic; +using System.ComponentModel.Composition; +using System.Diagnostics; +using System.Threading; +using System.Threading.Tasks; + +namespace MiniScript +{ + [Export(typeof(ILanguageClient))] + [ContentType("miniscript")] + [RunOnContext(RunningContext.RunOnHost)] + public class MiniScriptLanguageClient : ILanguageClient + { + public event AsyncEventHandler StartAsync; + public event AsyncEventHandler StopAsync; + public object InitializationOptions => null; + public IEnumerable FilesToWatch => null; + public bool ShowNotificationOnInitializeFailed => true; + public string Name => "MiniScript Language Client"; + public IEnumerable ConfigurationSections => new[] { "miniscript" }; + + public Task ActivateAsync(CancellationToken token) + { + var info = new ProcessStartInfo + { + FileName = @"C:\Users\myUser\AppData\Roaming\npm\miniscript-languageserver.cmd", + Arguments = "--stdio", + RedirectStandardInput = true, + RedirectStandardOutput = true, + UseShellExecute = false, + CreateNoWindow = true + }; + var process = new Process { StartInfo = info }; + + if (process.Start()) + { + Debug.WriteLine("Language server started successfully."); + return Task.FromResult(new Connection(process.StandardOutput.BaseStream, process.StandardInput.BaseStream)); + } + + Debug.WriteLine("Failed to start language server."); + return Task.FromResult(null); + } + + public async Task OnLoadedAsync() + { + if (StartAsync != null) + { + await StartAsync.InvokeAsync(this, EventArgs.Empty); + } + } + + public async Task StopServerAsync() + { + if (StopAsync != null) + { + await StopAsync.InvokeAsync(this, EventArgs.Empty); + } + } + + public Task OnServerInitializedAsync() + { + return Task.CompletedTask; + } + + public Task OnServerInitializeFailedAsync(ILanguageClientInitializationInfo initializationState) + { + string message = "MiniScript failed to activate, now we can't test LSP! :("; + string exception = initializationState.InitializationException?.ToString() ?? string.Empty; + message = $"{message}\n {exception}"; + + var failureContext = new InitializationFailureContext() + { + FailureMessage = message, + }; + + return Task.FromResult(failureContext); + } + } +} +``` + +4. You now have a basic framework for integrating the language server into Visual Studio. You can customize the content type, server activation, or extend the language client as needed. diff --git a/packages/node/setup/vscode.md b/packages/node/setup/vscode.md new file mode 100644 index 0000000..03a0cfb --- /dev/null +++ b/packages/node/setup/vscode.md @@ -0,0 +1,39 @@ +# VSCode Setup + +Create a language client file in your VSCode extension: + +```ts +import * as path from 'path'; +import { + LanguageClient, + LanguageClientOptions, + ServerOptions, + TransportKind +} from 'vscode-languageclient/node'; + +const serverModule = context.asAbsolutePath( + path.join('node_modules', 'miniscript-languageserver', 'index.js') +); + +const serverOptions: ServerOptions = { + run: { module: serverModule, transport: TransportKind.ipc } +}; + +const clientOptions: LanguageClientOptions = { + documentSelector: [{ scheme: 'file', language: 'miniscript' }], + synchronize: { + fileEvents: workspace.createFileSystemWatcher('**/*') + }, + diagnosticCollectionName: 'miniscript' +}; + +const client = new LanguageClient( + 'languageServerExample', + 'Language Server Example', + serverOptions, + clientOptions +); + +client.registerProposedFeatures(); +client.start(); +``` diff --git a/packages/node/setup/zed.md b/packages/node/setup/zed.md new file mode 100644 index 0000000..f1fa852 --- /dev/null +++ b/packages/node/setup/zed.md @@ -0,0 +1,197 @@ +# Zed Setup + +A ready-made extension is available at [miniscript-lsp-zed-extension](https://github.com/ayecue/miniscript-lsp-zed-extension). You can install it directly from the Zed extension marketplace. + +The rest of this guide explains how to create a Zed extension that integrates `miniscript-languageserver` from scratch. + +## Project Structure + +``` +miniscript-lsp-zed-extension/ + Cargo.toml + extension.toml + src/ + miniscript.rs + languages/ + miniscript/ + config.toml + highlights.scm +``` + +## 1. Extension Manifest + +Create `extension.toml` to declare the extension, its language server, and grammar: + +```toml +id = "miniscript" +name = "MiniScript" +version = "0.0.1" +schema_version = 1 +authors = ["your-name"] +description = "MiniScript LSP extension for Zed" +repository = "https://github.com/your-name/miniscript-lsp-zed-extension" + +[language_servers.miniscript-languageserver] +name = "MiniScript LSP" +language = "MiniScript" + +[grammars.miniscript] +repository = "https://github.com/ayecue/tree-sitter-miniscript" +commit = "f505f44e7bb67504e40ba683fa67184f14924e85" +``` + +## 2. Cargo.toml + +Zed extensions compile to a WASM CDYLIB. Create `Cargo.toml`: + +```toml +[package] +name = "miniscript-lsp-zed-extension" +version = "0.0.1" +edition = "2021" + +[lib] +path = "src/miniscript.rs" +crate-type = ["cdylib"] + +[dependencies] +zed_extension_api = "0.5.0" +``` + +## 3. Extension Entry Point + +Create `src/miniscript.rs`. This installs `miniscript-languageserver` via npm and launches it with `--stdio`: + +```rust +use std::{env, fs}; +use zed_extension_api::{ + self as zed, serde_json, settings::LspSettings, LanguageServerId, Result, +}; + +const SERVER_PATH: &str = "node_modules/.bin/miniscript-languageserver"; +const PACKAGE_NAME: &str = "miniscript-languageserver"; + +struct MiniScriptExtension { + did_find_server: bool, +} + +impl MiniScriptExtension { + fn server_exists(&self) -> bool { + fs::metadata(SERVER_PATH).map_or(false, |stat| stat.is_file()) + } + + fn server_script_path( + &mut self, + language_server_id: &LanguageServerId, + ) -> Result { + let server_exists = self.server_exists(); + if self.did_find_server && server_exists { + return Ok(SERVER_PATH.to_string()); + } + + zed::set_language_server_installation_status( + language_server_id, + &zed::LanguageServerInstallationStatus::CheckingForUpdate, + ); + let version = zed::npm_package_latest_version(PACKAGE_NAME)?; + + if !server_exists + || zed::npm_package_installed_version(PACKAGE_NAME)?.as_ref() + != Some(&version) + { + zed::set_language_server_installation_status( + language_server_id, + &zed::LanguageServerInstallationStatus::Downloading, + ); + let result = zed::npm_install_package(PACKAGE_NAME, &version); + match result { + Ok(()) => { + if !self.server_exists() { + Err(format!( + "installed package '{PACKAGE_NAME}' did not contain expected path '{SERVER_PATH}'", + ))?; + } + } + Err(error) => { + if !self.server_exists() { + Err(error)?; + } + } + } + } + + self.did_find_server = true; + Ok(SERVER_PATH.to_string()) + } +} + +impl zed::Extension for MiniScriptExtension { + fn new() -> Self { + Self { + did_find_server: false, + } + } + + fn language_server_command( + &mut self, + language_server_id: &LanguageServerId, + _worktree: &zed::Worktree, + ) -> Result { + let server_path = self.server_script_path(language_server_id)?; + Ok(zed::Command { + command: zed::node_binary_path()?, + args: vec![ + env::current_dir() + .unwrap() + .join(&server_path) + .to_string_lossy() + .to_string(), + "--stdio".to_string(), + ], + env: Default::default(), + }) + } + + fn language_server_initialization_options( + &mut self, + language_server_id: &LanguageServerId, + worktree: &zed::Worktree, + ) -> Result> { + let settings = LspSettings::for_worktree( + language_server_id.as_ref(), + worktree, + ) + .ok() + .and_then(|lsp_settings| lsp_settings.settings.clone()) + .unwrap_or_default(); + + let mut map = serde_json::Map::new(); + map.insert(language_server_id.to_string(), settings); + Ok(Some(serde_json::json!(map))) + } +} + +zed::register_extension!(MiniScriptExtension); +``` + +## 4. Language Configuration + +Create `languages/miniscript/config.toml`: + +```toml +name = "MiniScript" +grammar = "miniscript" +path_suffixes = ["ms"] +line_comments = ["//"] +block_comment = ["/*", "*/"] +brackets = [ + { start = "{", end = "}", close = true, newline = true }, + { start = "[", end = "]", close = true, newline = true }, + { start = "(", end = ")", close = true, newline = true }, + { start = "\"", end = "\"", close = true, newline = false }, +] +``` + +## 5. Build and Install + +Build the extension and install it in Zed. From 2ad9f6984f8e19e6b21f5c8c3122182507e2da27 Mon Sep 17 00:00:00 2001 From: ayecue Date: Sun, 8 Mar 2026 00:42:09 +0100 Subject: [PATCH 4/8] 3.0.0 update exposed packages --- packages/browser/package-lock.json | 54 +++++++++++++++--------------- packages/browser/package.json | 2 +- packages/node/package-lock.json | 54 +++++++++++++++--------------- packages/node/package.json | 4 +-- 4 files changed, 57 insertions(+), 57 deletions(-) diff --git a/packages/browser/package-lock.json b/packages/browser/package-lock.json index 1b965e4..829df0a 100644 --- a/packages/browser/package-lock.json +++ b/packages/browser/package-lock.json @@ -1,19 +1,19 @@ { "name": "miniscript-languageserver-browser", - "version": "2.1.1", + "version": "2.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "miniscript-languageserver-browser", - "version": "2.1.1", + "version": "2.2.0", "license": "ISC", "dependencies": { - "greybel-core": "~2.6.0", - "greybel-transpiler": "~3.8.1", - "greybel-type-analyzer": "~1.1.1", + "greybel-core": "~3.0.0", + "greybel-transpiler": "~4.0.0", + "greybel-type-analyzer": "~2.0.0", "lru-cache": "^11.1.0", - "miniscript-languageserver-core": "^2.1.0", + "miniscript-languageserver-core": "~3.0.0", "miniscript-meta": "~1.4.0" }, "devDependencies": { @@ -6515,32 +6515,32 @@ "license": "MIT" }, "node_modules/greybel-core": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/greybel-core/-/greybel-core-2.6.0.tgz", - "integrity": "sha512-fQLHeCxj63fpS3iHoeY5rb8Y9U+wOdgMrFxF2S7rM8qEQ3O9aKDSMBFklzbgc4yCn4TtUJ3l68DAjQkSZgvmkQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/greybel-core/-/greybel-core-3.0.0.tgz", + "integrity": "sha512-xniWqEJnaIOYX64r6ll35xePlHAqhziQGFtsMujhAVrEM5fHS1derYaeCPDkAxIUf8BXaHui9Wropr10yktG3A==", "license": "MIT", "dependencies": { - "miniscript-core": "~1.6.0" + "miniscript-core": "~2.0.0" } }, "node_modules/greybel-transpiler": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/greybel-transpiler/-/greybel-transpiler-3.8.1.tgz", - "integrity": "sha512-90lVlprFMkZKaJq6gJKc/m9snkToa+2MPhnugJcN7lNs4fhr/6OQpSA4Zw6ReNF+EENfPlMechda1RlvS0d7iQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/greybel-transpiler/-/greybel-transpiler-4.0.0.tgz", + "integrity": "sha512-YqLmCUu7NJlIVN0MDIICgn6jqNeVnRSiqnqKIvN4nBFlSE8ABk9Nl4g6oDZkgQZPMv/J3tqXww2UwmZItokpzw==", "license": "MIT", "dependencies": { "blueimp-md5": "^2.19.0", - "greybel-core": "~2.6.0" + "greybel-core": "~3.0.0" } }, "node_modules/greybel-type-analyzer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/greybel-type-analyzer/-/greybel-type-analyzer-1.1.1.tgz", - "integrity": "sha512-MRFbbNtf7zwNRHsy+t0fF7nSLZr72rZefNRsbEZoG+zJqfPOW/f8jfxnQsGeaiZMW4AkJ5kzls+gPiyLAtwcyw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/greybel-type-analyzer/-/greybel-type-analyzer-2.0.0.tgz", + "integrity": "sha512-VcNfhmVN4AG4dX51Q2n93cbBmsG0LGwy7CqCV4mBUBybesYLhDZy4J7j4NHK/vPd3gliaYCuV5hkRF3elJDoNw==", "license": "MIT", "dependencies": { "comment-parser": "^1.4.1", - "greybel-core": "~2.6.0", + "greybel-core": "~3.0.0", "meta-utils": "~3.0.0" } }, @@ -9141,15 +9141,15 @@ } }, "node_modules/miniscript-core": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/miniscript-core/-/miniscript-core-1.6.0.tgz", - "integrity": "sha512-kpTgf2dtHk2zxS5Hs0BP/95mh70cL3qf2gBGraCSWp6Q5ERDx9w6wUNMyqBOh3Jx/OTk/WNpuyNctochY4p/VA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/miniscript-core/-/miniscript-core-2.0.0.tgz", + "integrity": "sha512-yI651VvD41fsOcF/2HKfnyJwkRhqAZWpp/Lro7NrzIlIi4BrdqK9V4RF2mwn4HWfEKZsyjYxnEAq0ZzFFlTPqw==", "license": "MIT" }, "node_modules/miniscript-languageserver-core": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/miniscript-languageserver-core/-/miniscript-languageserver-core-2.1.0.tgz", - "integrity": "sha512-S2GSxYbF3PlhTRWqS70WsCzZ4nCuFsQBKAViHxgt7RlIi3iriRAVzKOk6teDXnZZjFeQu2IEwaKhSmU0MteDsg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/miniscript-languageserver-core/-/miniscript-languageserver-core-3.0.0.tgz", + "integrity": "sha512-j4mi6rMfbM45JVneuKNFgC8v0j9kPUMT/J/d0A4orLTSp8bNLn/zu7LiK+rqCV3GnKPEl7OupBLnvG6CJxSZFw==", "license": "ISC", "dependencies": { "color-convert": "^2.0.1", @@ -9164,9 +9164,9 @@ "node": "*" }, "peerDependencies": { - "greybel-core": ">=2.6.0", - "greybel-transpiler": ">=3.8.0", - "greybel-type-analyzer": ">=1.1.0", + "greybel-core": ">=3.0.0", + "greybel-transpiler": ">=4.0.0", + "greybel-type-analyzer": ">=2.0.0", "miniscript-meta": ">=1.4.0" } }, diff --git a/packages/browser/package.json b/packages/browser/package.json index 495cded..f0bef70 100644 --- a/packages/browser/package.json +++ b/packages/browser/package.json @@ -69,6 +69,6 @@ "miniscript-meta": "~1.4.0", "greybel-transpiler": "~4.0.0", "greybel-type-analyzer": "~2.0.0", - "miniscript-languageserver-core": "^2.2.0" + "miniscript-languageserver-core": "~3.0.0" } } \ No newline at end of file diff --git a/packages/node/package-lock.json b/packages/node/package-lock.json index e9cacc9..ec06743 100644 --- a/packages/node/package-lock.json +++ b/packages/node/package-lock.json @@ -1,20 +1,20 @@ { "name": "miniscript-languageserver", - "version": "2.1.1", + "version": "3.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "miniscript-languageserver", - "version": "2.1.1", + "version": "3.0.0", "license": "ISC", "dependencies": { "glob": "^11.0.0", - "greybel-core": "~2.6.0", - "greybel-transpiler": "~3.8.1", - "greybel-type-analyzer": "~1.1.1", + "greybel-core": "~3.0.0", + "greybel-transpiler": "~4.0.0", + "greybel-type-analyzer": "~2.0.0", "lru-cache": "^11.1.0", - "miniscript-languageserver-core": "^2.1.0", + "miniscript-languageserver-core": "~3.0.0", "miniscript-meta": "~1.4.0" }, "bin": { @@ -6692,32 +6692,32 @@ "license": "MIT" }, "node_modules/greybel-core": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/greybel-core/-/greybel-core-2.6.0.tgz", - "integrity": "sha512-fQLHeCxj63fpS3iHoeY5rb8Y9U+wOdgMrFxF2S7rM8qEQ3O9aKDSMBFklzbgc4yCn4TtUJ3l68DAjQkSZgvmkQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/greybel-core/-/greybel-core-3.0.0.tgz", + "integrity": "sha512-xniWqEJnaIOYX64r6ll35xePlHAqhziQGFtsMujhAVrEM5fHS1derYaeCPDkAxIUf8BXaHui9Wropr10yktG3A==", "license": "MIT", "dependencies": { - "miniscript-core": "~1.6.0" + "miniscript-core": "~2.0.0" } }, "node_modules/greybel-transpiler": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/greybel-transpiler/-/greybel-transpiler-3.8.1.tgz", - "integrity": "sha512-90lVlprFMkZKaJq6gJKc/m9snkToa+2MPhnugJcN7lNs4fhr/6OQpSA4Zw6ReNF+EENfPlMechda1RlvS0d7iQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/greybel-transpiler/-/greybel-transpiler-4.0.0.tgz", + "integrity": "sha512-YqLmCUu7NJlIVN0MDIICgn6jqNeVnRSiqnqKIvN4nBFlSE8ABk9Nl4g6oDZkgQZPMv/J3tqXww2UwmZItokpzw==", "license": "MIT", "dependencies": { "blueimp-md5": "^2.19.0", - "greybel-core": "~2.6.0" + "greybel-core": "~3.0.0" } }, "node_modules/greybel-type-analyzer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/greybel-type-analyzer/-/greybel-type-analyzer-1.1.1.tgz", - "integrity": "sha512-MRFbbNtf7zwNRHsy+t0fF7nSLZr72rZefNRsbEZoG+zJqfPOW/f8jfxnQsGeaiZMW4AkJ5kzls+gPiyLAtwcyw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/greybel-type-analyzer/-/greybel-type-analyzer-2.0.0.tgz", + "integrity": "sha512-VcNfhmVN4AG4dX51Q2n93cbBmsG0LGwy7CqCV4mBUBybesYLhDZy4J7j4NHK/vPd3gliaYCuV5hkRF3elJDoNw==", "license": "MIT", "dependencies": { "comment-parser": "^1.4.1", - "greybel-core": "~2.6.0", + "greybel-core": "~3.0.0", "meta-utils": "~3.0.0" } }, @@ -9384,15 +9384,15 @@ } }, "node_modules/miniscript-core": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/miniscript-core/-/miniscript-core-1.6.0.tgz", - "integrity": "sha512-kpTgf2dtHk2zxS5Hs0BP/95mh70cL3qf2gBGraCSWp6Q5ERDx9w6wUNMyqBOh3Jx/OTk/WNpuyNctochY4p/VA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/miniscript-core/-/miniscript-core-2.0.0.tgz", + "integrity": "sha512-yI651VvD41fsOcF/2HKfnyJwkRhqAZWpp/Lro7NrzIlIi4BrdqK9V4RF2mwn4HWfEKZsyjYxnEAq0ZzFFlTPqw==", "license": "MIT" }, "node_modules/miniscript-languageserver-core": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/miniscript-languageserver-core/-/miniscript-languageserver-core-2.1.0.tgz", - "integrity": "sha512-S2GSxYbF3PlhTRWqS70WsCzZ4nCuFsQBKAViHxgt7RlIi3iriRAVzKOk6teDXnZZjFeQu2IEwaKhSmU0MteDsg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/miniscript-languageserver-core/-/miniscript-languageserver-core-3.0.0.tgz", + "integrity": "sha512-j4mi6rMfbM45JVneuKNFgC8v0j9kPUMT/J/d0A4orLTSp8bNLn/zu7LiK+rqCV3GnKPEl7OupBLnvG6CJxSZFw==", "license": "ISC", "dependencies": { "color-convert": "^2.0.1", @@ -9407,9 +9407,9 @@ "node": "*" }, "peerDependencies": { - "greybel-core": ">=2.6.0", - "greybel-transpiler": ">=3.8.0", - "greybel-type-analyzer": ">=1.1.0", + "greybel-core": ">=3.0.0", + "greybel-transpiler": ">=4.0.0", + "greybel-type-analyzer": ">=2.0.0", "miniscript-meta": ">=1.4.0" } }, diff --git a/packages/node/package.json b/packages/node/package.json index bd07f11..f934a82 100644 --- a/packages/node/package.json +++ b/packages/node/package.json @@ -1,6 +1,6 @@ { "name": "miniscript-languageserver", - "version": "2.2.0", + "version": "3.0.0", "description": "Language server for MiniScript", "main": "./index.js", "scripts": { @@ -71,7 +71,7 @@ "lru-cache": "^11.1.0", "greybel-core": "~3.0.0", "greybel-transpiler": "~4.0.0", - "miniscript-languageserver-core": "^2.2.0", + "miniscript-languageserver-core": "~3.0.0", "miniscript-meta": "~1.4.0", "greybel-type-analyzer": "~2.0.0" } From 808e4fa4e60d71b92dae5db5877671d20d3887ef Mon Sep 17 00:00:00 2001 From: ayecue Date: Sun, 8 Mar 2026 01:38:25 +0100 Subject: [PATCH 5/8] 3.0.0 add preserve option --- packages/core/package-lock.json | 4 ++-- packages/core/package.json | 2 +- packages/core/src/helper/document-manager.ts | 4 +++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/core/package-lock.json b/packages/core/package-lock.json index 56d6a18..282a7c7 100644 --- a/packages/core/package-lock.json +++ b/packages/core/package-lock.json @@ -1,12 +1,12 @@ { "name": "miniscript-languageserver-core", - "version": "2.2.0", + "version": "3.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "miniscript-languageserver-core", - "version": "2.2.0", + "version": "3.0.1", "license": "ISC", "dependencies": { "color-convert": "^2.0.1", diff --git a/packages/core/package.json b/packages/core/package.json index 3860ae9..0f53dbb 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "miniscript-languageserver-core", - "version": "3.0.0", + "version": "3.0.1", "description": "Core functionality of language server for MiniScript", "main": "./dist/index.js", "typings": "./dist/index.d.ts", diff --git a/packages/core/src/helper/document-manager.ts b/packages/core/src/helper/document-manager.ts index 9074e37..3d11faa 100644 --- a/packages/core/src/helper/document-manager.ts +++ b/packages/core/src/helper/document-manager.ts @@ -59,7 +59,9 @@ export class DocumentManager extends EventEmitter implements IDocumentManager { this._context.documentMerger.cache.flushCacheKey(textDocument.uri); const content = textDocument.getText(); - const parser = new UnsafeParser(content); + const parser = new UnsafeParser(content, { + preserve: true, + }); const parsedPayload = parser.parseChunk() as ASTChunkGreybel; const typeDocument = typeManager.analyze(textDocument.uri, parsedPayload); From cefa7992575669d6c5cb2d842dfb0f482e641bad Mon Sep 17 00:00:00 2001 From: ayecue Date: Sun, 8 Mar 2026 01:44:07 +0100 Subject: [PATCH 6/8] 3.0.0 update to latest core --- packages/browser/package-lock.json | 8 ++++---- packages/browser/package.json | 2 +- packages/node/package-lock.json | 8 ++++---- packages/node/package.json | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/browser/package-lock.json b/packages/browser/package-lock.json index 829df0a..4447201 100644 --- a/packages/browser/package-lock.json +++ b/packages/browser/package-lock.json @@ -13,7 +13,7 @@ "greybel-transpiler": "~4.0.0", "greybel-type-analyzer": "~2.0.0", "lru-cache": "^11.1.0", - "miniscript-languageserver-core": "~3.0.0", + "miniscript-languageserver-core": "~3.0.1", "miniscript-meta": "~1.4.0" }, "devDependencies": { @@ -9147,9 +9147,9 @@ "license": "MIT" }, "node_modules/miniscript-languageserver-core": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/miniscript-languageserver-core/-/miniscript-languageserver-core-3.0.0.tgz", - "integrity": "sha512-j4mi6rMfbM45JVneuKNFgC8v0j9kPUMT/J/d0A4orLTSp8bNLn/zu7LiK+rqCV3GnKPEl7OupBLnvG6CJxSZFw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/miniscript-languageserver-core/-/miniscript-languageserver-core-3.0.1.tgz", + "integrity": "sha512-zHxozOcmA00OJ0LI8W3NvUc8la+sGJcJBTrp23r+ZRs8NqHcotz8RL2djJLQPTDfsl2T9kNe5LAaHf2pngsDKA==", "license": "ISC", "dependencies": { "color-convert": "^2.0.1", diff --git a/packages/browser/package.json b/packages/browser/package.json index f0bef70..aff16f6 100644 --- a/packages/browser/package.json +++ b/packages/browser/package.json @@ -69,6 +69,6 @@ "miniscript-meta": "~1.4.0", "greybel-transpiler": "~4.0.0", "greybel-type-analyzer": "~2.0.0", - "miniscript-languageserver-core": "~3.0.0" + "miniscript-languageserver-core": "~3.0.1" } } \ No newline at end of file diff --git a/packages/node/package-lock.json b/packages/node/package-lock.json index ec06743..fdca85c 100644 --- a/packages/node/package-lock.json +++ b/packages/node/package-lock.json @@ -14,7 +14,7 @@ "greybel-transpiler": "~4.0.0", "greybel-type-analyzer": "~2.0.0", "lru-cache": "^11.1.0", - "miniscript-languageserver-core": "~3.0.0", + "miniscript-languageserver-core": "~3.0.1", "miniscript-meta": "~1.4.0" }, "bin": { @@ -9390,9 +9390,9 @@ "license": "MIT" }, "node_modules/miniscript-languageserver-core": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/miniscript-languageserver-core/-/miniscript-languageserver-core-3.0.0.tgz", - "integrity": "sha512-j4mi6rMfbM45JVneuKNFgC8v0j9kPUMT/J/d0A4orLTSp8bNLn/zu7LiK+rqCV3GnKPEl7OupBLnvG6CJxSZFw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/miniscript-languageserver-core/-/miniscript-languageserver-core-3.0.1.tgz", + "integrity": "sha512-zHxozOcmA00OJ0LI8W3NvUc8la+sGJcJBTrp23r+ZRs8NqHcotz8RL2djJLQPTDfsl2T9kNe5LAaHf2pngsDKA==", "license": "ISC", "dependencies": { "color-convert": "^2.0.1", diff --git a/packages/node/package.json b/packages/node/package.json index f934a82..951aaf5 100644 --- a/packages/node/package.json +++ b/packages/node/package.json @@ -71,7 +71,7 @@ "lru-cache": "^11.1.0", "greybel-core": "~3.0.0", "greybel-transpiler": "~4.0.0", - "miniscript-languageserver-core": "~3.0.0", + "miniscript-languageserver-core": "~3.0.1", "miniscript-meta": "~1.4.0", "greybel-type-analyzer": "~2.0.0" } From 6e23fdd8efddb83523d85376d93ed2ba71cc9895 Mon Sep 17 00:00:00 2001 From: ayecue Date: Sun, 8 Mar 2026 02:52:21 +0100 Subject: [PATCH 7/8] 3.0.0 add strictMode to core --- packages/core/package-lock.json | 4 ++-- packages/core/package.json | 2 +- packages/core/src/context.ts | 1 + packages/core/src/helper/document-manager.ts | 2 ++ packages/core/src/types.ts | 2 ++ 5 files changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/core/package-lock.json b/packages/core/package-lock.json index 282a7c7..b3dd708 100644 --- a/packages/core/package-lock.json +++ b/packages/core/package-lock.json @@ -1,12 +1,12 @@ { "name": "miniscript-languageserver-core", - "version": "3.0.1", + "version": "3.0.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "miniscript-languageserver-core", - "version": "3.0.1", + "version": "3.0.2", "license": "ISC", "dependencies": { "color-convert": "^2.0.1", diff --git a/packages/core/package.json b/packages/core/package.json index 0f53dbb..6425d17 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "miniscript-languageserver-core", - "version": "3.0.1", + "version": "3.0.2", "description": "Core functionality of language server for MiniScript", "main": "./dist/index.js", "typings": "./dist/index.d.ts", diff --git a/packages/core/src/context.ts b/packages/core/src/context.ts index 415e438..f0b02fd 100644 --- a/packages/core/src/context.ts +++ b/packages/core/src/context.ts @@ -31,6 +31,7 @@ function createConfig(preset?: IConfigurationRequest): IConfiguration { autocomplete: preset?.autocomplete ?? true, hoverdocs: preset?.hoverdocs ?? true, diagnostic: preset?.diagnostic ?? true, + strictMode: preset?.strictMode ?? false, transpiler: { beautify: { keepParentheses: preset?.transpiler?.beautify?.keepParentheses ?? true, diff --git a/packages/core/src/helper/document-manager.ts b/packages/core/src/helper/document-manager.ts index 3d11faa..216f712 100644 --- a/packages/core/src/helper/document-manager.ts +++ b/packages/core/src/helper/document-manager.ts @@ -59,8 +59,10 @@ export class DocumentManager extends EventEmitter implements IDocumentManager { this._context.documentMerger.cache.flushCacheKey(textDocument.uri); const content = textDocument.getText(); + const config = this._context.getConfiguration(); const parser = new UnsafeParser(content, { preserve: true, + strictMode: config.strictMode, }); const parsedPayload = parser.parseChunk() as ASTChunkGreybel; const typeDocument = typeManager.analyze(textDocument.uri, parsedPayload); diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index dbc1a18..511ee5f 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -33,6 +33,7 @@ export interface IConfigurationRequest { autocomplete: boolean; hoverdocs: boolean; diagnostic: boolean; + strictMode: boolean; transpiler: { beautify: { keepParentheses: boolean; @@ -52,6 +53,7 @@ export interface IConfiguration { autocomplete: boolean; hoverdocs: boolean; diagnostic: boolean; + strictMode: boolean; transpiler: { beautify: { keepParentheses: boolean; From 11abbfcf5336aeaffc2eac65dc68771554c95ccb Mon Sep 17 00:00:00 2001 From: ayecue Date: Sun, 8 Mar 2026 02:55:47 +0100 Subject: [PATCH 8/8] 3.0.0 update core --- packages/browser/package-lock.json | 8 ++++---- packages/browser/package.json | 2 +- packages/node/README.md | 1 + packages/node/package-lock.json | 8 ++++---- packages/node/package.json | 2 +- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/packages/browser/package-lock.json b/packages/browser/package-lock.json index 4447201..dd949ea 100644 --- a/packages/browser/package-lock.json +++ b/packages/browser/package-lock.json @@ -13,7 +13,7 @@ "greybel-transpiler": "~4.0.0", "greybel-type-analyzer": "~2.0.0", "lru-cache": "^11.1.0", - "miniscript-languageserver-core": "~3.0.1", + "miniscript-languageserver-core": "~3.0.2", "miniscript-meta": "~1.4.0" }, "devDependencies": { @@ -9147,9 +9147,9 @@ "license": "MIT" }, "node_modules/miniscript-languageserver-core": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/miniscript-languageserver-core/-/miniscript-languageserver-core-3.0.1.tgz", - "integrity": "sha512-zHxozOcmA00OJ0LI8W3NvUc8la+sGJcJBTrp23r+ZRs8NqHcotz8RL2djJLQPTDfsl2T9kNe5LAaHf2pngsDKA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/miniscript-languageserver-core/-/miniscript-languageserver-core-3.0.2.tgz", + "integrity": "sha512-UInGKoBefYKQi3Jd2mSHLdi9LsU+gefMrjMfYQhQPlXZxqeHQ/hYLoBNUoRj9reoa98oS41tlW3irLbHm4zTgg==", "license": "ISC", "dependencies": { "color-convert": "^2.0.1", diff --git a/packages/browser/package.json b/packages/browser/package.json index aff16f6..8d00115 100644 --- a/packages/browser/package.json +++ b/packages/browser/package.json @@ -69,6 +69,6 @@ "miniscript-meta": "~1.4.0", "greybel-transpiler": "~4.0.0", "greybel-type-analyzer": "~2.0.0", - "miniscript-languageserver-core": "~3.0.1" + "miniscript-languageserver-core": "~3.0.2" } } \ No newline at end of file diff --git a/packages/node/README.md b/packages/node/README.md index c139c73..098539c 100644 --- a/packages/node/README.md +++ b/packages/node/README.md @@ -38,6 +38,7 @@ miniscript-languageserver --stdio autocomplete: boolean; // default: true hoverdocs: boolean; // default: true diagnostic: boolean; // default: true + strictMode: boolean; // default: false transpiler: { beautify: { keepParentheses: boolean; // default: true diff --git a/packages/node/package-lock.json b/packages/node/package-lock.json index fdca85c..2675337 100644 --- a/packages/node/package-lock.json +++ b/packages/node/package-lock.json @@ -14,7 +14,7 @@ "greybel-transpiler": "~4.0.0", "greybel-type-analyzer": "~2.0.0", "lru-cache": "^11.1.0", - "miniscript-languageserver-core": "~3.0.1", + "miniscript-languageserver-core": "~3.0.2", "miniscript-meta": "~1.4.0" }, "bin": { @@ -9390,9 +9390,9 @@ "license": "MIT" }, "node_modules/miniscript-languageserver-core": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/miniscript-languageserver-core/-/miniscript-languageserver-core-3.0.1.tgz", - "integrity": "sha512-zHxozOcmA00OJ0LI8W3NvUc8la+sGJcJBTrp23r+ZRs8NqHcotz8RL2djJLQPTDfsl2T9kNe5LAaHf2pngsDKA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/miniscript-languageserver-core/-/miniscript-languageserver-core-3.0.2.tgz", + "integrity": "sha512-UInGKoBefYKQi3Jd2mSHLdi9LsU+gefMrjMfYQhQPlXZxqeHQ/hYLoBNUoRj9reoa98oS41tlW3irLbHm4zTgg==", "license": "ISC", "dependencies": { "color-convert": "^2.0.1", diff --git a/packages/node/package.json b/packages/node/package.json index 951aaf5..76a4229 100644 --- a/packages/node/package.json +++ b/packages/node/package.json @@ -71,7 +71,7 @@ "lru-cache": "^11.1.0", "greybel-core": "~3.0.0", "greybel-transpiler": "~4.0.0", - "miniscript-languageserver-core": "~3.0.1", + "miniscript-languageserver-core": "~3.0.2", "miniscript-meta": "~1.4.0", "greybel-type-analyzer": "~2.0.0" }