From 5f6449ca5c982e8e4a9644395ef2b81d017c0adc Mon Sep 17 00:00:00 2001 From: Arnoud de Vries <6420061+arnoud-dv@users.noreply.github.com> Date: Fri, 25 Oct 2024 18:28:12 +0200 Subject: [PATCH] docs(angular-query): add query options from a service example --- .../.devcontainer/devcontainer.json | 4 + .../.eslintrc.cjs | 6 + .../query-options-from-a-service/README.md | 6 + .../query-options-from-a-service/angular.json | 104 ++++++++++++++++++ .../query-options-from-a-service/package.json | 30 +++++ .../src/app/app.component.html | 12 ++ .../src/app/app.component.ts | 12 ++ .../src/app/app.config.ts | 17 +++ .../src/app/app.routes.ts | 15 +++ .../src/app/components/post.component.html | 19 ++++ .../src/app/components/post.component.ts | 27 +++++ .../src/app/components/posts.component.html | 38 +++++++ .../src/app/components/posts.component.ts | 21 ++++ .../src/app/services/posts-service.ts | 21 ++++ .../src/app/services/queries-service.ts | 27 +++++ .../src/assets/.gitkeep | 0 .../src/favicon.ico | Bin 0 -> 15086 bytes .../src/index.html | 13 +++ .../query-options-from-a-service/src/main.ts | 5 + .../tsconfig.app.json | 9 ++ .../tsconfig.json | 29 +++++ examples/angular/router/angular.json | 2 +- examples/angular/router/src/styles.css | 1 - pnpm-lock.yaml | 71 +++++++++--- 24 files changed, 473 insertions(+), 16 deletions(-) create mode 100644 examples/angular/query-options-from-a-service/.devcontainer/devcontainer.json create mode 100644 examples/angular/query-options-from-a-service/.eslintrc.cjs create mode 100644 examples/angular/query-options-from-a-service/README.md create mode 100644 examples/angular/query-options-from-a-service/angular.json create mode 100644 examples/angular/query-options-from-a-service/package.json create mode 100644 examples/angular/query-options-from-a-service/src/app/app.component.html create mode 100644 examples/angular/query-options-from-a-service/src/app/app.component.ts create mode 100644 examples/angular/query-options-from-a-service/src/app/app.config.ts create mode 100644 examples/angular/query-options-from-a-service/src/app/app.routes.ts create mode 100644 examples/angular/query-options-from-a-service/src/app/components/post.component.html create mode 100644 examples/angular/query-options-from-a-service/src/app/components/post.component.ts create mode 100644 examples/angular/query-options-from-a-service/src/app/components/posts.component.html create mode 100644 examples/angular/query-options-from-a-service/src/app/components/posts.component.ts create mode 100644 examples/angular/query-options-from-a-service/src/app/services/posts-service.ts create mode 100644 examples/angular/query-options-from-a-service/src/app/services/queries-service.ts create mode 100644 examples/angular/query-options-from-a-service/src/assets/.gitkeep create mode 100644 examples/angular/query-options-from-a-service/src/favicon.ico create mode 100644 examples/angular/query-options-from-a-service/src/index.html create mode 100644 examples/angular/query-options-from-a-service/src/main.ts create mode 100644 examples/angular/query-options-from-a-service/tsconfig.app.json create mode 100644 examples/angular/query-options-from-a-service/tsconfig.json delete mode 100644 examples/angular/router/src/styles.css diff --git a/examples/angular/query-options-from-a-service/.devcontainer/devcontainer.json b/examples/angular/query-options-from-a-service/.devcontainer/devcontainer.json new file mode 100644 index 00000000000..36f47d8762e --- /dev/null +++ b/examples/angular/query-options-from-a-service/.devcontainer/devcontainer.json @@ -0,0 +1,4 @@ +{ + "name": "Node.js", + "image": "mcr.microsoft.com/devcontainers/javascript-node:18" +} diff --git a/examples/angular/query-options-from-a-service/.eslintrc.cjs b/examples/angular/query-options-from-a-service/.eslintrc.cjs new file mode 100644 index 00000000000..cca134ce166 --- /dev/null +++ b/examples/angular/query-options-from-a-service/.eslintrc.cjs @@ -0,0 +1,6 @@ +// @ts-check + +/** @type {import('eslint').Linter.Config} */ +const config = {} + +module.exports = config diff --git a/examples/angular/query-options-from-a-service/README.md b/examples/angular/query-options-from-a-service/README.md new file mode 100644 index 00000000000..f9e940480ac --- /dev/null +++ b/examples/angular/query-options-from-a-service/README.md @@ -0,0 +1,6 @@ +# TanStack Query Angular query options from a service example + +To run this example: + +- `npm install` or `yarn` or `pnpm i` or `bun i` +- `npm run start` or `yarn start` or `pnpm start` or `bun start` diff --git a/examples/angular/query-options-from-a-service/angular.json b/examples/angular/query-options-from-a-service/angular.json new file mode 100644 index 00000000000..bde3a51e951 --- /dev/null +++ b/examples/angular/query-options-from-a-service/angular.json @@ -0,0 +1,104 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "cli": { + "packageManager": "pnpm", + "analytics": false, + "cache": { + "enabled": false + } + }, + "newProjectRoot": "projects", + "projects": { + "query-options-from-a-service": { + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "inlineTemplate": true, + "inlineStyle": true, + "skipTests": true + }, + "@schematics/angular:class": { + "skipTests": true + }, + "@schematics/angular:directive": { + "skipTests": true + }, + "@schematics/angular:guard": { + "skipTests": true + }, + "@schematics/angular:interceptor": { + "skipTests": true + }, + "@schematics/angular:pipe": { + "skipTests": true + }, + "@schematics/angular:resolver": { + "skipTests": true + }, + "@schematics/angular:service": { + "skipTests": true + } + }, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:application", + "options": { + "outputPath": "dist/query-options-from-a-service", + "index": "src/index.html", + "browser": "src/main.ts", + "polyfills": ["zone.js"], + "tsConfig": "tsconfig.app.json", + "assets": ["src/favicon.ico", "src/assets"], + "styles": [], + "scripts": [] + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kb", + "maximumError": "1mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kb", + "maximumError": "4kb" + } + ], + "outputHashing": "all" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "configurations": { + "production": { + "buildTarget": "query-options-from-a-service:build:production" + }, + "development": { + "buildTarget": "query-options-from-a-service:build:development" + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "buildTarget": "query-options-from-a-service:build" + } + } + } + } + } +} diff --git a/examples/angular/query-options-from-a-service/package.json b/examples/angular/query-options-from-a-service/package.json new file mode 100644 index 00000000000..2982cd93614 --- /dev/null +++ b/examples/angular/query-options-from-a-service/package.json @@ -0,0 +1,30 @@ +{ + "name": "@tanstack/query-example-angular-query-options-from-a-service", + "type": "module", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "watch": "ng build --watch --configuration development" + }, + "private": true, + "dependencies": { + "@angular/common": "^17.3.12", + "@angular/compiler": "^17.3.12", + "@angular/core": "^17.3.12", + "@angular/platform-browser": "^17.3.12", + "@angular/platform-browser-dynamic": "^17.3.12", + "@angular/router": "^17.3.12", + "@tanstack/angular-query-experimental": "^5.59.16", + "rxjs": "^7.8.1", + "tslib": "^2.6.3", + "zone.js": "^0.14.8" + }, + "devDependencies": { + "@angular-devkit/build-angular": "^17.3.8", + "@angular/cli": "^17.3.8", + "@angular/compiler-cli": "^17.3.12", + "@tanstack/angular-query-devtools-experimental": "^5.59.16", + "typescript": "5.3.3" + } +} diff --git a/examples/angular/query-options-from-a-service/src/app/app.component.html b/examples/angular/query-options-from-a-service/src/app/app.component.html new file mode 100644 index 00000000000..b0a0e52fe48 --- /dev/null +++ b/examples/angular/query-options-from-a-service/src/app/app.component.html @@ -0,0 +1,12 @@ +

+ As you visit the posts below, you will notice them in a loading state the + first time you load them. However, after you return to this list and click on + any posts you have already visited again, you will see them load instantly and + background refresh right before your eyes! + + (You may need to throttle your network speed to simulate longer loading + sequences) + +

+ + diff --git a/examples/angular/query-options-from-a-service/src/app/app.component.ts b/examples/angular/query-options-from-a-service/src/app/app.component.ts new file mode 100644 index 00000000000..4a934b9c7e5 --- /dev/null +++ b/examples/angular/query-options-from-a-service/src/app/app.component.ts @@ -0,0 +1,12 @@ +import { Component } from '@angular/core' +import { RouterOutlet } from '@angular/router' +import { AngularQueryDevtools } from '@tanstack/angular-query-devtools-experimental' + +@Component({ + selector: 'app-root', + standalone: true, + imports: [AngularQueryDevtools, RouterOutlet], + templateUrl: './app.component.html', + styles: [], +}) +export class AppComponent {} diff --git a/examples/angular/query-options-from-a-service/src/app/app.config.ts b/examples/angular/query-options-from-a-service/src/app/app.config.ts new file mode 100644 index 00000000000..f3c46fd6578 --- /dev/null +++ b/examples/angular/query-options-from-a-service/src/app/app.config.ts @@ -0,0 +1,17 @@ +import { provideHttpClient, withFetch } from '@angular/common/http' +import { provideRouter, withComponentInputBinding } from '@angular/router' +import { + QueryClient, + provideAngularQuery, +} from '@tanstack/angular-query-experimental' + +import { routes } from './app.routes' +import type { ApplicationConfig } from '@angular/core' + +export const appConfig: ApplicationConfig = { + providers: [ + provideAngularQuery(new QueryClient()), + provideHttpClient(withFetch()), + provideRouter(routes, withComponentInputBinding()), + ], +} diff --git a/examples/angular/query-options-from-a-service/src/app/app.routes.ts b/examples/angular/query-options-from-a-service/src/app/app.routes.ts new file mode 100644 index 00000000000..8a8da66e69e --- /dev/null +++ b/examples/angular/query-options-from-a-service/src/app/app.routes.ts @@ -0,0 +1,15 @@ +import type { Route } from '@angular/router' + +// loadComponent lazily loads the component +// when the component is the default export, there is no need to handle the promise + +export const routes: Array = [ + { + path: '', + loadComponent: () => import('./components/posts.component'), + }, + { + path: 'post/:postId', + loadComponent: () => import('./components/post.component'), + }, +] diff --git a/examples/angular/query-options-from-a-service/src/app/components/post.component.html b/examples/angular/query-options-from-a-service/src/app/components/post.component.html new file mode 100644 index 00000000000..9ca755e387a --- /dev/null +++ b/examples/angular/query-options-from-a-service/src/app/components/post.component.html @@ -0,0 +1,19 @@ +
+
+ Back +
+ @if (postQuery.isPending()) { + Loading... + } @else if (postQuery.isError()) { + Error: {{ postQuery.error().message }} + } + @if (postQuery.data(); as post) { +

{{ post.title }}

+
+

{{ post.body }}

+
+ @if (postQuery.isFetching()) { + Background Updating... + } + } +
diff --git a/examples/angular/query-options-from-a-service/src/app/components/post.component.ts b/examples/angular/query-options-from-a-service/src/app/components/post.component.ts new file mode 100644 index 00000000000..ab9923e6baa --- /dev/null +++ b/examples/angular/query-options-from-a-service/src/app/components/post.component.ts @@ -0,0 +1,27 @@ +import { + ChangeDetectionStrategy, + Component, + inject, + input, + numberAttribute, +} from '@angular/core' +import { RouterLink } from '@angular/router' +import { injectQuery } from '@tanstack/angular-query-experimental' +import { QueriesService } from '../services/queries-service' + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + selector: 'post', + standalone: true, + templateUrl: './post.component.html', + imports: [RouterLink], +}) +export default class PostComponent { + private queries = inject(QueriesService) + + postId = input.required({ + transform: numberAttribute, + }) + + postQuery = injectQuery(() => this.queries.post(this.postId())) +} diff --git a/examples/angular/query-options-from-a-service/src/app/components/posts.component.html b/examples/angular/query-options-from-a-service/src/app/components/posts.component.html new file mode 100644 index 00000000000..06f7252914f --- /dev/null +++ b/examples/angular/query-options-from-a-service/src/app/components/posts.component.html @@ -0,0 +1,38 @@ +
+

Posts

+ @switch (postsQuery.status()) { + @case ('pending') { + Loading... + } + @case ('error') { + Error: {{ postsQuery.error()?.message }} + } + @default { +
+ @for (post of postsQuery.data(); track post.id) { +

+ + + {{ post.title }} +

+ } +
+ } + } +
+ @if (postsQuery.isFetching()) { + Background Updating... + } +
+
diff --git a/examples/angular/query-options-from-a-service/src/app/components/posts.component.ts b/examples/angular/query-options-from-a-service/src/app/components/posts.component.ts new file mode 100644 index 00000000000..1fe15616bfd --- /dev/null +++ b/examples/angular/query-options-from-a-service/src/app/components/posts.component.ts @@ -0,0 +1,21 @@ +import { ChangeDetectionStrategy, Component, inject } from '@angular/core' +import { RouterLink } from '@angular/router' +import { + injectQuery, + injectQueryClient, +} from '@tanstack/angular-query-experimental' +import { QueriesService } from '../services/queries-service' + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + selector: 'posts', + standalone: true, + templateUrl: './posts.component.html', + imports: [RouterLink], +}) +export default class PostsComponent { + private queries = inject(QueriesService) + + postsQuery = injectQuery(() => this.queries.posts()) + queryClient = injectQueryClient() +} diff --git a/examples/angular/query-options-from-a-service/src/app/services/posts-service.ts b/examples/angular/query-options-from-a-service/src/app/services/posts-service.ts new file mode 100644 index 00000000000..fed2a1b11c6 --- /dev/null +++ b/examples/angular/query-options-from-a-service/src/app/services/posts-service.ts @@ -0,0 +1,21 @@ +import { HttpClient } from '@angular/common/http' +import { Injectable, inject } from '@angular/core' + +@Injectable({ + providedIn: 'root', +}) +export class PostsService { + #http = inject(HttpClient) + + postById$ = (postId: number) => + this.#http.get(`https://jsonplaceholder.typicode.com/posts/${postId}`) + + allPosts$ = () => + this.#http.get>('https://jsonplaceholder.typicode.com/posts') +} + +export interface Post { + id: number + title: string + body: string +} diff --git a/examples/angular/query-options-from-a-service/src/app/services/queries-service.ts b/examples/angular/query-options-from-a-service/src/app/services/queries-service.ts new file mode 100644 index 00000000000..dd2cca982d8 --- /dev/null +++ b/examples/angular/query-options-from-a-service/src/app/services/queries-service.ts @@ -0,0 +1,27 @@ +import { Injectable, inject } from '@angular/core' +import { lastValueFrom } from 'rxjs' +import { queryOptions } from '@tanstack/angular-query-experimental' +import { PostsService } from './posts-service' + +@Injectable({ + providedIn: 'root', +}) +export class QueriesService { + private postsService = inject(PostsService) + + post(postId: number) { + return queryOptions({ + queryKey: ['post', postId], + queryFn: () => { + return lastValueFrom(this.postsService.postById$(postId)) + }, + }) + } + + posts() { + return queryOptions({ + queryKey: ['posts'], + queryFn: () => lastValueFrom(this.postsService.allPosts$()), + }) + } +} diff --git a/examples/angular/query-options-from-a-service/src/assets/.gitkeep b/examples/angular/query-options-from-a-service/src/assets/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/examples/angular/query-options-from-a-service/src/favicon.ico b/examples/angular/query-options-from-a-service/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..57614f9c967596fad0a3989bec2b1deff33034f6 GIT binary patch literal 15086 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 Nr__JTFzvMr^FKp4S3v*( literal 0 HcmV?d00001 diff --git a/examples/angular/query-options-from-a-service/src/index.html b/examples/angular/query-options-from-a-service/src/index.html new file mode 100644 index 00000000000..0b672995bfe --- /dev/null +++ b/examples/angular/query-options-from-a-service/src/index.html @@ -0,0 +1,13 @@ + + + + + TanStack Query Angular query options from a service example + + + + + + + + diff --git a/examples/angular/query-options-from-a-service/src/main.ts b/examples/angular/query-options-from-a-service/src/main.ts new file mode 100644 index 00000000000..c3d8f9af997 --- /dev/null +++ b/examples/angular/query-options-from-a-service/src/main.ts @@ -0,0 +1,5 @@ +import { bootstrapApplication } from '@angular/platform-browser' +import { appConfig } from './app/app.config' +import { AppComponent } from './app/app.component' + +bootstrapApplication(AppComponent, appConfig).catch((err) => console.error(err)) diff --git a/examples/angular/query-options-from-a-service/tsconfig.app.json b/examples/angular/query-options-from-a-service/tsconfig.app.json new file mode 100644 index 00000000000..5b9d3c5ecb0 --- /dev/null +++ b/examples/angular/query-options-from-a-service/tsconfig.app.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "files": ["src/main.ts"], + "include": ["src/**/*.d.ts"] +} diff --git a/examples/angular/query-options-from-a-service/tsconfig.json b/examples/angular/query-options-from-a-service/tsconfig.json new file mode 100644 index 00000000000..82c63d482ad --- /dev/null +++ b/examples/angular/query-options-from-a-service/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "outDir": "./dist/out-tsc", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "skipLibCheck": true, + "esModuleInterop": true, + "sourceMap": true, + "declaration": false, + "experimentalDecorators": true, + "moduleResolution": "node", + "importHelpers": true, + "target": "ES2022", + "module": "ES2022", + "useDefineForClassFields": false, + "lib": ["ES2022", "dom"] + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + } +} diff --git a/examples/angular/router/angular.json b/examples/angular/router/angular.json index b85aefa62cb..989d465ca01 100644 --- a/examples/angular/router/angular.json +++ b/examples/angular/router/angular.json @@ -53,7 +53,7 @@ "polyfills": ["zone.js"], "tsConfig": "tsconfig.app.json", "assets": ["src/favicon.ico", "src/assets"], - "styles": ["src/styles.css"], + "styles": [], "scripts": [] }, "configurations": { diff --git a/examples/angular/router/src/styles.css b/examples/angular/router/src/styles.css deleted file mode 100644 index 90d4ee0072c..00000000000 --- a/examples/angular/router/src/styles.css +++ /dev/null @@ -1 +0,0 @@ -/* You can add global styles to this file, and also import other style files */ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3921e48767a..d3eb1c2ed25 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -268,6 +268,55 @@ importers: specifier: 5.3.3 version: 5.3.3 + examples/angular/query-options-from-a-service: + dependencies: + '@angular/common': + specifier: ^17.3.12 + version: 17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.8))(rxjs@7.8.1) + '@angular/compiler': + specifier: ^17.3.12 + version: 17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.8)) + '@angular/core': + specifier: ^17.3.12 + version: 17.3.12(rxjs@7.8.1)(zone.js@0.14.8) + '@angular/platform-browser': + specifier: ^17.3.12 + version: 17.3.12(@angular/animations@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.8)))(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.8))(rxjs@7.8.1))(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.8)) + '@angular/platform-browser-dynamic': + specifier: ^17.3.12 + version: 17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.8))(rxjs@7.8.1))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.8)))(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.8))(@angular/platform-browser@17.3.12(@angular/animations@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.8)))(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.8))(rxjs@7.8.1))(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.8))) + '@angular/router': + specifier: ^17.3.12 + version: 17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.8))(rxjs@7.8.1))(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.8))(@angular/platform-browser@17.3.12(@angular/animations@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.8)))(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.8))(rxjs@7.8.1))(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.8)))(rxjs@7.8.1) + '@tanstack/angular-query-experimental': + specifier: ^5.59.16 + version: link:../../../packages/angular-query-experimental + rxjs: + specifier: ^7.8.1 + version: 7.8.1 + tslib: + specifier: ^2.6.3 + version: 2.7.0 + zone.js: + specifier: ^0.14.8 + version: 0.14.8 + devDependencies: + '@angular-devkit/build-angular': + specifier: ^17.3.8 + version: 17.3.8(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.8)))(typescript@5.3.3))(@types/express@4.17.21)(@types/node@22.7.4)(chokidar@3.6.0)(html-webpack-plugin@5.6.0(webpack@5.93.0(esbuild@0.19.12)))(ng-packagr@17.3.0(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.8)))(typescript@5.3.3))(tailwindcss@3.4.7)(tslib@2.7.0)(typescript@5.3.3))(tailwindcss@3.4.7)(typescript@5.3.3) + '@angular/cli': + specifier: ^17.3.8 + version: 17.3.8(chokidar@3.6.0) + '@angular/compiler-cli': + specifier: ^17.3.12 + version: 17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.8)))(typescript@5.3.3) + '@tanstack/angular-query-devtools-experimental': + specifier: ^5.59.16 + version: link:../../../packages/angular-query-devtools-experimental + typescript: + specifier: 5.3.3 + version: 5.3.3 + examples/angular/router: dependencies: '@angular/common': @@ -1223,7 +1272,7 @@ importers: version: 5.1.0(astro@4.12.3(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.31.3)(typescript@5.3.3))(tailwindcss@3.4.7) '@astrojs/vercel': specifier: ^7.7.2 - version: 7.7.2(astro@4.12.3(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.31.3)(typescript@5.3.3))(encoding@0.1.13)(next@14.2.5(@babel/core@7.25.2)(react-dom@19.0.0-rc-4c2e457c7c-20240522(react@18.3.1))(react@18.3.1)(sass@1.77.8))(react@18.3.1) + version: 7.7.2(astro@4.12.3(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.31.3)(typescript@5.3.3))(encoding@0.1.13)(next@14.2.5(@babel/core@7.25.2)(react-dom@19.0.0-rc-4c2e457c7c-20240522(react@19.0.0-rc-4c2e457c7c-20240522))(react@18.3.1)(sass@1.77.8))(react@18.3.1) '@tanstack/solid-query': specifier: ^5.59.16 version: link:../../../packages/solid-query @@ -9727,7 +9776,7 @@ packages: resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} engines: {node: '>= 4.0'} os: [darwin] - deprecated: Upgrade to fsevents v2 to mitigate potential security issues + deprecated: The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2 fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} @@ -17627,10 +17676,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/vercel@7.7.2(astro@4.12.3(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.31.3)(typescript@5.3.3))(encoding@0.1.13)(next@14.2.5(@babel/core@7.25.2)(react-dom@19.0.0-rc-4c2e457c7c-20240522(react@18.3.1))(react@18.3.1)(sass@1.77.8))(react@18.3.1)': + '@astrojs/vercel@7.7.2(astro@4.12.3(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.31.3)(typescript@5.3.3))(encoding@0.1.13)(next@14.2.5(@babel/core@7.25.2)(react-dom@19.0.0-rc-4c2e457c7c-20240522(react@19.0.0-rc-4c2e457c7c-20240522))(react@18.3.1)(sass@1.77.8))(react@18.3.1)': dependencies: '@astrojs/internal-helpers': 0.4.1 - '@vercel/analytics': 1.3.1(next@14.2.5(@babel/core@7.25.2)(react-dom@19.0.0-rc-4c2e457c7c-20240522(react@18.3.1))(react@18.3.1)(sass@1.77.8))(react@18.3.1) + '@vercel/analytics': 1.3.1(next@14.2.5(@babel/core@7.25.2)(react-dom@19.0.0-rc-4c2e457c7c-20240522(react@19.0.0-rc-4c2e457c7c-20240522))(react@18.3.1)(sass@1.77.8))(react@18.3.1) '@vercel/edge': 1.1.2 '@vercel/nft': 0.27.3(encoding@0.1.13) astro: 4.12.3(@types/node@22.7.4)(less@4.2.0)(sass@1.77.8)(terser@5.31.3)(typescript@5.3.3) @@ -22890,11 +22939,11 @@ snapshots: graphql: 15.8.0 wonka: 4.0.15 - '@vercel/analytics@1.3.1(next@14.2.5(@babel/core@7.25.2)(react-dom@19.0.0-rc-4c2e457c7c-20240522(react@18.3.1))(react@18.3.1)(sass@1.77.8))(react@18.3.1)': + '@vercel/analytics@1.3.1(next@14.2.5(@babel/core@7.25.2)(react-dom@19.0.0-rc-4c2e457c7c-20240522(react@19.0.0-rc-4c2e457c7c-20240522))(react@18.3.1)(sass@1.77.8))(react@18.3.1)': dependencies: server-only: 0.0.1 optionalDependencies: - next: 14.2.5(@babel/core@7.25.2)(react-dom@19.0.0-rc-4c2e457c7c-20240522(react@18.3.1))(react@18.3.1)(sass@1.77.8) + next: 14.2.5(@babel/core@7.25.2)(react-dom@19.0.0-rc-4c2e457c7c-20240522(react@19.0.0-rc-4c2e457c7c-20240522))(react@18.3.1)(sass@1.77.8) react: 18.3.1 '@vercel/edge@1.1.2': {} @@ -30009,7 +30058,7 @@ snapshots: next-tick@1.1.0: {} - next@14.2.5(@babel/core@7.25.2)(react-dom@19.0.0-rc-4c2e457c7c-20240522(react@18.3.1))(react@18.3.1)(sass@1.77.8): + next@14.2.5(@babel/core@7.25.2)(react-dom@19.0.0-rc-4c2e457c7c-20240522(react@19.0.0-rc-4c2e457c7c-20240522))(react@18.3.1)(sass@1.77.8): dependencies: '@next/env': 14.2.5 '@swc/helpers': 0.5.5 @@ -30018,7 +30067,7 @@ snapshots: graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 - react-dom: 19.0.0-rc-4c2e457c7c-20240522(react@18.3.1) + react-dom: 19.0.0-rc-4c2e457c7c-20240522(react@19.0.0-rc-4c2e457c7c-20240522) styled-jsx: 5.1.1(@babel/core@7.25.2)(react@18.3.1) optionalDependencies: '@next/swc-darwin-arm64': 14.2.5 @@ -32316,12 +32365,6 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 - react-dom@19.0.0-rc-4c2e457c7c-20240522(react@18.3.1): - dependencies: - react: 18.3.1 - scheduler: 0.25.0-rc-4c2e457c7c-20240522 - optional: true - react-dom@19.0.0-rc-4c2e457c7c-20240522(react@19.0.0-rc-4c2e457c7c-20240522): dependencies: react: 19.0.0-rc-4c2e457c7c-20240522