refactor: class-methods-use-this

This commit is contained in:
Tibo De Peuter 2025-03-23 13:39:10 +01:00
parent a42add7131
commit af57cb5d71
Signed by: tdpeuter
GPG key ID: 38297DE43F75FFE2
12 changed files with 48 additions and 45 deletions

View file

@ -5,6 +5,25 @@ import { LokiLabels } from 'loki-logger-ts';
export class MikroOrmLogger extends DefaultLogger { export class MikroOrmLogger extends DefaultLogger {
private logger: Logger = getLogger(); private logger: Logger = getLogger();
static createMessage(namespace: LoggerNamespace, messageArg: string, context?: LogContext): unknown {
const labels: LokiLabels = {
service: 'ORM',
};
let message: string;
if (context?.label) {
message = `[${namespace}] (${context.label}) ${messageArg}`;
} else {
message = `[${namespace}] ${messageArg}`;
}
return {
message: message,
labels: labels,
context: context,
};
}
log(namespace: LoggerNamespace, message: string, context?: LogContext): void { log(namespace: LoggerNamespace, message: string, context?: LogContext): void {
if (!this.isEnabled(namespace, context)) { if (!this.isEnabled(namespace, context)) {
return; return;
@ -12,28 +31,28 @@ export class MikroOrmLogger extends DefaultLogger {
switch (namespace) { switch (namespace) {
case 'query': case 'query':
this.logger.debug(this.createMessage(namespace, message, context)); this.logger.debug(MikroOrmLogger.createMessage(namespace, message, context));
break; break;
case 'query-params': case 'query-params':
// TODO Which log level should this be? // TODO Which log level should this be?
this.logger.info(this.createMessage(namespace, message, context)); this.logger.info(MikroOrmLogger.createMessage(namespace, message, context));
break; break;
case 'schema': case 'schema':
this.logger.info(this.createMessage(namespace, message, context)); this.logger.info(MikroOrmLogger.createMessage(namespace, message, context));
break; break;
case 'discovery': case 'discovery':
this.logger.debug(this.createMessage(namespace, message, context)); this.logger.debug(MikroOrmLogger.createMessage(namespace, message, context));
break; break;
case 'info': case 'info':
this.logger.info(this.createMessage(namespace, message, context)); this.logger.info(MikroOrmLogger.createMessage(namespace, message, context));
break; break;
case 'deprecated': case 'deprecated':
this.logger.warn(this.createMessage(namespace, message, context)); this.logger.warn(MikroOrmLogger.createMessage(namespace, message, context));
break; break;
default: default:
switch (context?.level) { switch (context?.level) {
case 'info': case 'info':
this.logger.info(this.createMessage(namespace, message, context)); this.logger.info(MikroOrmLogger.createMessage(namespace, message, context));
break; break;
case 'warning': case 'warning':
this.logger.warn(message); this.logger.warn(message);
@ -47,23 +66,4 @@ export class MikroOrmLogger extends DefaultLogger {
} }
} }
} }
private createMessage(namespace: LoggerNamespace, messageArg: string, context?: LogContext): unknown {
const labels: LokiLabels = {
service: 'ORM',
};
let message: string;
if (context?.label) {
message = `[${namespace}] (${context?.label}) ${messageArg}`;
} else {
message = `[${namespace}] ${messageArg}`;
}
return {
message: message,
labels: labels,
context: context,
};
}
} }

View file

@ -14,7 +14,7 @@ class AudioProcessor extends StringProcessor {
super(DwengoContentType.AUDIO_MPEG); super(DwengoContentType.AUDIO_MPEG);
} }
protected renderFn(audioUrl: string): string { override renderFn(audioUrl: string): string {
return DOMPurify.sanitize(`<audio controls> return DOMPurify.sanitize(`<audio controls>
<source src="${audioUrl}" type=${type}> <source src="${audioUrl}" type=${type}>
Your browser does not support the audio element. Your browser does not support the audio element.

View file

@ -3,7 +3,7 @@ import { Category } from 'gift-pegjs';
import { ProcessingError } from '../../processing-error.js'; import { ProcessingError } from '../../processing-error.js';
export class CategoryQuestionRenderer extends GIFTQuestionRenderer<Category> { export class CategoryQuestionRenderer extends GIFTQuestionRenderer<Category> {
render(_question: Category, _questionNumber: number): string { override render(_question: Category, _questionNumber: number): string {
throw new ProcessingError("The question type 'Category' is not supported yet!"); throw new ProcessingError("The question type 'Category' is not supported yet!");
} }
} }

View file

@ -3,7 +3,7 @@ import { Description } from 'gift-pegjs';
import { ProcessingError } from '../../processing-error.js'; import { ProcessingError } from '../../processing-error.js';
export class DescriptionQuestionRenderer extends GIFTQuestionRenderer<Description> { export class DescriptionQuestionRenderer extends GIFTQuestionRenderer<Description> {
render(_question: Description, _questionNumber: number): string { override render(_question: Description, _questionNumber: number): string {
throw new ProcessingError("The question type 'Description' is not supported yet!"); throw new ProcessingError("The question type 'Description' is not supported yet!");
} }
} }

View file

@ -2,7 +2,7 @@ import { GIFTQuestionRenderer } from './gift-question-renderer.js';
import { Essay } from 'gift-pegjs'; import { Essay } from 'gift-pegjs';
export class EssayQuestionRenderer extends GIFTQuestionRenderer<Essay> { export class EssayQuestionRenderer extends GIFTQuestionRenderer<Essay> {
render(question: Essay, questionNumber: number): string { override render(question: Essay, questionNumber: number): string {
let renderedHtml = ''; let renderedHtml = '';
if (question.title) { if (question.title) {
renderedHtml += `<h2 class='gift-title' id='gift-q${questionNumber}-title'>${question.title}</h2>\n`; renderedHtml += `<h2 class='gift-title' id='gift-q${questionNumber}-title'>${question.title}</h2>\n`;

View file

@ -3,7 +3,7 @@ import { Matching } from 'gift-pegjs';
import { ProcessingError } from '../../processing-error.js'; import { ProcessingError } from '../../processing-error.js';
export class MatchingQuestionRenderer extends GIFTQuestionRenderer<Matching> { export class MatchingQuestionRenderer extends GIFTQuestionRenderer<Matching> {
render(_question: Matching, _questionNumber: number): string { override render(_question: Matching, _questionNumber: number): string {
throw new ProcessingError("The question type 'Matching' is not supported yet!"); throw new ProcessingError("The question type 'Matching' is not supported yet!");
} }
} }

View file

@ -2,7 +2,7 @@ import { GIFTQuestionRenderer } from './gift-question-renderer.js';
import { MultipleChoice } from 'gift-pegjs'; import { MultipleChoice } from 'gift-pegjs';
export class MultipleChoiceQuestionRenderer extends GIFTQuestionRenderer<MultipleChoice> { export class MultipleChoiceQuestionRenderer extends GIFTQuestionRenderer<MultipleChoice> {
render(question: MultipleChoice, questionNumber: number): string { override render(question: MultipleChoice, questionNumber: number): string {
let renderedHtml = ''; let renderedHtml = '';
if (question.title) { if (question.title) {
renderedHtml += `<h2 class='gift-title' id='gift-q${questionNumber}-title'>${question.title}</h2>\n`; renderedHtml += `<h2 class='gift-title' id='gift-q${questionNumber}-title'>${question.title}</h2>\n`;

View file

@ -3,7 +3,7 @@ import { Numerical } from 'gift-pegjs';
import { ProcessingError } from '../../processing-error.js'; import { ProcessingError } from '../../processing-error.js';
export class NumericalQuestionRenderer extends GIFTQuestionRenderer<Numerical> { export class NumericalQuestionRenderer extends GIFTQuestionRenderer<Numerical> {
render(_question: Numerical, _questionNumber: number): string { override render(_question: Numerical, _questionNumber: number): string {
throw new ProcessingError("The question type 'Numerical' is not supported yet!"); throw new ProcessingError("The question type 'Numerical' is not supported yet!");
} }
} }

View file

@ -3,7 +3,7 @@ import { ShortAnswer } from 'gift-pegjs';
import { ProcessingError } from '../../processing-error.js'; import { ProcessingError } from '../../processing-error.js';
export class ShortQuestionRenderer extends GIFTQuestionRenderer<ShortAnswer> { export class ShortQuestionRenderer extends GIFTQuestionRenderer<ShortAnswer> {
render(_question: ShortAnswer, _questionNumber: number): string { override render(_question: ShortAnswer, _questionNumber: number): string {
throw new ProcessingError("The question type 'ShortAnswer' is not supported yet!"); throw new ProcessingError("The question type 'ShortAnswer' is not supported yet!");
} }
} }

View file

@ -3,7 +3,7 @@ import { TrueFalse } from 'gift-pegjs';
import { ProcessingError } from '../../processing-error.js'; import { ProcessingError } from '../../processing-error.js';
export class TrueFalseQuestionRenderer extends GIFTQuestionRenderer<TrueFalse> { export class TrueFalseQuestionRenderer extends GIFTQuestionRenderer<TrueFalse> {
render(_question: TrueFalse, _questionNumber: number): string { override render(_question: TrueFalse, _questionNumber: number): string {
throw new ProcessingError("The question type 'TrueFalse' is not supported yet!"); throw new ProcessingError("The question type 'TrueFalse' is not supported yet!");
} }
} }

View file

@ -15,11 +15,20 @@ class MarkdownProcessor extends StringProcessor {
super(DwengoContentType.TEXT_MARKDOWN); super(DwengoContentType.TEXT_MARKDOWN);
} }
static replaceLinks(html: string): string {
const proc = new InlineImageProcessor();
html = html.replace(
/<img.*?src="(.*?)".*?(alt="(.*?)")?.*?(title="(.*?)")?.*?>/g,
(_match: string, src: string, _alt: string, _altText: string, _title: string, _titleText: string) => proc.render(src)
);
return html;
}
override renderFn(mdText: string): string { override renderFn(mdText: string): string {
try { try {
marked.use({ renderer: dwengoMarkedRenderer }); marked.use({ renderer: dwengoMarkedRenderer });
const html = marked(mdText, { async: false }); const html = marked(mdText, { async: false });
return this.replaceLinks(html); // Replace html image links path return MarkdownProcessor.replaceLinks(html); // Replace html image links path
} catch (e: unknown) { } catch (e: unknown) {
if (e instanceof YAMLException) { if (e instanceof YAMLException) {
throw new ProcessingError(e.message); throw new ProcessingError(e.message);
@ -28,15 +37,6 @@ class MarkdownProcessor extends StringProcessor {
throw new ProcessingError('Unknown error while processing markdown: ' + e); throw new ProcessingError('Unknown error while processing markdown: ' + e);
} }
} }
replaceLinks(html: string): string {
const proc = new InlineImageProcessor();
html = html.replace(
/<img.*?src="(.*?)".*?(alt="(.*?)")?.*?(title="(.*?)")?.*?>/g,
(_match: string, src: string, _alt: string, _altText: string, _title: string, _titleText: string) => proc.render(src)
);
return html;
}
} }
export { MarkdownProcessor }; export { MarkdownProcessor };

View file

@ -35,6 +35,9 @@ export default [
'@typescript-eslint/array-type': 'warn', '@typescript-eslint/array-type': 'warn',
'@typescript-eslint/await-thenable': 'error', '@typescript-eslint/await-thenable': 'error',
'class-methods-use-this': 'off',
'@typescript-eslint/class-methods-use-this': [ 'error', { ignoreOverrideMethods: true } ],
'consistent-return': 'off', 'consistent-return': 'off',
'@typescript-eslint/consistent-return': 'off', '@typescript-eslint/consistent-return': 'off',
'@typescript-eslint/consistent-type-assertions': 'error', '@typescript-eslint/consistent-type-assertions': 'error',