Skip to content

Commit 1720b42

Browse files
authored
feat!: migrate to ngrx signals v19
chore(deps): bump ngrx signals query from 18.1.1 to 19.0.0 chore(deps): bump tanstack angular query from 5.61.1 to 5.62.8 chore(deps): bump angular from 19.0.0 to 19.0.5 chore(deps): bump angular material from 19.0.0 to 19.0.4 chore(deps-dev): bump angular cli from 19.0.1 to 19.0.6 Release-As: 0.5.0
1 parent ad70542 commit 1720b42

File tree

12 files changed

+1946
-1685
lines changed

12 files changed

+1946
-1685
lines changed

.github/workflows/pr.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ jobs:
4949
name: Run E2E tests
5050
runs-on: ubuntu-latest
5151
container:
52-
image: mcr.microsoft.com/playwright:v1.49.0-noble
52+
image: mcr.microsoft.com/playwright:v1.49.1-noble
5353
timeout-minutes: 10
5454
strategy:
5555
fail-fast: false

.release-please-config.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"last-release-sha": "ce0a86eaac2d6d79e4a3e21fc8133584b660f5df",
55
"packages": {
66
".": {
7+
"package-name": "@ngx-signal-store-query/core",
78
"release-type": "node",
89
"bump-minor-pre-major": true,
910
"bump-patch-for-minor-pre-major": true,

.release-please-manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
".": "0.4.0"
2+
"libs/ngx-signal-store-query": "0.4.0"
33
}

apps/demo-e2e/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
"test": "playwright test"
88
},
99
"devDependencies": {
10-
"@playwright/test": "1.49.0",
11-
"@types/node": "^22.9.3"
10+
"@playwright/test": "1.49.1",
11+
"@types/node": "22.10.2"
1212
},
1313
"volta": {
1414
"extends": "../../package.json"

apps/demo/src/app/__snapshots__/app.component.spec.ts.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
exports[`GIVEN AppComponent > WHEN component was initialized > THEN component should be rendered 1`] = `
44
<div
55
id="root1"
6-
ng-version="19.0.0"
6+
ng-version="19.0.5"
77
>
88
<ssq-counter>
99
<output

libs/ngx-signal-store-query/eslint.config.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ const config = tsEslint.config(
2525
style: 'kebab-case',
2626
},
2727
],
28+
'@typescript-eslint/no-explicit-any': 'warn',
2829
},
2930
},
3031
{

libs/ngx-signal-store-query/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@
2525
"tslib": "^2.3.0"
2626
},
2727
"peerDependencies": {
28-
"@angular/common": "^18.0.0 || >=19.0.0",
29-
"@angular/core": "^18.0.0 || >=19.0.0",
30-
"@ngrx/signals": "^18.0.0 || >=19.0.0",
28+
"@angular/common": "^19.0.0 || >=20.0.0 || next",
29+
"@angular/core": "^19.0.0 || >=20.0.0 || next",
30+
"@ngrx/signals": "^19.0.0 || >=20.0.0 || next",
3131
"@tanstack/angular-query-experimental": "^5.61.0"
3232
}
3333
}
Lines changed: 17 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,36 @@
1-
import {
2-
type Prettify,
3-
type SignalStoreFeatureResult,
4-
type StateSignals,
5-
type WritableStateSource,
6-
} from '@ngrx/signals';
7-
import {
8-
type CreateMutationResult,
9-
type CreateQueryOptions,
10-
type CreateQueryResult,
11-
type injectMutation,
12-
type QueryKey,
13-
} from '@tanstack/angular-query-experimental';
1+
import { type SignalStoreFeatureResult, type withProps } from '@ngrx/signals';
2+
import { type CreateQueryOptions, type injectMutation, type QueryKey } from '@tanstack/angular-query-experimental';
143

15-
export type QueryStore<Input extends SignalStoreFeatureResult> = Prettify<
16-
StateSignals<Input['state']> & Input['computed'] & Input['methods'] & WritableStateSource<Prettify<Input['state']>>
17-
>;
4+
export type StoreType<Input extends SignalStoreFeatureResult, Props extends object> = Parameters<
5+
Parameters<typeof withProps<Input, Props>>[0]
6+
>[0];
7+
8+
export type QueryProp<Name extends string> = `${Uncapitalize<Name>}Query`;
189

1910
export type CreateQueryFn<
11+
Name extends string,
2012
TDataFn = unknown,
2113
TError = Error,
2214
TData = TDataFn,
2315
TQueryKey extends QueryKey = QueryKey,
2416
Input extends SignalStoreFeatureResult = SignalStoreFeatureResult,
25-
> = (store: QueryStore<Input>) => () => CreateQueryOptions<TDataFn, TError, TData, TQueryKey>;
26-
27-
export type QueryProp<Name extends string> = `${Uncapitalize<Name>}Query`;
28-
29-
export type QueryMethod<TData = unknown, TError = Error> = (() => CreateQueryResult<TData, TError>) &
30-
CreateQueryResult<TData, TError>;
17+
> = (
18+
store: StoreType<Input, Record<QueryProp<Name>, unknown>>,
19+
) => () => CreateQueryOptions<TDataFn, TError, TData, TQueryKey>;
3120

3221
type CreateMutationOptions<TData = unknown, TError = Error, TVariables = void, TContext = unknown> = ReturnType<
3322
NonNullable<Parameters<typeof injectMutation<TData, TError, TVariables, TContext>>[0]>
3423
>;
3524

36-
export type CreateMutationFn<
37-
TData = unknown,
38-
TError = Error,
39-
TVariables = void,
40-
TContext = unknown,
41-
Input extends SignalStoreFeatureResult = SignalStoreFeatureResult,
42-
> = (store: QueryStore<Input>) => () => CreateMutationOptions<TData, TError, TVariables, TContext>;
43-
4425
export type MutationProp<Name extends string> = `${Uncapitalize<Name>}Mutation`;
4526

46-
export type MutationMethod<
27+
export type CreateMutationFn<
28+
Name extends string,
4729
TData = unknown,
4830
TError = Error,
4931
TVariables = void,
5032
TContext = unknown,
51-
> = (() => CreateMutationResult<TData, TError, TVariables, TContext>) &
52-
CreateMutationResult<TData, TError, TVariables, TContext>;
33+
Input extends SignalStoreFeatureResult = SignalStoreFeatureResult,
34+
> = (
35+
store: StoreType<Input, Record<MutationProp<Name>, unknown>>,
36+
) => () => CreateMutationOptions<TData, TError, TVariables, TContext>;
Lines changed: 12 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,7 @@
1-
import {
2-
type EmptyFeatureResult,
3-
signalStoreFeature,
4-
type SignalStoreFeature,
5-
type SignalStoreFeatureResult,
6-
withMethods,
7-
} from '@ngrx/signals';
8-
import { injectMutation } from '@tanstack/angular-query-experimental';
1+
import { type SignalStoreFeatureResult, withProps } from '@ngrx/signals';
2+
import { type CreateMutationResult, injectMutation } from '@tanstack/angular-query-experimental';
93

10-
import { type CreateMutationFn, type MutationMethod, type MutationProp, type QueryStore } from './types';
4+
import { type CreateMutationFn, type MutationProp } from './types';
115
import { lowerFirst } from './utils';
126

137
export const withMutation = <
@@ -17,33 +11,17 @@ export const withMutation = <
1711
TVariables = void,
1812
TContext = unknown,
1913
Input extends SignalStoreFeatureResult = SignalStoreFeatureResult,
14+
Props extends object = Record<MutationProp<Name>, CreateMutationResult<TData, TError, TVariables, TContext>>,
2015
>(
2116
name: Name,
22-
createMutationFn: CreateMutationFn<TData, TError, TVariables, TContext, NoInfer<Input>>,
23-
): SignalStoreFeature<
24-
Input,
25-
EmptyFeatureResult & {
26-
methods: Record<
27-
MutationProp<NoInfer<Name>>,
28-
MutationMethod<NoInfer<TData>, NoInfer<TError>, NoInfer<TVariables>, NoInfer<TContext>>
29-
>;
30-
}
31-
> => {
32-
const prop: MutationProp<NoInfer<Name>> = `${lowerFirst(name)}Mutation`;
17+
createMutationFn: CreateMutationFn<Name, TData, TError, TVariables, TContext, Input>,
18+
) => {
19+
const prop: MutationProp<Name> = `${lowerFirst(name)}Mutation`;
3320

34-
return signalStoreFeature(
35-
withMethods((store) => {
36-
const mutation = injectMutation(createMutationFn(store as QueryStore<NoInfer<Input>>));
21+
return withProps<Input, Props>((store) => {
22+
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
23+
const mutation = injectMutation(createMutationFn(store as any));
3724

38-
return {
39-
[prop]: new Proxy(() => mutation, {
40-
get: (_, prop) => Reflect.get(mutation, prop),
41-
has: (_, prop) => Reflect.has(mutation, prop),
42-
}),
43-
} as Record<
44-
MutationProp<NoInfer<Name>>,
45-
MutationMethod<NoInfer<TData>, NoInfer<TError>, NoInfer<TVariables>, NoInfer<TContext>>
46-
>;
47-
}),
48-
);
25+
return { [prop]: mutation } as Props;
26+
});
4927
};
Lines changed: 12 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,7 @@
1-
import {
2-
type EmptyFeatureResult,
3-
signalStoreFeature,
4-
type SignalStoreFeature,
5-
type SignalStoreFeatureResult,
6-
withMethods,
7-
} from '@ngrx/signals';
8-
import { injectQuery, type QueryKey } from '@tanstack/angular-query-experimental';
1+
import { type SignalStoreFeatureResult, withProps } from '@ngrx/signals';
2+
import { type CreateQueryResult, injectQuery, type QueryKey } from '@tanstack/angular-query-experimental';
93

10-
import { type CreateQueryFn, type QueryMethod, type QueryProp, type QueryStore } from './types';
4+
import { type CreateQueryFn, type QueryProp } from './types';
115
import { lowerFirst } from './utils';
126

137
export const withQuery = <
@@ -17,25 +11,17 @@ export const withQuery = <
1711
TData = TDataFn,
1812
TQueryKey extends QueryKey = QueryKey,
1913
Input extends SignalStoreFeatureResult = SignalStoreFeatureResult,
14+
Props extends object = Record<QueryProp<Name>, CreateQueryResult<TData, TError>>,
2015
>(
2116
name: Name,
22-
createQueryFn: CreateQueryFn<TDataFn, TError, TData, TQueryKey, NoInfer<Input>>,
23-
): SignalStoreFeature<
24-
Input,
25-
EmptyFeatureResult & { methods: Record<QueryProp<NoInfer<Name>>, QueryMethod<NoInfer<TData>, NoInfer<TError>>> }
26-
> => {
27-
const prop: QueryProp<NoInfer<Name>> = `${lowerFirst(name)}Query`;
17+
createQueryFn: CreateQueryFn<Name, TDataFn, TError, TData, TQueryKey, Input>,
18+
) => {
19+
const prop: QueryProp<Name> = `${lowerFirst(name)}Query`;
2820

29-
return signalStoreFeature(
30-
withMethods((store) => {
31-
const query = injectQuery(createQueryFn(store as QueryStore<NoInfer<Input>>));
21+
return withProps<Input, Props>((store) => {
22+
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
23+
const query = injectQuery(createQueryFn(store as any));
3224

33-
return {
34-
[prop]: new Proxy(() => query, {
35-
get: (_, prop) => Reflect.get(query, prop),
36-
has: (_, prop) => Reflect.has(query, prop),
37-
}),
38-
} as Record<QueryProp<NoInfer<Name>>, QueryMethod<NoInfer<TData>, NoInfer<TError>>>;
39-
}),
40-
);
25+
return { [prop]: query } as Props;
26+
});
4127
};

package.json

Lines changed: 43 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@ngx-signal-store-query/source",
3-
"version": "0.4.0",
3+
"version": "0.5.0",
44
"private": true,
55
"scripts": {
66
"build": "ng build ngx-signal-store-query --configuration=production",
@@ -14,75 +14,70 @@
1414
"prepare": "git config core.hookspath .githooks || true",
1515
"serve": "ng serve demo",
1616
"serve:ssr:demo": "node dist/apps/demo/server/server.mjs",
17-
"test": "ng test"
17+
"test": "ng test",
18+
"test:clear-snapshots": "rimraf -g \"{apps,libs}/**/__snapshots__\""
1819
},
1920
"dependencies": {
20-
"@angular/animations": "^19.0.0",
21-
"@angular/cdk": "^19.0.0",
22-
"@angular/common": "^19.0.0",
23-
"@angular/compiler": "^19.0.0",
24-
"@angular/core": "^19.0.0",
25-
"@angular/forms": "^19.0.0",
26-
"@angular/material": "^19.0.0",
27-
"@angular/platform-browser": "^19.0.0",
28-
"@angular/platform-browser-dynamic": "^19.0.0",
29-
"@angular/platform-server": "^19.0.0",
30-
"@angular/router": "^19.0.0",
31-
"@angular/ssr": "^19.0.1",
32-
"@ngrx/signals": "^18.1.1",
33-
"@tanstack/angular-query-experimental": "^5.61.1",
34-
"express": "^4.21.1",
21+
"@angular/animations": "^19.0.5",
22+
"@angular/cdk": "^19.0.4",
23+
"@angular/common": "^19.0.5",
24+
"@angular/compiler": "^19.0.5",
25+
"@angular/core": "^19.0.5",
26+
"@angular/forms": "^19.0.5",
27+
"@angular/material": "^19.0.4",
28+
"@angular/platform-browser": "^19.0.5",
29+
"@angular/platform-browser-dynamic": "^19.0.5",
30+
"@angular/platform-server": "^19.0.5",
31+
"@angular/router": "^19.0.5",
32+
"@angular/ssr": "^19.0.6",
33+
"@ngrx/signals": "^19.0.0",
34+
"@tanstack/angular-query-experimental": "^5.62.8",
35+
"express": "^4.21.2",
3536
"rxjs": "~7.8.1",
3637
"tslib": "^2.8.1",
3738
"zone.js": "~0.15.0"
3839
},
3940
"devDependencies": {
40-
"@analogjs/vite-plugin-angular": "^1.9.4",
41-
"@analogjs/vitest-angular": "^1.9.4",
42-
"@angular-devkit/build-angular": "^19.0.1",
43-
"@angular/cli": "^19.0.1",
44-
"@angular/compiler-cli": "^19.0.0",
45-
"@commitlint/cli": "^19.6.0",
41+
"@analogjs/vite-plugin-angular": "^1.10.3",
42+
"@analogjs/vitest-angular": "^1.10.3",
43+
"@angular-devkit/build-angular": "^19.0.6",
44+
"@angular/cli": "^19.0.6",
45+
"@angular/compiler-cli": "^19.0.5",
46+
"@commitlint/cli": "^19.6.1",
4647
"@commitlint/config-conventional": "^19.6.0",
47-
"@eslint/js": "^9.15.0",
48-
"@octokit/types": "^13.6.1",
49-
"@playwright/test": "1.49.0",
50-
"@types/express": "^4.17.21",
51-
"@types/node": "^22.9.3",
52-
"@vitest/coverage-v8": "^2.1.5",
53-
"angular-eslint": "18.4.1",
48+
"@eslint/js": "^9.17.0",
49+
"@octokit/types": "^13.6.2",
50+
"@playwright/test": "1.49.1",
51+
"@types/express": "4.17.21",
52+
"@types/node": "22.10.2",
53+
"@vitest/coverage-v8": "^2.1.8",
54+
"angular-eslint": "19.0.2",
5455
"cross-env": "^7.0.3",
55-
"eslint": "^9.15.0",
56+
"eslint": "^9.17.0",
5657
"eslint-config-prettier": "^9.1.0",
5758
"eslint-plugin-import": "^2.31.0",
5859
"eslint-plugin-prettier": "^5.2.1",
5960
"jsdom": "^25.0.1",
60-
"lint-staged": "^15.2.10",
61+
"lint-staged": "^15.2.11",
6162
"ng-packagr": "^19.0.1",
62-
"prettier": "3.3.3",
63-
"prettier-plugin-packagejson": "2.5.5",
63+
"prettier": "3.4.2",
64+
"prettier-plugin-packagejson": "2.5.6",
6465
"prettier-plugin-sh": "0.14.0",
66+
"rimraf": "^6.0.1",
6567
"typescript": "~5.6.3",
66-
"typescript-eslint": "8.15.0",
68+
"typescript-eslint": "8.18.1",
6769
"vite": "^5.4.11",
68-
"vite-tsconfig-paths": "^5.1.3",
69-
"vitest": "^2.1.5"
70+
"vite-tsconfig-paths": "^5.1.4",
71+
"vitest": "^2.1.8"
7072
},
71-
"packageManager": "pnpm@9.14.2",
73+
"packageManager": "pnpm@9.15.1",
7274
"volta": {
73-
"node": "22.11.0",
74-
"pnpm": "9.14.2"
75+
"node": "22.12.0",
76+
"pnpm": "9.15.1"
7577
},
7678
"overrides": {
7779
"@analogjs/vitest-angular": {
78-
"@angular-devkit/architect": "0.1900.1"
79-
},
80-
"@ngrx/signals": {
81-
"@angular/core": "^19.0.0"
82-
},
83-
"angular-eslint": {
84-
"@angular-devkit/core": "^19.0.1",
85-
"@angular-devkit/schematics": "^19.0.1"
80+
"@angular-devkit/architect": "~0.1900.6"
8681
}
8782
}
8883
}

0 commit comments

Comments
 (0)