();
}
diff --git a/angular-standalone/official/tabs/ionic.starter.json b/angular-standalone/official/tabs/ionic.starter.json
index 3c68e48ac..8c29cbd27 100644
--- a/angular-standalone/official/tabs/ionic.starter.json
+++ b/angular-standalone/official/tabs/ionic.starter.json
@@ -7,6 +7,6 @@
"www"
],
"scripts": {
- "test": "npm run lint && npm run build && npm run test -- --configuration=ci --browsers=ChromeHeadless"
+ "test": "npm run lint && npm run build && npm run test -- --configuration=ci"
}
}
diff --git a/angular-standalone/official/tabs/src/app/explore-container/explore-container.component.html b/angular-standalone/official/tabs/src/app/explore-container/explore-container.component.html
index a3fcb604f..c5e53d0f9 100644
--- a/angular-standalone/official/tabs/src/app/explore-container/explore-container.component.html
+++ b/angular-standalone/official/tabs/src/app/explore-container/explore-container.component.html
@@ -1,5 +1,5 @@
-
{{ name }}
+
{{ name() }}
Explore
();
}
diff --git a/angular/base/.eslintrc.json b/angular/base/.eslintrc.json
deleted file mode 100644
index 5215f5548..000000000
--- a/angular/base/.eslintrc.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "root": true,
- "ignorePatterns": ["projects/**/*"],
- "overrides": [
- {
- "files": ["*.ts"],
- "parserOptions": {
- "project": ["tsconfig.json"],
- "createDefaultProgram": true
- },
- "extends": [
- "plugin:@angular-eslint/recommended",
- "plugin:@angular-eslint/template/process-inline-templates"
- ],
- "rules": {
- "@angular-eslint/prefer-standalone": "off",
- "@angular-eslint/component-class-suffix": [
- "error",
- {
- "suffixes": ["Page", "Component"]
- }
- ],
- "@angular-eslint/component-selector": [
- "error",
- {
- "type": "element",
- "prefix": "app",
- "style": "kebab-case"
- }
- ],
- "@angular-eslint/directive-selector": [
- "error",
- {
- "type": "attribute",
- "prefix": "app",
- "style": "camelCase"
- }
- ]
- }
- },
- {
- "files": ["*.html"],
- "extends": ["plugin:@angular-eslint/template/recommended"],
- "rules": {}
- }
- ]
-}
diff --git a/angular/base/angular.json b/angular/base/angular.json
index e7c7b8888..8e8795972 100644
--- a/angular/base/angular.json
+++ b/angular/base/angular.json
@@ -11,12 +11,15 @@
"prefix": "app",
"architect": {
"build": {
- "builder": "@angular-devkit/build-angular:browser",
+ "builder": "@angular/build:application",
"options": {
- "outputPath": "www",
+ "outputPath": {
+ "base": "www",
+ "browser": ""
+ },
"index": "src/index.html",
- "main": "src/main.ts",
- "polyfills": "src/polyfills.ts",
+ "browser": "src/main.ts",
+ "polyfills": [],
"tsConfig": "tsconfig.app.json",
"inlineStyleLanguage": "scss",
"assets": [
@@ -57,9 +60,7 @@
"outputHashing": "all"
},
"development": {
- "buildOptimizer": false,
"optimization": false,
- "vendorChunk": true,
"extractLicenses": false,
"sourceMap": true,
"namedChunks": true
@@ -71,7 +72,7 @@
"defaultConfiguration": "production"
},
"serve": {
- "builder": "@angular-devkit/build-angular:dev-server",
+ "builder": "@angular/build:dev-server",
"configurations": {
"production": {
"buildTarget": "app:build:production"
@@ -86,37 +87,20 @@
"defaultConfiguration": "development"
},
"extract-i18n": {
- "builder": "@angular-devkit/build-angular:extract-i18n",
+ "builder": "@angular/build:extract-i18n",
"options": {
"buildTarget": "app:build"
}
},
"test": {
- "builder": "@angular-devkit/build-angular:karma",
+ "builder": "@angular/build:unit-test",
"options": {
- "main": "src/test.ts",
- "polyfills": "src/polyfills.ts",
"tsConfig": "tsconfig.spec.json",
- "karmaConfig": "karma.conf.js",
- "inlineStyleLanguage": "scss",
- "assets": [
- {
- "glob": "**/*",
- "input": "src/assets",
- "output": "assets"
- },
- {
- "glob": "**/*.svg",
- "input": "node_modules/ionicons/dist/ionicons/svg",
- "output": "./svg"
- }
- ],
- "styles": ["src/global.scss", "src/theme/variables.scss"],
- "scripts": []
+ "buildTarget": "::development",
+ "setupFiles": ["src/test-setup.ts"]
},
"configurations": {
"ci": {
- "progress": false,
"watch": false
}
}
diff --git a/angular/base/eslint.config.js b/angular/base/eslint.config.js
new file mode 100644
index 000000000..b1da5ee68
--- /dev/null
+++ b/angular/base/eslint.config.js
@@ -0,0 +1,32 @@
+// @ts-check
+const tseslint = require("typescript-eslint");
+const angular = require("angular-eslint");
+
+module.exports = tseslint.config(
+ {
+ files: ["**/*.ts"],
+ ignores: ["projects/**/*"],
+ extends: [...angular.configs.tsRecommended],
+ processor: angular.processInlineTemplates,
+ rules: {
+ "@angular-eslint/prefer-standalone": "off",
+ "@angular-eslint/component-class-suffix": [
+ "error",
+ { suffixes: ["Page", "Component"] },
+ ],
+ "@angular-eslint/component-selector": [
+ "error",
+ { type: "element", prefix: "app", style: "kebab-case" },
+ ],
+ "@angular-eslint/directive-selector": [
+ "error",
+ { type: "attribute", prefix: "app", style: "camelCase" },
+ ],
+ },
+ },
+ {
+ files: ["**/*.html"],
+ extends: [...angular.configs.templateRecommended],
+ rules: {},
+ }
+);
diff --git a/angular/base/karma.conf.js b/angular/base/karma.conf.js
deleted file mode 100644
index 611c27fba..000000000
--- a/angular/base/karma.conf.js
+++ /dev/null
@@ -1,44 +0,0 @@
-// Karma configuration file, see link for more information
-// https://karma-runner.github.io/1.0/config/configuration-file.html
-
-module.exports = function (config) {
- config.set({
- basePath: '',
- frameworks: ['jasmine', '@angular-devkit/build-angular'],
- plugins: [
- require('karma-jasmine'),
- require('karma-chrome-launcher'),
- require('karma-jasmine-html-reporter'),
- require('karma-coverage'),
- require('@angular-devkit/build-angular/plugins/karma')
- ],
- client: {
- jasmine: {
- // you can add configuration options for Jasmine here
- // the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html
- // for example, you can disable the random execution with `random: false`
- // or set a specific seed with `seed: 4321`
- },
- clearContext: false // leave Jasmine Spec Runner output visible in browser
- },
- jasmineHtmlReporter: {
- suppressAll: true // removes the duplicated traces
- },
- coverageReporter: {
- dir: require('path').join(__dirname, './coverage/app'),
- subdir: '.',
- reporters: [
- { type: 'html' },
- { type: 'text-summary' }
- ]
- },
- reporters: ['progress', 'kjhtml'],
- port: 9876,
- colors: true,
- logLevel: config.LOG_INFO,
- autoWatch: true,
- browsers: ['Chrome'],
- singleRun: false,
- restartOnFileChange: true
- });
-};
diff --git a/angular/base/package.json b/angular/base/package.json
index 81c0d135d..28d4fc42f 100644
--- a/angular/base/package.json
+++ b/angular/base/package.json
@@ -13,45 +13,29 @@
},
"private": true,
"dependencies": {
- "@angular/animations": "20.3.25",
- "@angular/common": "20.3.25",
- "@angular/compiler": "20.3.25",
- "@angular/core": "20.3.25",
- "@angular/forms": "20.3.25",
- "@angular/platform-browser": "20.3.25",
- "@angular/platform-browser-dynamic": "20.3.25",
- "@angular/router": "20.3.25",
- "@ionic/angular": "^8.0.0",
+ "@angular/common": "22.0.1",
+ "@angular/compiler": "22.0.1",
+ "@angular/core": "22.0.1",
+ "@angular/forms": "22.0.1",
+ "@angular/platform-browser": "22.0.1",
+ "@angular/platform-browser-dynamic": "22.0.1",
+ "@angular/router": "22.0.1",
+ "@ionic/angular": "8.8.9-dev.11781098612.122c6758",
"ionicons": "^7.0.0",
"rxjs": "~7.8.0",
- "tslib": "^2.3.0",
- "zone.js": "~0.15.0"
+ "tslib": "^2.3.0"
},
"devDependencies": {
- "@angular-devkit/build-angular": "20.3.28",
- "@angular-eslint/builder": "20.7.0",
- "@angular-eslint/eslint-plugin": "20.7.0",
- "@angular-eslint/eslint-plugin-template": "20.7.0",
- "@angular-eslint/schematics": "20.7.0",
- "@angular-eslint/template-parser": "20.7.0",
- "@angular/cli": "20.3.28",
- "@angular/compiler-cli": "20.3.25",
- "@angular/language-service": "20.3.25",
- "@ionic/angular-toolkit": "^12.0.0",
- "@types/jasmine": "~5.1.0",
- "@typescript-eslint/eslint-plugin": "^8.18.0",
- "@typescript-eslint/parser": "^8.18.0",
+ "@angular/build": "22.0.1",
+ "@angular/cli": "22.0.1",
+ "@angular/compiler-cli": "22.0.1",
+ "@angular/language-service": "22.0.1",
+ "@ionic/angular-toolkit": "^12.3.0",
+ "angular-eslint": "22.0.0",
"eslint": "^9.16.0",
- "eslint-plugin-import": "^2.29.1",
- "eslint-plugin-jsdoc": "^48.2.1",
- "eslint-plugin-prefer-arrow": "1.2.2",
- "jasmine-core": "~5.1.0",
- "jasmine-spec-reporter": "~5.0.0",
- "karma": "~6.4.0",
- "karma-chrome-launcher": "~3.2.0",
- "karma-coverage": "~2.2.0",
- "karma-jasmine": "~5.1.0",
- "karma-jasmine-html-reporter": "~2.1.0",
- "typescript": "~5.9.0"
+ "jsdom": "^26.0.0",
+ "typescript": "~6.0.0",
+ "typescript-eslint": "^8.61.0",
+ "vitest": "^4.0.8"
}
}
diff --git a/angular/base/src/app/app.module.ts b/angular/base/src/app/app.module.ts
index c8a63befc..2459b96bd 100644
--- a/angular/base/src/app/app.module.ts
+++ b/angular/base/src/app/app.module.ts
@@ -1,4 +1,4 @@
-import { NgModule } from '@angular/core';
+import { NgModule, provideZonelessChangeDetection } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { RouteReuseStrategy } from '@angular/router';
@@ -9,7 +9,10 @@ import { AppComponent } from './app.component';
@NgModule({
declarations: [AppComponent],
imports: [BrowserModule, IonicModule.forRoot()],
- providers: [{ provide: RouteReuseStrategy, useClass: IonicRouteStrategy }],
+ providers: [
+ provideZonelessChangeDetection(),
+ { provide: RouteReuseStrategy, useClass: IonicRouteStrategy },
+ ],
bootstrap: [AppComponent],
})
export class AppModule {}
diff --git a/angular/base/src/polyfills.ts b/angular/base/src/polyfills.ts
deleted file mode 100644
index 394705a80..000000000
--- a/angular/base/src/polyfills.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * This file includes polyfills needed by Angular and is loaded before the app.
- * You can add your own extra polyfills to this file.
- *
- * This file is divided into 2 sections:
- * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.
- * 2. Application imports. Files imported after ZoneJS that should be loaded before your main
- * file.
- *
- * The current setup is for so-called "evergreen" browsers; the last versions of browsers that
- * automatically update themselves. This includes recent versions of Safari, Chrome (including
- * Opera), Edge on the desktop, and iOS and Chrome on mobile.
- *
- * Learn more in https://angular.io/guide/browser-support
- */
-
-/***************************************************************************************************
- * BROWSER POLYFILLS
- */
-
-/**
- * By default, zone.js will patch all possible macroTask and DomEvents
- * user can disable parts of macroTask/DomEvents patch by setting following flags
- * because those flags need to be set before `zone.js` being loaded, and webpack
- * will put import in the top of bundle, so user need to create a separate file
- * in this directory (for example: zone-flags.ts), and put the following flags
- * into that file, and then add the following code before importing zone.js.
- * import './zone-flags';
- *
- * The flags allowed in zone-flags.ts are listed here.
- *
- * The following flags will work for all browsers.
- *
- * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame
- * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick
- * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames
- *
- * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js
- * with the following flag, it will bypass `zone.js` patch for IE/Edge
- *
- * (window as any).__Zone_enable_cross_context_check = true;
- *
- */
-
-import './zone-flags';
-
-/***************************************************************************************************
- * Zone JS is required by default for Angular itself.
- */
-import 'zone.js'; // Included with Angular CLI.
-
-
-/***************************************************************************************************
- * APPLICATION IMPORTS
- */
diff --git a/angular/base/src/test-setup.ts b/angular/base/src/test-setup.ts
new file mode 100644
index 000000000..adcbbc9c2
--- /dev/null
+++ b/angular/base/src/test-setup.ts
@@ -0,0 +1,16 @@
+// Polyfills for running unit tests under jsdom (the default Vitest environment).
+// Ionic components such as ion-menu and ion-split-pane query `window.matchMedia`,
+// which jsdom does not implement.
+if (!window.matchMedia) {
+ window.matchMedia = (query: string): MediaQueryList =>
+ ({
+ matches: false,
+ media: query,
+ onchange: null,
+ addListener: () => undefined,
+ removeListener: () => undefined,
+ addEventListener: () => undefined,
+ removeEventListener: () => undefined,
+ dispatchEvent: () => false,
+ }) as MediaQueryList;
+}
diff --git a/angular/base/src/test.ts b/angular/base/src/test.ts
deleted file mode 100644
index 51bb0206a..000000000
--- a/angular/base/src/test.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-// This file is required by karma.conf.js and loads recursively all the .spec and framework files
-
-import 'zone.js/testing';
-import { getTestBed } from '@angular/core/testing';
-import {
- BrowserDynamicTestingModule,
- platformBrowserDynamicTesting
-} from '@angular/platform-browser-dynamic/testing';
-
-// First, initialize the Angular testing environment.
-getTestBed().initTestEnvironment(
- BrowserDynamicTestingModule,
- platformBrowserDynamicTesting(),
-);
diff --git a/angular/base/src/zone-flags.ts b/angular/base/src/zone-flags.ts
deleted file mode 100644
index c84245fd3..000000000
--- a/angular/base/src/zone-flags.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-/**
- * Prevents Angular change detection from
- * running with certain Web Component callbacks
- */
-// eslint-disable-next-line no-underscore-dangle
-(window as any).__Zone_disable_customElements = true;
diff --git a/angular/base/tsconfig.app.json b/angular/base/tsconfig.app.json
index 82d91dc4a..374cc9d29 100644
--- a/angular/base/tsconfig.app.json
+++ b/angular/base/tsconfig.app.json
@@ -6,8 +6,7 @@
"types": []
},
"files": [
- "src/main.ts",
- "src/polyfills.ts"
+ "src/main.ts"
],
"include": [
"src/**/*.d.ts"
diff --git a/angular/base/tsconfig.json b/angular/base/tsconfig.json
index 382934afb..69f64e151 100644
--- a/angular/base/tsconfig.json
+++ b/angular/base/tsconfig.json
@@ -2,7 +2,6 @@
{
"compileOnSave": false,
"compilerOptions": {
- "baseUrl": "./",
"outDir": "./dist/out-tsc",
"forceConsistentCasingInFileNames": true,
"strict": true,
@@ -12,14 +11,13 @@
"noFallthroughCasesInSwitch": true,
"sourceMap": true,
"declaration": false,
- "downlevelIteration": true,
"experimentalDecorators": true,
- "moduleResolution": "node",
+ "moduleResolution": "bundler",
"importHelpers": true,
"target": "es2022",
"module": "es2020",
"lib": [
- "es2018",
+ "es2022",
"dom"
],
"skipLibCheck": true,
diff --git a/angular/base/tsconfig.spec.json b/angular/base/tsconfig.spec.json
index 092345b02..936a37a5d 100644
--- a/angular/base/tsconfig.spec.json
+++ b/angular/base/tsconfig.spec.json
@@ -4,15 +4,13 @@
"compilerOptions": {
"outDir": "./out-tsc/spec",
"types": [
- "jasmine"
+ "vitest/globals"
]
},
- "files": [
- "src/test.ts",
- "src/polyfills.ts"
- ],
"include": [
"src/**/*.spec.ts",
- "src/**/*.d.ts"
+ "src/**/*.d.ts",
+ "src/test-setup.ts",
+ "src/**/*.module.ts"
]
}
diff --git a/angular/official/blank/ionic.starter.json b/angular/official/blank/ionic.starter.json
index e28c7e4ac..87b690f45 100644
--- a/angular/official/blank/ionic.starter.json
+++ b/angular/official/blank/ionic.starter.json
@@ -7,6 +7,6 @@
"www"
],
"scripts": {
- "test": "npm run lint && npm run build && npm run test -- --configuration=ci --browsers=ChromeHeadless"
+ "test": "npm run lint && npm run build && npm run test -- --configuration=ci"
}
}
diff --git a/angular/official/blank/src/app/app.module.ts b/angular/official/blank/src/app/app.module.ts
index 34b715b6c..34f1ff019 100644
--- a/angular/official/blank/src/app/app.module.ts
+++ b/angular/official/blank/src/app/app.module.ts
@@ -1,4 +1,4 @@
-import { NgModule } from '@angular/core';
+import { NgModule, provideZonelessChangeDetection } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { RouteReuseStrategy } from '@angular/router';
@@ -10,7 +10,10 @@ import { AppRoutingModule } from './app-routing.module';
@NgModule({
declarations: [AppComponent],
imports: [BrowserModule, IonicModule.forRoot(), AppRoutingModule],
- providers: [{ provide: RouteReuseStrategy, useClass: IonicRouteStrategy }],
+ providers: [
+ provideZonelessChangeDetection(),
+ { provide: RouteReuseStrategy, useClass: IonicRouteStrategy },
+ ],
bootstrap: [AppComponent],
})
export class AppModule {}
diff --git a/angular/official/list/ionic.starter.json b/angular/official/list/ionic.starter.json
index 9e35de2ef..9d399db0b 100644
--- a/angular/official/list/ionic.starter.json
+++ b/angular/official/list/ionic.starter.json
@@ -7,6 +7,6 @@
"www"
],
"scripts": {
- "test": "npm run lint && npm run build && npm run test -- --configuration=ci --browsers=ChromeHeadless"
+ "test": "npm run lint && npm run build && npm run test -- --configuration=ci"
}
}
diff --git a/angular/official/list/src/app/app-routing.module.ts b/angular/official/list/src/app/app-routing.module.ts
index a2b2e0f72..64b48c0da 100644
--- a/angular/official/list/src/app/app-routing.module.ts
+++ b/angular/official/list/src/app/app-routing.module.ts
@@ -19,7 +19,7 @@ const routes: Routes = [
@NgModule({
imports: [
- RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules })
+ RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules, bindToComponentInputs: true })
],
exports: [RouterModule]
})
diff --git a/angular/official/list/src/app/app.module.ts b/angular/official/list/src/app/app.module.ts
index 34b715b6c..34f1ff019 100644
--- a/angular/official/list/src/app/app.module.ts
+++ b/angular/official/list/src/app/app.module.ts
@@ -1,4 +1,4 @@
-import { NgModule } from '@angular/core';
+import { NgModule, provideZonelessChangeDetection } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { RouteReuseStrategy } from '@angular/router';
@@ -10,7 +10,10 @@ import { AppRoutingModule } from './app-routing.module';
@NgModule({
declarations: [AppComponent],
imports: [BrowserModule, IonicModule.forRoot(), AppRoutingModule],
- providers: [{ provide: RouteReuseStrategy, useClass: IonicRouteStrategy }],
+ providers: [
+ provideZonelessChangeDetection(),
+ { provide: RouteReuseStrategy, useClass: IonicRouteStrategy },
+ ],
bootstrap: [AppComponent],
})
export class AppModule {}
diff --git a/angular/official/list/src/app/home/home.page.html b/angular/official/list/src/app/home/home.page.html
index bbdc656f4..0e49dd03e 100644
--- a/angular/official/list/src/app/home/home.page.html
+++ b/angular/official/list/src/app/home/home.page.html
@@ -20,7 +20,7 @@
- @for (message of getMessages(); track message) {
+ @for (message of messages; track message.id) {
}
diff --git a/angular/official/list/src/app/home/home.page.spec.ts b/angular/official/list/src/app/home/home.page.spec.ts
index 054a66d30..558e5a901 100644
--- a/angular/official/list/src/app/home/home.page.spec.ts
+++ b/angular/official/list/src/app/home/home.page.spec.ts
@@ -1,9 +1,7 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { RouterModule } from '@angular/router';
-import { IonicModule } from '@ionic/angular';
-
-import { MessageComponentModule } from '../message/message.module';
+import { HomePageModule } from './home.module';
import { HomePage } from './home.page';
describe('HomePage', () => {
@@ -12,8 +10,7 @@ describe('HomePage', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
- declarations: [HomePage],
- imports: [IonicModule.forRoot(), MessageComponentModule, RouterModule.forRoot([])]
+ imports: [HomePageModule, RouterModule.forRoot([])]
}).compileComponents();
fixture = TestBed.createComponent(HomePage);
diff --git a/angular/official/list/src/app/home/home.page.ts b/angular/official/list/src/app/home/home.page.ts
index c5404229a..25253ac3f 100644
--- a/angular/official/list/src/app/home/home.page.ts
+++ b/angular/official/list/src/app/home/home.page.ts
@@ -1,8 +1,7 @@
import { Component, inject } from '@angular/core';
import { RefresherCustomEvent } from '@ionic/angular';
-import { MessageComponent } from '../message/message.component';
-import { DataService, Message } from '../services/data.service';
+import { DataService } from '../services/data.service';
@Component({
selector: 'app-home',
@@ -12,15 +11,11 @@ import { DataService, Message } from '../services/data.service';
})
export class HomePage {
private data = inject(DataService);
- constructor() {}
+ protected readonly messages = this.data.getMessages();
refresh(ev: any) {
setTimeout(() => {
(ev as RefresherCustomEvent).detail.complete();
}, 3000);
}
-
- getMessages(): Message[] {
- return this.data.getMessages();
- }
}
diff --git a/angular/official/list/src/app/message/message.component.html b/angular/official/list/src/app/message/message.component.html
index c8c822e85..7b02e2d7f 100644
--- a/angular/official/list/src/app/message/message.component.html
+++ b/angular/official/list/src/app/message/message.component.html
@@ -1,4 +1,4 @@
-@if (message) {
+@if (message(); as message) {
@@ -6,7 +6,7 @@
{{ message.fromName }}
{{ message.date }}
- @if (isIos()) {
+ @if (isIos) {
}
diff --git a/angular/official/list/src/app/message/message.component.ts b/angular/official/list/src/app/message/message.component.ts
index 1d91033f5..ad673c8d2 100644
--- a/angular/official/list/src/app/message/message.component.ts
+++ b/angular/official/list/src/app/message/message.component.ts
@@ -1,4 +1,4 @@
-import { ChangeDetectionStrategy, Component, inject, Input } from '@angular/core';
+import { ChangeDetectionStrategy, Component, inject, input } from '@angular/core';
import { Platform } from '@ionic/angular';
import { Message } from '../services/data.service';
@@ -11,8 +11,6 @@ import { Message } from '../services/data.service';
})
export class MessageComponent {
private platform = inject(Platform);
- @Input() message?: Message;
- isIos() {
- return this.platform.is('ios')
- }
+ readonly message = input();
+ readonly isIos = this.platform.is('ios');
}
diff --git a/angular/official/list/src/app/view-message/view-message.page.html b/angular/official/list/src/app/view-message/view-message.page.html
index c97a58ea6..612feffb5 100644
--- a/angular/official/list/src/app/view-message/view-message.page.html
+++ b/angular/official/list/src/app/view-message/view-message.page.html
@@ -1,12 +1,12 @@
-
+
-@if (message) {
+@if (message(); as message) {
diff --git a/angular/official/list/src/app/view-message/view-message.page.spec.ts b/angular/official/list/src/app/view-message/view-message.page.spec.ts
index 0e99d6619..920214e18 100644
--- a/angular/official/list/src/app/view-message/view-message.page.spec.ts
+++ b/angular/official/list/src/app/view-message/view-message.page.spec.ts
@@ -17,6 +17,7 @@ describe('ViewMessagePage', () => {
fixture = TestBed.createComponent(ViewMessagePage);
component = fixture.componentInstance;
+ fixture.componentRef.setInput('id', '0');
fixture.detectChanges();
});
diff --git a/angular/official/list/src/app/view-message/view-message.page.ts b/angular/official/list/src/app/view-message/view-message.page.ts
index f8d29a418..cce684355 100644
--- a/angular/official/list/src/app/view-message/view-message.page.ts
+++ b/angular/official/list/src/app/view-message/view-message.page.ts
@@ -1,8 +1,6 @@
-
-import { Component, inject, OnInit } from '@angular/core';
-import { ActivatedRoute } from '@angular/router';
-import { IonicModule, Platform } from '@ionic/angular';
-import { DataService, Message } from '../services/data.service';
+import { Component, computed, inject, input } from '@angular/core';
+import { Platform } from '@ionic/angular';
+import { DataService } from '../services/data.service';
@Component({
selector: 'app-view-message',
@@ -10,21 +8,11 @@ import { DataService, Message } from '../services/data.service';
styleUrls: ['./view-message.page.scss'],
standalone: false,
})
-export class ViewMessagePage implements OnInit {
- public message!: Message;
+export class ViewMessagePage {
private data = inject(DataService);
- private activatedRoute = inject(ActivatedRoute);
private platform = inject(Platform);
- constructor() {}
-
- ngOnInit() {
- const id = this.activatedRoute.snapshot.paramMap.get('id') as string;
- this.message = this.data.getMessageById(parseInt(id, 10));
- }
-
- getBackButtonText() {
- const isIos = this.platform.is('ios')
- return isIos ? 'Inbox' : '';
- }
+ readonly id = input.required();
+ protected readonly message = computed(() => this.data.getMessageById(parseInt(this.id(), 10)));
+ protected readonly backButtonText = this.platform.is('ios') ? 'Inbox' : '';
}
diff --git a/angular/official/sidemenu/ionic.starter.json b/angular/official/sidemenu/ionic.starter.json
index dee32cee3..a78ac8bb8 100644
--- a/angular/official/sidemenu/ionic.starter.json
+++ b/angular/official/sidemenu/ionic.starter.json
@@ -7,6 +7,6 @@
"www"
],
"scripts": {
- "test": "npm run lint && npm run build && npm run test -- --configuration=ci --browsers=ChromeHeadless"
+ "test": "npm run lint && npm run build && npm run test -- --configuration=ci"
}
}
diff --git a/angular/official/sidemenu/src/app/app-routing.module.ts b/angular/official/sidemenu/src/app/app-routing.module.ts
index f142a6e09..bc4c006b1 100644
--- a/angular/official/sidemenu/src/app/app-routing.module.ts
+++ b/angular/official/sidemenu/src/app/app-routing.module.ts
@@ -4,18 +4,18 @@ import { PreloadAllModules, RouterModule, Routes } from '@angular/router';
const routes: Routes = [
{
path: '',
- redirectTo: 'folder/inbox',
+ redirectTo: 'folder/Inbox',
pathMatch: 'full'
},
{
- path: 'folder/:id',
+ path: 'folder/:folder',
loadChildren: () => import('./folder/folder.module').then( m => m.FolderPageModule)
}
];
@NgModule({
imports: [
- RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules })
+ RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules, bindToComponentInputs: true })
],
exports: [RouterModule]
})
diff --git a/angular/official/sidemenu/src/app/app.component.spec.ts b/angular/official/sidemenu/src/app/app.component.spec.ts
index 72d2d233a..27222eb00 100644
--- a/angular/official/sidemenu/src/app/app.component.spec.ts
+++ b/angular/official/sidemenu/src/app/app.component.spec.ts
@@ -3,6 +3,7 @@ import { TestBed } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import { Router, RouterLink, RouterModule } from '@angular/router';
+import { IonicModule } from '@ionic/angular';
import { AppComponent } from './app.component';
@@ -14,7 +15,7 @@ describe('AppComponent', () => {
await TestBed.configureTestingModule({
declarations: [AppComponent],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
- imports: [RouterModule.forRoot([])],
+ imports: [IonicModule.forRoot(), RouterModule.forRoot([])],
}).compileComponents();
});
@@ -25,14 +26,14 @@ describe('AppComponent', () => {
});
// TODO(ROU-10799): Fix the flaky test.
- xit('should have menu labels', () => {
+ it.skip('should have menu labels', () => {
const fixture = TestBed.createComponent(AppComponent);
fixture.detectChanges();
const app = fixture.nativeElement;
const menuItems = app.querySelectorAll('ion-label');
expect(menuItems.length).toEqual(12);
- expect(menuItems[0].textContent).toContain('Inbox');
- expect(menuItems[1].textContent).toContain('Outbox');
+ expect(menuItems[0].innerHTML).toContain('Inbox');
+ expect(menuItems[1].innerHTML).toContain('Outbox');
});
it('should have urls', () => {
@@ -48,8 +49,8 @@ describe('AppComponent', () => {
.queryAll(By.directive(RouterLink))
.map((el) => el.injector.get(RouterLink));
expect(links.length).toEqual(6);
- expect(router.serializeUrl(links[0].urlTree!)).toEqual('/folder/inbox');
- expect(router.serializeUrl(links[1].urlTree!)).toEqual('/folder/outbox');
+ expect(router.serializeUrl(links[0].urlTree!)).toEqual('/folder/Inbox');
+ expect(router.serializeUrl(links[1].urlTree!)).toEqual('/folder/Outbox');
});
});
diff --git a/angular/official/sidemenu/src/app/app.component.ts b/angular/official/sidemenu/src/app/app.component.ts
index 71cc5ca6a..b7ec07521 100644
--- a/angular/official/sidemenu/src/app/app.component.ts
+++ b/angular/official/sidemenu/src/app/app.component.ts
@@ -6,14 +6,14 @@ import { Component } from '@angular/core';
standalone: false,
})
export class AppComponent {
- public appPages = [
- { title: 'Inbox', url: '/folder/inbox', icon: 'mail' },
- { title: 'Outbox', url: '/folder/outbox', icon: 'paper-plane' },
- { title: 'Favorites', url: '/folder/favorites', icon: 'heart' },
- { title: 'Archived', url: '/folder/archived', icon: 'archive' },
- { title: 'Trash', url: '/folder/trash', icon: 'trash' },
- { title: 'Spam', url: '/folder/spam', icon: 'warning' },
+ protected readonly appPages = [
+ { title: 'Inbox', url: '/folder/Inbox', icon: 'mail' },
+ { title: 'Outbox', url: '/folder/Outbox', icon: 'paper-plane' },
+ { title: 'Favorites', url: '/folder/Favorites', icon: 'heart' },
+ { title: 'Archived', url: '/folder/Archived', icon: 'archive' },
+ { title: 'Trash', url: '/folder/Trash', icon: 'trash' },
+ { title: 'Spam', url: '/folder/Spam', icon: 'warning' },
];
- public labels = ['Family', 'Friends', 'Notes', 'Work', 'Travel', 'Reminders'];
+ protected readonly labels = ['Family', 'Friends', 'Notes', 'Work', 'Travel', 'Reminders'];
constructor() {}
}
diff --git a/angular/official/sidemenu/src/app/app.module.ts b/angular/official/sidemenu/src/app/app.module.ts
index 34b715b6c..34f1ff019 100644
--- a/angular/official/sidemenu/src/app/app.module.ts
+++ b/angular/official/sidemenu/src/app/app.module.ts
@@ -1,4 +1,4 @@
-import { NgModule } from '@angular/core';
+import { NgModule, provideZonelessChangeDetection } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { RouteReuseStrategy } from '@angular/router';
@@ -10,7 +10,10 @@ import { AppRoutingModule } from './app-routing.module';
@NgModule({
declarations: [AppComponent],
imports: [BrowserModule, IonicModule.forRoot(), AppRoutingModule],
- providers: [{ provide: RouteReuseStrategy, useClass: IonicRouteStrategy }],
+ providers: [
+ provideZonelessChangeDetection(),
+ { provide: RouteReuseStrategy, useClass: IonicRouteStrategy },
+ ],
bootstrap: [AppComponent],
})
export class AppModule {}
diff --git a/angular/official/sidemenu/src/app/folder/folder.page.html b/angular/official/sidemenu/src/app/folder/folder.page.html
index 39aaa6a05..9a96665b6 100644
--- a/angular/official/sidemenu/src/app/folder/folder.page.html
+++ b/angular/official/sidemenu/src/app/folder/folder.page.html
@@ -3,19 +3,19 @@
- {{ folder }}
+ {{ folder() }}
- {{ folder }}
+ {{ folder() }}
diff --git a/angular/official/sidemenu/src/app/folder/folder.page.spec.ts b/angular/official/sidemenu/src/app/folder/folder.page.spec.ts
index 898ea87f6..4f2000404 100644
--- a/angular/official/sidemenu/src/app/folder/folder.page.spec.ts
+++ b/angular/official/sidemenu/src/app/folder/folder.page.spec.ts
@@ -16,6 +16,7 @@ describe('FolderPage', () => {
fixture = TestBed.createComponent(FolderPage);
component = fixture.componentInstance;
+ fixture.componentRef.setInput('folder', 'Inbox');
fixture.detectChanges();
});
diff --git a/angular/official/sidemenu/src/app/folder/folder.page.ts b/angular/official/sidemenu/src/app/folder/folder.page.ts
index e29f5978b..7d3a5181c 100644
--- a/angular/official/sidemenu/src/app/folder/folder.page.ts
+++ b/angular/official/sidemenu/src/app/folder/folder.page.ts
@@ -1,5 +1,4 @@
-import { Component, inject, OnInit } from '@angular/core';
-import { ActivatedRoute } from '@angular/router';
+import { Component, input } from '@angular/core';
@Component({
selector: 'app-folder',
@@ -7,12 +6,6 @@ import { ActivatedRoute } from '@angular/router';
styleUrls: ['./folder.page.scss'],
standalone: false,
})
-export class FolderPage implements OnInit {
- public folder!: string;
- private activatedRoute = inject(ActivatedRoute);
- constructor() {}
-
- ngOnInit() {
- this.folder = this.activatedRoute.snapshot.paramMap.get('id') as string;
- }
+export class FolderPage {
+ readonly folder = input.required();
}
diff --git a/angular/official/tabs/ionic.starter.json b/angular/official/tabs/ionic.starter.json
index 3c68e48ac..8c29cbd27 100644
--- a/angular/official/tabs/ionic.starter.json
+++ b/angular/official/tabs/ionic.starter.json
@@ -7,6 +7,6 @@
"www"
],
"scripts": {
- "test": "npm run lint && npm run build && npm run test -- --configuration=ci --browsers=ChromeHeadless"
+ "test": "npm run lint && npm run build && npm run test -- --configuration=ci"
}
}
diff --git a/angular/official/tabs/src/app/app.module.ts b/angular/official/tabs/src/app/app.module.ts
index 4255dd891..1c3671cf9 100644
--- a/angular/official/tabs/src/app/app.module.ts
+++ b/angular/official/tabs/src/app/app.module.ts
@@ -1,4 +1,4 @@
-import { NgModule } from '@angular/core';
+import { NgModule, provideZonelessChangeDetection } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { RouteReuseStrategy } from '@angular/router';
@@ -10,7 +10,10 @@ import { AppComponent } from './app.component';
@NgModule({
declarations: [AppComponent],
imports: [BrowserModule, IonicModule.forRoot(), AppRoutingModule],
- providers: [{ provide: RouteReuseStrategy, useClass: IonicRouteStrategy }],
+ providers: [
+ provideZonelessChangeDetection(),
+ { provide: RouteReuseStrategy, useClass: IonicRouteStrategy },
+ ],
bootstrap: [AppComponent],
})
export class AppModule {}
diff --git a/angular/official/tabs/src/app/explore-container/explore-container.component.html b/angular/official/tabs/src/app/explore-container/explore-container.component.html
index bbadb7d64..21f93b6b6 100644
--- a/angular/official/tabs/src/app/explore-container/explore-container.component.html
+++ b/angular/official/tabs/src/app/explore-container/explore-container.component.html
@@ -1,4 +1,4 @@
\ No newline at end of file
+
diff --git a/angular/official/tabs/src/app/explore-container/explore-container.component.ts b/angular/official/tabs/src/app/explore-container/explore-container.component.ts
index 3a5133a5a..9c7c1fe86 100644
--- a/angular/official/tabs/src/app/explore-container/explore-container.component.ts
+++ b/angular/official/tabs/src/app/explore-container/explore-container.component.ts
@@ -1,4 +1,4 @@
-import { Component, Input } from '@angular/core';
+import { Component, input } from '@angular/core';
@Component({
selector: 'app-explore-container',
@@ -7,7 +7,5 @@ import { Component, Input } from '@angular/core';
standalone: false,
})
export class ExploreContainerComponent {
-
- @Input() name?: string;
-
+ readonly name = input();
}
diff --git a/angular/official/tabs/src/app/tab1/tab1.page.spec.ts b/angular/official/tabs/src/app/tab1/tab1.page.spec.ts
index 0dbb7c0ad..8d2ef858b 100644
--- a/angular/official/tabs/src/app/tab1/tab1.page.spec.ts
+++ b/angular/official/tabs/src/app/tab1/tab1.page.spec.ts
@@ -1,8 +1,7 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { IonicModule } from '@ionic/angular';
-
-import { ExploreContainerComponentModule } from '../explore-container/explore-container.module';
+import { RouterModule } from '@angular/router';
+import { Tab1PageModule } from './tab1.module';
import { Tab1Page } from './tab1.page';
describe('Tab1Page', () => {
@@ -11,8 +10,7 @@ describe('Tab1Page', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
- declarations: [Tab1Page],
- imports: [IonicModule.forRoot(), ExploreContainerComponentModule]
+ imports: [Tab1PageModule, RouterModule.forRoot([])]
}).compileComponents();
fixture = TestBed.createComponent(Tab1Page);
diff --git a/angular/official/tabs/src/app/tab2/tab2.page.spec.ts b/angular/official/tabs/src/app/tab2/tab2.page.spec.ts
index 70bd876ed..76d01175d 100644
--- a/angular/official/tabs/src/app/tab2/tab2.page.spec.ts
+++ b/angular/official/tabs/src/app/tab2/tab2.page.spec.ts
@@ -1,8 +1,7 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { IonicModule } from '@ionic/angular';
-
-import { ExploreContainerComponentModule } from '../explore-container/explore-container.module';
+import { RouterModule } from '@angular/router';
+import { Tab2PageModule } from './tab2.module';
import { Tab2Page } from './tab2.page';
describe('Tab2Page', () => {
@@ -11,8 +10,7 @@ describe('Tab2Page', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
- declarations: [Tab2Page],
- imports: [IonicModule.forRoot(), ExploreContainerComponentModule]
+ imports: [Tab2PageModule, RouterModule.forRoot([])]
}).compileComponents();
fixture = TestBed.createComponent(Tab2Page);
diff --git a/angular/official/tabs/src/app/tab3/tab3.page.spec.ts b/angular/official/tabs/src/app/tab3/tab3.page.spec.ts
index 28d86196c..472f97108 100644
--- a/angular/official/tabs/src/app/tab3/tab3.page.spec.ts
+++ b/angular/official/tabs/src/app/tab3/tab3.page.spec.ts
@@ -1,8 +1,7 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { IonicModule } from '@ionic/angular';
-
-import { ExploreContainerComponentModule } from '../explore-container/explore-container.module';
+import { RouterModule } from '@angular/router';
+import { Tab3PageModule } from './tab3.module';
import { Tab3Page } from './tab3.page';
describe('Tab3Page', () => {
@@ -11,8 +10,7 @@ describe('Tab3Page', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
- declarations: [Tab3Page],
- imports: [IonicModule.forRoot(), ExploreContainerComponentModule]
+ imports: [Tab3PageModule, RouterModule.forRoot([])]
}).compileComponents();
fixture = TestBed.createComponent(Tab3Page);
diff --git a/react-vite/base/package.json b/react-vite/base/package.json
index f1589ae0d..3d3c9838a 100644
--- a/react-vite/base/package.json
+++ b/react-vite/base/package.json
@@ -12,15 +12,13 @@
"lint": "eslint"
},
"dependencies": {
- "@ionic/react": "^8.5.0",
- "@ionic/react-router": "^8.5.0",
- "@types/react-router": "^5.1.20",
- "@types/react-router-dom": "^5.3.3",
+ "@ionic/react": "8.8.11-dev.11781186446.19d9a1cc",
+ "@ionic/react-router": "8.8.11-dev.11781186446.19d9a1cc",
"ionicons": "^7.4.0",
"react": "19.0.0",
"react-dom": "19.0.0",
- "react-router": "^5.3.4",
- "react-router-dom": "^5.3.4"
+ "react-router": "^6.30.0",
+ "react-router-dom": "^6.30.0"
},
"devDependencies": {
"@testing-library/dom": ">=7.21.4",
@@ -29,8 +27,8 @@
"@testing-library/user-event": "^14.4.3",
"@types/react": "19.0.10",
"@types/react-dom": "19.0.4",
- "@vitejs/plugin-legacy": "^5.0.0",
- "@vitejs/plugin-react": "^4.0.1",
+ "@vitejs/plugin-legacy": "^8.0.0",
+ "@vitejs/plugin-react": "^6.0.0",
"cypress": "^13.5.0",
"eslint": "^9.20.1",
"eslint-plugin-react": "^7.32.2",
@@ -38,10 +36,10 @@
"eslint-plugin-react-refresh": "^0.4.19",
"globals": "^15.15.0",
"jsdom": "^22.1.0",
- "terser": "^5.4.0",
+ "terser": "^5.16.0",
"typescript": "~5.9.0",
"typescript-eslint": "^8.24.0",
- "vite": "^5.0.0",
- "vitest": "^0.34.6"
+ "vite": "^8.0.0",
+ "vitest": "^4.0.0"
}
}
diff --git a/react-vite/official/blank/src/App.tsx b/react-vite/official/blank/src/App.tsx
index 79d3009a1..cd8ef3f65 100644
--- a/react-vite/official/blank/src/App.tsx
+++ b/react-vite/official/blank/src/App.tsx
@@ -1,4 +1,4 @@
-import { Redirect, Route } from 'react-router-dom';
+import { Navigate, Route } from 'react-router-dom';
import { IonApp, IonRouterOutlet, setupIonicReact } from '@ionic/react';
import { IonReactRouter } from '@ionic/react-router';
import Home from './pages/Home';
@@ -39,12 +39,8 @@ const App: React.FC = () => (
-
-
-
-
-
-
+ } />
+ } />
diff --git a/react-vite/official/list/src/App.tsx b/react-vite/official/list/src/App.tsx
index 72bdb6ead..fbc89609a 100644
--- a/react-vite/official/list/src/App.tsx
+++ b/react-vite/official/list/src/App.tsx
@@ -1,4 +1,4 @@
-import { Redirect, Route } from 'react-router-dom';
+import { Navigate, Route } from 'react-router-dom';
import { IonApp, IonRouterOutlet, setupIonicReact } from '@ionic/react';
import { IonReactRouter } from '@ionic/react-router';
import Home from './pages/Home';
@@ -40,15 +40,9 @@ const App: React.FC = () => (
-
-
-
-
-
-
-
-
-
+ } />
+ } />
+ } />
diff --git a/react-vite/official/list/src/pages/ViewMessage.tsx b/react-vite/official/list/src/pages/ViewMessage.tsx
index e7f7e6094..526066a21 100644
--- a/react-vite/official/list/src/pages/ViewMessage.tsx
+++ b/react-vite/official/list/src/pages/ViewMessage.tsx
@@ -19,10 +19,10 @@ import './ViewMessage.css';
function ViewMessage() {
const [message, setMessage] = useState();
- const params = useParams<{ id: string }>();
+ const { id = '' } = useParams<{ id: string }>();
useIonViewWillEnter(() => {
- const msg = getMessage(parseInt(params.id, 10));
+ const msg = getMessage(parseInt(id, 10));
setMessage(msg);
});
diff --git a/react-vite/official/sidemenu/src/App.tsx b/react-vite/official/sidemenu/src/App.tsx
index 427c3ba27..a2d8897e1 100644
--- a/react-vite/official/sidemenu/src/App.tsx
+++ b/react-vite/official/sidemenu/src/App.tsx
@@ -1,6 +1,6 @@
import { IonApp, IonRouterOutlet, IonSplitPane, setupIonicReact } from '@ionic/react';
import { IonReactRouter } from '@ionic/react-router';
-import { Redirect, Route } from 'react-router-dom';
+import { Navigate, Route } from 'react-router-dom';
import Menu from './components/Menu';
import Page from './pages/Page';
@@ -43,12 +43,8 @@ const App: React.FC = () => {
-
-
-
-
-
-
+ } />
+ } />
diff --git a/react-vite/official/sidemenu/src/pages/Page.tsx b/react-vite/official/sidemenu/src/pages/Page.tsx
index 24ac77a87..627630aea 100644
--- a/react-vite/official/sidemenu/src/pages/Page.tsx
+++ b/react-vite/official/sidemenu/src/pages/Page.tsx
@@ -5,7 +5,7 @@ import './Page.css';
const Page: React.FC = () => {
- const { name } = useParams<{ name: string; }>();
+ const { name = '' } = useParams<{ name: string; }>();
return (
diff --git a/react-vite/official/tabs/src/App.tsx b/react-vite/official/tabs/src/App.tsx
index cd2a292d0..caeef6078 100644
--- a/react-vite/official/tabs/src/App.tsx
+++ b/react-vite/official/tabs/src/App.tsx
@@ -1,4 +1,4 @@
-import { Redirect, Route } from 'react-router-dom';
+import { Navigate, Route } from 'react-router-dom';
import {
IonApp,
IonIcon,
@@ -52,18 +52,10 @@ const App: React.FC = () => (
-
-
-
-
-
-
-
-
-
-
-
-
+ } />
+ } />
+ } />
+ } />
diff --git a/vue-vite/base/package.json b/vue-vite/base/package.json
index 34a559c59..aa402ab2a 100644
--- a/vue-vite/base/package.json
+++ b/vue-vite/base/package.json
@@ -12,25 +12,25 @@
"lint": "eslint ."
},
"dependencies": {
- "@ionic/vue": "^8.0.0",
- "@ionic/vue-router": "^8.0.0",
+ "@ionic/vue": "8.8.11-dev.11781186446.19d9a1cc",
+ "@ionic/vue-router": "8.8.11-dev.11781186446.19d9a1cc",
"ionicons": "^7.0.0",
- "vue": "^3.3.0",
- "vue-router": "^4.2.0"
+ "vue": "^3.5.0",
+ "vue-router": "^5.0.0"
},
"devDependencies": {
- "@vitejs/plugin-legacy": "^5.0.0",
- "@vitejs/plugin-vue": "^4.0.0",
+ "@vitejs/plugin-legacy": "^8.0.0",
+ "@vitejs/plugin-vue": "^6.0.0",
"@vue/eslint-config-typescript": "^12.0.0",
"@vue/test-utils": "^2.3.0",
"cypress": "^13.5.0",
"eslint": "^8.35.0",
"eslint-plugin-vue": "^9.9.0",
"jsdom": "^22.1.0",
- "terser": "^5.4.0",
+ "terser": "^5.16.0",
"typescript": "~5.9.0",
- "vite": "^5.0.0",
- "vitest": "^0.34.6",
+ "vite": "^8.0.0",
+ "vitest": "^4.0.0",
"vue-tsc": "^2.1.10"
}
}