Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .tool-versions
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Tool versions for Stratos development
# Used by asdf and other version managers
# Use latest stable versions
nodejs 24.11.0
bun 1.3.2
nodejs 26.2.0
bun 1.3.14
6 changes: 3 additions & 3 deletions build/check-versions.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@
* before running tests. This ensures test compatibility across different
* development environments.
*
* Required versions:
* - Node.js: 24.x
* - Bun: 1.2.13 - 1.2.x (NOT 1.3.x due to breaking changes)
* Required versions (see .tool-versions for the exact pins):
* - Node.js: 24.x or 26.x
* - Bun: 1.3.14+ (vitest runs on the bun runtime via `bunx --bun`)
*/

const fs = require('fs');
Expand Down
196 changes: 155 additions & 41 deletions bun.lock

Large diffs are not rendered by default.

86 changes: 43 additions & 43 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -46,24 +46,24 @@
"start-dev": "ng serve --aot=false",
"test-clean": "./build/clean-test-reports.sh",
"test-reports": "./build/show-test-reports.sh",
"test": "NODE_OPTIONS=\"--localstorage-file=/tmp/stratos-vitest-localstorage-$$\" vitest run --dangerouslyIgnoreUnhandledErrors --project=core --project=store --project=cloud-foundry --project=kubernetes --project=cf-autoscaler --project=git --project=shared --project=extension",
"test:ui": "NODE_OPTIONS=\"--localstorage-file=/tmp/stratos-vitest-localstorage-$$\" vitest --ui",
"test:watch": "NODE_OPTIONS=\"--localstorage-file=/tmp/stratos-vitest-localstorage-$$\" vitest",
"test:coverage": "NODE_OPTIONS=\"--localstorage-file=/tmp/stratos-vitest-localstorage-$$\" vitest run --coverage",
"test:core": "NODE_OPTIONS=\"--localstorage-file=/tmp/stratos-vitest-localstorage-$$\" vitest run --project=core",
"test:store": "NODE_OPTIONS=\"--localstorage-file=/tmp/stratos-vitest-localstorage-$$\" vitest run --project=store",
"test:cloud-foundry": "NODE_OPTIONS=\"--localstorage-file=/tmp/stratos-vitest-localstorage-$$\" vitest run --project=cloud-foundry",
"test:kubernetes": "NODE_OPTIONS=\"--localstorage-file=/tmp/stratos-vitest-localstorage-$$\" vitest run --project=kubernetes",
"test:cf-autoscaler": "NODE_OPTIONS=\"--localstorage-file=/tmp/stratos-vitest-localstorage-$$\" vitest run --project=cf-autoscaler",
"test:git": "NODE_OPTIONS=\"--localstorage-file=/tmp/stratos-vitest-localstorage-$$\" vitest run --project=git",
"test:shared": "NODE_OPTIONS=\"--localstorage-file=/tmp/stratos-vitest-localstorage-$$\" vitest run --project=shared",
"test:extension": "NODE_OPTIONS=\"--localstorage-file=/tmp/stratos-vitest-localstorage-$$\" vitest run --project=extension",
"test-frontend:core": "NODE_OPTIONS=\"--localstorage-file=/tmp/stratos-vitest-localstorage-$$\" vitest run --project=core",
"test-frontend:store": "NODE_OPTIONS=\"--localstorage-file=/tmp/stratos-vitest-localstorage-$$\" vitest run --project=store",
"test-frontend:cloud-foundry": "NODE_OPTIONS=\"--localstorage-file=/tmp/stratos-vitest-localstorage-$$\" vitest run --project=cloud-foundry",
"test-frontend:cf-autoscaler": "NODE_OPTIONS=\"--localstorage-file=/tmp/stratos-vitest-localstorage-$$\" vitest run --project=cf-autoscaler",
"test-frontend:kubernetes": "NODE_OPTIONS=\"--localstorage-file=/tmp/stratos-vitest-localstorage-$$\" vitest run --project=kubernetes",
"test-frontend:git": "NODE_OPTIONS=\"--localstorage-file=/tmp/stratos-vitest-localstorage-$$\" vitest run --project=git",
"test": "vitest run --dangerouslyIgnoreUnhandledErrors --project=core --project=store --project=cloud-foundry --project=kubernetes --project=cf-autoscaler --project=git --project=shared --project=extension",
"test:ui": "vitest --ui",
"test:watch": "vitest",
"test:coverage": "vitest run --coverage",
"test:core": "vitest run --project=core",
"test:store": "vitest run --project=store",
"test:cloud-foundry": "vitest run --project=cloud-foundry",
"test:kubernetes": "vitest run --project=kubernetes",
"test:cf-autoscaler": "vitest run --project=cf-autoscaler",
"test:git": "vitest run --project=git",
"test:shared": "vitest run --project=shared",
"test:extension": "vitest run --project=extension",
"test-frontend:core": "vitest run --project=core",
"test-frontend:store": "vitest run --project=store",
"test-frontend:cloud-foundry": "vitest run --project=cloud-foundry",
"test-frontend:cf-autoscaler": "vitest run --project=cf-autoscaler",
"test-frontend:kubernetes": "vitest run --project=kubernetes",
"test-frontend:git": "vitest run --project=git",
"posttest": "echo 'Coverage reports in coverage/ directory'",
"codecov": "codecov -f coverage/coverage-final.json -F frontend",
"codecov-backend": "codecov -f src/jetstream/coverage.txt -F backend",
Expand Down Expand Up @@ -111,7 +111,7 @@
},
"dependencies": {
"@angular/animations": "21.2.8",
"@angular/cdk": "^21.2.6",
"@angular/cdk": "^21.2.13",
"@angular/common": "21.2.8",
"@angular/core": "21.2.8",
"@angular/forms": "21.2.8",
Expand All @@ -125,9 +125,9 @@
"@ngrx/store": "21.1.0",
"@ngrx/store-devtools": "21.1.0",
"@swimlane/ngx-graph": "11.0.0",
"chart.js": "^4.5.0",
"chart.js": "^4.5.1",
"core-js": "3.45.0",
"date-fns": "^4.1.0",
"date-fns": "^4.3.0",
"date-fns-tz": "^3.2.0",
"immer": "10.1.1",
"intersect": "1.0.1",
Expand All @@ -150,14 +150,14 @@
"xterm-addon-fit": "0.9.0-beta.37"
},
"engines": {
"node": "^24.0",
"node": "^24 || ^26",
"npm": ">=8.3",
"bun": ">=1.2.0"
"bun": ">=1.3.14"
},
"devDependencies": {
"@analogjs/vite-plugin-angular": "^2.4.4",
"@analogjs/vitest-angular": "^2.4.4",
"@angular-builders/custom-webpack": "^21.0.0",
"@analogjs/vite-plugin-angular": "^2.5.2",
"@analogjs/vitest-angular": "^2.5.2",
"@angular-builders/custom-webpack": "^21.0.3",
"@angular-devkit/architect": "0.2102.7",
"@angular-devkit/build-angular": "21.2.7",
"@angular-devkit/core": "21.2.7",
Expand All @@ -171,11 +171,11 @@
"@angular/compiler-cli": "21.2.8",
"@angular/language-service": "21.2.8",
"@cypress/request": "3.0.9",
"@playwright/test": "^1.49.1",
"@playwright/test": "^1.60.0",
"@schematics/angular": "21.2.7",
"@tailwindcss/forms": "^0.5.10",
"@tailwindcss/forms": "^0.5.11",
"@tailwindcss/postcss": "^4.3.0",
"@tailwindcss/typography": "^0.5.16",
"@tailwindcss/typography": "^0.5.19",
"@types/d3-dispatch": "^3.0.7",
"@types/d3-drag": "^3.0.7",
"@types/d3-scale": "^4.0.9",
Expand All @@ -186,43 +186,43 @@
"@types/node": "24.2.1",
"@types/pngjs": "^6.0.5",
"@types/webpack": "^5.28.5",
"@typescript-eslint/eslint-plugin": "^8.57.2",
"@typescript-eslint/parser": "^8.57.2",
"@vitest/coverage-v8": "^4.1.4",
"@typescript-eslint/eslint-plugin": "^8.60.0",
"@typescript-eslint/parser": "^8.60.0",
"@vitest/coverage-v8": "^4.1.7",
"@vitest/ui": "3.1.1",
"acorn": "8.15.0",
"adm-zip": "0.5.16",
"angular-eslint": "20.7.0",
"autoprefixer": "^10.4.21",
"baseline-browser-mapping": "^2.10.8",
"autoprefixer": "^10.5.0",
"baseline-browser-mapping": "^2.10.32",
"browserstack-local": "1.5.13",
"codecov": "3.8.2",
"copy-webpack-plugin": "13.0.1",
"delete": "1.1.0",
"eslint": "9",
"eslint": "^9.39.4",
"fs-extra": "11.3.1",
"globby": "14.1.0",
"happy-dom": "^20.8.9",
"happy-dom": "^20.9.0",
"js-yaml": "4.1.1",
"jsdom": "^27.1.0",
"jsdom": "^27.4.0",
"json-schema-to-typescript": "15.0.4",
"kind-of": "6.0.3",
"mem": "9.0.2",
"mktemp": "2.0.1",
"ng-packagr": "20.1.0",
"npm-run-all": "4.1.5",
"nyc": "17.1.0",
"pixelmatch": "^7.1.0",
"pixelmatch": "^7.2.0",
"pngjs": "^7.0.0",
"ps-node": "0.1.6",
"q": "^1.4.1",
"q": "^1.5.1",
"rxjs-tslint": "0.1.8",
"sass": "^1.32.13",
"sass-loader": "^13.3.2",
"sass": "^1.100.0",
"sass-loader": "^13.3.3",
"tailwindcss": "^4.3.0",
"tslint": "5.20.1",
"typescript": "^5.9.3",
"typescript-eslint": "^8.58.0",
"vitest": "^4.1.4"
"typescript-eslint": "^8.60.0",
"vitest": "^4.1.7"
}
}
7 changes: 4 additions & 3 deletions src/frontend/packages/core/src/test-setup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -287,9 +287,10 @@ class LocalStorageMock implements Storage {
}

getItem(key: string): string | null {
// Return empty string instead of null to avoid issues with code that doesn't handle null
// This is a test-friendly behavior while still being technically compliant with Storage interface
return this.store.get(key) ?? '';
// Spec-compliant: the Storage interface returns null for a missing key (real
// browsers and node's webstorage do). Returning '' here diverged from that and
// broke `.toBeNull()` assertions once the --localstorage-file flag was dropped.
return this.store.get(key) ?? null;
}

key(index: number): string | null {
Expand Down
7 changes: 4 additions & 3 deletions src/frontend/vitest.workspace.setup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,10 @@ class LocalStorageMock implements Storage {
}

getItem(key: string): string | null {
// Return empty string instead of null to avoid issues with code that doesn't handle null
// This is a test-friendly behavior while still being technically compliant with Storage interface
return this.store.get(key) ?? '';
// Spec-compliant: the Storage interface returns null for a missing key (real
// browsers and node's webstorage do). Returning '' here diverged from that and
// broke `.toBeNull()` assertions once the --localstorage-file flag was dropped.
return this.store.get(key) ?? null;
}

key(index: number): string | null {
Expand Down
Loading