diff --git a/src/base/classes/serverpod.class.ts b/src/base/classes/serverpod.class.ts index b5ae9d8..4de41cd 100644 --- a/src/base/classes/serverpod.class.ts +++ b/src/base/classes/serverpod.class.ts @@ -5,6 +5,8 @@ import { join, sep } from 'path'; import * as vscode from 'vscode'; import { parse } from 'yaml'; import { Constants } from '../../utils/constants.util'; +import { LogCategory } from '../../utils/enums.util'; +import { ExtLogger } from '../../utils/logger.util'; import { Utils } from './../../utils/utils.util'; import { ServerpodInterface } from './../interfaces/serverpod.interface'; import { Flutter } from './flutter.class'; @@ -17,6 +19,8 @@ export class Serverpod implements ServerpodInterface { */ private context: vscode.ExtensionContext; + private logger: ExtLogger = new ExtLogger(LogCategory.serverpod); + /** * Constructor for the serverpod class */ @@ -151,9 +155,10 @@ export class Serverpod implements ServerpodInterface { spawn('which', ['docker'], { detached: false }).on('close', async (code) => { _dockerExists = code === 0; if (_dockerExists) { - console.log('Docker found'); + this.logger.info('๐Ÿณ Docker found'); } else { + this.logger.error('๐Ÿณ Docker not found. Please install docker to continue.'); await vscode.window.showErrorMessage('Docker not found. Please install docker to continue.'); _isError = true; } @@ -167,7 +172,7 @@ export class Serverpod implements ServerpodInterface { vscode.window.showWarningMessage(_dockerExists ? 'Docker is not running. Please start docker and try again.' : 'Looks like you didn\'t install docker.', ...dockerErrorOption).then(async (value) => { if (!_dockerExists && value === dockerErrorOption[0]) { const _opened = await vscode.env.openExternal(vscode.Uri.parse('https://www.docker.com/get-started')); - console.log(`${_opened ? 'Opened' : 'Failed to open'} https://www.docker.com/get-started`); + _opened ? this.logger.info('๐Ÿณ Opened https://www.docker.com/get-started') : this.logger.error('๐Ÿณ Failed to open https://www.docker.com/get-started'); resolve(); } else if ((_dockerExists && value === dockerErrorOption[0]) || (!_dockerExists && dockerErrorOption[1])) { _isError = true; @@ -190,15 +195,14 @@ export class Serverpod implements ServerpodInterface { }); resolve(); } - console.log(data.toString()); this._channel?.append(data.toString()); }); newProjSpawn.stdout.on('close', async () => { - console.log(`serverpod project creation closed with ${_isError}`); + this.logger.error(`๐Ÿ’” serverpod project creation closed with ${_isError}`); resolve(); }); newProjSpawn.stderr.on('error', async (err) => { - console.error(err); + this.logger.error(`๐Ÿ’” ${err}`); this._channel?.append(err.toString()); this._channel?.hide(); reject(); @@ -207,24 +211,23 @@ export class Serverpod implements ServerpodInterface { return p; }).then(async () => { if (!_isError && existsSync(join(_path, _name!))) { - console.log('serverpod project created'); + this.logger.info('โœ… serverpod project created'); this._channel?.appendLine('Project created successfully'); - console.log(join(_path, _name!)); + this.logger.info(join(_path, _name!)); setTimeout(async () => { await vscode.commands.executeCommand("vscode.openFolder", vscode.Uri.file(join(_path, _name!))); }, 100); } else { - console.log('Project creation failed'); + this.logger.error('๐Ÿ’” Project creation failed'); this._channel?.appendLine('Project creation failed'); } return Promise.resolve(); }, () => { - console.error('Failed'); + this.logger.error('๐Ÿ’” Project creation failed'); this._channel?.appendLine('Project creation failed'); vscode.window.showErrorMessage('Project creation failed'); return; }); - console.log('Done outside'); return; } } @@ -235,13 +238,15 @@ export class Serverpod implements ServerpodInterface { * Starts the serverpod server * */ async startServerpodServer(): Promise { - console.log('Starting serverpod server ...'); + this.logger.info('๐ŸŒ Starting serverpod server ...'); if (!this.projPath) { + this.logger.error('๐Ÿ’” Not a serverpod project'); await vscode.window.showErrorMessage('Not a serverpod project'); return; } var projNameSplitList = new Utils(this.context).projectPath?.uri.path.split(sep); if (!projNameSplitList) { + this.logger.error('๐Ÿ’” Not a serverpod project'); await vscode.window.showErrorMessage('Not a serverpod project'); return; } @@ -275,7 +280,7 @@ export class Serverpod implements ServerpodInterface { _generateSpawn = undefined; } if (_generateSpawn) { - console.log('Killing generate spawn'); + this.logger.warn('๐Ÿšฉ Killing generate spawn'); process.kill(-_generateSpawn.pid, 'SIGKILL'); } return true; @@ -424,15 +429,13 @@ export class Serverpod implements ServerpodInterface { */ envPath.forEach(_p => { if (_p.endsWith(join('flutter', 'bin')) || _p.endsWith(join('flutter', 'bin', sep))) { - console.log(_p); this._flutter.setFlutterPath = _p; - } - if (_p.endsWith(join('dart-sdk', 'bin')) || _p.endsWith(join('dart-sdk', 'bin', sep))) { - console.log(_p); - this._flutter.setDartPath = _p; + this.logger.info(`๐Ÿฉต Flutter path: ${_p}`); + this._flutter.setDartPath = join(_p, 'cache', 'dart-sdk'); + this.logger.info(`๐Ÿ’™ Dart path: ${this._flutter.dartPath}`); } if (Constants.isWindows ? _p.includes(join('pub', 'cache')) : _p.includes('.pub-cache')) { - console.log(_p); + this.logger.info(`๐Ÿงก Pub cache path: ${_p}`); this._flutter.setPubCachePath = _p; } }); diff --git a/src/base/classes/snippet.ts b/src/base/classes/snippet.ts index 77c6368..ced47db 100644 --- a/src/base/classes/snippet.ts +++ b/src/base/classes/snippet.ts @@ -1,10 +1,12 @@ import { CancellationToken, CompletionContext, CompletionItem, CompletionList, Disposable, DocumentSelector, languages, Position, TextDocument } from "vscode"; +import { LogCategory } from "../../utils/enums.util"; +import { ExtLogger } from "../../utils/logger.util"; -export class Snippet{ +export class Snippet { static disposableSnippet = (documentSelector: DocumentSelector): Disposable => { return languages.registerCompletionItemProvider(documentSelector, { provideCompletionItems: (_document: TextDocument, position: Position, _token: CancellationToken, _context: CompletionContext): CompletionItem[] | CompletionList | undefined => { - console.log('provideCompletionItems triggered for YAML'); + new ExtLogger(LogCategory.extension).info('provideCompletionItems triggered for YAML'); if (position.line <= 0) { return; } diff --git a/src/base/interfaces/logger.interface.ts b/src/base/interfaces/logger.interface.ts new file mode 100644 index 0000000..68699e4 --- /dev/null +++ b/src/base/interfaces/logger.interface.ts @@ -0,0 +1,14 @@ +import { LogCategory, LogSeverity } from "../../utils/enums.util"; + +export interface Logger { + info(message: string, category?: LogCategory): void; + warn(message: any, category?: LogCategory): void; + error(error: any, category?: LogCategory): void; +} + +export interface LogMessage { + readonly message: string; + readonly severity: LogSeverity; + readonly category: LogCategory; + toLine(maxLength: number): string; +} diff --git a/src/index.ts b/src/index.ts index e044184..61108f1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,12 +2,15 @@ import * as vscode from 'vscode'; import { Serverpod } from './base/classes/serverpod.class'; import { Snippet } from './base/classes/snippet'; import { Constants } from './utils/constants.util'; +import { LogCategory } from './utils/enums.util'; +import { ExtLogger } from './utils/logger.util'; export async function activate(context: vscode.ExtensionContext): Promise { + const logger: ExtLogger = new ExtLogger(LogCategory.extension); try { const _serverpod: Serverpod = new Serverpod(context); await _serverpod.init(); - console.log('Congratulations, your extension \'serverpod\' is now active!'); + logger.info('๐ŸŽ‰ Congratulations, your extension \'serverpod\' is now active!'); const disposableCreate: vscode.Disposable = vscode.commands.registerCommand(Constants.createCommand, async () => await _serverpod.createServerpodFlutterProject()); const disposableGenerate: vscode.Disposable = vscode.commands.registerCommand(Constants.generateCommand, async () => await _serverpod.generateServerpodCode()); const disposableServe: vscode.Disposable = vscode.commands.registerCommand(Constants.serveCommand, async () => await _serverpod.startServerpodServer()); @@ -29,10 +32,11 @@ export async function activate(context: vscode.ExtensionContext): Promise export async function deactivate(context: vscode.ExtensionContext): Promise { const _serverpod: Serverpod = new Serverpod(context); + const logger: ExtLogger = new ExtLogger(LogCategory.extension); _serverpod.stopServer(); _serverpod.stopGenerating(); context.subscriptions.forEach((subscription: vscode.Disposable) => { - console.log('Disposing ' + subscription); + logger.info('๐Ÿ—‘๏ธ Disposing ' + subscription); }); - console.log('Your extension \'serverpod\' is now deactivated!'); + logger.info('๐Ÿ’€ Your extension \'serverpod\' is now deactivated!'); } \ No newline at end of file diff --git a/src/utils/enums.util.ts b/src/utils/enums.util.ts index e69de29..84b2773 100644 --- a/src/utils/enums.util.ts +++ b/src/utils/enums.util.ts @@ -0,0 +1,15 @@ +export enum LogCategory { + serverpod = 'SERVERPOD', + flutter = 'FLUTTER', + dart = 'DART', + utils = 'UTILS', + terraform = 'TERRAFORM', + extension = 'EXTENSION', +} + + +export enum LogSeverity { + info, + warn, + error, +} \ No newline at end of file diff --git a/src/utils/logger.util.ts b/src/utils/logger.util.ts new file mode 100644 index 0000000..5cd539e --- /dev/null +++ b/src/utils/logger.util.ts @@ -0,0 +1,24 @@ +import { Logger } from "../base/interfaces/logger.interface"; +import { LogCategory, LogSeverity } from "./enums.util"; + +export class ExtLogger implements Logger { + + + constructor(private category: LogCategory) { + } + + + private logAppender(message: string, severity: LogSeverity) { + return `${severity === LogSeverity.info ? '\x1b[34mINFO\x1b[0m' : severity === LogSeverity.warn ? '\x1b[33mWARNING\x1b[0m' : '\x1b[31mERROR\x1b[0m'} : [ Serverpod.${this.category} ] - ${message}`; + } + + public info(message: string): void { + console.log(this.logAppender(message, LogSeverity.info)); + } + public warn(message: any): void { + console.warn(this.logAppender(message, LogSeverity.warn)); + } + public error(error: any): void { + console.error(this.logAppender(error, LogSeverity.error)); + } +} \ No newline at end of file diff --git a/src/utils/utils.util.ts b/src/utils/utils.util.ts index 3a238d9..6965af9 100644 --- a/src/utils/utils.util.ts +++ b/src/utils/utils.util.ts @@ -4,6 +4,8 @@ import * as os from 'os'; import { join } from 'path'; import * as vscode from 'vscode'; import { Constants } from './constants.util'; +import { LogCategory } from './enums.util'; +import { ExtLogger } from './logger.util'; export class Utils { @@ -62,7 +64,7 @@ export class Utils { * @returns the error message if the name is not valid or already exists * */ static killPid(pid: string): string { - console.log("Killing PID " + pid); + new ExtLogger(LogCategory.extension).warn("๐Ÿšฉ Killing PID " + pid); if (Constants.isWindows) { return execSync(`taskkill /F /PID ${pid}`, { encoding: "utf-8" }); } else {