Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(operators): improve type checking and intellisense for State Operators #1947

Merged
merged 17 commits into from
Dec 9, 2022

Conversation

markwhitfeld
Copy link
Member

PR Checklist

Please check if your PR fulfills the following requirements:

PR Type

What kind of change does this PR introduce?

[x] Bugfix
[x] Feature
[ ] Code style update (formatting, local variables)
[ ] Refactoring (no functional changes, no api changes)
[ ] Build related changes
[ ] CI related changes
[ ] Documentation content changes
[ ] Other... Please describe:

What is the current behavior?

There have been some long-running issues with the way that the typing of state operators work.
This stemmed from some changes in Typescript 3.x in the way that it handled co-variance and contra-variance.
As a result of this change in typescript, state operators would infer their types from the parameters and the return type would satisfy the expected type only due to type structure similarities.
The problem is that this resulted in the fact that additional properties (potentially misspelt properties) would be accepted and would not show an error. Also, if the user tried to use IntelliSense within a patch operator, it would not show any useful suggestions.

What is the new behavior?

The type of a state operator is not inferred from the contextual requirement of the State Operator on it's return type.
The typescript default of inferring the type of T from the arguments of the operator has been blocked so that it allows for this "reverse" inference. As a result of this change, both type checking and IntelliSense work as originally intended.

Does this PR introduce a breaking change?

[ ] Yes
[x] No

After upgrading, the developer may get some compile errors, but this is indicating areas in the code that are incorrectly typed or have an unsafe typing context. Some users may see this as a "breaking change", but it is an enhancement to the typing of the lib instead.

Other information

@markwhitfeld
Copy link
Member Author

Marking this as a draft PR because I still need to decide how some new types are exposed from the lib.

@bundlemon
Copy link

bundlemon bot commented Dec 3, 2022

BundleMon

Files updated (4)
Status Path Size Limits
fesm2015/ngxs-store.js
118.41KB (+21B +0.02%) 125KB / +0.5%
fesm5/ngxs-store.js
137.69KB (+21B +0.01%) 145KB / +0.5%
fesm2015/ngxs-store-operators.js
9.87KB (-66B -0.65%) 15KB / +0.5%
fesm5/ngxs-store-operators.js
10.01KB (-66B -0.64%) 15KB / +0.5%
Unchanged files (2)
Status Path Size Limits
fesm5/ngxs-store-internals.js
6.58KB 20KB / +0.5%
fesm2015/ngxs-store-internals.js
5.65KB 20KB / +0.5%

Total files change -90B -0.03%

Groups updated (2)
Status Path Size Limits
@ngxs/store(esm2015)[gzip]
./esm2015/**/*.js
174.29KB (+1.7KB +0.99%) +1%
@ngxs/store(esm5)[gzip]
./esm5/**/*.js
181.01KB (+1.7KB +0.95%) +1%
Unchanged groups (4)
Status Path Size Limits
@ngxs/store(umd)[gzip]
./bundles/*.umd.js
40.56KB +1%
@ngxs/store(fesm5)[gzip]
./fesm5/*.js
29.86KB +1%
@ngxs/store(fesm2015)[gzip]
./fesm2015/*.js
27.32KB +1%
@ngxs/store(umd.min)[gzip]
./bundles/*.umd.min.js
13.65KB +1%

Final result: ✅

View report in BundleMon website ➡️


Current branch size history | Target branch size history

@bundlemon
Copy link

bundlemon bot commented Dec 3, 2022

BundleMon (NGXS Plugins)

Unchanged files (28)
Status Path Size Limits
Plugins(umd)[gzip]
storage-plugin/bundles/ngxs-storage-plugin.um
d.js
7.98KB +1%
Plugins(umd)[gzip]
router-plugin/bundles/ngxs-router-plugin.umd.
js
7.28KB +1%
Plugins(umd)[gzip]
hmr-plugin/bundles/ngxs-hmr-plugin.umd.js
6.96KB +1%
Plugins(umd)[gzip]
websocket-plugin/bundles/ngxs-websocket-plugi
n.umd.js
6.87KB +1%
Plugins(umd)[gzip]
devtools-plugin/bundles/ngxs-devtools-plugin.
umd.js
6.53KB +1%
Plugins(umd)[gzip]
form-plugin/bundles/ngxs-form-plugin.umd.js
6.44KB +1%
Plugins(umd)[gzip]
logger-plugin/bundles/ngxs-logger-plugin.umd.
js
5.77KB +1%
Plugins(fesm5)[gzip]
storage-plugin/fesm5/ngxs-storage-plugin.js
4.67KB +1%
Plugins(fesm2015)[gzip]
storage-plugin/fesm2015/ngxs-storage-plugin.j
s
4.35KB +1%
Plugins(fesm5)[gzip]
router-plugin/fesm5/ngxs-router-plugin.js
3.91KB +1%
Plugins(fesm5)[gzip]
hmr-plugin/fesm5/ngxs-hmr-plugin.js
3.62KB +1%
Plugins(fesm2015)[gzip]
router-plugin/fesm2015/ngxs-router-plugin.js
3.56KB +1%
Plugins(fesm5)[gzip]
websocket-plugin/fesm5/ngxs-websocket-plugin.
js
3.53KB +1%
Plugins(fesm2015)[gzip]
hmr-plugin/fesm2015/ngxs-hmr-plugin.js
3.25KB +1%
Plugins(fesm5)[gzip]
devtools-plugin/fesm5/ngxs-devtools-plugin.js
3.21KB +1%
Plugins(fesm2015)[gzip]
websocket-plugin/fesm2015/ngxs-websocket-plug
in.js
3.15KB +1%
Plugins(umd.min)[gzip]
hmr-plugin/bundles/ngxs-hmr-plugin.umd.min.js
3.1KB +1%
Plugins(fesm5)[gzip]
form-plugin/fesm5/ngxs-form-plugin.js
3.07KB +1%
Plugins(fesm2015)[gzip]
devtools-plugin/fesm2015/ngxs-devtools-plugin
.js
3.03KB +1%
Plugins(fesm2015)[gzip]
form-plugin/fesm2015/ngxs-form-plugin.js
2.74KB +1%
Plugins(umd.min)[gzip]
router-plugin/bundles/ngxs-router-plugin.umd.
min.js
2.72KB +1%
Plugins(umd.min)[gzip]
storage-plugin/bundles/ngxs-storage-plugin.um
d.min.js
2.54KB +1%
Plugins(fesm5)[gzip]
logger-plugin/fesm5/ngxs-logger-plugin.js
2.48KB +1%
Plugins(umd.min)[gzip]
form-plugin/bundles/ngxs-form-plugin.umd.min.
js
2.43KB +1%
Plugins(fesm2015)[gzip]
logger-plugin/fesm2015/ngxs-logger-plugin.js
2.37KB +1%
Plugins(umd.min)[gzip]
websocket-plugin/bundles/ngxs-websocket-plugi
n.umd.min.js
2.18KB +1%
Plugins(umd.min)[gzip]
logger-plugin/bundles/ngxs-logger-plugin.umd.
min.js
1.95KB +1%
Plugins(umd.min)[gzip]
devtools-plugin/bundles/ngxs-devtools-plugin.
umd.min.js
1.86KB +1%

No change in files bundle size

Unchanged groups (6)
Status Path Size Limits
All Plugins(esm5)[gzip]
./-plugin/esm5/**/.js
128.77KB +1%
All Plugins(esm2015)[gzip]
./-plugin/esm2015/**/.js
123.36KB +1%
All Plugins(umd)[gzip]
./-plugin/bundles/.umd.js
47.84KB +1%
All Plugins(fesm5)[gzip]
./-plugin/fesm5/.js
24.49KB +1%
All Plugins(fesm2015)[gzip]
./-plugin/fesm2015/.js
22.45KB +1%
All Plugins(umd.min)[gzip]
./-plugin/bundles/.umd.min.js
16.77KB +1%

Final result: ✅

View report in BundleMon website ➡️


Current branch size history | Target branch size history

@bundlemon
Copy link

bundlemon bot commented Dec 3, 2022

BundleMon (Integration Projects)

Unchanged files (4)
Status Path Size Limits
Main bundles(Gzip)
hello-world-ng11-ivy/dist-integration/main.(h
ash).js
71.26KB +1%
Main bundles(Gzip)
hello-world-ng13-ivy/dist-integration/main.(h
ash).js
69.9KB +1%
Main bundles(Gzip)
hello-world-ng12-ivy/dist-integration/main.(h
ash).js
67.97KB +1%
Main bundles(Gzip)
hello-world-ng14-ivy/dist-integration/main.(h
ash).js
65.59KB +1%

No change in files bundle size

Final result: ✅

View report in BundleMon website ➡️


Current branch size history | Target branch size history

@markwhitfeld markwhitfeld marked this pull request as ready for review December 8, 2022 20:58
@codeclimate
Copy link

codeclimate bot commented Dec 8, 2022

Code Climate has analyzed commit 2d4d967 and detected 0 issues on this pull request.

The test coverage on the diff in this pull request is 100.0% (50% is the threshold).

This pull request will bring the total coverage in the repository to 96.9% (0.0% change).

View more on Code Climate.

@arturovt arturovt merged commit 7c829a7 into master Dec 9, 2022
@arturovt arturovt deleted the mark/1806-2 branch December 9, 2022 06:10
@markwhitfeld markwhitfeld added this to the v3.8.0 milestone Mar 29, 2023
crapStone pushed a commit to Calciumdibromid/CaBr2 that referenced this pull request Mar 29, 2023
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [@ngxs/form-plugin](https://github.com/ngxs/store) | dependencies | minor | [`3.7.6` -> `3.8.0`](https://renovatebot.com/diffs/npm/@ngxs%2fform-plugin/3.7.6/3.8.0) |
| [@ngxs/storage-plugin](https://github.com/ngxs/store) | dependencies | minor | [`3.7.6` -> `3.8.0`](https://renovatebot.com/diffs/npm/@ngxs%2fstorage-plugin/3.7.6/3.8.0) |
| [@ngxs/store](https://github.com/ngxs/store) | dependencies | minor | [`3.7.6` -> `3.8.0`](https://renovatebot.com/diffs/npm/@ngxs%2fstore/3.7.6/3.8.0) |

---

### Release Notes

<details>
<summary>ngxs/store</summary>

### [`v3.8.0`](https://github.com/ngxs/store/blob/HEAD/CHANGELOG.md#&#8203;380-2023-03-29)

[Compare Source](ngxs/store@v3.7.6...v3.8.0)

-   Feature: Build packages in Ivy format [#&#8203;1945](ngxs/store#1945)
-   Feature: Add advanced selector utilities [#&#8203;1824](ngxs/store#1824)
-   Feature: Expose `ActionContext` and `ActionStatus` [#&#8203;1766](ngxs/store#1766)
-   Feature: `ofAction*` methods should have strong types [#&#8203;1808](ngxs/store#1808)
-   Feature: Improve contextual type inference for state operators [#&#8203;1806](ngxs/store#1806) [#&#8203;1947](ngxs/store#1947)
-   Feature: Enable warning on unhandled actions [#&#8203;1870](ngxs/store#1870) [#&#8203;1951](ngxs/store#1951)
-   Feature: Router Plugin - Provide more actions and navigation timing option [#&#8203;1932](ngxs/store#1932)
-   Feature: Storage Plugin - Allow providing namespace for keys [#&#8203;1841](ngxs/store#1841)
-   Feature: Storage Plugin - Enable providing storage engine individually [#&#8203;1935](ngxs/store#1935)
-   Feature: Devtools Plugin - Add new options to the `NgxsDevtoolsOptions` interface [#&#8203;1879](ngxs/store#1879)
-   Feature: Devtools Plugin - Add trace options to `NgxsDevtoolsOptions` [#&#8203;1968](ngxs/store#1968)
-   Feature: Form Plugin - Allow `ngxsFormDebounce` to be string [#&#8203;1972](ngxs/store#1972)
-   Performance: Tree-shake patch errors [#&#8203;1955](ngxs/store#1955)
-   Fix: Get descriptor explicitly when it's considered as a class property [#&#8203;1961](ngxs/store#1961)
-   Fix: Avoid delayed updates from state stream [#&#8203;1981](ngxs/store#1981)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNS4yNC41IiwidXBkYXRlZEluVmVyIjoiMzUuMjQuNSJ9-->

Co-authored-by: cabr2-bot <cabr2.help@gmail.com>
Reviewed-on: https://codeberg.org/Calciumdibromid/CaBr2/pulls/1837
Reviewed-by: Epsilon_02 <epsilon_02@noreply.codeberg.org>
Co-authored-by: Calciumdibromid Bot <cabr2_bot@noreply.codeberg.org>
Co-committed-by: Calciumdibromid Bot <cabr2_bot@noreply.codeberg.org>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants