From a746149bf32b2809bc1970d27f1f5b0704468d37 Mon Sep 17 00:00:00 2001 From: "Kuang-Chen (KC) Lu" Date: Fri, 7 Aug 2026 18:12:35 -0400 Subject: [PATCH 1/4] done --- client/src/commands.ts | 22 +++---- client/src/extension.ts | 60 ++++++++++++++++++- client/src/requestForwarding.ts | 4 +- client/tsconfig.json | 3 +- common/tsconfig.json | 5 +- server/src/providers/completion.ts | 72 ++++++++++------------- server/src/providers/definition.ts | 2 +- server/src/providers/diagnostic.ts | 27 ++++----- server/src/providers/documentSymbol.ts | 8 +-- server/src/providers/foldingRange.ts | 4 +- server/src/providers/formatting.ts | 2 +- server/src/providers/hover.ts | 26 ++++---- server/src/providers/refactoring.ts | 4 +- server/src/providers/rename.ts | 2 +- server/src/providers/requestForwarding.ts | 2 +- server/src/providers/signatureHelp.ts | 44 +++++++------- server/src/server.ts | 2 +- server/src/utils/functions.ts | 22 +++---- server/tsconfig.json | 2 +- 19 files changed, 181 insertions(+), 132 deletions(-) diff --git a/client/src/commands.ts b/client/src/commands.ts index 777a3d5..79b34a9 100644 --- a/client/src/commands.ts +++ b/client/src/commands.ts @@ -22,7 +22,7 @@ import { client } from "./extension"; */ export async function overrideClassMembers() { // Get the open document and check that it's an ObjectScript class - const openDoc = window.activeTextEditor.document; + const openDoc = window.activeTextEditor!.document; if (openDoc.languageId != "objectscript-class") { // Can only override members in a class return; @@ -48,7 +48,7 @@ export async function overrideClassMembers() { } // Check that we can insert new class members at the cursor position - const selection = window.activeTextEditor.selection; + const selection = window.activeTextEditor!.selection; let cursorvalid = false; let docposvalid = false; if (openDoc.lineAt(selection.active.line).isEmptyOrWhitespace && selection.isEmpty) { @@ -175,10 +175,10 @@ export async function selectImportPackage(uri: string, classname: string) { selectedPackage = allimportpackages[0]; } else { // Ask the user to select an import package - selectedPackage = await window.showQuickPick(allimportpackages, { + selectedPackage = (await window.showQuickPick(allimportpackages, { title: "Pick the package to import", canPickMany: false, - }); + }))!; if (!selectedPackage) { // No package was selected return; @@ -206,7 +206,7 @@ export async function extractMethod( newmethodtype: string, ) { // Get the list of class member names - const symbols = await commands.executeCommand("vscode.executeDocumentSymbolProvider", Uri.parse(uri)); + const symbols: any[] = await commands.executeCommand("vscode.executeDocumentSymbolProvider", Uri.parse(uri)); const clsmembers: string[] = []; for (let clsmember = 0; clsmember < symbols[0].children.length; clsmember++) { clsmembers.push(symbols[0].children[clsmember].name); @@ -261,20 +261,20 @@ export async function extractMethod( await workspace.applyEdit(await client.protocol2CodeConverter.asWorkspaceEdit(lspWorkspaceEdit)); // Highlight and scroll to new extracted method - const activeEditor = window.activeTextEditor; + const activeEditor = window.activeTextEditor!; if (activeEditor.document.uri.toString() === uri) { // Selection of the extracted method - const anchor = lspWorkspaceEdit.changes[uri][0].range.start; + const anchor = lspWorkspaceEdit.changes![uri][0].range.start; let methodstring: string = ""; - for (let edit = 0; edit < lspWorkspaceEdit.changes[uri].length - 2; edit++) { - methodstring += lspWorkspaceEdit.changes[uri][edit].newText; + for (let edit = 0; edit < lspWorkspaceEdit.changes![uri].length - 2; edit++) { + methodstring += lspWorkspaceEdit.changes![uri][edit].newText; } const methodsize = methodstring.split("\n").length - 1; const range: Range = new Range(new Position(anchor.line + 1, 0), new Position(anchor.line + methodsize, 1)); // Selection of the method call - const anchor2 = lspWorkspaceEdit.changes[uri][lspWorkspaceEdit.changes[uri].length - 1].range.start; - const linesize = lspWorkspaceEdit.changes[uri][lspWorkspaceEdit.changes[uri].length - 1].newText.length; + const anchor2 = lspWorkspaceEdit.changes![uri][lspWorkspaceEdit.changes![uri].length - 1].range.start; + const linesize = lspWorkspaceEdit.changes![uri][lspWorkspaceEdit.changes![uri].length - 1].newText.length; const range2: Range = new Range( new Position(anchor2.line + methodsize + 1, anchor2.character), new Position(anchor2.line + methodsize + 1, anchor2.character + linesize + 1), diff --git a/client/src/extension.ts b/client/src/extension.ts index b576595..fc2fb6e 100644 --- a/client/src/extension.ts +++ b/client/src/extension.ts @@ -35,6 +35,7 @@ import { makeRESTRequest } from "./makeRESTRequest"; import { ISCEmbeddedContentProvider, requestForwardingMiddleware } from "./requestForwarding"; import type { ServerSpec, ProtocolMethods } from "../../common/out/types"; import type { Disposable } from "vscode-languageclient"; +import { Authorization, ResolvedAuthorization } from '@intersystems-community/intersystems-servermanager'; export let client: { onRequest( @@ -168,7 +169,8 @@ export async function activate(context: ExtensionContext) { // for a missing password via the Server Manager's authentication provider. async function resolveServerSpec(uri: Uri) { const wsFolderUriString = workspace.getWorkspaceFolder(uri)?.uri.toString(); - const { auth, ...serverSpec } = objectScriptApi.serverForUri(uri); + const serverSpec = objectScriptApi.serverForUri(uri)!; + const auth = serverSpec.auth ?? new BasicAuthorization(serverSpec.username, serverSpec.password); if ( // Server was resolved serverSpec.host !== "" && @@ -455,3 +457,59 @@ export async function deactivate(): Promise { } await Promise.allSettled(promises); } + + +// A copy of the BasicAuthorization class from ServerManager +// We use it to patch older version of getServerSpec. +export default class BasicAuthorization implements Authorization { + #username?: string; + #password?: string; + constructor(username?: string, password?: string) { + this.#username = username; + this.#password = password; + } + + public get username(): string { + return this.#username || ""; + } + + public get password(): string | undefined { + return this.#password; + } + + public get accessToken(): string | undefined { + return this.#password; + } + + public get httpAuthorizationHeader(): string { + return `Basic ${Buffer.from(`${this.#username}:${this.#password}`).toString("base64")}`; + } + + public resolved(): this is ResolvedAuthorization { + return this.username !== "" && this.#password !== undefined; + } + + public resolve(param: { accessToken: string; username?: string }): this is ResolvedAuthorization { + this.#username = param.username ?? this.#username; + this.#password = param.accessToken ?? this.#password; + return this.resolved(); + } + + public clear(): asserts this is Authorization { + this.#password = undefined; + } + + public get credentials(): { auth: { username: string; password: string }; headers?: Record } { + return { + auth: { + username: this.username, + password: this.password!, + }, + headers: {}, + }; + } + + public clone(): BasicAuthorization { + return new BasicAuthorization(this.#username, this.#password); + } +} diff --git a/client/src/requestForwarding.ts b/client/src/requestForwarding.ts index 7ad2796..9290964 100644 --- a/client/src/requestForwarding.ts +++ b/client/src/requestForwarding.ts @@ -140,7 +140,7 @@ export const requestForwardingMiddleware: Middleware = { }; export class ISCEmbeddedContentProvider implements TextDocumentContentProvider { - constructor() {} + constructor() { } provideTextDocumentContent(uri: Uri): ProviderResult { // Get the isclexer language number and position from the URI authority @@ -148,7 +148,7 @@ export class ISCEmbeddedContentProvider implements TextDocumentContentProvider { const positionText = uri.authority.split(":")[1]; const position = new Position(Number(positionText.split("-")[0]), Number(positionText.split("-")[1])); // Use the language number to isolate the original URI - let originalUri: string; + let originalUri: string | undefined; if (language == 11) { // Language is JavaScript so the extension is .js originalUri = uri.path.slice(1).slice(0, -3); diff --git a/client/tsconfig.json b/client/tsconfig.json index ae0ca3f..479c618 100644 --- a/client/tsconfig.json +++ b/client/tsconfig.json @@ -5,7 +5,8 @@ "target": "es6", "outDir": "out", "rootDir": "src", - "sourceMap": true + "sourceMap": true, + "strictNullChecks": true, }, "include": ["src"], "exclude": ["node_modules", ".vscode-test"] diff --git a/common/tsconfig.json b/common/tsconfig.json index cd58234..f973a88 100644 --- a/common/tsconfig.json +++ b/common/tsconfig.json @@ -10,8 +10,9 @@ "declarationMap": true, "strict": true, "esModuleInterop": true, - "skipLibCheck": true - }, + "skipLibCheck": true, + "strictNullChecks": true, + }, "include": ["src"], "exclude": ["node_modules", "out"] } diff --git a/server/src/providers/completion.ts b/server/src/providers/completion.ts index 52c1718..b63d4e6 100644 --- a/server/src/providers/completion.ts +++ b/server/src/providers/completion.ts @@ -578,9 +578,8 @@ async function completionFullClassName( // Get all classes const querydata = { - query: `SELECT dcd.Name, dcd.Deprecated FROM %Library.RoutineMgr_StudioOpenDialog(?,?,?,?,?,?,?) AS sod, %Dictionary.ClassDefinition AS dcd WHERE sod.Name = dcd.Name||'.cls'${ - !settings.completion.showDeprecated ? " AND dcd.Deprecated = 0" : "" - }`, + query: `SELECT dcd.Name, dcd.Deprecated FROM %Library.RoutineMgr_StudioOpenDialog(?,?,?,?,?,?,?) AS sod, %Dictionary.ClassDefinition AS dcd WHERE sod.Name = dcd.Name||'.cls'${!settings.completion.showDeprecated ? " AND dcd.Deprecated = 0" : "" + }`, parameters: ["*.cls", 1, 1, 1, 1, 0, settings.completion.showGenerated ? 1 : 0], }; const respdata = await makeRESTRequest("POST", 1, "/action/query", server, querydata); @@ -590,7 +589,7 @@ async function completionFullClassName( let compItem: CompletionItem; if (imports.length > 0) { // Resolve import - let sortText: string; + let sortText: string | undefined; for (const imp of imports) { if (displayname.indexOf(imp) === 0 && displayname.slice(imp.length + 1).indexOf(".") === -1) { displayname = displayname.slice(imp.length + 1); @@ -638,9 +637,8 @@ async function completionPackage(server: ServerSpec, settings: LanguageServerCon // Get all the packages const querydata = { - query: `SELECT DISTINCT $PIECE(dcd.Name,'.',1,$LENGTH(dcd.Name,'.')-1) AS Package FROM %Library.RoutineMgr_StudioOpenDialog(?,?,?,?,?,?,?) AS sod, %Dictionary.ClassDefinition AS dcd WHERE sod.Name = dcd.Name||'.cls'${ - !settings.completion.showDeprecated ? " AND dcd.Deprecated = 0" : "" - }`, + query: `SELECT DISTINCT $PIECE(dcd.Name,'.',1,$LENGTH(dcd.Name,'.')-1) AS Package FROM %Library.RoutineMgr_StudioOpenDialog(?,?,?,?,?,?,?) AS sod, %Dictionary.ClassDefinition AS dcd WHERE sod.Name = dcd.Name||'.cls'${!settings.completion.showDeprecated ? " AND dcd.Deprecated = 0" : "" + }`, parameters: ["*.cls", 1, 1, 1, 1, 0, settings.completion.showGenerated ? 1 : 0], }; const respdata = await makeRESTRequest("POST", 1, "/action/query", server, querydata); @@ -692,7 +690,7 @@ async function globalsOrRoutines( server: ServerSpec, lineText: string, prefix: string = "", -): Promise { +): Promise { // Determine if this is a routine or global, and return null if we're in $BITLOGIC let brk = false, parenLevel = 0, @@ -756,13 +754,13 @@ async function globalsOrRoutines( server, isRoutine ? { - query: `SELECT DISTINCT $PIECE(Name,'.',1,$LENGTH(Name,'.')-1) AS Name FROM %Library.RoutineMgr_StudioOpenDialog(?,1,1,1,1,1,0,'NOT (Name %PATTERN ''.E1"."0.1"G"1N1".obj"'' AND $LENGTH(Name,''.'') > 3)')`, - parameters: [`${prefix.length ? `${prefix.slice(0, -1)}/` : ""}*.mac,*.int,*.obj`], - } + query: `SELECT DISTINCT $PIECE(Name,'.',1,$LENGTH(Name,'.')-1) AS Name FROM %Library.RoutineMgr_StudioOpenDialog(?,1,1,1,1,1,0,'NOT (Name %PATTERN ''.E1"."0.1"G"1N1".obj"'' AND $LENGTH(Name,''.'') > 3)')`, + parameters: [`${prefix.length ? `${prefix.slice(0, -1)}/` : ""}*.mac,*.int,*.obj`], + } : { - query: "SELECT Name FROM %SYS.GlobalQuery_NameSpaceList(,?,?,,,1,0)", - parameters: [`${prefix}*`, (await showInternalForServer(server)) ? 1 : 0], - }, + query: "SELECT Name FROM %SYS.GlobalQuery_NameSpaceList(,?,?,,,1,0)", + parameters: [`${prefix}*`, (await showInternalForServer(server)) ? 1 : 0], + }, ); if (Array.isArray(respdata?.data?.result?.content) && respdata.data.result.content.length > 0) { return respdata.data.result.content.map((item: { Name: string }) => { @@ -1120,9 +1118,8 @@ export async function onCompletion(params: CompletionParams): Promise 0) { // Resolve import - let sortText: string; + let sortText: string | undefined; for (const imp of imports) { if (displayname.indexOf(imp) === 0 && displayname.slice(imp.length + 1).indexOf(".") === -1) { displayname = displayname.slice(imp.length + 1); @@ -1260,9 +1257,8 @@ export async function onCompletion(params: CompletionParams): PromiseClassType IS NULL OR parent->ClassType != 'datatype')" - : "" - }${internalStr}${deprecatedStr}`, + query: `SELECT Name, Description, Origin, Type, Deprecated FROM %Dictionary.CompiledParameter WHERE Parent = ?${membercontext.context == "instance" + ? " AND (parent->ClassType IS NULL OR parent->ClassType != 'datatype')" + : "" + }${internalStr}${deprecatedStr}`, parameters: [membercontext.baseclass], }; const respdata = await makeRESTRequest("POST", 1, "/action/query", server, data); @@ -1620,11 +1615,10 @@ export async function onCompletion(params: CompletionParams): Promise { +export async function onDefinition(params: TextDocumentPositionParams): Promise { const doc = documents.get(params.textDocument.uri); if (doc === undefined) { return null; diff --git a/server/src/providers/diagnostic.ts b/server/src/providers/diagnostic.ts index f599bd1..3ea6ccb 100644 --- a/server/src/providers/diagnostic.ts +++ b/server/src/providers/diagnostic.ts @@ -165,7 +165,7 @@ export async function onDiagnostics(params: DocumentDiagnosticParams): Promise= result[result.length - 1].range.start.line && labelrange.start.line <= result[result.length - 1].range.end.line; - let firstbrace: [number, number] | undefined = undefined; + let firstbrace: [number, number] | undefined; if (!inProcedureBlock) { // Check if this label is a procedure block firstbrace = labelIsProcedureBlock(doc, parsed, line); @@ -416,7 +416,7 @@ export async function onDocumentSymbol(params: DocumentSymbolParams) { parsed[line][tkn + 1].l == ld.html_langindex && parsed[line][tkn + 1].s == ld.html_tag_attrindex && doc.getText(Range.create(line, parsed[line][tkn].p, line, parsed[line][tkn].p + parsed[line][tkn].c)) === - "<" && + "<" && doc .getText( Range.create(line, parsed[line][tkn + 1].p, line, parsed[line][tkn + 1].p + parsed[line][tkn + 1].c), diff --git a/server/src/providers/foldingRange.ts b/server/src/providers/foldingRange.ts index 1e3395d..ba3e0fd 100644 --- a/server/src/providers/foldingRange.ts +++ b/server/src/providers/foldingRange.ts @@ -736,7 +736,7 @@ export async function onFoldingRanges(params: FoldingRangeParams) { parsed[line][tkn + 1].l == ld.html_langindex && parsed[line][tkn + 1].s == ld.html_tag_attrindex && doc.getText(Range.create(line, parsed[line][tkn].p, line, parsed[line][tkn].p + parsed[line][tkn].c)) === - "<" && + "<" && doc .getText( Range.create(line, parsed[line][tkn + 1].p, line, parsed[line][tkn + 1].p + parsed[line][tkn + 1].c), @@ -790,7 +790,7 @@ export async function onFoldingRanges(params: FoldingRangeParams) { }); } else if (inCComment && commentText.slice(-2) == "*/") { // Close the most recent C-style comment range - const cCommentRange = openranges.pop(); + const cCommentRange = openranges.pop()!; cCommentRange.endLine = line - 1; cCommentRange.kind = FoldingRangeKind.Comment; if (cCommentRange.endLine > cCommentRange.startLine) result.push(cCommentRange); diff --git a/server/src/providers/formatting.ts b/server/src/providers/formatting.ts index d4fccad..c952f28 100644 --- a/server/src/providers/formatting.ts +++ b/server/src/providers/formatting.ts @@ -63,7 +63,7 @@ async function formatText(uri: DocumentUri, range?: Range): Promise { +export async function onHover(params: TextDocumentPositionParams): Promise { const doc = documents.get(params.textDocument.uri); if (doc === undefined) { return null; @@ -171,7 +171,7 @@ export async function onHover(params: TextDocumentPositionParams): Promise 0) { // We got data back - const header = `(**${normalizedcls}**) **${param}**${ - respdata.data.result.content[0].Type != "" ? ` As **${respdata.data.result.content[0].Type}**` : "" - }`; + const header = `(**${normalizedcls}**) **${param}**${respdata.data.result.content[0].Type != "" ? ` As **${respdata.data.result.content[0].Type}**` : "" + }`; return { contents: { kind: MarkupKind.Markdown, diff --git a/server/src/providers/refactoring.ts b/server/src/providers/refactoring.ts index 2252034..84fac70 100644 --- a/server/src/providers/refactoring.ts +++ b/server/src/providers/refactoring.ts @@ -419,7 +419,7 @@ export async function addOverridableMembers(params: AddOverridableMembersParams) // Loop through the QuickPickItem array and map all origin classes to the members const membersPerOrigin: Map = new Map(); for (const member of params.members) { - const origin = member.detail.split(" ")[member.detail.split(" ").length - 1] + ".cls"; + const origin = member.detail!.split(" ")[member.detail!.split(" ").length - 1] + ".cls"; if (membersPerOrigin.has(origin)) { // Add this member to the array of members for this origin class const membersarr = membersPerOrigin.get(origin); @@ -757,7 +757,7 @@ export async function addMethod(params: AddMethodParams): Promise= 0; line--) { let starttkn = parsed[line].length - 1; if (line == params.position.line) { diff --git a/server/src/providers/signatureHelp.ts b/server/src/providers/signatureHelp.ts index 6670418..45bd019 100644 --- a/server/src/providers/signatureHelp.ts +++ b/server/src/providers/signatureHelp.ts @@ -34,12 +34,12 @@ let signatureHelpMacroCache: SignatureHelpMacroContext; /** * Cache of the documentation content sent for the last triggered SignatureHelp. */ -let signatureHelpDocumentationCache: SignatureHelpDocCache | undefined = undefined; +let signatureHelpDocumentationCache: SignatureHelpDocCache | undefined; /** * The start position of the active SignatureHelp. */ -let signatureHelpStartPosition: Position | undefined = undefined; +let signatureHelpStartPosition: Position | undefined; /** Placeholder for the Markdown emphasis characters before an argument. */ const emphasizePrefix: string = "%%%%%"; @@ -198,10 +198,10 @@ export async function onSignatureHelp(params: SignatureHelpParams): Promise 0) { // We got data back @@ -613,16 +613,16 @@ export async function onSignatureHelp(params: SignatureHelpParams): Promise 0) { // We got data back diff --git a/server/src/server.ts b/server/src/server.ts index 2e11a0e..9a40d80 100644 --- a/server/src/server.ts +++ b/server/src/server.ts @@ -168,7 +168,7 @@ connection.onNotification("intersystems/server/passwordChange", (serverName: str for (const uri of invalid) { serverSpecs.delete(uri); } - let toRemove: ServerSpec | undefined = undefined; + let toRemove: ServerSpec | undefined; for (const server of schemaCaches.keys()) { if (server.serverName == serverName) { toRemove = server; diff --git a/server/src/utils/functions.ts b/server/src/utils/functions.ts index 765a098..52c9339 100644 --- a/server/src/utils/functions.ts +++ b/server/src/utils/functions.ts @@ -61,7 +61,7 @@ turndown.addRule("pre", { /* empty */ } } else { - switch (attrVal.split("!").shift().toUpperCase()) { + switch (attrVal.split("!").shift()!.toUpperCase()) { case "OBJECTSCRIPT": case "COS": case "INT": @@ -81,7 +81,7 @@ turndown.addRule("pre", { break; case "JAVASCRIPT": case "JS": - lang = attrVal.split("!").pop().toUpperCase() == "JSON" ? "json" : "javascript"; + lang = attrVal.split("!").pop()!.toUpperCase() == "JSON" ? "json" : "javascript"; break; case "CSS": lang = "css"; @@ -1343,7 +1343,7 @@ export async function findMethodParameterClass( allfiles?: StudioOpenDialogFile[], inheritedpackages?: string[], ): Promise { - let result: ClassMemberContext | undefined = undefined; + let result: ClassMemberContext | undefined; for (let tkn = 0; tkn < parsed[line].length; tkn++) { if (parsed[line][tkn].l == ld.cls_langindex && parsed[line][tkn].s == ld.cls_param_attrindex) { // This is a parameter @@ -1644,7 +1644,7 @@ async function determineParameterClass( allfiles?: StudioOpenDialogFile[], inheritedpackages?: string[], ): Promise { - let result: ClassMemberContext | undefined = undefined; + let result: ClassMemberContext | undefined; if (doc.languageId === "objectscript-class") { // Parameters can only have a type if they're in a UDL method @@ -1736,7 +1736,7 @@ async function determineDeclaredLocalVarClass( allfiles?: StudioOpenDialogFile[], inheritedpackages?: string[], ): Promise { - let result: ClassMemberContext | undefined = undefined; + let result: ClassMemberContext | undefined; if (varText === "%request") { result = { @@ -1893,11 +1893,11 @@ async function parseSetCommand( let inPostconditional = false; let pcParenCount = 0; let foundVar = false; - let operatorTuple: [number, number] | undefined = undefined; + let operatorTuple: [number, number] | undefined; let exprLeadingParenCount = 0; let exprParenLevel = 0; - let firstExprTuple: [number, number] | undefined = undefined; - let lastMemTuple: [number, number] | undefined = undefined; + let firstExprTuple: [number, number] | undefined; + let lastMemTuple: [number, number] | undefined; for (let ln = line; ln < parsed.length; ln++) { if (!parsed[ln]?.length) continue; for (let tkn = ln == line ? token + 1 : 0; tkn < parsed[ln].length; tkn++) { @@ -2360,7 +2360,7 @@ async function determineUndeclaredLocalVarClass( allfiles?: StudioOpenDialogFile[], inheritedpackages?: string[], ): Promise { - let result: ClassMemberContext | undefined = undefined; + let result: ClassMemberContext | undefined; // Scan to the top of the method to find where the variable was Set or passed by reference let firstLabel = true; @@ -3044,7 +3044,7 @@ export function labelIsProcedureBlock( ): [number, number] | undefined { const lastLabelTkn = parsed[line].length > 1 && parsed[line][1].s == ld.cos_label_attrindex ? 1 : 0; let currentLabelIsProcedureBlock: boolean = false; - let result: [number, number] | undefined = undefined; + let result: [number, number] | undefined; if ( parsed[line].length > lastLabelTkn + 1 && @@ -3360,7 +3360,7 @@ export function urlMapAttribute( parsed: compressedline[], line: number, token: number, -): "Call" | "Forward" | "" { +): "Call" | "Forward" | "" | undefined { // Determine if we're in a UrlMap XData block let inUrlMap = false; for (let ln = line; ln >= 0; ln--) { diff --git a/server/tsconfig.json b/server/tsconfig.json index 117fe97..9326bc7 100644 --- a/server/tsconfig.json +++ b/server/tsconfig.json @@ -5,7 +5,7 @@ "moduleResolution": "node16", "sourceMap": true, "strict": true, - "strictNullChecks": false, + "strictNullChecks": true, "outDir": "out", "rootDir": "src", "noImplicitAny": false, From efce88c55c6780f9cc52ebf12733e2dfca6e2ed5 Mon Sep 17 00:00:00 2001 From: "Kuang-Chen (KC) Lu" Date: Fri, 7 Aug 2026 18:29:15 -0400 Subject: [PATCH 2/4] fix types as well --- client/package-lock.json | 2 +- client/package.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index 327379a..6e17040 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -12,7 +12,7 @@ "vscode-languageclient": "^9.0.1" }, "devDependencies": { - "@intersystems-community/intersystems-servermanager": "^3.14.0", + "@intersystems-community/intersystems-servermanager": "^3.14.0-beta", "@types/semver": "^7.7.0", "@types/vscode": "1.93.0" }, diff --git a/client/package.json b/client/package.json index b5474ff..0a77ff6 100644 --- a/client/package.json +++ b/client/package.json @@ -11,8 +11,8 @@ "vscode-languageclient": "^9.0.1" }, "devDependencies": { - "@intersystems-community/intersystems-servermanager": "^3.14.0", + "@intersystems-community/intersystems-servermanager": "^3.14.0-beta", "@types/semver": "^7.7.0", "@types/vscode": "1.93.0" } -} +} \ No newline at end of file From 42f3b89dd4a1a2fa1b6a167fe08f0b6292841ec1 Mon Sep 17 00:00:00 2001 From: "Kuang-Chen (KC) Lu" Date: Fri, 7 Aug 2026 18:47:13 -0400 Subject: [PATCH 3/4] more type errors --- common/package-lock.json | 28 ---------------------------- server/src/utils/functions.ts | 2 ++ 2 files changed, 2 insertions(+), 28 deletions(-) diff --git a/common/package-lock.json b/common/package-lock.json index 6b0c95e..ffbe65c 100644 --- a/common/package-lock.json +++ b/common/package-lock.json @@ -7,9 +7,6 @@ "": { "name": "@intersystems/language-server-common", "version": "2.8.4-SNAPSHOT", - "dependencies": { - "vscode-languageserver-protocol": "^3.17.5" - }, "devDependencies": { "@types/node": "^18.19.50", "typescript": "^5.6.2" @@ -45,31 +42,6 @@ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true, "license": "MIT" - }, - "node_modules/vscode-jsonrpc": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.1.tgz", - "integrity": "sha512-rfuA6T75H6m5EkbhtEPzre9pT0HPcDI2MMy4+nPFIBks5J8JBAUHD4tRYSgaBOijIEC7SRkC1kKyXTLqbmh9jw==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/vscode-languageserver-protocol": { - "version": "3.18.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.18.2.tgz", - "integrity": "sha512-XRyDbT0Pp3sSNti3JmxVEUMySWCSi1hhM+/KUlCy1hV1zmrqpM1OwO12EAki8blhmLuIMpaJrYbo0OzGVfK2Qg==", - "license": "MIT", - "dependencies": { - "vscode-jsonrpc": "9.0.1", - "vscode-languageserver-types": "3.18.0" - } - }, - "node_modules/vscode-languageserver-types": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.18.0.tgz", - "integrity": "sha512-8TsGPNMIMiiBdkORgRSvLjuiEIiAFtO+KssmYWxQ+uSVvlf7RjK8YKCOjPzZ+YA04jXEV7+7LvkSmHkhpNS99g==", - "license": "MIT" } } } diff --git a/server/src/utils/functions.ts b/server/src/utils/functions.ts index 52c9339..9aa2b8e 100644 --- a/server/src/utils/functions.ts +++ b/server/src/utils/functions.ts @@ -109,6 +109,7 @@ turndown.addRule("documaticArgs", { if (node.children.length > 0) { return `\n#### Arguments:\n${content}\n`; } + return ""; }, }); turndown.addRule("documaticArg", { @@ -118,6 +119,7 @@ turndown.addRule("documaticArg", { if (attrVal !== null) { return `\n- \`${attrVal}\` - ${content}`; } + return ""; }, }); turndown.addRule("documaticReturn", { From c3a27a44803a20312770408d18b130b8b43d5d11 Mon Sep 17 00:00:00 2001 From: "Kuang-Chen (KC) Lu" Date: Mon, 10 Aug 2026 12:15:08 -0400 Subject: [PATCH 4/4] official version --- client/package-lock.json | 14 +++++++------- client/package.json | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index 6e17040..c002db2 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -12,7 +12,7 @@ "vscode-languageclient": "^9.0.1" }, "devDependencies": { - "@intersystems-community/intersystems-servermanager": "^3.14.0-beta", + "@intersystems-community/intersystems-servermanager": "^3.14.1", "@types/semver": "^7.7.0", "@types/vscode": "1.93.0" }, @@ -21,9 +21,9 @@ } }, "node_modules/@intersystems-community/intersystems-servermanager": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@intersystems-community/intersystems-servermanager/-/intersystems-servermanager-3.14.0.tgz", - "integrity": "sha512-VKitwu5OTCHUT5ABs13/pldNLn4rdjfVBSM0gKnEfR+pPHBTaTgtCARoqiPqGIkLghHl2LToFunCRlTdQhDV+A==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/@intersystems-community/intersystems-servermanager/-/intersystems-servermanager-3.14.1.tgz", + "integrity": "sha512-sGOq2agsIdN0dO6AwqciSbt8bV/y2gLBuRpiyq7hUR/7liE7s5a2EbYryN6A+h6J2lHLo/akiFz1ipmckIXvvg==", "dev": true, "license": "MIT" }, @@ -414,9 +414,9 @@ }, "dependencies": { "@intersystems-community/intersystems-servermanager": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@intersystems-community/intersystems-servermanager/-/intersystems-servermanager-3.14.0.tgz", - "integrity": "sha512-VKitwu5OTCHUT5ABs13/pldNLn4rdjfVBSM0gKnEfR+pPHBTaTgtCARoqiPqGIkLghHl2LToFunCRlTdQhDV+A==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/@intersystems-community/intersystems-servermanager/-/intersystems-servermanager-3.14.1.tgz", + "integrity": "sha512-sGOq2agsIdN0dO6AwqciSbt8bV/y2gLBuRpiyq7hUR/7liE7s5a2EbYryN6A+h6J2lHLo/akiFz1ipmckIXvvg==", "dev": true }, "@types/semver": { diff --git a/client/package.json b/client/package.json index 0a77ff6..9bd2ae3 100644 --- a/client/package.json +++ b/client/package.json @@ -11,8 +11,8 @@ "vscode-languageclient": "^9.0.1" }, "devDependencies": { - "@intersystems-community/intersystems-servermanager": "^3.14.0-beta", + "@intersystems-community/intersystems-servermanager": "^3.14.1", "@types/semver": "^7.7.0", "@types/vscode": "1.93.0" } -} \ No newline at end of file +}