Skip to content
Open
Show file tree
Hide file tree
Changes from 30 commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
8ab8529
Development: upgrade Angular 22, TypeScript 6, PrimeNG 22 and major c…
krusche Jun 30, 2026
fb2f1cf
Development: only require the angular21 OpenAPI generator for openApi…
krusche Jun 30, 2026
0fdba1e
Merge develop into chore/major-dependency-updates
krusche Jun 30, 2026
6976328
Development: fix client spec type-checking after the dependency upgrade
krusche Jun 30, 2026
0e41384
Development: fix Vitest unhandled errors under zoneless change detection
krusche Jun 30, 2026
299f0e4
Development: resolve the angular21 OpenAPI generator from a shared lo…
krusche Jun 30, 2026
dae6740
Development: resolve the angular21 OpenAPI generator from Maven Central
krusche Jun 30, 2026
352d486
Development: fix non-JSON GET responseType + PrimeNG 22 dialog footer
krusche Jun 30, 2026
dd744b1
Merge remote-tracking branch 'origin/develop' into chore/major-depend…
krusche Jul 2, 2026
99e08f5
Fix checklist-panel spec for regenerated string-literal enum model
krusche Jul 2, 2026
2090f7c
Merge develop into chore/major-dependency-updates
krusche Jul 3, 2026
6f8bade
Development: rename remaining p-splitterpanel selectors for PrimeNG 22
krusche Jul 3, 2026
7228c67
Merge develop into chore/major-dependency-updates
krusche Jul 3, 2026
00f9149
Development: fix spec typecheck under TypeScript 6
krusche Jul 3, 2026
34f7b91
Development: Address review feedback for Angular 22 upgrade
krusche Jul 3, 2026
9e010b9
Merge develop into chore/major-dependency-updates
krusche Jul 9, 2026
d5ce10c
chore: update client dependencies to their latest versions
krusche Jul 9, 2026
264d520
chore: bump PrimeNG to 22.0.0-rc.2
krusche Jul 9, 2026
16ac54a
Development: Keep PrimeNG 21 (MIT) on the Angular 22 upgrade
krusche Jul 9, 2026
f6e019f
build: adjust plagiarism/programming client coverage thresholds
krusche Jul 10, 2026
e36b102
build: adjust admin/atlas/quiz client coverage thresholds
krusche Jul 10, 2026
4026b67
Development: Register the service worker immediately (fix E2E CDP flood)
krusche Jul 10, 2026
dc65c58
Revert "Register the service worker immediately"
krusche Jul 10, 2026
7f4196e
test(e2e): eagerly buffer API response bodies to avoid CDP getRespons…
krusche Jul 11, 2026
5bc62af
Merge develop into feature/angular22-on-primeng21
krusche Jul 11, 2026
60a44b9
test(e2e): enlarge CDP network buffer to fix getResponseBody eviction
krusche Jul 11, 2026
6d2217c
PrimeNG 21: use the .p-splitterpanel class (not PrimeNG 22's .p-split…
krusche Jul 11, 2026
10ced20
Development: Adopt openapi-generator-angular22 1.0.0 (incl. generator…
krusche Jul 11, 2026
da6da18
Fix stale openapi model imports in tutorialgroup test helpers
krusche Jul 11, 2026
2dfa833
E2E: [experiment] warm JS/CSS chunks in-context to cut getResponseBod…
krusche Jul 12, 2026
535b119
E2E: resilient response-body reads to survive CDP getResponseBody evi…
krusche Jul 12, 2026
712a4f8
Merge remote-tracking branch 'origin/develop' into feature/angular22-…
krusche Jul 12, 2026
87825fe
Development: Align Playwright pnpm version and silence TS 6 moduleRes…
krusche Jul 12, 2026
903fedc
Development: Remove orphaned setupTestBed call left by the develop merge
krusche Jul 12, 2026
1e7c380
Merge branch 'develop' into feature/angular22-on-primeng21
krusche Jul 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
8 changes: 4 additions & 4 deletions .env
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ NGINX_IMAGE_VARIANT=-alpine-slim
# Testing
ALPINE_VERSION=3.23.4
# Used for both the Docker image and @playwright/test in src/test/playwright/package.json
PLAYWRIGHT_VERSION=v1.60.0
PLAYWRIGHT_VERSION=v1.61.1

# Monitoring
# TODO: Upgrade Prometheus to v3.x (breaking config changes, v2 is EOL). See https://prometheus.io/docs/prometheus/latest/migration/
Expand All @@ -60,6 +60,6 @@ KEYCLOAK_VERSION=26.6
# Run `node supporting_scripts/sync-client-versions.mjs` after changing these.
# Note: ANGULAR_VERSION does not update all Angular-related packages; Angular CDK/Material, CLI,
# and build tooling are excluded from automatic syncing and may need separate updates.
ANGULAR_ESLINT_VERSION=21.4.0
ANGULAR_VERSION=21.2.16
TYPESCRIPT_ESLINT_VERSION=8.60.1
ANGULAR_ESLINT_VERSION=22.0.0
ANGULAR_VERSION=22.0.6
TYPESCRIPT_ESLINT_VERSION=8.63.0
23 changes: 23 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,29 @@ buildscript {
force "com.github.jknack:handlebars:4.5.3"
}
}
// The custom OpenAPI generator (generatorName "angular22", https://github.com/ls1intum/openapi-generator-angular22)
// is only needed when regenerating the Angular client locally via `./gradlew openApiGenerate`. The
// generated client is committed, so CI never regenerates it and must not try to resolve this
// artifact. The generator + Maven Local are therefore added to the buildscript classpath solely for
// that task (so the org.openapi.generator plugin discovers it via ServiceLoader during regeneration).
//
// The generator is published to Maven Central (no authentication needed). To regenerate the client
// it is resolved from either:
// 1. Maven Central — the released artifact, resolved with no credentials. OR
// 2. Maven Local — clone the generator repo and run `./gradlew publishToMavenLocal` there; this
// build-from-source path needs no registry and works before a version reaches Central.
if (gradle.startParameter.taskNames.any { it.toLowerCase().contains("openapigenerate") }) {
repositories {
// Build-from-source fallback — checked first so a locally-built generator is picked up
// without network access (and works before a release is on Maven Central).
mavenLocal()
// Released generator artifact, published to Maven Central and resolved without authentication.
mavenCentral()
}
dependencies {
classpath "de.tum.cit.aet:openapi-generator-angular22:1.0.0"
}
}
dependencies {
// Force the entire Jackson 2.x family to 2.22.0 on the build-script / plugin classpath too.
// The org.openapi.generator and springdoc plugins otherwise drag in older jackson-databind
Expand Down
5 changes: 4 additions & 1 deletion eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,10 @@ export default tseslint.config(
rules: {
...prettierPlugin.configs.recommended.rules,
...tsPlugin.configs.recommended.rules,
...angularPlugin.configs.recommended.rules,
// angular-eslint 22 removed `configs` from `@angular-eslint/eslint-plugin`; the recommended
// rules now live in the `angular-eslint` meta-package's flat `tsRecommended` config array
// (an array of flat-config objects, only one of which carries `rules`).
...Object.assign({}, ...angular.configs.tsRecommended.map((c) => c.rules ?? {})),
'@typescript-eslint/no-non-null-assertion': 'off',
'@typescript-eslint/no-unsafe-return': 'off',
'@typescript-eslint/no-unsafe-member-access': 'off',
Expand Down
19 changes: 15 additions & 4 deletions gradle/openapi.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,15 @@
// 5. Post-process the generated files to remove leading underscores and numeric suffixes from method names
// 6. Remove unused imports from the generated TypeScript files to satisfy our tsconfig.

// The Angular client is generated by our custom de.tum.cit.aet:openapi-generator-angular22:1.0.0
// generator (generatorName "angular22"): standalone, inject()-based services (no constructor
// injection — required for the AnalogJS fastCompile test runner under Angular 22) and
// signal/readonly-aware models. The generator is added to the buildscript classpath (only for the
// openApiGenerate task) in the root build.gradle, which also documents how to obtain it (Maven
// Central — no auth — or build-from-source via publishToMavenLocal). The generated client is
// committed, so CI never runs openApiGenerate.
openApiGenerate {
generatorName = "typescript-angular"
generatorName = "angular22"
inputSpec.set(file("${rootDir}/openapi/openapi.yaml").toURI().toString())
outputDir = "${rootDir}/src/main/webapp/app/openapi"
apiPackage = "api"
Expand All @@ -79,10 +86,14 @@
set: 'Array',
]
languageSpecificPrimitives =['void']
// useHttpResource=false: classical HttpClient.get() Observable methods (not the signal-based
// httpResource API). useInjectFunction=true: inject() instead of constructor injection.
// readonlyModels=false: keep DTO properties mutable (Artemis builds/edits DTOs in place).
configOptions = [
serviceSuffix: "ApiService",
supportsES6: "true",
serviceFileSuffix: "Api.service"
useHttpResource : "false",
useInjectFunction: "true",
separateResources: "false",
readonlyModels : "false"
]
}

Expand Down
92 changes: 46 additions & 46 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,33 +8,33 @@
"email": "krusche@tum.de",
"url": "https://aet.cit.tum.de/krusche"
},
"packageManager": "pnpm@11.9.0",
"packageManager": "pnpm@11.10.0",
Comment thread
krusche marked this conversation as resolved.
"dependencies": {
"@angular/cdk": "21.2.14",
"@angular/common": "21.2.17",
"@angular/compiler": "21.2.17",
"@angular/core": "21.2.17",
"@angular/forms": "21.2.17",
"@angular/platform-browser": "21.2.17",
"@angular/platform-browser-dynamic": "21.2.17",
"@angular/router": "21.2.17",
"@angular/service-worker": "21.2.17",
"@angular/youtube-player": "21.2.14",
"@angular/cdk": "22.0.4",
"@angular/common": "22.0.6",
"@angular/compiler": "22.0.6",
"@angular/core": "22.0.6",
"@angular/forms": "22.0.6",
"@angular/platform-browser": "22.0.6",
"@angular/platform-browser-dynamic": "22.0.6",
"@angular/router": "22.0.6",
"@angular/service-worker": "22.0.6",
"@angular/youtube-player": "22.0.4",
"@ctrl/ngx-emoji-mart": "9.3.0",
"@dagrejs/dagre": "3.0.0",
"@e965/xlsx": "0.20.3",
"@embedpdf/engines": "2.14.4",
"@embedpdf/models": "2.14.4",
"@embedpdf/pdfium": "2.14.4",
"@fingerprintjs/fingerprintjs": "5.2.0",
"@fortawesome/angular-fontawesome": "4.0.0",
"@fortawesome/fontawesome-svg-core": "7.2.0",
"@fortawesome/free-regular-svg-icons": "7.2.0",
"@fortawesome/free-solid-svg-icons": "7.2.0",
"@ng-bootstrap/ng-bootstrap": "20.0.0",
"@ngx-translate/core": "17.0.0",
"@fortawesome/angular-fontawesome": "5.1.0",
"@fortawesome/fontawesome-svg-core": "7.3.0",
"@fortawesome/free-regular-svg-icons": "7.3.0",
"@fortawesome/free-solid-svg-icons": "7.3.0",
"@ng-bootstrap/ng-bootstrap": "21.0.0",
"@ngx-translate/core": "18.0.0",
"@primeuix/themes": "2.0.3",
"@sentry/angular": "10.57.0",
"@sentry/angular": "10.64.0",
"@stomp/rx-stomp": "2.4.0",
"@stomp/stompjs": "7.3.0",
"@tumaet/apollon": "5.0.1",
Expand All @@ -53,9 +53,9 @@
"html-diff-ts": "1.4.2",
"katex": "0.17.0",
"lodash-es": "4.18.1",
"markdown-it": "14.2.0",
"markdown-it": "14.3.0",
"monaco-editor": "0.55.1",
"papaparse": "5.5.3",
"papaparse": "5.5.4",
"primeicons": "7.0.0",
"primeng": "21.1.9",
"rxjs": "7.8.2",
Expand All @@ -66,56 +66,56 @@
"yjs": "13.6.31"
},
"devDependencies": {
"@analogjs/vite-plugin-angular": "2.6.1",
"@analogjs/vitest-angular": "2.6.1",
"@angular-devkit/build-angular": "21.2.16",
"@angular-eslint/builder": "21.4.0",
"@angular-eslint/eslint-plugin": "21.4.0",
"@angular-eslint/schematics": "21.4.0",
"@angular-eslint/template-parser": "21.4.0",
"@angular/build": "21.2.16",
"@angular/cli": "21.2.16",
"@angular/compiler-cli": "21.2.17",
"@angular/language-service": "21.2.17",
"@analogjs/vite-plugin-angular": "2.6.3",
"@analogjs/vitest-angular": "2.6.3",
"@angular-devkit/build-angular": "22.0.5",
"@angular-eslint/builder": "22.0.0",
"@angular-eslint/eslint-plugin": "22.0.0",
"@angular-eslint/schematics": "22.0.0",
"@angular-eslint/template-parser": "22.0.0",
"@angular/build": "22.0.5",
"@angular/cli": "22.0.5",
"@angular/compiler-cli": "22.0.6",
"@angular/language-service": "22.0.6",
"@eslint/js": "10.0.1",
"@tailwindcss/postcss": "4.3.1",
"@tailwindcss/postcss": "4.3.2",
"@types/d3-shape": "3.1.8",
"@types/lodash-es": "4.17.12",
"@types/markdown-it": "14.1.2",
"@types/node": "24.13.2",
"@types/node": "24.13.3",
"@types/papaparse": "5.5.2",
"@types/turndown": "5.0.6",
"@typescript-eslint/eslint-plugin": "8.61.1",
"@typescript-eslint/parser": "8.61.1",
"@typescript-eslint/utils": "8.61.1",
"@vitest/coverage-istanbul": "4.1.9",
"angular-eslint": "21.4.0",
"@typescript-eslint/eslint-plugin": "8.63.0",
"@typescript-eslint/parser": "8.63.0",
"@typescript-eslint/utils": "8.63.0",
"@vitest/coverage-istanbul": "4.1.10",
"angular-eslint": "22.0.0",
"cross-env": "10.1.0",
"esbuild": "0.28.1",
"eslint": "10.5.0",
"eslint": "10.6.0",
"eslint-plugin-prettier": "5.5.6",
"folder-hash": "4.1.3",
"husky": "9.1.7",
"jsdom": "29.1.1",
"lighthouse": "13.4.0",
"lint-staged": "17.0.7",
"lint-staged": "17.0.8",
"ng-mocks": "14.15.3",
"postcss-html": "1.8.1",
"postcss-scss": "4.0.9",
"prettier": "3.8.4",
"prettier": "3.9.4",
"rimraf": "6.1.3",
"sass": "1.101.0",
"stylelint": "17.13.0",
"stylelint": "17.14.0",
"stylelint-config-html": "1.1.0",
"stylelint-config-standard-scss": "17.0.0",
"stylelint-scss": "7.2.0",
"tailwindcss": "4.3.1",
"tailwindcss": "4.3.2",
"tailwindcss-primeui": "0.6.1",
"ts-morph": "28.0.0",
"typescript": "5.9.3",
"typescript-eslint": "8.61.1",
"typescript": "6.0.3",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@krusche [medium] The TypeScript 6 bump makes the Playwright pretest fail before any browser tests can run. src/test/playwright/tsconfig.json still sets moduleResolution: "node", which TS 6 reports as TS5107 unless this project opts into ignoreDeprecations: "6.0" or moves off the deprecated alias. I reproduced it with corepack pnpm@11.10.0 exec tsc --noEmit -p src/test/playwright/tsconfig.json.\n\n

🤖 Prompt for AI agents\n\nIn src/test/playwright/tsconfig.json, moduleResolution: "node" now fails under TypeScript 6 with TS5107 during the Playwright pretest. Fix this by adding "ignoreDeprecations": "6.0" to that Playwright tsconfig or by replacing the deprecated module resolution setting with a TypeScript-6-compatible one, then verify tsc --noEmit -p src/test/playwright/tsconfig.json passes.\n\n

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 87825fe: added "ignoreDeprecations": "6.0" to src/test/playwright/tsconfig.json so TypeScript 6 no longer reports TS5107 on the deprecated moduleResolution: "node", and the Playwright pretest type-checks again.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@krusche This fixes the TS5107 warning, but the verification command from the thread still does not pass: corepack pnpm@11.10.0 exec tsc --noEmit -p src/test/playwright/tsconfig.json now fails with TS6059/rootDir errors from the app imports under src/main/webapp. Please keep this thread open until that command succeeds.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@krusche This is still failing on current HEAD: corepack pnpm@11.10.0 exec tsc --noEmit -p src/test/playwright/tsconfig.json reports TS6059 rootDir errors for the src/main/webapp imports and TS2307 module-resolution errors for Playwright/Angular packages. The Playwright config needs to compile with the app imports it uses, not just silence TS5107.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@krusche This is still open on current HEAD. I reran corepack pnpm@11.10.0 exec tsc --noEmit -p src/test/playwright/tsconfig.json; it still fails with TS6059 rootDir errors for src/main/webapp imports, TS2307 module-resolution errors for Angular/Playwright packages, and stricter TS6 errors in the Playwright sources. The Playwright tsconfig needs to compile the files it imports before this thread can be resolved.

"typescript-eslint": "8.63.0",
"vite-tsconfig-paths": "6.1.1",
"vitest": "4.1.9",
"vitest": "4.1.10",
"vitest-canvas-mock": "1.1.4"
},
"engines": {
Expand Down
File renamed without changes.
Loading
Loading