feat(backend): LearningPathPersonalizingService geïmplementeerd
This commit is contained in:
		
							parent
							
								
									cd0a3a8a7b
								
							
						
					
					
						commit
						a30c4d0d32
					
				
					 5 changed files with 129 additions and 116 deletions
				
			
		|  | @ -18,24 +18,24 @@ | ||||||
|         "@mikro-orm/postgresql": "^6.4.6", |         "@mikro-orm/postgresql": "^6.4.6", | ||||||
|         "@mikro-orm/reflection": "^6.4.6", |         "@mikro-orm/reflection": "^6.4.6", | ||||||
|         "@mikro-orm/sqlite": "6.4.6", |         "@mikro-orm/sqlite": "6.4.6", | ||||||
|  |         "@types/cors": "^2.8.17", | ||||||
|         "@types/js-yaml": "^4.0.9", |         "@types/js-yaml": "^4.0.9", | ||||||
|         "axios": "^1.8.2", |         "axios": "^1.8.2", | ||||||
|  |         "cors": "^2.8.5", | ||||||
|         "dotenv": "^16.4.7", |         "dotenv": "^16.4.7", | ||||||
|         "express": "^5.0.1", |         "express": "^5.0.1", | ||||||
|  |         "express-jwt": "^8.5.1", | ||||||
|         "gift-pegjs": "^1.0.2", |         "gift-pegjs": "^1.0.2", | ||||||
|         "isomorphic-dompurify": "^2.22.0", |         "isomorphic-dompurify": "^2.22.0", | ||||||
|         "express-jwt": "^8.5.1", |  | ||||||
|         "jwks-rsa": "^3.1.0", |  | ||||||
|         "uuid": "^11.1.0", |  | ||||||
|         "js-yaml": "^4.1.0", |         "js-yaml": "^4.1.0", | ||||||
|         "marked": "^15.0.7", |         "jsonpath-plus": "^10.3.0", | ||||||
|         "uuid": "^11.1.0", |         "jwks-rsa": "^3.1.0", | ||||||
|         "loki-logger-ts": "^1.0.2", |         "loki-logger-ts": "^1.0.2", | ||||||
|  |         "marked": "^15.0.7", | ||||||
|         "response-time": "^2.3.3", |         "response-time": "^2.3.3", | ||||||
|  |         "uuid": "^11.1.0", | ||||||
|         "winston": "^3.17.0", |         "winston": "^3.17.0", | ||||||
|         "winston-loki": "^6.1.3", |         "winston-loki": "^6.1.3" | ||||||
|         "cors": "^2.8.5", |  | ||||||
|         "@types/cors": "^2.8.17" |  | ||||||
|     }, |     }, | ||||||
|     "devDependencies": { |     "devDependencies": { | ||||||
|         "@mikro-orm/cli": "^6.4.6", |         "@mikro-orm/cli": "^6.4.6", | ||||||
|  |  | ||||||
|  | @ -15,7 +15,7 @@ function getLearningObjectIdentifierFromRequest(req: Request): LearningObjectIde | ||||||
|     return { |     return { | ||||||
|         hruid: req.params.hruid as string, |         hruid: req.params.hruid as string, | ||||||
|         language: (req.query.language || getEnvVar(EnvVars.FallbackLanguage)) as Language, |         language: (req.query.language || getEnvVar(EnvVars.FallbackLanguage)) as Language, | ||||||
|         version: req.query.version as string |         version: parseInt(req.query.version as string) | ||||||
|     }; |     }; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -24,6 +24,7 @@ export class UnauthorizedException extends Error { | ||||||
|  */ |  */ | ||||||
| export class ForbiddenException extends Error { | export class ForbiddenException extends Error { | ||||||
|     status = 403; |     status = 403; | ||||||
|  | 
 | ||||||
|     constructor(message: string = 'Forbidden') { |     constructor(message: string = 'Forbidden') { | ||||||
|         super(message); |         super(message); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -1,5 +1,69 @@ | ||||||
| const learningPathPersonalizingService = { | import {Student} from "../../entities/users/student.entity"; | ||||||
|  | import {getSubmissionRepository} from "../../data/repositories"; | ||||||
|  | import {Group} from "../../entities/assignments/group.entity"; | ||||||
|  | import {Submission} from "../../entities/assignments/submission.entity"; | ||||||
|  | import {LearningObjectIdentifier} from "../../entities/content/learning-object-identifier"; | ||||||
|  | import {LearningPathNode} from "../../entities/content/learning-path-node.entity"; | ||||||
|  | import {LearningPathTransition} from "../../entities/content/learning-path-transition.entity"; | ||||||
|  | import {JSONPath} from 'jsonpath-plus'; | ||||||
| 
 | 
 | ||||||
|  | /** | ||||||
|  |  * Returns the last submission for the learning object associated with the given node and for the student or group | ||||||
|  |  */ | ||||||
|  | async function getLastRelevantSubmission(node: LearningPathNode, pathFor: {student?: Student, group?: Group}): Promise<Submission | null> { | ||||||
|  |     const submissionRepo = getSubmissionRepository(); | ||||||
|  |     const learningObjectId: LearningObjectIdentifier = { | ||||||
|  |         hruid: node.learningObjectHruid, | ||||||
|  |         language: node.language, | ||||||
|  |         version: node.version | ||||||
|  |     }; | ||||||
|  |     let lastSubmission: Submission | null; | ||||||
|  |     if (pathFor.group) { | ||||||
|  |         lastSubmission = await submissionRepo.findMostRecentSubmissionForGroup(learningObjectId, pathFor.group); | ||||||
|  |     } else if (pathFor.student) { | ||||||
|  |         lastSubmission = await submissionRepo.findMostRecentSubmissionForStudent(learningObjectId, pathFor.student); | ||||||
|  |     } else { | ||||||
|  |         throw new Error("The path must either be created for a certain group or for a certain student!"); | ||||||
|  |     } | ||||||
|  |     return lastSubmission; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function transitionPossible(transition: LearningPathTransition, submitted: object | null): boolean { | ||||||
|  |     if (transition.condition === "true" || !transition.condition) { | ||||||
|  |         return true; // If the transition is unconditional, we can go on.
 | ||||||
|  |     } | ||||||
|  |     if (submitted === null) { | ||||||
|  |         return false; // If the transition is not unconditional and there was no submission, the transition is not possible.
 | ||||||
|  |     } | ||||||
|  |     return JSONPath({path: transition.condition, json: submitted}).length === 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Service to create individual trajectories from learning paths based on the submissions of the student or group. | ||||||
|  |  */ | ||||||
|  | const learningPathPersonalizingService = { | ||||||
|  |     async calculatePersonalizedTrajectory(nodes: LearningPathNode[], pathFor: {student?: Student, group?: Group}): Promise<LearningPathNode[]> { | ||||||
|  |         let trajectory: LearningPathNode[] = []; | ||||||
|  | 
 | ||||||
|  |         // Always start with the start node.
 | ||||||
|  |         let currentNode = nodes.filter(it => it.startNode)[0]; | ||||||
|  |         trajectory.push(currentNode); | ||||||
|  | 
 | ||||||
|  |         while (true) { | ||||||
|  |             // At every node, calculate all the possible next transitions.
 | ||||||
|  |             let lastSubmission = await getLastRelevantSubmission(currentNode, pathFor); | ||||||
|  |             let submitted = lastSubmission === null ? null : JSON.parse(lastSubmission.content); | ||||||
|  |             let possibleTransitions = currentNode.transitions | ||||||
|  |                 .filter(it => transitionPossible(it, submitted)); | ||||||
|  | 
 | ||||||
|  |             if (possibleTransitions.length === 0) { // If there are none, the trajectory has ended.
 | ||||||
|  |                 return trajectory; | ||||||
|  |             } else { // Otherwise, take the first possible transition.
 | ||||||
|  |                 currentNode = possibleTransitions[0].node; | ||||||
|  |                 trajectory.push(currentNode); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| export default learningPathPersonalizingService; | export default learningPathPersonalizingService; | ||||||
|  |  | ||||||
							
								
								
									
										160
									
								
								package-lock.json
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										160
									
								
								package-lock.json
									
										
									
										generated
									
									
									
								
							|  | @ -36,17 +36,16 @@ | ||||||
|                 "@types/js-yaml": "^4.0.9", |                 "@types/js-yaml": "^4.0.9", | ||||||
|                 "axios": "^1.8.2", |                 "axios": "^1.8.2", | ||||||
|                 "cors": "^2.8.5", |                 "cors": "^2.8.5", | ||||||
|                 "@mikro-orm/sqlite": "6.4.6", |  | ||||||
|                 "@types/js-yaml": "^4.0.9", |  | ||||||
|                 "dotenv": "^16.4.7", |                 "dotenv": "^16.4.7", | ||||||
|                 "express": "^5.0.1", |                 "express": "^5.0.1", | ||||||
|  |                 "express-jwt": "^8.5.1", | ||||||
|                 "gift-pegjs": "^1.0.2", |                 "gift-pegjs": "^1.0.2", | ||||||
|                 "isomorphic-dompurify": "^2.22.0", |                 "isomorphic-dompurify": "^2.22.0", | ||||||
|                 "express-jwt": "^8.5.1", |  | ||||||
|                 "js-yaml": "^4.1.0", |                 "js-yaml": "^4.1.0", | ||||||
|                 "marked": "^15.0.7", |                 "jsonpath-plus": "^10.3.0", | ||||||
|                 "jwks-rsa": "^3.1.0", |                 "jwks-rsa": "^3.1.0", | ||||||
|                 "loki-logger-ts": "^1.0.2", |                 "loki-logger-ts": "^1.0.2", | ||||||
|  |                 "marked": "^15.0.7", | ||||||
|                 "response-time": "^2.3.3", |                 "response-time": "^2.3.3", | ||||||
|                 "uuid": "^11.1.0", |                 "uuid": "^11.1.0", | ||||||
|                 "winston": "^3.17.0", |                 "winston": "^3.17.0", | ||||||
|  | @ -155,7 +154,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/@asamuzakjp/css-color": { |         "node_modules/@asamuzakjp/css-color": { | ||||||
|             "version": "2.8.3", |             "version": "2.8.3", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT", |             "license": "MIT", | ||||||
|             "dependencies": { |             "dependencies": { | ||||||
|                 "@csstools/css-calc": "^2.1.1", |                 "@csstools/css-calc": "^2.1.1", | ||||||
|  | @ -623,7 +621,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/@csstools/color-helpers": { |         "node_modules/@csstools/color-helpers": { | ||||||
|             "version": "5.0.1", |             "version": "5.0.1", | ||||||
|             "dev": true, |  | ||||||
|             "funding": [ |             "funding": [ | ||||||
|                 { |                 { | ||||||
|                     "type": "github", |                     "type": "github", | ||||||
|  | @ -641,7 +638,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/@csstools/css-calc": { |         "node_modules/@csstools/css-calc": { | ||||||
|             "version": "2.1.1", |             "version": "2.1.1", | ||||||
|             "dev": true, |  | ||||||
|             "funding": [ |             "funding": [ | ||||||
|                 { |                 { | ||||||
|                     "type": "github", |                     "type": "github", | ||||||
|  | @ -663,7 +659,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/@csstools/css-color-parser": { |         "node_modules/@csstools/css-color-parser": { | ||||||
|             "version": "3.0.7", |             "version": "3.0.7", | ||||||
|             "dev": true, |  | ||||||
|             "funding": [ |             "funding": [ | ||||||
|                 { |                 { | ||||||
|                     "type": "github", |                     "type": "github", | ||||||
|  | @ -689,7 +684,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/@csstools/css-parser-algorithms": { |         "node_modules/@csstools/css-parser-algorithms": { | ||||||
|             "version": "3.0.4", |             "version": "3.0.4", | ||||||
|             "dev": true, |  | ||||||
|             "funding": [ |             "funding": [ | ||||||
|                 { |                 { | ||||||
|                     "type": "github", |                     "type": "github", | ||||||
|  | @ -710,7 +704,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/@csstools/css-tokenizer": { |         "node_modules/@csstools/css-tokenizer": { | ||||||
|             "version": "3.0.3", |             "version": "3.0.3", | ||||||
|             "dev": true, |  | ||||||
|             "funding": [ |             "funding": [ | ||||||
|                 { |                 { | ||||||
|                     "type": "github", |                     "type": "github", | ||||||
|  | @ -969,44 +962,6 @@ | ||||||
|                 "url": "https://github.com/sponsors/nzakas" |                 "url": "https://github.com/sponsors/nzakas" | ||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
|         "node_modules/@intlify/core-base": { |  | ||||||
|             "version": "10.0.5", |  | ||||||
|             "license": "MIT", |  | ||||||
|             "dependencies": { |  | ||||||
|                 "@intlify/message-compiler": "10.0.5", |  | ||||||
|                 "@intlify/shared": "10.0.5" |  | ||||||
|             }, |  | ||||||
|             "engines": { |  | ||||||
|                 "node": ">= 16" |  | ||||||
|             }, |  | ||||||
|             "funding": { |  | ||||||
|                 "url": "https://github.com/sponsors/kazupon" |  | ||||||
|             } |  | ||||||
|         }, |  | ||||||
|         "node_modules/@intlify/message-compiler": { |  | ||||||
|             "version": "10.0.5", |  | ||||||
|             "license": "MIT", |  | ||||||
|             "dependencies": { |  | ||||||
|                 "@intlify/shared": "10.0.5", |  | ||||||
|                 "source-map-js": "^1.0.2" |  | ||||||
|             }, |  | ||||||
|             "engines": { |  | ||||||
|                 "node": ">= 16" |  | ||||||
|             }, |  | ||||||
|             "funding": { |  | ||||||
|                 "url": "https://github.com/sponsors/kazupon" |  | ||||||
|             } |  | ||||||
|         }, |  | ||||||
|         "node_modules/@intlify/shared": { |  | ||||||
|             "version": "10.0.5", |  | ||||||
|             "license": "MIT", |  | ||||||
|             "engines": { |  | ||||||
|                 "node": ">= 16" |  | ||||||
|             }, |  | ||||||
|             "funding": { |  | ||||||
|                 "url": "https://github.com/sponsors/kazupon" |  | ||||||
|             } |  | ||||||
|         }, |  | ||||||
|         "node_modules/@isaacs/cliui": { |         "node_modules/@isaacs/cliui": { | ||||||
|             "version": "8.0.2", |             "version": "8.0.2", | ||||||
|             "dev": true, |             "dev": true, | ||||||
|  | @ -1084,6 +1039,30 @@ | ||||||
|                 "@jridgewell/sourcemap-codec": "^1.4.10" |                 "@jridgewell/sourcemap-codec": "^1.4.10" | ||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
|  |         "node_modules/@jsep-plugin/assignment": { | ||||||
|  |             "version": "1.3.0", | ||||||
|  |             "resolved": "https://registry.npmjs.org/@jsep-plugin/assignment/-/assignment-1.3.0.tgz", | ||||||
|  |             "integrity": "sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ==", | ||||||
|  |             "license": "MIT", | ||||||
|  |             "engines": { | ||||||
|  |                 "node": ">= 10.16.0" | ||||||
|  |             }, | ||||||
|  |             "peerDependencies": { | ||||||
|  |                 "jsep": "^0.4.0||^1.0.0" | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         "node_modules/@jsep-plugin/regex": { | ||||||
|  |             "version": "1.0.4", | ||||||
|  |             "resolved": "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.4.tgz", | ||||||
|  |             "integrity": "sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg==", | ||||||
|  |             "license": "MIT", | ||||||
|  |             "engines": { | ||||||
|  |                 "node": ">= 10.16.0" | ||||||
|  |             }, | ||||||
|  |             "peerDependencies": { | ||||||
|  |                 "jsep": "^0.4.0||^1.0.0" | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|         "node_modules/@mikro-orm/cli": { |         "node_modules/@mikro-orm/cli": { | ||||||
|             "version": "6.4.6", |             "version": "6.4.6", | ||||||
|             "dev": true, |             "dev": true, | ||||||
|  | @ -1721,7 +1700,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/@types/http-errors": { |         "node_modules/@types/http-errors": { | ||||||
|             "version": "2.0.4", |             "version": "2.0.4", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT" |             "license": "MIT" | ||||||
|         }, |         }, | ||||||
|         "node_modules/@types/js-yaml": { |         "node_modules/@types/js-yaml": { | ||||||
|  | @ -1755,7 +1733,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/@types/mime": { |         "node_modules/@types/mime": { | ||||||
|             "version": "1.3.5", |             "version": "1.3.5", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT" |             "license": "MIT" | ||||||
|         }, |         }, | ||||||
|         "node_modules/@types/ms": { |         "node_modules/@types/ms": { | ||||||
|  | @ -1766,7 +1743,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/@types/node": { |         "node_modules/@types/node": { | ||||||
|             "version": "22.13.4", |             "version": "22.13.4", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT", |             "license": "MIT", | ||||||
|             "dependencies": { |             "dependencies": { | ||||||
|                 "undici-types": "~6.20.0" |                 "undici-types": "~6.20.0" | ||||||
|  | @ -1774,12 +1750,10 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/@types/qs": { |         "node_modules/@types/qs": { | ||||||
|             "version": "6.9.18", |             "version": "6.9.18", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT" |             "license": "MIT" | ||||||
|         }, |         }, | ||||||
|         "node_modules/@types/range-parser": { |         "node_modules/@types/range-parser": { | ||||||
|             "version": "1.2.7", |             "version": "1.2.7", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT" |             "license": "MIT" | ||||||
|         }, |         }, | ||||||
|         "node_modules/@types/response-time": { |         "node_modules/@types/response-time": { | ||||||
|  | @ -1795,7 +1769,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/@types/send": { |         "node_modules/@types/send": { | ||||||
|             "version": "0.17.4", |             "version": "0.17.4", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT", |             "license": "MIT", | ||||||
|             "dependencies": { |             "dependencies": { | ||||||
|                 "@types/mime": "^1", |                 "@types/mime": "^1", | ||||||
|  | @ -1804,7 +1777,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/@types/serve-static": { |         "node_modules/@types/serve-static": { | ||||||
|             "version": "1.15.7", |             "version": "1.15.7", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT", |             "license": "MIT", | ||||||
|             "dependencies": { |             "dependencies": { | ||||||
|                 "@types/http-errors": "*", |                 "@types/http-errors": "*", | ||||||
|  | @ -2498,7 +2470,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/agent-base": { |         "node_modules/agent-base": { | ||||||
|             "version": "7.1.3", |             "version": "7.1.3", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT", |             "license": "MIT", | ||||||
|             "engines": { |             "engines": { | ||||||
|                 "node": ">= 14" |                 "node": ">= 14" | ||||||
|  | @ -2636,7 +2607,6 @@ | ||||||
|             "version": "1.8.2", |             "version": "1.8.2", | ||||||
|             "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.2.tgz", |             "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.2.tgz", | ||||||
|             "integrity": "sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==", |             "integrity": "sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==", | ||||||
|             "version": "1.8.1", |  | ||||||
|             "license": "MIT", |             "license": "MIT", | ||||||
|             "dependencies": { |             "dependencies": { | ||||||
|                 "follow-redirects": "^1.15.6", |                 "follow-redirects": "^1.15.6", | ||||||
|  | @ -3135,7 +3105,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/color-name": { |         "node_modules/color-name": { | ||||||
|             "version": "1.1.4", |             "version": "1.1.4", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT" |             "license": "MIT" | ||||||
|         }, |         }, | ||||||
|         "node_modules/color-string": { |         "node_modules/color-string": { | ||||||
|  | @ -3315,7 +3284,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/cssstyle": { |         "node_modules/cssstyle": { | ||||||
|             "version": "4.2.1", |             "version": "4.2.1", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT", |             "license": "MIT", | ||||||
|             "dependencies": { |             "dependencies": { | ||||||
|                 "@asamuzakjp/css-color": "^2.8.2", |                 "@asamuzakjp/css-color": "^2.8.2", | ||||||
|  | @ -3331,7 +3299,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/data-urls": { |         "node_modules/data-urls": { | ||||||
|             "version": "5.0.0", |             "version": "5.0.0", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT", |             "license": "MIT", | ||||||
|             "dependencies": { |             "dependencies": { | ||||||
|                 "whatwg-mimetype": "^4.0.0", |                 "whatwg-mimetype": "^4.0.0", | ||||||
|  | @ -3367,7 +3334,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/decimal.js": { |         "node_modules/decimal.js": { | ||||||
|             "version": "10.5.0", |             "version": "10.5.0", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT" |             "license": "MIT" | ||||||
|         }, |         }, | ||||||
|         "node_modules/decompress-response": { |         "node_modules/decompress-response": { | ||||||
|  | @ -4804,7 +4770,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/html-encoding-sniffer": { |         "node_modules/html-encoding-sniffer": { | ||||||
|             "version": "4.0.0", |             "version": "4.0.0", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT", |             "license": "MIT", | ||||||
|             "dependencies": { |             "dependencies": { | ||||||
|                 "whatwg-encoding": "^3.1.1" |                 "whatwg-encoding": "^3.1.1" | ||||||
|  | @ -4845,7 +4810,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/http-proxy-agent": { |         "node_modules/http-proxy-agent": { | ||||||
|             "version": "7.0.2", |             "version": "7.0.2", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT", |             "license": "MIT", | ||||||
|             "dependencies": { |             "dependencies": { | ||||||
|                 "agent-base": "^7.1.0", |                 "agent-base": "^7.1.0", | ||||||
|  | @ -4857,7 +4821,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/https-proxy-agent": { |         "node_modules/https-proxy-agent": { | ||||||
|             "version": "7.0.6", |             "version": "7.0.6", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT", |             "license": "MIT", | ||||||
|             "dependencies": { |             "dependencies": { | ||||||
|                 "agent-base": "^7.1.2", |                 "agent-base": "^7.1.2", | ||||||
|  | @ -5097,7 +5060,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/is-potential-custom-element-name": { |         "node_modules/is-potential-custom-element-name": { | ||||||
|             "version": "1.0.1", |             "version": "1.0.1", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT" |             "license": "MIT" | ||||||
|         }, |         }, | ||||||
|         "node_modules/is-promise": { |         "node_modules/is-promise": { | ||||||
|  | @ -5250,7 +5212,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/jsdom": { |         "node_modules/jsdom": { | ||||||
|             "version": "26.0.0", |             "version": "26.0.0", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT", |             "license": "MIT", | ||||||
|             "dependencies": { |             "dependencies": { | ||||||
|                 "cssstyle": "^4.2.1", |                 "cssstyle": "^4.2.1", | ||||||
|  | @ -5289,12 +5250,20 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/jsdom/node_modules/xml-name-validator": { |         "node_modules/jsdom/node_modules/xml-name-validator": { | ||||||
|             "version": "5.0.0", |             "version": "5.0.0", | ||||||
|             "dev": true, |  | ||||||
|             "license": "Apache-2.0", |             "license": "Apache-2.0", | ||||||
|             "engines": { |             "engines": { | ||||||
|                 "node": ">=18" |                 "node": ">=18" | ||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
|  |         "node_modules/jsep": { | ||||||
|  |             "version": "1.4.0", | ||||||
|  |             "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", | ||||||
|  |             "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", | ||||||
|  |             "license": "MIT", | ||||||
|  |             "engines": { | ||||||
|  |                 "node": ">= 10.16.0" | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|         "node_modules/jsesc": { |         "node_modules/jsesc": { | ||||||
|             "version": "3.1.0", |             "version": "3.1.0", | ||||||
|             "dev": true, |             "dev": true, | ||||||
|  | @ -5350,6 +5319,24 @@ | ||||||
|                 "graceful-fs": "^4.1.6" |                 "graceful-fs": "^4.1.6" | ||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
|  |         "node_modules/jsonpath-plus": { | ||||||
|  |             "version": "10.3.0", | ||||||
|  |             "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.3.0.tgz", | ||||||
|  |             "integrity": "sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA==", | ||||||
|  |             "license": "MIT", | ||||||
|  |             "dependencies": { | ||||||
|  |                 "@jsep-plugin/assignment": "^1.3.0", | ||||||
|  |                 "@jsep-plugin/regex": "^1.0.4", | ||||||
|  |                 "jsep": "^1.4.0" | ||||||
|  |             }, | ||||||
|  |             "bin": { | ||||||
|  |                 "jsonpath": "bin/jsonpath-cli.js", | ||||||
|  |                 "jsonpath-plus": "bin/jsonpath-cli.js" | ||||||
|  |             }, | ||||||
|  |             "engines": { | ||||||
|  |                 "node": ">=18.0.0" | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|         "node_modules/jsonwebtoken": { |         "node_modules/jsonwebtoken": { | ||||||
|             "version": "9.0.2", |             "version": "9.0.2", | ||||||
|             "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", |             "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", | ||||||
|  | @ -5663,7 +5650,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/lru-cache": { |         "node_modules/lru-cache": { | ||||||
|             "version": "10.4.3", |             "version": "10.4.3", | ||||||
|             "dev": true, |  | ||||||
|             "license": "ISC" |             "license": "ISC" | ||||||
|         }, |         }, | ||||||
|         "node_modules/lru-memoizer": { |         "node_modules/lru-memoizer": { | ||||||
|  | @ -6399,7 +6385,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/nwsapi": { |         "node_modules/nwsapi": { | ||||||
|             "version": "2.2.16", |             "version": "2.2.16", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT" |             "license": "MIT" | ||||||
|         }, |         }, | ||||||
|         "node_modules/object-assign": { |         "node_modules/object-assign": { | ||||||
|  | @ -6579,7 +6564,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/parse5": { |         "node_modules/parse5": { | ||||||
|             "version": "7.2.1", |             "version": "7.2.1", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT", |             "license": "MIT", | ||||||
|             "dependencies": { |             "dependencies": { | ||||||
|                 "entities": "^4.5.0" |                 "entities": "^4.5.0" | ||||||
|  | @ -7049,7 +7033,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/punycode": { |         "node_modules/punycode": { | ||||||
|             "version": "2.3.1", |             "version": "2.3.1", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT", |             "license": "MIT", | ||||||
|             "engines": { |             "engines": { | ||||||
|                 "node": ">=6" |                 "node": ">=6" | ||||||
|  | @ -7354,7 +7337,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/rrweb-cssom": { |         "node_modules/rrweb-cssom": { | ||||||
|             "version": "0.8.0", |             "version": "0.8.0", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT" |             "license": "MIT" | ||||||
|         }, |         }, | ||||||
|         "node_modules/run-applescript": { |         "node_modules/run-applescript": { | ||||||
|  | @ -7422,7 +7404,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/saxes": { |         "node_modules/saxes": { | ||||||
|             "version": "6.0.0", |             "version": "6.0.0", | ||||||
|             "dev": true, |  | ||||||
|             "license": "ISC", |             "license": "ISC", | ||||||
|             "dependencies": { |             "dependencies": { | ||||||
|                 "xmlchars": "^2.2.0" |                 "xmlchars": "^2.2.0" | ||||||
|  | @ -8042,7 +8023,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/symbol-tree": { |         "node_modules/symbol-tree": { | ||||||
|             "version": "3.2.4", |             "version": "3.2.4", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT" |             "license": "MIT" | ||||||
|         }, |         }, | ||||||
|         "node_modules/synckit": { |         "node_modules/synckit": { | ||||||
|  | @ -8170,7 +8150,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/tldts": { |         "node_modules/tldts": { | ||||||
|             "version": "6.1.77", |             "version": "6.1.77", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT", |             "license": "MIT", | ||||||
|             "dependencies": { |             "dependencies": { | ||||||
|                 "tldts-core": "^6.1.77" |                 "tldts-core": "^6.1.77" | ||||||
|  | @ -8181,7 +8160,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/tldts-core": { |         "node_modules/tldts-core": { | ||||||
|             "version": "6.1.77", |             "version": "6.1.77", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT" |             "license": "MIT" | ||||||
|         }, |         }, | ||||||
|         "node_modules/to-regex-range": { |         "node_modules/to-regex-range": { | ||||||
|  | @ -8211,7 +8189,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/tough-cookie": { |         "node_modules/tough-cookie": { | ||||||
|             "version": "5.1.1", |             "version": "5.1.1", | ||||||
|             "dev": true, |  | ||||||
|             "license": "BSD-3-Clause", |             "license": "BSD-3-Clause", | ||||||
|             "dependencies": { |             "dependencies": { | ||||||
|                 "tldts": "^6.1.32" |                 "tldts": "^6.1.32" | ||||||
|  | @ -8222,7 +8199,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/tr46": { |         "node_modules/tr46": { | ||||||
|             "version": "5.0.0", |             "version": "5.0.0", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT", |             "license": "MIT", | ||||||
|             "dependencies": { |             "dependencies": { | ||||||
|                 "punycode": "^2.3.1" |                 "punycode": "^2.3.1" | ||||||
|  | @ -8416,7 +8392,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/undici-types": { |         "node_modules/undici-types": { | ||||||
|             "version": "6.20.0", |             "version": "6.20.0", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT" |             "license": "MIT" | ||||||
|         }, |         }, | ||||||
|         "node_modules/unicorn-magic": { |         "node_modules/unicorn-magic": { | ||||||
|  | @ -8913,24 +8888,6 @@ | ||||||
|                 "url": "https://opencollective.com/eslint" |                 "url": "https://opencollective.com/eslint" | ||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
|         "node_modules/vue-i18n": { |  | ||||||
|             "version": "10.0.5", |  | ||||||
|             "license": "MIT", |  | ||||||
|             "dependencies": { |  | ||||||
|                 "@intlify/core-base": "10.0.5", |  | ||||||
|                 "@intlify/shared": "10.0.5", |  | ||||||
|                 "@vue/devtools-api": "^6.5.0" |  | ||||||
|             }, |  | ||||||
|             "engines": { |  | ||||||
|                 "node": ">= 16" |  | ||||||
|             }, |  | ||||||
|             "funding": { |  | ||||||
|                 "url": "https://github.com/sponsors/kazupon" |  | ||||||
|             }, |  | ||||||
|             "peerDependencies": { |  | ||||||
|                 "vue": "^3.0.0" |  | ||||||
|             } |  | ||||||
|         }, |  | ||||||
|         "node_modules/vue-router": { |         "node_modules/vue-router": { | ||||||
|             "version": "4.5.0", |             "version": "4.5.0", | ||||||
|             "license": "MIT", |             "license": "MIT", | ||||||
|  | @ -8989,7 +8946,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/w3c-xmlserializer": { |         "node_modules/w3c-xmlserializer": { | ||||||
|             "version": "5.0.0", |             "version": "5.0.0", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT", |             "license": "MIT", | ||||||
|             "dependencies": { |             "dependencies": { | ||||||
|                 "xml-name-validator": "^5.0.0" |                 "xml-name-validator": "^5.0.0" | ||||||
|  | @ -9000,7 +8956,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/w3c-xmlserializer/node_modules/xml-name-validator": { |         "node_modules/w3c-xmlserializer/node_modules/xml-name-validator": { | ||||||
|             "version": "5.0.0", |             "version": "5.0.0", | ||||||
|             "dev": true, |  | ||||||
|             "license": "Apache-2.0", |             "license": "Apache-2.0", | ||||||
|             "engines": { |             "engines": { | ||||||
|                 "node": ">=18" |                 "node": ">=18" | ||||||
|  | @ -9008,7 +8963,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/webidl-conversions": { |         "node_modules/webidl-conversions": { | ||||||
|             "version": "7.0.0", |             "version": "7.0.0", | ||||||
|             "dev": true, |  | ||||||
|             "license": "BSD-2-Clause", |             "license": "BSD-2-Clause", | ||||||
|             "engines": { |             "engines": { | ||||||
|                 "node": ">=12" |                 "node": ">=12" | ||||||
|  | @ -9016,7 +8970,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/whatwg-encoding": { |         "node_modules/whatwg-encoding": { | ||||||
|             "version": "3.1.1", |             "version": "3.1.1", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT", |             "license": "MIT", | ||||||
|             "dependencies": { |             "dependencies": { | ||||||
|                 "iconv-lite": "0.6.3" |                 "iconv-lite": "0.6.3" | ||||||
|  | @ -9027,7 +8980,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/whatwg-encoding/node_modules/iconv-lite": { |         "node_modules/whatwg-encoding/node_modules/iconv-lite": { | ||||||
|             "version": "0.6.3", |             "version": "0.6.3", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT", |             "license": "MIT", | ||||||
|             "dependencies": { |             "dependencies": { | ||||||
|                 "safer-buffer": ">= 2.1.2 < 3.0.0" |                 "safer-buffer": ">= 2.1.2 < 3.0.0" | ||||||
|  | @ -9038,7 +8990,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/whatwg-mimetype": { |         "node_modules/whatwg-mimetype": { | ||||||
|             "version": "4.0.0", |             "version": "4.0.0", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT", |             "license": "MIT", | ||||||
|             "engines": { |             "engines": { | ||||||
|                 "node": ">=18" |                 "node": ">=18" | ||||||
|  | @ -9046,7 +8997,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/whatwg-url": { |         "node_modules/whatwg-url": { | ||||||
|             "version": "14.1.1", |             "version": "14.1.1", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT", |             "license": "MIT", | ||||||
|             "dependencies": { |             "dependencies": { | ||||||
|                 "tr46": "^5.0.0", |                 "tr46": "^5.0.0", | ||||||
|  | @ -9289,7 +9239,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/ws": { |         "node_modules/ws": { | ||||||
|             "version": "8.18.0", |             "version": "8.18.0", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT", |             "license": "MIT", | ||||||
|             "engines": { |             "engines": { | ||||||
|                 "node": ">=10.0.0" |                 "node": ">=10.0.0" | ||||||
|  | @ -9317,7 +9266,6 @@ | ||||||
|         }, |         }, | ||||||
|         "node_modules/xmlchars": { |         "node_modules/xmlchars": { | ||||||
|             "version": "2.2.0", |             "version": "2.2.0", | ||||||
|             "dev": true, |  | ||||||
|             "license": "MIT" |             "license": "MIT" | ||||||
|         }, |         }, | ||||||
|         "node_modules/xtend": { |         "node_modules/xtend": { | ||||||
|  |  | ||||||
		Reference in a new issue
	
	 Gerald Schmittinger
						Gerald Schmittinger