Skip to content

Commit

Permalink
improve types
Browse files Browse the repository at this point in the history
  • Loading branch information
idleberg committed Jul 7, 2023
1 parent 00d2cff commit b44e84f
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 62 deletions.
21 changes: 15 additions & 6 deletions src/diagnostics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,14 @@ import vscode from 'vscode';
import { compile } from 'makensis';
import { findErrors, findWarnings, getMakensisPath, getNullDevice, getPreprocessMode, getOverrideCompression, getSpawnEnv } from './util';
import { getConfig } from 'vscode-get-config';
import type { CompilerOptions } from 'makensis';
import micromatch from 'micromatch';

async function updateDiagnostics(document: vscode.TextDocument | null, collection: vscode.DiagnosticCollection): Promise<void> {
if (!document) {
return;
}

const { compiler, diagnostics } = await getConfig('nsis');

if (diagnostics.enableDiagnostics !== true) {
Expand Down Expand Up @@ -32,7 +37,7 @@ async function updateDiagnostics(document: vscode.TextDocument | null, collectio
return;
}

const options = {
const options: CompilerOptions = {
verbose: 2,
pathToMakensis,
postExecute: [
Expand All @@ -50,8 +55,8 @@ async function updateDiagnostics(document: vscode.TextDocument | null, collectio
const overrideCompression = await getOverrideCompression();

if (overrideCompression) {
options['preExecute'] = ['SetCompressor /FINAL zlib'];
options['postExecute'].push('SetCompress off');
options.preExecute = ['SetCompressor /FINAL zlib'];
(options.postExecute as string[]).push('SetCompress off');
}

let output;
Expand All @@ -62,13 +67,17 @@ async function updateDiagnostics(document: vscode.TextDocument | null, collectio
console.error('[vscode-nsis]', error instanceof Error ? error.message : error);
}

const diagnosticsResult = [];
const diagnosticsResult: string[] = [];

const warnings = await findWarnings(output.stdout);
if (warnings) diagnosticsResult.push(...warnings);
if (warnings) {
diagnosticsResult.push(...warnings);
}

const error = findErrors(output.stderr);
if (error) diagnosticsResult.push(error);
if (error) {
diagnosticsResult.push(error);
}

collection.set(document.uri, diagnosticsResult);
} else {
Expand Down
103 changes: 47 additions & 56 deletions src/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,19 +9,28 @@ import open from 'open';
import vscode from 'vscode';
import which from 'which';

function getNullDevice(): string {


type DiagnosticCollection = {
code?: string;
message?: string;
range?: vscode.Range;
severity?: vscode.DiagnosticSeverity;
}

export function getNullDevice(): string {
return isWindows()
? 'OutFile NUL'
: 'OutFile /dev/null/';
}

function getPrefix(): string {
export function getPrefix(): string {
return isWindows()
? '/'
: '-';
}

function isHeaderFile(filePath: string): boolean {
export function isHeaderFile(filePath: string): boolean {
const headerFiles = [
'.bnsh',
'.nsh'
Expand All @@ -30,19 +39,19 @@ function isHeaderFile(filePath: string): boolean {
return Boolean(headerFiles.filter(fileExt => filePath?.endsWith(fileExt)).length);
}

function isWindows(): boolean {
export function isWindows(): boolean {
return platform() === 'win32'
}

async function isWindowsCompatible(): Promise<boolean> {
export async function isWindowsCompatible(): Promise<boolean> {
const { wine } = await getConfig('nsis');

return isWindows() || wine.runWithWine === true
? true
: false;
}

async function getMakensisPath(): Promise<string | undefined> {
export async function getMakensisPath(): Promise<string> {
const { compiler } = await getConfig('nsis');

const pathToMakensis = isWindows() && compiler.pathToMakensis.startsWith('"') && compiler.pathToMakensis.startsWith('"')
Expand All @@ -67,9 +76,11 @@ async function getMakensisPath(): Promise<string | undefined> {

console.error('[vscode-nsis]', error instanceof Error ? error.message : error);
}

return 'makensis';
}

function mapPlatform(): string {
export function mapPlatform(): string {
const pf = platform();

switch (pf) {
Expand All @@ -84,11 +95,11 @@ function mapPlatform(): string {
}
}

function openURL(cmd: string): void {
export function openURL(cmd: string): void {
open(`https://idleberg.github.io/NSIS.docset/Contents/Resources/Documents/html/Commands/${cmd}.html?utm_source=vscode&utm_content=reference`);
}

async function pathWarning(): Promise<void> {
export async function pathWarning(): Promise<void> {
const choice = await vscode.window.showWarningMessage('makensis is not installed or missing in your PATH environmental variable', 'Download', 'Help')

switch (choice) {
Expand All @@ -102,7 +113,7 @@ async function pathWarning(): Promise<void> {
}
}

async function revealInstaller(outFile: string): Promise<void> {
export async function revealInstaller(outFile: string): Promise<void> {
if (outFile && await fileExists(outFile)) {
switch (platform()) {
case 'win32':
Expand All @@ -124,7 +135,7 @@ async function revealInstaller(outFile: string): Promise<void> {
}
}

async function runInstaller(outFile: string): Promise<void> {
export async function runInstaller(outFile: string): Promise<void> {
if (outFile && await fileExists(outFile)) {
const { wine } = await getConfig('nsis');

Expand All @@ -136,7 +147,7 @@ async function runInstaller(outFile: string): Promise<void> {
}
}

async function buttonHandler(choice: string, outFile?: string): Promise<void> {
export async function buttonHandler(choice: string, outFile?: string): Promise<void> {
switch (choice) {
case 'Run':
await runInstaller(outFile);
Expand All @@ -152,7 +163,7 @@ async function buttonHandler(choice: string, outFile?: string): Promise<void> {
}
}

async function getPreprocessMode(): Promise<string> {
export async function getPreprocessMode(): Promise<string> {
const { diagnostics } = await getConfig('nsis');

switch (diagnostics.preprocessMode) {
Expand All @@ -165,13 +176,13 @@ async function getPreprocessMode(): Promise<string> {
}
}

async function getOverrideCompression(): Promise<string> {
export async function getOverrideCompression(): Promise<string> {
const { diagnostics } = await getConfig('nsis');

return diagnostics.overrideCompression || true;
}

function getLineLength(line: number): number {
export function getLineLength(line: number): number {
const editorText = vscode.window.activeTextEditor.document.getText();

if (editorText && editorText.length) {
Expand All @@ -183,7 +194,7 @@ function getLineLength(line: number): number {
return 0;
}

async function showANSIDeprecationWarning(): Promise<void> {
export async function showANSIDeprecationWarning(): Promise<void> {
const choice = await vscode.window.showWarningMessage('ANSI targets are deprecated as of NSIS v3.05, consider moving to Unicode. You can mute this warning in the package settings.', 'Unicode Installer', 'Open Settings')

switch (choice) {
Expand All @@ -202,7 +213,7 @@ async function showANSIDeprecationWarning(): Promise<void> {
process.exit();
}

async function fileExists(filePath: string): Promise<boolean> {
export async function fileExists(filePath: string): Promise<boolean> {
try {
await fs.access(filePath, constants.F_OK);
} catch (err) {
Expand All @@ -212,23 +223,25 @@ async function fileExists(filePath: string): Promise<boolean> {
return true;
}

async function findWarnings(input: string): Promise<unknown[]> {
const output = [];
export async function findWarnings(input: string): Promise<unknown[]> {
const output: DiagnosticCollection[] = [];

const warningLines = input.split('\n');
if (!warningLines.length) return ;
if (!warningLines.length) {
return [output];
}

if (warningLines.length) {
// Note to self: Don't use map()
warningLines.forEach(async warningLine => {
const result = /warning: (?<message>.*) \((?<file>.*?):(?<line>\d+)\)/.exec(warningLine);

if (result !== null) {
const warningLine = parseInt(result.groups.line) - 1;
const warningLine = parseInt(String(result?.groups?.line)) - 1;

output.push({
code: '',
message: result.groups.message,
message: result.groups?.message,
range: new vscode.Range(new vscode.Position(warningLine, 0), new vscode.Position(warningLine, getLineLength(warningLine))),
severity: vscode.DiagnosticSeverity.Warning
});
Expand All @@ -238,20 +251,20 @@ async function findWarnings(input: string): Promise<unknown[]> {
if (!await getConfig('nsis') && input.includes('7998: ANSI targets are deprecated')) {
showANSIDeprecationWarning();
}

return output;
}

return output;
}

function findErrors(input: string): unknown {
export function findErrors(input: string): DiagnosticCollection {
const result = /(?<message>.*)\r?\n.*rror in script:? "(?<file>.*)" on line (?<line>\d+)/.exec(input);

if (result !== null) {
const errorLine = parseInt(result.groups.line) - 1;
const errorLine = parseInt(String(result?.groups?.line)) - 1;

return {
code: '',
message: result.groups.message,
message: result?.groups?.message,
range: new vscode.Range(new vscode.Position(errorLine, 0), new vscode.Position(errorLine, getLineLength(errorLine))),
severity: vscode.DiagnosticSeverity.Error
};
Expand All @@ -260,7 +273,7 @@ function findErrors(input: string): unknown {
return {};
}

async function getProjectPath(): Promise<null | string> {
export async function getProjectPath(): Promise<null | string> {
let editor;

try {
Expand All @@ -270,14 +283,15 @@ async function getProjectPath(): Promise<null | string> {
}

try {
const { uri } = vscode.workspace.getWorkspaceFolder(editor.document.uri);
return uri.fsPath;
const workspaceFolder = vscode.workspace.getWorkspaceFolder(editor.document.uri);

return workspaceFolder ? workspaceFolder.uri.fsPath : '';
} catch (error) {
return null;
}
}

async function getSpawnEnv(): Promise<SpawnOptions> {
export async function getSpawnEnv(): Promise<SpawnOptions> {
const { integrated } = vscode.workspace.getConfiguration('terminal');
const mappedPlatform = mapPlatform();

Expand All @@ -291,11 +305,11 @@ async function getSpawnEnv(): Promise<SpawnOptions> {
};
}

function inRange(value: number | string, min: number, max: number): boolean {
export function inRange(value: number | string, min: number, max: number): boolean {
return Number(value) >= min && Number(value) <= max;
}

function hasArgument(needle: string | string[], argument: string): boolean {
export function hasArgument(needle: string | string[], argument: string): boolean {
needle = typeof needle === 'string'
? [needle]
: needle;
Expand All @@ -304,26 +318,3 @@ function hasArgument(needle: string | string[], argument: string): boolean {
? true
: false;
}

export {
buttonHandler,
fileExists,
findErrors,
findWarnings,
getMakensisPath,
getNullDevice,
getOverrideCompression,
getPrefix,
getPreprocessMode,
getProjectPath,
getSpawnEnv,
hasArgument,
inRange,
isHeaderFile,
isWindowsCompatible,
mapPlatform,
openURL,
pathWarning,
revealInstaller,
runInstaller
};

0 comments on commit b44e84f

Please sign in to comment.