diff --git a/backend/src/controllers/auth.ts b/backend/src/controllers/auth.ts index d3f3affb..b87eaf7b 100644 --- a/backend/src/controllers/auth.ts +++ b/backend/src/controllers/auth.ts @@ -1,16 +1,16 @@ import { envVars, getEnvVar } from '../util/envVars.js'; -type FrontendIdpConfig = { +interface FrontendIdpConfig { authority: string; clientId: string; scope: string; responseType: string; -}; +} -type FrontendAuthConfig = { +interface FrontendAuthConfig { student: FrontendIdpConfig; teacher: FrontendIdpConfig; -}; +} const SCOPE = 'openid profile email'; const RESPONSE_TYPE = 'code'; diff --git a/backend/src/controllers/learning-objects.ts b/backend/src/controllers/learning-objects.ts index 6e331ff3..14d200ce 100644 --- a/backend/src/controllers/learning-objects.ts +++ b/backend/src/controllers/learning-objects.ts @@ -13,7 +13,7 @@ function getLearningObjectIdentifierFromRequest(req: Request): LearningObjectIde throw new BadRequestException('HRUID is required.'); } return { - hruid: req.params.hruid as string, + hruid: req.params.hruid, language: (req.query.language || getEnvVar(envVars.FallbackLanguage)) as Language, version: parseInt(req.query.version as string), }; @@ -24,7 +24,7 @@ function getLearningPathIdentifierFromRequest(req: Request): LearningPathIdentif throw new BadRequestException('HRUID is required.'); } return { - hruid: req.params.hruid as string, + hruid: req.params.hruid, language: (req.query.language as Language) || FALLBACK_LANG, }; } diff --git a/backend/src/controllers/teachers.ts b/backend/src/controllers/teachers.ts index e5f1fc87..4bf7eb53 100644 --- a/backend/src/controllers/teachers.ts +++ b/backend/src/controllers/teachers.ts @@ -85,7 +85,7 @@ export async function deleteTeacherHandler(req: Request, res: Response): Promise export async function getTeacherClassHandler(req: Request, res: Response): Promise { try { - const username = req.params.username as string; + const username = req.params.username; const full = req.query.full === 'true'; if (!username) { @@ -104,7 +104,7 @@ export async function getTeacherClassHandler(req: Request, res: Response): Promi export async function getTeacherStudentHandler(req: Request, res: Response): Promise { try { - const username = req.params.username as string; + const username = req.params.username; const full = req.query.full === 'true'; if (!username) { @@ -123,7 +123,7 @@ export async function getTeacherStudentHandler(req: Request, res: Response): Pro export async function getTeacherQuestionHandler(req: Request, res: Response): Promise { try { - const username = req.params.username as string; + const username = req.params.username; const full = req.query.full === 'true'; if (!username) { diff --git a/backend/src/controllers/users.ts b/backend/src/controllers/users.ts index 7706e2ee..255db93a 100644 --- a/backend/src/controllers/users.ts +++ b/backend/src/controllers/users.ts @@ -24,7 +24,7 @@ export async function getAllUsersHandler(req: Request, res: Resp export async function getUserHandler(req: Request, res: Response, service: UserService): Promise { try { - const username = req.params.username as string; + const username = req.params.username; if (!username) { res.status(400).json({ error: 'Missing required field: username' }); diff --git a/backend/src/interfaces/learning-content.ts b/backend/src/interfaces/learning-content.ts index 51474917..693aec37 100644 --- a/backend/src/interfaces/learning-content.ts +++ b/backend/src/interfaces/learning-content.ts @@ -58,7 +58,7 @@ export interface EducationalGoal { export interface ReturnValue { callback_url: string; - callback_schema: Record; + callback_schema: Record; } export interface LearningObjectMetadata { diff --git a/backend/src/middleware/auth/authentication-info.d.ts b/backend/src/middleware/auth/authentication-info.d.ts index 4b060dfa..e8f0d48c 100644 --- a/backend/src/middleware/auth/authentication-info.d.ts +++ b/backend/src/middleware/auth/authentication-info.d.ts @@ -1,11 +1,11 @@ /** * Object with information about the user who is currently logged in. */ -export type AuthenticationInfo = { +export interface AuthenticationInfo { accountType: 'student' | 'teacher'; username: string; name?: string; firstName?: string; lastName?: string; email?: string; -}; +} diff --git a/backend/src/services/learning-objects/database-learning-object-provider.ts b/backend/src/services/learning-objects/database-learning-object-provider.ts index 03dbfdff..a8055f2c 100644 --- a/backend/src/services/learning-objects/database-learning-object-provider.ts +++ b/backend/src/services/learning-objects/database-learning-object-provider.ts @@ -1,7 +1,6 @@ import { LearningObjectProvider } from './learning-object-provider.js'; import { FilteredLearningObject, LearningObjectIdentifier, LearningPathIdentifier } from '../../interfaces/learning-content.js'; import { getLearningObjectRepository, getLearningPathRepository } from '../../data/repositories.js'; -import { Language } from '../../entities/content/language.js'; import { LearningObject } from '../../entities/content/learning-object.entity.js'; import { getUrlStringForLearningObject } from '../../util/links.js'; import processingService from './processing/processing-service.js'; @@ -44,7 +43,7 @@ function convertLearningObject(learningObject: LearningObject | null): FilteredL async function findLearningObjectEntityById(id: LearningObjectIdentifier): Promise { const learningObjectRepo = getLearningObjectRepository(); - return learningObjectRepo.findLatestByHruidAndLanguage(id.hruid, id.language as Language); + return learningObjectRepo.findLatestByHruidAndLanguage(id.hruid, id.language); } /** @@ -65,7 +64,7 @@ const databaseLearningObjectProvider: LearningObjectProvider = { async getLearningObjectHTML(id: LearningObjectIdentifier): Promise { const learningObjectRepo = getLearningObjectRepository(); - const learningObject = await learningObjectRepo.findLatestByHruidAndLanguage(id.hruid, id.language as Language); + const learningObject = await learningObjectRepo.findLatestByHruidAndLanguage(id.hruid, id.language); if (!learningObject) { return null; } diff --git a/backend/src/services/learning-objects/processing/markdown/markdown-processor.ts b/backend/src/services/learning-objects/processing/markdown/markdown-processor.ts index 77673cbf..dbbf2a37 100644 --- a/backend/src/services/learning-objects/processing/markdown/markdown-processor.ts +++ b/backend/src/services/learning-objects/processing/markdown/markdown-processor.ts @@ -8,6 +8,7 @@ import { DwengoContentType } from '../content-type.js'; import dwengoMarkedRenderer from './dwengo-marked-renderer.js'; import { StringProcessor } from '../string-processor.js'; import { ProcessingError } from '../processing-error.js'; +import { YAMLException } from 'js-yaml'; class MarkdownProcessor extends StringProcessor { constructor() { @@ -19,8 +20,12 @@ class MarkdownProcessor extends StringProcessor { marked.use({ renderer: dwengoMarkedRenderer }); const html = marked(mdText, { async: false }); return this.replaceLinks(html); // Replace html image links path - } catch (e: any) { - throw new ProcessingError(e.message); + } catch (e: unknown) { + if (e instanceof YAMLException) { + throw new ProcessingError(e.message); + } + + throw new ProcessingError('Unknown error while processing markdown: ' + e); } } diff --git a/backend/src/services/learning-objects/processing/processing-service.ts b/backend/src/services/learning-objects/processing/processing-service.ts index a6c662cc..f731eb5d 100644 --- a/backend/src/services/learning-objects/processing/processing-service.ts +++ b/backend/src/services/learning-objects/processing/processing-service.ts @@ -21,7 +21,7 @@ const EMBEDDED_LEARNING_OBJECT_PLACEHOLDER = />; + private processors!: Map>; constructor() { const processors = [ diff --git a/backend/src/services/learning-paths/database-learning-path-provider.ts b/backend/src/services/learning-paths/database-learning-path-provider.ts index ed721517..c8ab41ca 100644 --- a/backend/src/services/learning-paths/database-learning-path-provider.ts +++ b/backend/src/services/learning-paths/database-learning-path-provider.ts @@ -25,7 +25,7 @@ async function getLearningObjectsForNodes(nodes: LearningPathNode[]): Promise <[LearningPathNode, FilteredLearningObject | null]>[node, learningObject]) + .then((learningObject) => ([node, learningObject] as [LearningPathNode, FilteredLearningObject | null])) ) ) ); diff --git a/backend/src/sqlite-autoincrement-workaround.ts b/backend/src/sqlite-autoincrement-workaround.ts index a5c20dfd..29d02ffc 100644 --- a/backend/src/sqlite-autoincrement-workaround.ts +++ b/backend/src/sqlite-autoincrement-workaround.ts @@ -27,14 +27,14 @@ export class SqliteAutoincrementSubscriber implements EventSubscriber { for (const prop of Object.values(args.meta.properties)) { const property = prop as EntityProperty; - if (property.primary && property.autoincrement && !(args.entity as Record)[property.name]) { + if (property.primary && property.autoincrement && !(args.entity as Record)[property.name]) { // Obtain and increment sequence number of this entity. const propertyKey = args.meta.class.name + '.' + property.name; const nextSeqNumber = this.sequenceNumbersForEntityType.get(propertyKey) || 0; this.sequenceNumbersForEntityType.set(propertyKey, nextSeqNumber + 1); // Set the property accordingly. - (args.entity as Record)[property.name] = nextSeqNumber + 1; + (args.entity as Record)[property.name] = nextSeqNumber + 1; } } } diff --git a/backend/src/util/api-helper.ts b/backend/src/util/api-helper.ts index fff7a6a1..9aac5bd1 100644 --- a/backend/src/util/api-helper.ts +++ b/backend/src/util/api-helper.ts @@ -1,5 +1,6 @@ import axios, { AxiosRequestConfig } from 'axios'; import { getLogger, Logger } from '../logging/initalize.js'; +import { LearningObjectIdentifier } from '../interfaces/learning-content.js'; const logger: Logger = getLogger(); @@ -17,8 +18,8 @@ export async function fetchWithLogging( url: string, description: string, options?: { - params?: Record; - query?: Record; + params?: Record | LearningObjectIdentifier; + query?: Record; responseType?: 'json' | 'text'; } ): Promise { @@ -26,18 +27,21 @@ export async function fetchWithLogging( const config: AxiosRequestConfig = options || {}; const response = await axios.get(url, config); return response.data; - } catch (error: any) { - if (error.response) { - if (error.response.status === 404) { - logger.debug(`❌ ERROR: ${description} not found (404) at "${url}".`); + } catch (error: unknown) { + if (axios.isAxiosError(error)) { + if (error.response) { + if (error.response.status === 404) { + logger.debug(`❌ ERROR: ${description} not found (404) at "${url}".`); + } else { + logger.debug( + `❌ ERROR: Failed to fetch ${description}. Status: ${error.response.status} - ${error.response.statusText} (URL: "${url}")` + ); + } } else { - logger.debug( - `❌ ERROR: Failed to fetch ${description}. Status: ${error.response.status} - ${error.response.statusText} (URL: "${url}")` - ); + logger.debug(`❌ ERROR: Network or unexpected error when fetching ${description}:`, error.message); } - } else { - logger.debug(`❌ ERROR: Network or unexpected error when fetching ${description}:`, error.message); } + logger.error(`❌ ERROR: Unknown error while fetching ${description}.`, error); return null; } } diff --git a/backend/src/util/envVars.ts b/backend/src/util/envVars.ts index 15ad5928..aed0bebd 100644 --- a/backend/src/util/envVars.ts +++ b/backend/src/util/envVars.ts @@ -5,7 +5,7 @@ const STUDENT_IDP_PREFIX = IDP_PREFIX + 'STUDENT_'; const TEACHER_IDP_PREFIX = IDP_PREFIX + 'TEACHER_'; const CORS_PREFIX = PREFIX + 'CORS_'; -type EnvVar = { key: string; required?: boolean; defaultValue?: any }; +interface EnvVar { key: string; required?: boolean; defaultValue?: number | string | boolean } export const envVars: { [key: string]: EnvVar } = { Port: { key: PREFIX + 'PORT', defaultValue: 3000 }, @@ -44,7 +44,7 @@ export function getEnvVar(envVar: EnvVar): string { } else if (envVar.required) { throw new Error(`Missing environment variable: ${envVar.key}`); } else { - return envVar.defaultValue || ''; + return String(envVar.defaultValue) || ''; } } diff --git a/backend/tests/test-assets/learning-objects/learning-object-example.d.ts b/backend/tests/test-assets/learning-objects/learning-object-example.d.ts index 1d4009f8..5053ca75 100644 --- a/backend/tests/test-assets/learning-objects/learning-object-example.d.ts +++ b/backend/tests/test-assets/learning-objects/learning-object-example.d.ts @@ -1,8 +1,8 @@ import { LearningObject } from '../../../src/entities/content/learning-object.entity'; import { Attachment } from '../../../src/entities/content/attachment.entity'; -type LearningObjectExample = { +interface LearningObjectExample { createLearningObject: () => LearningObject; createAttachment: { [key: string]: (owner: LearningObject) => Attachment }; getHTMLRendering: () => string; -}; +} diff --git a/backend/tests/test-assets/learning-paths/learning-path-example.d.ts b/backend/tests/test-assets/learning-paths/learning-path-example.d.ts index 9df3ba48..d8e94dc8 100644 --- a/backend/tests/test-assets/learning-paths/learning-path-example.d.ts +++ b/backend/tests/test-assets/learning-paths/learning-path-example.d.ts @@ -1,3 +1,3 @@ -type LearningPathExample = { +interface LearningPathExample { createLearningPath: () => LearningPath; -}; +} diff --git a/backend/tests/test-assets/learning-paths/test-conditions-example.ts b/backend/tests/test-assets/learning-paths/test-conditions-example.ts index 816cd735..b5e38c24 100644 --- a/backend/tests/test-assets/learning-paths/test-conditions-example.ts +++ b/backend/tests/test-assets/learning-paths/test-conditions-example.ts @@ -6,12 +6,12 @@ import { createLearningPathNode, createLearningPathTransition } from './learning import { LearningObject } from '../../../src/entities/content/learning-object.entity'; import { envVars, getEnvVar } from '../../../src/util/envVars'; -export type ConditionTestLearningPathAndLearningObjects = { +export interface ConditionTestLearningPathAndLearningObjects { branchingObject: LearningObject; extraExerciseObject: LearningObject; finalObject: LearningObject; learningPath: LearningPath; -}; +} export function createConditionTestLearningPathAndLearningObjects(): ConditionTestLearningPathAndLearningObjects { const learningPath = new LearningPath(); diff --git a/backend/tests/test-utils/expectations.ts b/backend/tests/test-utils/expectations.ts index 347f4b40..8f33bd8f 100644 --- a/backend/tests/test-utils/expectations.ts +++ b/backend/tests/test-utils/expectations.ts @@ -25,7 +25,7 @@ export function expectToBeCorrectEntity(actual: { entity: T; n expected.entity[property] !== undefined && // If we don't expect a certain value for a property, we assume it can be filled in by the database however it wants. typeof expected.entity[property] !== 'function' // Functions obviously are not persisted via the database ) { - if (!actual.entity.hasOwnProperty(property)) { + if (!Object.prototype.hasOwnProperty.call(actual.entity, property)) { throw new AssertionError({ message: `${expected.name} has defined property ${property}, but ${actual.name} is missing it.`, }); diff --git a/backend/tests/test_assets/assignments/assignments.testdata.ts b/backend/tests/test_assets/assignments/assignments.testdata.ts index 7f909de4..5a5a3d5e 100644 --- a/backend/tests/test_assets/assignments/assignments.testdata.ts +++ b/backend/tests/test_assets/assignments/assignments.testdata.ts @@ -1,9 +1,9 @@ -import { Connection, EntityManager, IDatabaseDriver } from '@mikro-orm/core'; +import { EntityManager } from '@mikro-orm/core'; import { Assignment } from '../../../src/entities/assignments/assignment.entity'; import { Class } from '../../../src/entities/classes/class.entity'; import { Language } from '../../../src/entities/content/language'; -export function makeTestAssignemnts(em: EntityManager>, classes: Array): Array { +export function makeTestAssignemnts(em: EntityManager, classes: Array): Array { const assignment01 = em.create(Assignment, { within: classes[0], id: 1, diff --git a/backend/tests/test_assets/assignments/groups.testdata.ts b/backend/tests/test_assets/assignments/groups.testdata.ts index 0e9ef201..199d6f48 100644 --- a/backend/tests/test_assets/assignments/groups.testdata.ts +++ b/backend/tests/test_assets/assignments/groups.testdata.ts @@ -1,13 +1,9 @@ -import { Connection, EntityManager, IDatabaseDriver } from '@mikro-orm/core'; +import { EntityManager } from '@mikro-orm/core'; import { Group } from '../../../src/entities/assignments/group.entity'; import { Assignment } from '../../../src/entities/assignments/assignment.entity'; import { Student } from '../../../src/entities/users/student.entity'; -export function makeTestGroups( - em: EntityManager>, - students: Array, - assignments: Array -): Array { +export function makeTestGroups(em: EntityManager, students: Array, assignments: Array): Array { const group01 = em.create(Group, { assignment: assignments[0], groupNumber: 1, diff --git a/backend/tests/test_assets/assignments/submission.testdata.ts b/backend/tests/test_assets/assignments/submission.testdata.ts index 95dd65df..7b56a6cb 100644 --- a/backend/tests/test_assets/assignments/submission.testdata.ts +++ b/backend/tests/test_assets/assignments/submission.testdata.ts @@ -1,14 +1,10 @@ -import { Connection, EntityManager, IDatabaseDriver } from '@mikro-orm/core'; +import { EntityManager } from '@mikro-orm/core'; import { Submission } from '../../../src/entities/assignments/submission.entity'; import { Language } from '../../../src/entities/content/language'; import { Student } from '../../../src/entities/users/student.entity'; import { Group } from '../../../src/entities/assignments/group.entity'; -export function makeTestSubmissions( - em: EntityManager>, - students: Array, - groups: Array -): Array { +export function makeTestSubmissions(em: EntityManager, students: Array, groups: Array): Array { const submission01 = em.create(Submission, { learningObjectHruid: 'id03', learningObjectLanguage: Language.English, diff --git a/backend/tests/test_assets/classes/class-join-requests.testdata.ts b/backend/tests/test_assets/classes/class-join-requests.testdata.ts index 8d9e328f..f0e151ca 100644 --- a/backend/tests/test_assets/classes/class-join-requests.testdata.ts +++ b/backend/tests/test_assets/classes/class-join-requests.testdata.ts @@ -1,13 +1,9 @@ -import { Connection, EntityManager, IDatabaseDriver } from '@mikro-orm/core'; +import { EntityManager } from '@mikro-orm/core'; import { ClassJoinRequest, ClassJoinRequestStatus } from '../../../src/entities/classes/class-join-request.entity'; import { Student } from '../../../src/entities/users/student.entity'; import { Class } from '../../../src/entities/classes/class.entity'; -export function makeTestClassJoinRequests( - em: EntityManager>, - students: Array, - classes: Array -): Array { +export function makeTestClassJoinRequests(em: EntityManager, students: Array, classes: Array): Array { const classJoinRequest01 = em.create(ClassJoinRequest, { requester: students[4], class: classes[1], diff --git a/backend/tests/test_assets/classes/classes.testdata.ts b/backend/tests/test_assets/classes/classes.testdata.ts index b3e98bc8..e122d084 100644 --- a/backend/tests/test_assets/classes/classes.testdata.ts +++ b/backend/tests/test_assets/classes/classes.testdata.ts @@ -1,9 +1,9 @@ -import { Connection, EntityManager, IDatabaseDriver } from '@mikro-orm/core'; +import { EntityManager } from '@mikro-orm/core'; import { Class } from '../../../src/entities/classes/class.entity'; import { Student } from '../../../src/entities/users/student.entity'; import { Teacher } from '../../../src/entities/users/teacher.entity'; -export function makeTestClasses(em: EntityManager>, students: Array, teachers: Array): Array { +export function makeTestClasses(em: EntityManager, students: Array, teachers: Array): Array { const studentsClass01 = students.slice(0, 7); const teacherClass01: Array = teachers.slice(0, 1); diff --git a/backend/tests/test_assets/classes/teacher-invitations.testdata.ts b/backend/tests/test_assets/classes/teacher-invitations.testdata.ts index 84eeab01..35b471a4 100644 --- a/backend/tests/test_assets/classes/teacher-invitations.testdata.ts +++ b/backend/tests/test_assets/classes/teacher-invitations.testdata.ts @@ -1,13 +1,9 @@ -import { Connection, EntityManager, IDatabaseDriver } from '@mikro-orm/core'; +import { EntityManager } from '@mikro-orm/core'; import { TeacherInvitation } from '../../../src/entities/classes/teacher-invitation.entity'; import { Teacher } from '../../../src/entities/users/teacher.entity'; import { Class } from '../../../src/entities/classes/class.entity'; -export function makeTestTeacherInvitations( - em: EntityManager>, - teachers: Array, - classes: Array -): Array { +export function makeTestTeacherInvitations(em: EntityManager, teachers: Array, classes: Array): Array { const teacherInvitation01 = em.create(TeacherInvitation, { sender: teachers[1], receiver: teachers[0], diff --git a/backend/tests/test_assets/content/attachments.testdata.ts b/backend/tests/test_assets/content/attachments.testdata.ts index 9f690d9c..22242a77 100644 --- a/backend/tests/test_assets/content/attachments.testdata.ts +++ b/backend/tests/test_assets/content/attachments.testdata.ts @@ -1,8 +1,8 @@ -import { Connection, EntityManager, IDatabaseDriver } from '@mikro-orm/core'; +import { EntityManager } from '@mikro-orm/core'; import { Attachment } from '../../../src/entities/content/attachment.entity'; import { LearningObject } from '../../../src/entities/content/learning-object.entity'; -export function makeTestAttachments(em: EntityManager>, learningObjects: Array): Array { +export function makeTestAttachments(em: EntityManager, learningObjects: Array): Array { const attachment01 = em.create(Attachment, { learningObject: learningObjects[1], name: 'attachment01', diff --git a/backend/tests/test_assets/content/learning-objects.testdata.ts b/backend/tests/test_assets/content/learning-objects.testdata.ts index 17ed4f01..e45bdea0 100644 --- a/backend/tests/test_assets/content/learning-objects.testdata.ts +++ b/backend/tests/test_assets/content/learning-objects.testdata.ts @@ -1,9 +1,9 @@ -import { Connection, EntityManager, IDatabaseDriver } from '@mikro-orm/core'; +import { EntityManager } from '@mikro-orm/core'; import { LearningObject, ReturnValue } from '../../../src/entities/content/learning-object.entity'; import { Language } from '../../../src/entities/content/language'; import { DwengoContentType } from '../../../src/services/learning-objects/processing/content-type'; -export function makeTestLearningObjects(em: EntityManager>): Array { +export function makeTestLearningObjects(em: EntityManager): Array { const returnValue: ReturnValue = new ReturnValue(); returnValue.callbackSchema = ''; returnValue.callbackUrl = ''; diff --git a/backend/tests/test_assets/content/learning-paths.testdata.ts b/backend/tests/test_assets/content/learning-paths.testdata.ts index 10de885c..3b62b55c 100644 --- a/backend/tests/test_assets/content/learning-paths.testdata.ts +++ b/backend/tests/test_assets/content/learning-paths.testdata.ts @@ -1,10 +1,10 @@ -import { Connection, EntityManager, IDatabaseDriver } from '@mikro-orm/core'; +import { EntityManager } from '@mikro-orm/core'; import { LearningPath } from '../../../src/entities/content/learning-path.entity'; import { Language } from '../../../src/entities/content/language'; import { LearningPathTransition } from '../../../src/entities/content/learning-path-transition.entity'; import { LearningPathNode } from '../../../src/entities/content/learning-path-node.entity'; -export function makeTestLearningPaths(em: EntityManager>): Array { +export function makeTestLearningPaths(em: EntityManager): Array { const learningPathNode01: LearningPathNode = new LearningPathNode(); const learningPathNode02: LearningPathNode = new LearningPathNode(); const learningPathNode03: LearningPathNode = new LearningPathNode(); diff --git a/backend/tests/test_assets/questions/answers.testdata.ts b/backend/tests/test_assets/questions/answers.testdata.ts index 20e816da..4332a70f 100644 --- a/backend/tests/test_assets/questions/answers.testdata.ts +++ b/backend/tests/test_assets/questions/answers.testdata.ts @@ -1,9 +1,9 @@ -import { Connection, EntityManager, IDatabaseDriver } from '@mikro-orm/core'; +import { EntityManager } from '@mikro-orm/core'; import { Answer } from '../../../src/entities/questions/answer.entity'; import { Teacher } from '../../../src/entities/users/teacher.entity'; import { Question } from '../../../src/entities/questions/question.entity'; -export function makeTestAnswers(em: EntityManager>, teachers: Array, questions: Array): Array { +export function makeTestAnswers(em: EntityManager, teachers: Array, questions: Array): Array { const answer01 = em.create(Answer, { author: teachers[0], toQuestion: questions[1], diff --git a/backend/tests/test_assets/questions/questions.testdata.ts b/backend/tests/test_assets/questions/questions.testdata.ts index cea43e18..0c19109a 100644 --- a/backend/tests/test_assets/questions/questions.testdata.ts +++ b/backend/tests/test_assets/questions/questions.testdata.ts @@ -1,9 +1,9 @@ -import { Connection, EntityManager, IDatabaseDriver } from '@mikro-orm/core'; +import { EntityManager } from '@mikro-orm/core'; import { Question } from '../../../src/entities/questions/question.entity'; import { Language } from '../../../src/entities/content/language'; import { Student } from '../../../src/entities/users/student.entity'; -export function makeTestQuestions(em: EntityManager>, students: Array): Array { +export function makeTestQuestions(em: EntityManager, students: Array): Array { const question01 = em.create(Question, { learningObjectLanguage: Language.English, learningObjectVersion: 1, diff --git a/backend/tests/test_assets/users/students.testdata.ts b/backend/tests/test_assets/users/students.testdata.ts index 61e0b590..aff29913 100644 --- a/backend/tests/test_assets/users/students.testdata.ts +++ b/backend/tests/test_assets/users/students.testdata.ts @@ -1,7 +1,7 @@ -import { Connection, EntityManager, IDatabaseDriver } from '@mikro-orm/core'; +import { EntityManager } from '@mikro-orm/core'; import { Student } from '../../../src/entities/users/student.entity'; -export function makeTestStudents(em: EntityManager>): Array { +export function makeTestStudents(em: EntityManager): Array { const student01 = em.create(Student, { username: 'Noordkaap', firstName: 'Stijn', diff --git a/backend/tests/test_assets/users/teachers.testdata.ts b/backend/tests/test_assets/users/teachers.testdata.ts index d8985e44..7e519f7d 100644 --- a/backend/tests/test_assets/users/teachers.testdata.ts +++ b/backend/tests/test_assets/users/teachers.testdata.ts @@ -1,7 +1,7 @@ import { Teacher } from '../../../src/entities/users/teacher.entity'; -import { Connection, EntityManager, IDatabaseDriver } from '@mikro-orm/core'; +import { EntityManager } from '@mikro-orm/core'; -export function makeTestTeachers(em: EntityManager>): Array { +export function makeTestTeachers(em: EntityManager): Array { const teacher01 = em.create(Teacher, { username: 'FooFighters', firstName: 'Dave', diff --git a/eslint.config.ts b/eslint.config.ts index 3596633a..bbc68665 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -34,6 +34,10 @@ export default [ rules: { 'consistent-return': 'off', '@typescript-eslint/consistent-return': 'off', + '@typescript-eslint/consistent-type-assertions': 'error', + '@typescript-eslint/consistent-type-definitions': 'error', + '@typescript-eslint/consistent-type-exports': 'off', + '@typescript-eslint/consistent-type-imports': 'off', '@typescript-eslint/explicit-function-return-type': 'warn', @@ -58,12 +62,24 @@ export default [ } ], + 'no-dupe-class-members': 'off', + '@typescript-eslint/no-dupe-class-members': 'off', + '@typescript-eslint/no-duplicate-enum-values': 'error', + 'no-duplicate-imports': 'off', + '@typescript-eslint/no-duplicate-type-constituents': 'off', + // 'no-empty-function': 'off', '@typescript-eslint/no-empty-function': 'error', 'no-loop-func': 'off', '@typescript-eslint/no-loop-func': 'error', + '@typescript-eslint/no-type-alias': 'off', + + '@typescript-eslint/no-unnecessary-type-arguments': 'error', + '@typescript-eslint/no-unnecessary-type-assertion': 'error', + '@typescript-eslint/no-unnecessary-type-constraint': 'error', + '@typescript-eslint/no-unnecessary-type-parameters': 'off', '@typescript-eslint/no-unsafe-function-type': 'error', 'no-unused-expressions': 'off', @@ -89,7 +105,6 @@ export default [ 'no-await-in-loop': 'warn', 'no-constructor-return': 'error', - 'no-duplicate-imports': 'error', 'no-inner-declarations': 'error', 'no-self-compare': 'error', 'no-template-curly-in-string': 'error', @@ -100,7 +115,6 @@ export default [ 'arrow-body-style': ['warn', 'as-needed'], 'block-scoped-var': 'warn', 'capitalized-comments': 'warn', - 'consistent-return': 'warn', 'consistent-this': 'error', curly: 'error', 'default-case': 'error',