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: bulletproof SPA recovery #4558

Merged
merged 40 commits into from Jun 26, 2023
Merged

Conversation

jordanw66
Copy link
Contributor

@jordanw66 jordanw66 commented Jun 22, 2023

Overview

This PR finally delivers the holy trinity of Qwik SPA, specifically:

  • Every page arrived at through SPA can be determined by history alone.
  • (Nearly) every page can recover the SPA context on popstate after a refresh, navigation away/back, browser session restore, etc. (relies on any Link if present, this can be improved, falls back to reload if not)
  • Scroll is saved and restored for every single SPA page, even if the SPA context is lost and not recovered.
  • Scroll history is saved directly in history state, impossible to lose, not subject to sessions or storage being lost. Seriously, when the nukes come for us all the last things standing will be twinkie factories, and your scroll states.
  • Scroll restore and saving almost perfectly mimics browser native scroll restore. You literally cannot tell the difference, and if you find some small edgecase, it should easily be fixable under this setup.
  • This level of SPA recovery doesn't come free, but we "keep it Qwik" by inserting a small shim to replace the old popstate handler. This shim checks if SPA needs to be rebooted, if so it scrolls then manually imports a standalone SPA init QRL to handle the rest. There is essentially 0 impact on MPA pages. The size is comparable to the old handler.
  • This standalone SPA init QRL hands off to the useNavigate context once it's restored. It is never sent to users on MPA, instead we pre-cache when the user first upgrades to SPA, this way it's cached and ready for SPA reboots.
  • @billykwok's custom restoreScroll$ @alpha api has been removed. It was incompatible with these changes, but I do believe the code in this PR can be extended to provide more customization than any other framework. However, it will take some thought to implement and nail down the correct API. For now, we choose to deliver best-in-class MPA-like scroll experience by default.
  • Browsers will natively remember and scroll on every single state. For further resiliency, we patch the history object during an SPA context so that devs who use pushState and replaceState will always maintain scroll history.
  • Rewrote and expanded docs on SPA Navigation to be more informative and also added Scroll Restoration docs.
  • Fixed a longtime issue where isNavigating should've been set to false after render, instead it was being set before.

With this PR, the SPA experience in Qwik becomes indistinguishable from MPA.

What is it?

  • Feature / enhancement
  • Bug
  • Docs / tests / types / typos

Description

Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change.

Use cases and why

    1. One use case
    1. Another use case

Checklist:

  • My code follows the developer guidelines of this project
  • I have performed a self-review of my own code
  • I have made corresponding changes to the documentation
  • Added new tests to cover the fix / functionality

@stackblitz
Copy link

stackblitz bot commented Jun 22, 2023

Review PR in StackBlitz Codeflow Run & review this pull request in StackBlitz Codeflow.

@netlify
Copy link

netlify bot commented Jun 22, 2023

👷 Deploy request for qwik-insights pending review.

Visit the deploys page to approve it

Name Link
🔨 Latest commit 622618d

@DustinJSilk
Copy link
Contributor

amazing work!

@gitguardian
Copy link

gitguardian bot commented Jun 23, 2023

⚠️ GitGuardian has uncovered 2 secrets following the scan of your pull request.

Please consider investigating the findings and remediating the incidents. Failure to do so may lead to compromising the associated services or software components.

🔎 Detected hardcoded secrets in your pull request
GitGuardian id Secret Commit Filename
- Generic High Entropy Secret 6563514 packages/insights/.env.local View secret
- Generic High Entropy Secret fb3da22 packages/insights/.env.local View secret
🛠 Guidelines to remediate hardcoded secrets
  1. Understand the implications of revoking this secret by investigating where it is used in your code.
  2. Replace and store your secrets safely. Learn here the best practices.
  3. Revoke and rotate these secrets.
  4. If possible, rewrite git history. Rewriting git history is not a trivial act. You might completely break other contributing developers' workflow and you risk accidentally deleting legitimate data.

To avoid such incidents in the future consider


🦉 GitGuardian detects secrets in your source code to help developers and security teams secure the modern development process. You are seeing this because you or someone else with access to this repository has authorized GitGuardian to scan your pull request.

Our GitHub checks need improvements? Share your feedbacks!

@jordanw66 jordanw66 marked this pull request as ready for review June 24, 2023 13:56
@jordanw66
Copy link
Contributor Author

This PR is now pretty much ready, please let me know if this implementation is acceptable. cc @manucorporat

@manucorporat
Copy link
Contributor

At this point the implementation is way over my head, you know more than anybody how this works, but the work seems good and i like the reduced API surface, gonna merge before 1.2 release!

Can u fix the merge conflict?

@shairez
Copy link
Collaborator

shairez commented Jun 25, 2023

Wow this is some amazing job @jordanw66 ! 👏👏

(btw, if you are on discord / twitter / myspace, please DM me :)

@jordanw66
Copy link
Contributor Author

jordanw66 commented Jun 26, 2023

@manucorporat Fixed the merge issue, also rewrote and simplified billy's scroll logic, and discovered a few preexisting bugs in useNavigate and Link and fixed those. I've manually tested the whole SPA pipeline now, seems to work amazing. (should be good for this release)

You can imagine there are probably 100s of edge cases with SPA navigation, I plan to rewrite the whole spa e2e in a future PR to make sure this doesn't get broken and covers all of them. Will take time though, SPA is like a labyrinth and not exactly straightforward.

@manucorporat
Copy link
Contributor

Improving e2e is a must a this point indeed, like @shairez said, if you are discord we can chat about a plan!
Once we have a good structure in place is easy to add new regression tests as issues are reported!

@manucorporat manucorporat merged commit 82047a8 into QwikDev:main Jun 26, 2023
19 checks passed
@manucorporat
Copy link
Contributor

Gonna merge!

@jordanw66 jordanw66 deleted the feat/spa-recovery branch June 26, 2023 11:08
kodiakhq bot pushed a commit to ascorbic/unpic-img that referenced this pull request Jul 9, 2023
[![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [@builder.io/qwik](https://qwik.builder.io/) ([source](https://togithub.com/BuilderIO/qwik)) | [`1.1.5` -> `1.2.6`](https://renovatebot.com/diffs/npm/@builder.io%2fqwik/1.1.5/1.2.6) | [![age](https://badges.renovateapi.com/packages/npm/@builder.io%2fqwik/1.2.6/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/npm/@builder.io%2fqwik/1.2.6/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/npm/@builder.io%2fqwik/1.2.6/compatibility-slim/1.1.5)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/npm/@builder.io%2fqwik/1.2.6/confidence-slim/1.1.5)](https://docs.renovatebot.com/merge-confidence/) |

---

### Release Notes

<details>
<summary>BuilderIO/qwik (@&#8203;builder.io/qwik)</summary>

### [`v1.2.6`](https://togithub.com/BuilderIO/qwik/releases/tag/v1.2.6)

[Compare Source](https://togithub.com/BuilderIO/qwik/compare/v1.2.5...v1.2.6)

##### What's Changed

-   feat(server-functions): routeAction$ validation based on RequestEvent by [@&#8203;tzdesign](https://togithub.com/tzdesign) in [QwikDev/qwik#4727
-   fix: visual cms starter by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4731
-   feat: add jokes by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4734
-   docs: fix example in Best Practices Guide by [@&#8203;octoper](https://togithub.com/octoper) in [QwikDev/qwik#4733
-   fix: force spa-init into client symbols in dev builds by [@&#8203;jordanw66](https://togithub.com/jordanw66) in [QwikDev/qwik#4738
-   fix: cli accept empty folder by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4740
-   fix: configure jsx import by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4741
-   chore: update deps by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4742
-   fix: case for images by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4744
-   1.2.6 by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4743

##### New Contributors

-   [@&#8203;octoper](https://togithub.com/octoper) made their first contribution in [QwikDev/qwik#4733

**Full Changelog**: QwikDev/qwik@v1.2.5...v1.2.6

### [`v1.2.5`](https://togithub.com/BuilderIO/qwik/releases/tag/v1.2.5)

[Compare Source](https://togithub.com/BuilderIO/qwik/compare/v1.2.4...v1.2.5)

#### What's Changed

-   Insights by [@&#8203;mhevery](https://togithub.com/mhevery) in [QwikDev/qwik#4707
-   docs(cart): remove padding-left from cart overlay by [@&#8203;gioboa](https://togithub.com/gioboa) in [QwikDev/qwik#4705
-   docs: correct the capture index for qrl by [@&#8203;wtlin1228](https://togithub.com/wtlin1228) in [QwikDev/qwik#4706
-   fix: add .pnpm-store to .prettierignore by [@&#8203;jordanw66](https://togithub.com/jordanw66) in [QwikDev/qwik#4710
-   docs: add route handler menu + ecpsystem case studies  by [@&#8203;hamatoyogi](https://togithub.com/hamatoyogi) in [QwikDev/qwik#4713
-   fix(aws): bundle all without express by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4691
-   fix: multiple cookies in azure by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4716
-   fix: vite csr mode by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4719
-   fix: clear attribute when undefined by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4721
-   docs: fixed typo in labs index.mdx by [@&#8203;Craiqser](https://togithub.com/Craiqser) in [QwikDev/qwik#4573
-   fix: routes plugins with tsx by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4726
-   fix: update pandacss dep by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4725
-   1.2.5 by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4729
-   fix(vite): \n escaping in  vite plugin by [@&#8203;FlatMapIO](https://togithub.com/FlatMapIO) in [QwikDev/qwik#4730

**Full Changelog**: QwikDev/qwik@v1.2.4...v1.2.5

### [`v1.2.4`](https://togithub.com/BuilderIO/qwik/releases/tag/v1.2.4)

[Compare Source](https://togithub.com/BuilderIO/qwik/compare/v1.2.3...v1.2.4)

##### What's Changed

-   fix(eslint): useMethod rule for regular functions by [@&#8203;shairez](https://togithub.com/shairez) in [QwikDev/qwik#4666
-   fix: typo by [@&#8203;yaikohi](https://togithub.com/yaikohi) in [QwikDev/qwik#4655
-   fix: the property parameter can be symbol by [@&#8203;wtlin1228](https://togithub.com/wtlin1228) in [QwikDev/qwik#4668
-   docs css: fix shop cart floating button by [@&#8203;gioboa](https://togithub.com/gioboa) in [QwikDev/qwik#4669
-   shop: added colors to icons and small changes by [@&#8203;the-r3aper7](https://togithub.com/the-r3aper7) in [QwikDev/qwik#4670
-   doc: optional font by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4672
-   fix: image tools improvements by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4671
-   perf: preload css fonts by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4673
-   chore: update deps by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4674
-   fix(optimizer): ssr transform for rollup by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4675
-   fix: add loc to symbol manifest by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4676
-   fix: add crossorigin attribute by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4677
-   docs(request-handling): cookie has method by [@&#8203;tzdesign](https://togithub.com/tzdesign) in [QwikDev/qwik#4632
-   feat(labs): add clustering to symbols by [@&#8203;mhevery](https://togithub.com/mhevery) in [QwikDev/qwik#4648
-   fix: inlined signals in library mode by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4684
-   fix: always try relative path for mapped hooks by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4686
-   fix: configurable getOrigin for node servers by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4687
-   fix: staticFile() api in node middleware by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4693
-   fix(entry.deno.ts): fix wrong parameters by [@&#8203;arkhvoid](https://togithub.com/arkhvoid) in [QwikDev/qwik#4696
-   fix: migrate to modern Deno Server by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4697
-   fix: add vanilla node server by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4699
-   1.2.4 by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4690
-   docs(mdx): fixed path to counter component by [@&#8203;YannickFricke](https://togithub.com/YannickFricke) in [QwikDev/qwik#4680
-   chore: add aws badge by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4703
-   chore: fix \n is pure text in console by [@&#8203;minsoo-web](https://togithub.com/minsoo-web) in [QwikDev/qwik#4700
-   fix: PROTOCOL and HOST header are case insensitive by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4704

##### New Contributors

-   [@&#8203;yaikohi](https://togithub.com/yaikohi) made their first contribution in [QwikDev/qwik#4655
-   [@&#8203;tzdesign](https://togithub.com/tzdesign) made their first contribution in [QwikDev/qwik#4632
-   [@&#8203;arkhvoid](https://togithub.com/arkhvoid) made their first contribution in [QwikDev/qwik#4696
-   [@&#8203;YannickFricke](https://togithub.com/YannickFricke) made their first contribution in [QwikDev/qwik#4680
-   [@&#8203;minsoo-web](https://togithub.com/minsoo-web) made their first contribution in [QwikDev/qwik#4700

**Full Changelog**: QwikDev/qwik@v1.2.3...v1.2.4

### [`v1.2.3`](https://togithub.com/BuilderIO/qwik/releases/tag/v1.2.3)

[Compare Source](https://togithub.com/BuilderIO/qwik/compare/v1.2.2...v1.2.3)

#### What's Changed

-   docs(utilities): adding documentation for the `new` cli command  by [@&#8203;thejackshelton](https://togithub.com/thejackshelton) in [QwikDev/qwik#4649
-   docs: aws lambda documentation by [@&#8203;leifermendez](https://togithub.com/leifermendez) in [QwikDev/qwik#4642
-   fix: server$ error when request is closed by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4653
-   docs: resumable by [@&#8203;aboudard](https://togithub.com/aboudard) in [QwikDev/qwik#2780
-   fix: add dependencies to pkg by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4656
-   fix: navigation crash with plugins by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4657
-   fix: unit test jsx image by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4660
-   docs: ecosystem improvements by [@&#8203;the-r3aper7](https://togithub.com/the-r3aper7) in [QwikDev/qwik#4659
-   fix(slot): rendering variable slot projection by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4661
-   fix: svg rendering + test by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4663
-   1.2.3 by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4662

#### New Contributors

-   [@&#8203;aboudard](https://togithub.com/aboudard) made their first contribution in [QwikDev/qwik#2780

**Full Changelog**: QwikDev/qwik@v1.2.2...v1.2.3

### [`v1.2.2`](https://togithub.com/BuilderIO/qwik/releases/tag/v1.2.2)

[Compare Source](https://togithub.com/BuilderIO/qwik/compare/v1.2.1...v1.2.2)

#### What's Changed

-   fix: csstypes dep by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4644
-   feat(qwik): encode the manifest hash into the container. by [@&#8203;mhevery](https://togithub.com/mhevery) in [QwikDev/qwik#4647

**Full Changelog**: QwikDev/qwik@v1.2.1...v1.2.2

### [`v1.2.1`](https://togithub.com/BuilderIO/qwik/releases/tag/v1.2.1)

[Compare Source](https://togithub.com/BuilderIO/qwik/compare/v1.2.0...v1.2.1)

#### What's Changed

-   docs header: add shop link by [@&#8203;gioboa](https://togithub.com/gioboa) in [QwikDev/qwik#4641
-   fix: tailwind integration by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4640

**Full Changelog**: QwikDev/qwik@v1.2.0...v1.2.1

### [`v1.2.0`](https://togithub.com/BuilderIO/qwik/releases/tag/v1.2.0)

[Compare Source](https://togithub.com/BuilderIO/qwik/compare/v1.1.5...v1.2.0)

##### What's Changed

-   docs: fix link to `speculative-module-fetching` by [@&#8203;Craiqser](https://togithub.com/Craiqser) in [QwikDev/qwik#4421
-   fix: use levenshtein distance to provide even better 404 by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4389
-   feat: serialize support for Set and Map by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4375
-   \[✨] Critical DX/UX improvement to SPA navigation in Qwik City by [@&#8203;billykwok](https://togithub.com/billykwok) in [QwikDev/qwik#3244
-   docs: add CodeSandbox demo to Modular Forms guide by [@&#8203;fabian-hiller](https://togithub.com/fabian-hiller) in [QwikDev/qwik#4095
-   docs: fix link to `Bundle Optimization` by [@&#8203;Craiqser](https://togithub.com/Craiqser) in [QwikDev/qwik#4418
-   feat: image performance dev tools by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4424
-   fix: slow test by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4431
-   docs: qwiksand-box by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4429
-   fix: image-size dep by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4435
-   docs: fix example to match by [@&#8203;hamatoyogi](https://togithub.com/hamatoyogi) in [QwikDev/qwik#4439
-   chore: remove unused starter file by [@&#8203;adamdbradley](https://togithub.com/adamdbradley) in [QwikDev/qwik#4446
-   fix: set qwik builder counter initial value by [@&#8203;adamdbradley](https://togithub.com/adamdbradley) in [QwikDev/qwik#4449
-   fix: cli background install by [@&#8203;adamdbradley](https://togithub.com/adamdbradley) in [QwikDev/qwik#4450
-   feat: client info API by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4433
-   fix: jsx rendering order by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4458
-   Reorganize .gitignore by [@&#8203;szepeviktor](https://togithub.com/szepeviktor) in [QwikDev/qwik#4456
-   docs: Routing - Change getLocation() to useLocation() by [@&#8203;chsanch](https://togithub.com/chsanch) in [QwikDev/qwik#4454
-   fix: visible task execution after removal by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4459
-   Fix typo in MDX example code by [@&#8203;erikras](https://togithub.com/erikras) in [QwikDev/qwik#4457
-   feat(adapter): aws starter adapter by [@&#8203;leifermendez](https://togithub.com/leifermendez) in [QwikDev/qwik#4390
-   fix(use-on.ts): fixed useOn methods to pass correct eventName to \_useOn by [@&#8203;OrenSayag](https://togithub.com/OrenSayag) in [QwikDev/qwik#4453
-   docs: routeLoader adjustment by [@&#8203;hamatoyogi](https://togithub.com/hamatoyogi) in [QwikDev/qwik#4462
-   fix: root gitignore file by [@&#8203;zanettin](https://togithub.com/zanettin) in [QwikDev/qwik#4460
-   fix: add missing nonce to popstate script by [@&#8203;DustinJSilk](https://togithub.com/DustinJSilk) in [QwikDev/qwik#4468
-   feat: CLI option `new` by [@&#8203;zanettin](https://togithub.com/zanettin) in [QwikDev/qwik#4273
-   Include a woman in the "community" emoji by [@&#8203;erikras](https://togithub.com/erikras) in [QwikDev/qwik#4471
-   docs: Update the middleware / endpoint documentation by [@&#8203;mhevery](https://togithub.com/mhevery) in [QwikDev/qwik#4442
-   fix: prefetch urls with different search queries by [@&#8203;DustinJSilk](https://togithub.com/DustinJSilk) in [QwikDev/qwik#4474
-   refactor: improve DX of "qwik new" by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4472
-   fix: bundling for testing by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4475
-   feat: image vite transform by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4479
-   refactor: containerState for appendHeadStyle by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4478
-   fix: implicitly end middleware chain on response by [@&#8203;mhevery](https://togithub.com/mhevery) in [QwikDev/qwik#4441
-   refactor: visible tasks can run in parallel by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4477
-   Update pages.json by [@&#8203;hexa-it](https://togithub.com/hexa-it) in [QwikDev/qwik#4473
-   feat: update starter dev-tools by [@&#8203;adamdbradley](https://togithub.com/adamdbradley) in [QwikDev/qwik#4483
-   perf: optimizer knows non-variadic components by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4484
-   Add new documentation for deprecated features. by [@&#8203;nsdonato](https://togithub.com/nsdonato) in [QwikDev/qwik#4476
-   feat: add no-unnecessary-condition eslint rule by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4485
-   fix(parse-pathname): path segment encoding by [@&#8203;Varixo](https://togithub.com/Varixo) in [QwikDev/qwik#4486
-   docs(\*): update contribution docs by [@&#8203;Wimpert](https://togithub.com/Wimpert) in [QwikDev/qwik#4490
-   Allow replace state when navigating by [@&#8203;Wimpert](https://togithub.com/Wimpert) in [QwikDev/qwik#4488
-   fix: test bundle mode by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4491
-   fix: 'Numberish' type used for width/height didn't allow % by [@&#8203;KenAKAFrosty](https://togithub.com/KenAKAFrosty) in [QwikDev/qwik#4434
-   fix: missing navigation update to static page by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4493
-   🦄 by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4495
-   feat: add image to starter by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4497
-   fix: $localize optimizer bug by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4498
-   docs(adding content security policy to the advanced topics) by [@&#8203;the-zimmermann](https://togithub.com/the-zimmermann) in [QwikDev/qwik#4440
-   fix: clientConn types by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4501
-   Pr docs qwik city by [@&#8203;mhevery](https://togithub.com/mhevery) in [QwikDev/qwik#4494
-   chore: fix dev release by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4511
-   refactor: simplify new templates by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4512
-   fix: cli new interactive by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4516
-   feat: svg optimization with esm by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4526
-   fix: spa redirects from non-pages by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4518
-   docs: fix typos in Overview and State files. by [@&#8203;eecopa](https://togithub.com/eecopa) in [QwikDev/qwik#4524
-   docs: fixed a typo in image link by [@&#8203;avanderpluijm](https://togithub.com/avanderpluijm) in [QwikDev/qwik#4514
-   docs: fixed small typos in qwik-city documentation. by [@&#8203;VinuB-Dev](https://togithub.com/VinuB-Dev) in [QwikDev/qwik#4522
-   feat: pandacss integration by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4515
-   docs: added custom icons  by [@&#8203;LoganAffleck](https://togithub.com/LoganAffleck) in [QwikDev/qwik#4513
-   Update app.tsx in runtime-less example by [@&#8203;primeagen-rustaceans](https://togithub.com/primeagen-rustaceans) in [QwikDev/qwik#4467
-   docs: fix typos by [@&#8203;enesflow](https://togithub.com/enesflow) in [QwikDev/qwik#4500
-   docs: move think-qwik page to concepts route by [@&#8203;moinulmoin](https://togithub.com/moinulmoin) in [QwikDev/qwik#4499
-   feat: frame-perfect and state-backed durable SPA scroll restoration by [@&#8203;jordanw66](https://togithub.com/jordanw66) in [QwikDev/qwik#4509
-   docs: fixed typos in comments and docs by [@&#8203;ehrencrona](https://togithub.com/ehrencrona) in [QwikDev/qwik#4430
-   doc: add redirect to new think-qwik docs by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4533
-   fix: missing component in layout by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4535
-   fix(router): use encodeURI instead by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4534
-   fix: click to component for svg by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4537
-   fix: regression when navigating to / by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4538
-   fix: save scrollState on visibilitychange by [@&#8203;jordanw66](https://togithub.com/jordanw66) in [QwikDev/qwik#4536
-   feat: automatically set qwik icons by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4539
-   fix: renderToString mode is always ignored and returns an empty page by [@&#8203;ncharalampidis](https://togithub.com/ncharalampidis) in [QwikDev/qwik#4528
-   fix: image?jsx strip export default by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4541
-   fix(router): redirect handling by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4543
-   chore: update deps by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4540
-   chore: create `@builder.io/qwik-labs` by [@&#8203;mhevery](https://togithub.com/mhevery) in [QwikDev/qwik#4545
-   perf: leverage modulepreload for common chunks by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4546
-   fix: perfect hash scroll by [@&#8203;jordanw66](https://togithub.com/jordanw66) in [QwikDev/qwik#4550
-   perf: enable navigationPreload by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4548
-   Sidebar style by [@&#8203;LoganAffleck](https://togithub.com/LoganAffleck) in [QwikDev/qwik#4554
-   fix: QwikIntrinsicElements does not include ref by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4555
-   docs: add panda css by [@&#8203;anubra266](https://togithub.com/anubra266) in [QwikDev/qwik#4544
-   feat(insights): create a new insights application by [@&#8203;mhevery](https://togithub.com/mhevery) in [QwikDev/qwik#4547
-   docs: add ss-link to showcase by [@&#8203;Leizhenpeng](https://togithub.com/Leizhenpeng) in [QwikDev/qwik#2689
-   fix: navigationPreload waitUntil by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4561
-   feat: layout shift detection by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4560
-   docs: add resource + fix css by [@&#8203;hamatoyogi](https://togithub.com/hamatoyogi) in [QwikDev/qwik#4562
-   fix(qwik-city buildtime): make generated file ids unique by [@&#8203;hbendev](https://togithub.com/hbendev) in [QwikDev/qwik#4564
-   feat: transform compiler architecture by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4566
-   feat(insights): basic UI for seeing symbols by [@&#8203;mhevery](https://togithub.com/mhevery) in [QwikDev/qwik#4565
-   docs: Add Qwik Labs section by [@&#8203;mhevery](https://togithub.com/mhevery) in [QwikDev/qwik#4568
-   chore: fix broken lock file by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4574
-   fix: route new template by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4576
-   docs(qwik-labs edit link route): fixed qwik labs "edit page" link & so… by [@&#8203;thejackshelton](https://togithub.com/thejackshelton) in [QwikDev/qwik#4571
-   feat(labs): typed routes by [@&#8203;mhevery](https://togithub.com/mhevery) in [QwikDev/qwik#4580
-   docs(labs): add typed routes by [@&#8203;mhevery](https://togithub.com/mhevery) in [QwikDev/qwik#4582
-   chore: fix saving of artifacts to build by [@&#8203;mhevery](https://togithub.com/mhevery) in [QwikDev/qwik#4583
-   chore(labs): fix distribution build by [@&#8203;mhevery](https://togithub.com/mhevery) in [QwikDev/qwik#4584
-   Internal renaming suggestions by [@&#8203;shairez](https://togithub.com/shairez) in [QwikDev/qwik#4581
-   fix(labs): encodeencodeURIComponent for params by [@&#8203;mhevery](https://togithub.com/mhevery) in [QwikDev/qwik#4587
-   feat: panda css use vite-macro plugin by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4588
-   Qwik shop 🎁 by [@&#8203;gioboa](https://togithub.com/gioboa) in [QwikDev/qwik#4225
-   fix: shop cache by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4590
-   docs(advanced & concepts docs improvements): clarity / structure changes by [@&#8203;thejackshelton](https://togithub.com/thejackshelton) in [QwikDev/qwik#4592
-   Add replaceState to link component by [@&#8203;Wimpert](https://togithub.com/Wimpert) in [QwikDev/qwik#4492
-   docs: simplify menu by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4593
-   fix: improve pandacss integration by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4594
-   fix: default prettier format for starters by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4595
-   chore(labs): copy build artifacts into the build git repo by [@&#8203;mhevery](https://togithub.com/mhevery) in [QwikDev/qwik#4589
-   chore: update deps by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4597
-   docs: fix insights docs by [@&#8203;gioboa](https://togithub.com/gioboa) in [QwikDev/qwik#4598
-   chore(labs): include package.json in full build by [@&#8203;mhevery](https://togithub.com/mhevery) in [QwikDev/qwik#4599
-   docs: Dynamic og image implementation by [@&#8203;mrhoodz](https://togithub.com/mrhoodz) in [QwikDev/qwik#4579
-   fix: correct documentation URLs for rules created by ESLintUtils.RuleCreator by [@&#8203;wtlin1228](https://togithub.com/wtlin1228) in [QwikDev/qwik#4604
-   feat: bulletproof SPA recovery by [@&#8203;jordanw66](https://togithub.com/jordanw66) in [QwikDev/qwik#4558
-   fix: Social and Vendor are production only components by [@&#8203;wtlin1228](https://togithub.com/wtlin1228) in [QwikDev/qwik#4610
-   docs: image optimization by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4608
-   chore: change useStore link by [@&#8203;GustavoMelloGit](https://togithub.com/GustavoMelloGit) in [QwikDev/qwik#4601
-   fix(qwik-core): add types for the style attribute by [@&#8203;hbendev](https://togithub.com/hbendev) in [QwikDev/qwik#4577
-   docs: Update deprecation information about the basePathname by [@&#8203;julianobrasil](https://togithub.com/julianobrasil) in [QwikDev/qwik#4437
-   docs: fix typos on Qwik City home by [@&#8203;corydeppen](https://togithub.com/corydeppen) in [QwikDev/qwik#4602
-   feat: improve error message for duplicated loaders by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4619
-   docs: dynamic ogImage feature url format fix and clean up by [@&#8203;mrhoodz](https://togithub.com/mrhoodz) in [QwikDev/qwik#4617
-   fix: detect invalid html by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4623
-   1.2.0 by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4600
-   fix: image devtools by [@&#8203;manucorporat](https://togithub.com/manucorporat) in [QwikDev/qwik#4626
-   feat: qwik add builder.io by [@&#8203;adamdbradley](https://togithub.com/adamdbradley) in [QwikDev/qwik#4627
-   feat: scroll opt-out on nav() and Link by [@&#8203;jordanw66](https://togithub.com/jordanw66) in [QwikDev/qwik#4622

##### New Contributors

-   [@&#8203;erikras](https://togithub.com/erikras) made their first contribution in [QwikDev/qwik#4457
-   [@&#8203;OrenSayag](https://togithub.com/OrenSayag) made their first contribution in [QwikDev/qwik#4453
-   [@&#8203;hexa-it](https://togithub.com/hexa-it) made their first contribution in [QwikDev/qwik#4473
-   [@&#8203;the-zimmermann](https://togithub.com/the-zimmermann) made their first contribution in [QwikDev/qwik#4440
-   [@&#8203;eecopa](https://togithub.com/eecopa) made their first contribution in [QwikDev/qwik#4524
-   [@&#8203;avanderpluijm](https://togithub.com/avanderpluijm) made their first contribution in [QwikDev/qwik#4514
-   [@&#8203;VinuB-Dev](https://togithub.com/VinuB-Dev) made their first contribution in [QwikDev/qwik#4522
-   [@&#8203;LoganAffleck](https://togithub.com/LoganAffleck) made their first contribution in [QwikDev/qwik#4513
-   [@&#8203;primeagen-rustaceans](https://togithub.com/primeagen-rustaceans) made their first contribution in [QwikDev/qwik#4467
-   [@&#8203;enesflow](https://togithub.com/enesflow) made their first contribution in [QwikDev/qwik#4500
-   [@&#8203;moinulmoin](https://togithub.com/moinulmoin) made their first contribution in [QwikDev/qwik#4499
-   [@&#8203;jordanw66](https://togithub.com/jordanw66) made their first contribution in [QwikDev/qwik#4509
-   [@&#8203;ehrencrona](https://togithub.com/ehrencrona) made their first contribution in [QwikDev/qwik#4430
-   [@&#8203;ncharalampidis](https://togithub.com/ncharalampidis) made their first contribution in [QwikDev/qwik#4528
-   [@&#8203;anubra266](https://togithub.com/anubra266) made their first contribution in [QwikDev/qwik#4544
-   [@&#8203;Leizhenpeng](https://togithub.com/Leizhenpeng) made their first contribution in [QwikDev/qwik#2689
-   [@&#8203;mrhoodz](https://togithub.com/mrhoodz) made their first contribution in [QwikDev/qwik#4579
-   [@&#8203;corydeppen](https://togithub.com/corydeppen) made their first contribution in [QwikDev/qwik#4602

**Full Changelog**: QwikDev/qwik@v1.1.5...v1.2.0

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "after 9pm on sunday" (UTC), 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 this update again.

---

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

---

This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://developer.mend.io/github/ascorbic/unpic-img).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNi41LjMiLCJ1cGRhdGVkSW5WZXIiOiIzNi41LjMiLCJ0YXJnZXRCcmFuY2giOiJtYWluIn0=-->
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.

None yet

4 participants