Compare commits
45 Commits
blitz@2.0.
...
@blitzjs/n
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
922bc276d9 | ||
|
|
365e67094c | ||
|
|
31d7a6f413 | ||
|
|
8726b16bb9 | ||
|
|
240f378b54 | ||
|
|
d6655f0178 | ||
|
|
001c174cbf | ||
|
|
1d863f352a | ||
|
|
a36110171a | ||
|
|
37b5e35e22 | ||
|
|
3b213a35b0 | ||
|
|
809f6019be | ||
|
|
a51b1e85e1 | ||
|
|
a948dbb7b8 | ||
|
|
4b91c429ca | ||
|
|
6ab9db7802 | ||
|
|
d3e6b02ad4 | ||
|
|
813365da61 | ||
|
|
6559c25f71 | ||
|
|
83b355900b | ||
|
|
c721c104db | ||
|
|
7e538ba451 | ||
|
|
8e00605a86 | ||
|
|
dcdcd04055 | ||
|
|
e339e2fd0a | ||
|
|
37e1ec4abc | ||
|
|
718a194891 | ||
|
|
0f18c68d63 | ||
|
|
3511d5b69b | ||
|
|
716e188d13 | ||
|
|
57a53fa3c2 | ||
|
|
abb1ad5d1c | ||
|
|
7096083038 | ||
|
|
0ac6e17122 | ||
|
|
8bcb471a53 | ||
|
|
abe2afccdf | ||
|
|
d9fc5d8e26 | ||
|
|
3f20a47405 | ||
|
|
72addbbeed | ||
|
|
1c809094fd | ||
|
|
54a66a95dc | ||
|
|
8d9ea00e1d | ||
|
|
ab4d9de70f | ||
|
|
8f166a5db0 | ||
|
|
df7cee84ad |
@@ -970,7 +970,8 @@
|
||||
"avatar_url": "https://avatars0.githubusercontent.com/u/3496193?v=4",
|
||||
"profile": "https://twitter.com/dillonraphael",
|
||||
"contributions": [
|
||||
"code"
|
||||
"code",
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -3590,6 +3591,45 @@
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "saadaltabari",
|
||||
"name": "saadaltabari",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/29986512?v=4",
|
||||
"profile": "https://github.com/saadaltabari",
|
||||
"contributions": [
|
||||
"doc",
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "iojcde",
|
||||
"name": "Jeeho Ahn",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/31413538?v=4",
|
||||
"profile": "https://github.com/iojcde",
|
||||
"contributions": [
|
||||
"doc",
|
||||
"tool",
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "ryanwashburne",
|
||||
"name": "Ryan Washburne",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/12566087?v=4",
|
||||
"profile": "https://linkedin.com/in/ryanwashburne",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "sherryxiao1988",
|
||||
"name": "Shundan Xiao",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/1202426?v=4",
|
||||
"profile": "https://github.com/sherryxiao1988",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
}
|
||||
],
|
||||
"contributorsPerLine": 7,
|
||||
|
||||
6
.changeset/breezy-moose-behave.md
Normal file
6
.changeset/breezy-moose-behave.md
Normal file
@@ -0,0 +1,6 @@
|
||||
---
|
||||
"blitz": minor
|
||||
"@blitzjs/auth": patch
|
||||
---
|
||||
|
||||
Truncate errors from `api/auth/<strategy>/callback` request to 100 characters before passing them to the `?authError=` query parameter
|
||||
5
.changeset/calm-carpets-deny.md
Normal file
5
.changeset/calm-carpets-deny.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"blitz": patch
|
||||
---
|
||||
|
||||
Fixes the db seed command so that the database can disconnect after running the seed file.
|
||||
5
.changeset/calm-nails-wait.md
Normal file
5
.changeset/calm-nails-wait.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@blitzjs/codemod": patch
|
||||
---
|
||||
|
||||
These are various changes to will make the codemod more dynamic and work with a larger variety of codebases. These fixes are implemented to make the codemod work with flightdeck.
|
||||
5
.changeset/clean-walls-wink.md
Normal file
5
.changeset/clean-walls-wink.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@blitzjs/rpc": patch
|
||||
---
|
||||
|
||||
Pass `signal` from useQuery to Blitz internal rpc client to be able to cancel queries on unmount
|
||||
5
.changeset/curly-seas-serve.md
Normal file
5
.changeset/curly-seas-serve.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"blitz": patch
|
||||
---
|
||||
|
||||
Check for new versions when running CLI
|
||||
5
.changeset/dirty-planets-chew.md
Normal file
5
.changeset/dirty-planets-chew.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@blitzjs/auth": patch
|
||||
---
|
||||
|
||||
Update `deleteSession` return type — allow undefined values
|
||||
5
.changeset/four-sheep-judge.md
Normal file
5
.changeset/four-sheep-judge.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@blitzjs/next": patch
|
||||
---
|
||||
|
||||
Export router-context from browser entrypoint
|
||||
5
.changeset/fuzzy-bees-warn.md
Normal file
5
.changeset/fuzzy-bees-warn.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"blitz": patch
|
||||
---
|
||||
|
||||
Fix APP_ENV not being set before loading env config
|
||||
5
.changeset/gorgeous-buses-scream.md
Normal file
5
.changeset/gorgeous-buses-scream.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@blitzjs/next": patch
|
||||
---
|
||||
|
||||
Allow prefetching multiple queries in gSSP and gSP
|
||||
5
.changeset/heavy-apes-judge.md
Normal file
5
.changeset/heavy-apes-judge.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"blitz": patch
|
||||
---
|
||||
|
||||
Show all blitz packages when running `blitz version` command
|
||||
5
.changeset/hungry-baboons-swim.md
Normal file
5
.changeset/hungry-baboons-swim.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"blitz": patch
|
||||
---
|
||||
|
||||
Improve codemod utilities
|
||||
5
.changeset/lemon-seas-push.md
Normal file
5
.changeset/lemon-seas-push.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@blitzjs/generator": patch
|
||||
---
|
||||
|
||||
Don't try to copy RPC API endpoint in templates that don't have it
|
||||
10
.changeset/mean-gorillas-reply.md
Normal file
10
.changeset/mean-gorillas-reply.md
Normal file
@@ -0,0 +1,10 @@
|
||||
---
|
||||
"@blitzjs/auth": patch
|
||||
"blitz": patch
|
||||
---
|
||||
|
||||
Fix a long-standing issue with occasional blitz auth flakiness
|
||||
|
||||
This bug would sometimes cause users to be logged out or to experience an CSRFTokenMismatchError. This bug, when encountered, usually by lots of setPublicData or session.create calls, would not set the cookie headers correctly resulting in cookies being set to a previous state or in a possibly undefined state.
|
||||
|
||||
There are no security concerns as far as I can tell.
|
||||
5
.changeset/modern-ligers-behave.md
Normal file
5
.changeset/modern-ligers-behave.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@blitzjs/generator": patch
|
||||
---
|
||||
|
||||
Add hoist pattern entry for react-query in new app templates
|
||||
5
.changeset/ninety-lies-press.md
Normal file
5
.changeset/ninety-lies-press.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"blitz": patch
|
||||
---
|
||||
|
||||
Temporarily skip version check
|
||||
5
.changeset/perfect-eyes-repeat.md
Normal file
5
.changeset/perfect-eyes-repeat.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@blitzjs/rpc": patch
|
||||
---
|
||||
|
||||
Fix pipe resolver return type
|
||||
5
.changeset/polite-lizards-love.md
Normal file
5
.changeset/polite-lizards-love.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"blitz": patch
|
||||
---
|
||||
|
||||
Passes the correct arguments (without flags) to any bin command ran with the blitz cli
|
||||
@@ -23,10 +23,16 @@
|
||||
"changesets": [
|
||||
"big-phones-bow",
|
||||
"breezy-cameras-double",
|
||||
"breezy-moose-behave",
|
||||
"bright-mangos-run",
|
||||
"calm-carpets-deny",
|
||||
"calm-nails-wait",
|
||||
"clean-walls-wink",
|
||||
"cool-doors-invent",
|
||||
"cool-horses-check",
|
||||
"curly-seas-serve",
|
||||
"dirty-monkeys-greet",
|
||||
"dirty-planets-chew",
|
||||
"eleven-humans-sort",
|
||||
"empty-berries-rule",
|
||||
"empty-turkeys-wave",
|
||||
@@ -36,19 +42,27 @@
|
||||
"flat-bees-approve",
|
||||
"four-brooms-juggle",
|
||||
"four-meals-fry",
|
||||
"four-sheep-judge",
|
||||
"fuzzy-bees-warn",
|
||||
"fuzzy-jars-admire",
|
||||
"gentle-dogs-reply",
|
||||
"good-apes-drum",
|
||||
"good-insects-wink",
|
||||
"gorgeous-buses-scream",
|
||||
"great-months-train",
|
||||
"green-papayas-do",
|
||||
"healthy-rice-shout",
|
||||
"heavy-apes-judge",
|
||||
"hot-drinks-approve",
|
||||
"hungry-baboons-swim",
|
||||
"late-steaks-give",
|
||||
"lemon-games-press",
|
||||
"lemon-seas-push",
|
||||
"lovely-colts-share",
|
||||
"lucky-cows-try",
|
||||
"mean-gorillas-reply",
|
||||
"modern-cameras-pull",
|
||||
"modern-ligers-behave",
|
||||
"moody-bags-walk",
|
||||
"moody-squids-cheer",
|
||||
"nervous-beds-travel",
|
||||
@@ -58,16 +72,21 @@
|
||||
"nice-starfishes-live",
|
||||
"nine-birds-confess",
|
||||
"nine-onions-admire",
|
||||
"ninety-lies-press",
|
||||
"ninety-pets-heal",
|
||||
"olive-bees-buy",
|
||||
"olive-feet-rhyme",
|
||||
"olive-sheep-rhyme",
|
||||
"perfect-eyes-repeat",
|
||||
"plenty-bottles-swim",
|
||||
"polite-lizards-love",
|
||||
"poor-peas-lick",
|
||||
"poor-penguins-look",
|
||||
"poor-shrimps-think",
|
||||
"popular-teachers-pay",
|
||||
"pretty-games-march",
|
||||
"purple-singers-greet",
|
||||
"quick-cycles-confess",
|
||||
"quiet-feet-travel",
|
||||
"quiet-pans-hunt",
|
||||
"quiet-sloths-rule",
|
||||
@@ -76,12 +95,18 @@
|
||||
"sharp-falcons-begin",
|
||||
"shy-olives-hang",
|
||||
"silent-colts-reply",
|
||||
"silly-apricots-share",
|
||||
"six-apricots-kick",
|
||||
"slimy-needles-taste",
|
||||
"slow-walls-poke",
|
||||
"small-socks-confess",
|
||||
"smooth-planets-admire",
|
||||
"smooth-stingrays-drum",
|
||||
"soft-adults-smell",
|
||||
"sour-lemons-hunt",
|
||||
"strong-apes-reply",
|
||||
"stupid-walls-sell",
|
||||
"sweet-kiwis-cross",
|
||||
"swift-drinks-dress",
|
||||
"tall-meals-learn",
|
||||
"tame-keys-reply",
|
||||
@@ -92,6 +117,8 @@
|
||||
"thick-parrots-float",
|
||||
"thirty-countries-build",
|
||||
"tidy-clouds-smoke",
|
||||
"tough-toes-pull",
|
||||
"twelve-lemons-smile",
|
||||
"twenty-beans-pump",
|
||||
"two-carpets-rhyme",
|
||||
"two-kiwis-help",
|
||||
@@ -101,6 +128,7 @@
|
||||
"violet-lions-help",
|
||||
"weak-suns-shave",
|
||||
"wicked-ghosts-cough",
|
||||
"wicked-rings-walk",
|
||||
"wise-frogs-give"
|
||||
]
|
||||
}
|
||||
|
||||
5
.changeset/pretty-games-march.md
Normal file
5
.changeset/pretty-games-march.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@blitzjs/codemod": patch
|
||||
---
|
||||
|
||||
Import ErrorComponent as DefaultErrorComponent
|
||||
5
.changeset/quick-cycles-confess.md
Normal file
5
.changeset/quick-cycles-confess.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"blitz": patch
|
||||
---
|
||||
|
||||
fixes blitz not loading custom server
|
||||
5
.changeset/silly-apricots-share.md
Normal file
5
.changeset/silly-apricots-share.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@blitzjs/next": patch
|
||||
---
|
||||
|
||||
Avoid reassigning queryClient in prefetch methods
|
||||
5
.changeset/six-apricots-kick.md
Normal file
5
.changeset/six-apricots-kick.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@blitzjs/next": patch
|
||||
---
|
||||
|
||||
Infer result type in the `api` handler and allow customizing it
|
||||
5
.changeset/smooth-stingrays-drum.md
Normal file
5
.changeset/smooth-stingrays-drum.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@blitzjs/codemod": patch
|
||||
---
|
||||
|
||||
Updates the error messages based on if it's a babel parse error or an unexpected error
|
||||
5
.changeset/soft-adults-smell.md
Normal file
5
.changeset/soft-adults-smell.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@blitzjs/auth": patch
|
||||
---
|
||||
|
||||
Fix `Page.authenticate` not working for layout components
|
||||
9
.changeset/sour-lemons-hunt.md
Normal file
9
.changeset/sour-lemons-hunt.md
Normal file
@@ -0,0 +1,9 @@
|
||||
---
|
||||
"@blitzjs/auth": patch
|
||||
"blitz": patch
|
||||
---
|
||||
|
||||
Fix auth issue where session token and publicData cookie were updated unnecessarily, leading to potential user logout
|
||||
|
||||
- Previously, we were updating the session token each time public data changed. This is not needed, and it would cause race condition bugs where a user could be unexpectedly logged out because a request already in flight would not match the new session token.
|
||||
- Previously, we were updating the publicData cookie even when it hadn't changed. This may reduce unnecessary re-renders on the client.
|
||||
5
.changeset/sweet-kiwis-cross.md
Normal file
5
.changeset/sweet-kiwis-cross.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@blitzjs/rpc": patch
|
||||
---
|
||||
|
||||
Fix queries/mutations lookup on Windows
|
||||
5
.changeset/tough-toes-pull.md
Normal file
5
.changeset/tough-toes-pull.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@blitzjs/rpc": patch
|
||||
---
|
||||
|
||||
Remove debug console.log
|
||||
5
.changeset/twelve-lemons-smile.md
Normal file
5
.changeset/twelve-lemons-smile.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@blitzjs/next": patch
|
||||
---
|
||||
|
||||
Fix prefetching multiple queries causes only the last one to be passed to page
|
||||
5
.changeset/wicked-rings-walk.md
Normal file
5
.changeset/wicked-rings-walk.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@blitzjs/next": patch
|
||||
---
|
||||
|
||||
Set prefix in moduleNameWrapper's options in Blitz's jest configuration
|
||||
2
.github/CODEOWNERS
vendored
2
.github/CODEOWNERS
vendored
@@ -1,5 +1,5 @@
|
||||
# https://help.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners
|
||||
|
||||
* @flybayer @beerose @dillonraphael
|
||||
* @beerose @dillonraphael
|
||||
|
||||
packages/generator/templates**/* @flybayer
|
||||
|
||||
2
.npmrc
2
.npmrc
@@ -6,4 +6,4 @@ public-hoist-pattern[]=*types*
|
||||
public-hoist-pattern[]=*eslint*
|
||||
public-hoist-pattern[]=@prettier/plugin-*
|
||||
public-hoist-pattern[]=*prettier-plugin-*
|
||||
strict-peer-dependencies=false
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Contributing
|
||||
|
||||
[Read the Contributing Guide at Blitzjs.com](https://blitzjs.com/docs/contributing)
|
||||
[Read the Contributing Guide at Blitzjs.com](https://alpha.blitzjs.com/docs/contributing)
|
||||
|
||||
## To run tests
|
||||
|
||||
|
||||
52
README.md
52
README.md
@@ -6,7 +6,7 @@
|
||||
<img alt="" src="https://img.shields.io/badge/Join%20our%20community-6700EB.svg?style=for-the-badge&labelColor=000000&logoWidth=20&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQ9SURBVHgB7d3dVdtAEIbhcSpICUoH0IEogQqSVBBSAU4FSSpIOoAORAfQgSghHXzZ1U/YcMD4R9rZmf2ec3y448LyiNf27iLiGIAmPLrweC9Un3DhrzG6EarLNP09nlwJ1SOZ/lQr5N80/S/p2QMVCBf5N17XCfm1Y/rBHqjAG9PPHvBsz+mf9WAP+HLA9M/YA14cOP2payH7jpj+VCtk1wnTP+vj7xCy6cTpn7EHLMLp059iD1iD8eveJbVCNsSLheX1YA/YgOWnf8YeKB3Wmf7Ud6Fy4f/FHmtpxbl3YlC4MJ/Cj0bWdwPnPbARg+L0S54XQHS32WwuxClzd4CM0z9rPfeAuTtA5ulPXYQ7wZ04Y+oOoDD9KZc9YOoOoDj9s4dwFzgXR6w1wIPoOvPWA9buAHEJ173o3gWiy3AnuBUHLEbgmYwvAk1/wuM8vAgexThzbwPDkx7/DHwVXfFOxP2GmsKd4Ab6zPeAyU8CI7AHFmH2BRCBPXAyk18GzUrqAXCTiR4ssyj0VFw/oCU8+e+RZ33AWz6KMaYbIIWxB+JSLs1bsbkeMN0AqakHvoku9oA2sAfqBvbAQdw0QArsgb25aYBUQT3QgT2gB+yBuqGcHij2UCqXDZACe2Anlw2QYg/QAOyBuoE98CL3DZDCuK4/rh/Q7oGL6U+TOvcNkJoijN8X1C48+T+g75eQDrAH/qmqAVJgDwyqaoAUe4AGYA/UDZX3QLUNkEIZPRCd5+6BahsgVUgPROwBTSijB7jpVAvGHriHvmw9wAZ4BpX1ABvgmakHtPcbRuwBTWAPULgAV9D/jKDY9YRvwvgEaurD44uQHvAol7qBW7WKluVtIHiUS7GyvA0s6CiXDnxrpQfsgbqBS7GKk/2jYHCrVlGyfxTMrVo0ALdq1Q3sgSKofh0M9oA61a+D2QM0AHugbmAPqClmSRjK2apVVQ8UsySsoK1aHdgDesCtWnUDeyCrIpeFg1u3sylyWTi3btMA7IG6gT2wuuK3hoE9sKrit4YVslWLPaAN7IG6ocKt2zmY2h4O9sDiTG0PZw/QANy6XTewBxZj9ogYVHy025LMHhEz9cBn0We6B0yfERReBLfhx0/R1YQHPx/QBPbA0VwcEwf2wNFcHBPHHjiem3MC2QPHcXdSaJjA+KfgTPQ8hhfjBzHC40mhlzJ+Xq9lK4a4PCs43AVaGTed5mZq+iOXZwWHi3AnOj2wFWNcnxYe7gTxLtBKHuamP/J+Wnh8a5irB7ZC5Yk9gPX1QuXC+usHWqGyhYvUYR0a7zboUOFCNVhnk0krZAOW7wFOvzXhom2xnEbIHizTA1wEYhWW6YFGyC6c1gOcfg9wfA80Qj7g8B7g9HuCww+haIR8wf49wOn3Cvv9k8tGyC/s7gFOv3fY3QONkH+v9MBWqB7PeqDn9FcIT//kcitUn6kHOu/T/xfWzlQy3dEHhwAAAABJRU5ErkJggg==">
|
||||
</a>
|
||||
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
|
||||
<a aria-label="All Contributors" href="#contributors-"><img alt="" src="https://img.shields.io/badge/all_contributors-381-17BB8A.svg?style=for-the-badge&labelColor=000000"></a>
|
||||
<a aria-label="All Contributors" href="#contributors-"><img alt="" src="https://img.shields.io/badge/all_contributors-385-17BB8A.svg?style=for-the-badge&labelColor=000000"></a>
|
||||
<!-- ALL-CONTRIBUTORS-BADGE:END -->
|
||||
<a aria-label="License" href="https://github.com/blitz-js/blitz/blob/canary/LICENSE">
|
||||
<img alt="" src="https://img.shields.io/npm/l/blitz.svg?style=for-the-badge&labelColor=000000&color=blue">
|
||||
@@ -19,25 +19,12 @@
|
||||
|
||||
<br>
|
||||
|
||||
<h1 align="center">The Fullstack React Framework</h1>
|
||||
|
||||
<h5 align="center">"Zero-API" Data Layer — Built on Next.js — Inspired by Ruby on Rails</h3>
|
||||
<h3 align="center"><a href="https://blitzjs.com/docs/get-started" target="_blank">Read the Documentation</a></h3>
|
||||
<br>
|
||||
|
||||
“Zero-API” data layer **lets you import server code directly into your React components** instead of having to manually add API endpoints and do client-side fetching and caching.
|
||||
|
||||
New Blitz apps come with **all the boring stuff already set up for you!** Like ESLint, Prettier, Jest, user sign up, log in, and password reset.
|
||||
|
||||
Provides **helpful defaults and conventions** for things like routing, file structure, and authentication while also being extremely flexible.
|
||||
|
||||
<h1 align="center">The Missing Fullstack Toolkit for Next.js</h1>
|
||||
|
||||
<br>
|
||||
|
||||
### Quick Start
|
||||
|
||||
You need Node.js 12 or newer
|
||||
|
||||
#### Install Blitz
|
||||
|
||||
Run `npm install -g blitz` or `yarn global add blitz`
|
||||
@@ -53,37 +40,8 @@ _You can alternatively use [`npx`](https://www.npmjs.com/package/npx)_
|
||||
|
||||
<br><br>
|
||||
|
||||
<a aria-label="Bytes Newsletter" href="https://ui.dev/bytes/?r=blitzjs">
|
||||
<img alt="Bytes Newsletter" src="https://files-8wtskjofb.vercel.app/smarter-16x1.jpg">
|
||||
</a>
|
||||
|
||||
|
||||
<br><br>
|
||||
|
||||
|
||||
|
||||
### The Foundational Principles
|
||||
|
||||
1. Fullstack & Monolithic
|
||||
2. API Not Required
|
||||
3. Convention over Configuration
|
||||
4. Loose Opinions
|
||||
5. Easy to Start, Easy to Scale
|
||||
6. Stability
|
||||
7. Community over Code
|
||||
|
||||
[The Blitz Manifesto](https://blitzjs.com/docs/manifesto) explains these principles in detail.
|
||||
|
||||
<br>
|
||||
|
||||
### What is Blitz Designed For?
|
||||
|
||||
Blitz is designed for tiny to large database-backed applications that have one or more graphical user interfaces.
|
||||
|
||||
While we currently only support web, we are pursuing the dream of a single monolithic application that runs on web and mobile with maximum code sharing and minimal boilerplate.
|
||||
|
||||
<br>
|
||||
|
||||
## Welcome to the Blitz Community 👋
|
||||
|
||||
The Blitz community is warm, safe, diverse, inclusive, and fun! LGBTQ+, women, and minorities are especially welcome. Please read our [Code of Conduct](https://blitzjs.com/docs/code-of-conduct).
|
||||
@@ -379,7 +337,7 @@ Thanks to these wonderful people ([emoji key](https://allcontributors.org/docs/e
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/jschepmans"><img src="https://avatars2.githubusercontent.com/u/5782977?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Johan Schepmans</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=jschepmans" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://twitter.com/dillonraphael"><img src="https://avatars0.githubusercontent.com/u/3496193?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dillon Raphael</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=dillonraphael" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://twitter.com/dillonraphael"><img src="https://avatars0.githubusercontent.com/u/3496193?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dillon Raphael</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=dillonraphael" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=dillonraphael" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/clgeoio"><img src="https://avatars2.githubusercontent.com/u/37571416?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Cody G</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=clgeoio" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=clgeoio" title="Tests">⚠️</a></td>
|
||||
<td align="center"><a href="https://github.com/madflow"><img src="https://avatars0.githubusercontent.com/u/183248?v=4?s=100" width="100px;" alt=""/><br /><sub><b>madflow</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=madflow" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://twitter.com/nitaking_"><img src="https://avatars2.githubusercontent.com/u/10850034?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Satoshi Nitawaki</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=nitaking" title="Code">💻</a> <a href="#maintenance-nitaking" title="Maintenance">🚧</a> <a href="#question-nitaking" title="Answering Questions">💬</a> <a href="https://github.com/blitz-js/blitz/commits?author=nitaking" title="Documentation">📖</a></td>
|
||||
@@ -741,6 +699,10 @@ Thanks to these wonderful people ([emoji key](https://allcontributors.org/docs/e
|
||||
<td align="center"><a href="https://github.com/c-ciobanu"><img src="https://avatars.githubusercontent.com/u/33382714?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Cristi Ciobanu</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=c-ciobanu" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://arpitdalal.dev"><img src="https://avatars.githubusercontent.com/u/61059807?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Arpit Dalal</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=arpitdalal" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/robertrisch"><img src="https://avatars.githubusercontent.com/u/73828816?v=4?s=100" width="100px;" alt=""/><br /><sub><b>robertrisch</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=robertrisch" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/saadaltabari"><img src="https://avatars.githubusercontent.com/u/29986512?v=4?s=100" width="100px;" alt=""/><br /><sub><b>saadaltabari</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=saadaltabari" title="Documentation">📖</a> <a href="https://github.com/blitz-js/blitz/commits?author=saadaltabari" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/iojcde"><img src="https://avatars.githubusercontent.com/u/31413538?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jeeho Ahn</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=iojcde" title="Documentation">📖</a> <a href="#tool-iojcde" title="Tools">🔧</a> <a href="https://github.com/blitz-js/blitz/commits?author=iojcde" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://linkedin.com/in/ryanwashburne"><img src="https://avatars.githubusercontent.com/u/12566087?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ryan Washburne</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=ryanwashburne" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/sherryxiao1988"><img src="https://avatars.githubusercontent.com/u/1202426?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Shundan Xiao</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=sherryxiao1988" title="Documentation">📖</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
save-exact=true
|
||||
legacy-peer-deps=true
|
||||
|
||||
public-hoist-pattern[]=react-query
|
||||
public-hoist-pattern[]=next
|
||||
public-hoist-pattern[]=secure-password
|
||||
public-hoist-pattern[]=*jest*
|
||||
@@ -1,7 +1,11 @@
|
||||
import React from "react"
|
||||
import Head from "next/head"
|
||||
import React, { FC } from "react"
|
||||
import { BlitzLayout } from "@blitzjs/next"
|
||||
|
||||
const Layout: FC<{ title?: string; children?: React.ReactNode }> = ({ title, children }) => {
|
||||
const Layout: BlitzLayout<{ title?: string; children?: React.ReactNode }> = ({
|
||||
title,
|
||||
children,
|
||||
}) => {
|
||||
return (
|
||||
<>
|
||||
<Head>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"name": "toolkit-app",
|
||||
"version": "1.0.1-alpha.16",
|
||||
"scripts": {
|
||||
"start:dev": "pnpm run prisma:start && next dev",
|
||||
"start:dev": "pnpm run prisma:start && blitz dev",
|
||||
"buildapp": "NODE_ENV=production pnpm blitz codegen && pnpm prisma generate && next build",
|
||||
"start": "next start",
|
||||
"lint": "next lint",
|
||||
@@ -28,8 +28,8 @@
|
||||
"@blitzjs/next": "workspace:*",
|
||||
"@blitzjs/rpc": "workspace:*",
|
||||
"@hookform/resolvers": "2.8.8",
|
||||
"@prisma/client": "3.9.0",
|
||||
"blitz": "workspace:2.0.0-alpha.54",
|
||||
"@prisma/client": "4.0.0",
|
||||
"blitz": "workspace:2.0.0-alpha.62",
|
||||
"next": "12.2.0",
|
||||
"prisma": "4.0.0",
|
||||
"react": "18.0.0",
|
||||
|
||||
8
apps/web/.npmrc
Normal file
8
apps/web/.npmrc
Normal file
@@ -0,0 +1,8 @@
|
||||
save-exact=true
|
||||
legacy-peer-deps=true
|
||||
|
||||
public-hoist-pattern[]=react-query
|
||||
public-hoist-pattern[]=next
|
||||
public-hoist-pattern[]=secure-password
|
||||
public-hoist-pattern[]=*jest*
|
||||
public-hoist-pattern[]=@testing-library/*
|
||||
@@ -20,7 +20,7 @@
|
||||
"@blitzjs/config": "workspace:*",
|
||||
"@blitzjs/next": "workspace:*",
|
||||
"@blitzjs/rpc": "workspace:*",
|
||||
"@prisma/client": "3.9.0",
|
||||
"@prisma/client": "4.0.0",
|
||||
"@types/jest": "27.4.1",
|
||||
"@types/passport-twitter": "1.0.37",
|
||||
"blitz": "workspace:*",
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
"@blitzjs/auth": "workspace:*",
|
||||
"@blitzjs/config": "workspace:*",
|
||||
"@blitzjs/next": "workspace:*",
|
||||
"@prisma/client": "3.9.0",
|
||||
"@prisma/client": "4.0.0",
|
||||
"blitz": "workspace:*",
|
||||
"lowdb": "3.0.0",
|
||||
"next": "12.2.0",
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
"@blitzjs/auth": "workspace:*",
|
||||
"@blitzjs/next": "workspace:*",
|
||||
"@blitzjs/rpc": "workspace:*",
|
||||
"@prisma/client": "3.9.0",
|
||||
"@prisma/client": "4.0.0",
|
||||
"blitz": "workspace:*",
|
||||
"lowdb": "3.0.0",
|
||||
"next": "12.2.0",
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
"@blitzjs/config": "workspace:*",
|
||||
"@blitzjs/next": "workspace:*",
|
||||
"@blitzjs/rpc": "workspace:*",
|
||||
"@prisma/client": "3.9.0",
|
||||
"@prisma/client": "4.0.0",
|
||||
"blitz": "workspace:*",
|
||||
"next": "12.2.0",
|
||||
"prisma": "4.0.0",
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
"@blitzjs/auth": "workspace:*",
|
||||
"@blitzjs/next": "workspace:*",
|
||||
"@blitzjs/rpc": "workspace:*",
|
||||
"@prisma/client": "3.9.0",
|
||||
"@prisma/client": "4.0.0",
|
||||
"blitz": "workspace:*",
|
||||
"lowdb": "3.0.0",
|
||||
"next": "12.2.0",
|
||||
|
||||
@@ -1,5 +1,78 @@
|
||||
# @blitzjs/auth
|
||||
|
||||
## 2.0.0-alpha.62
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [365e6709]
|
||||
- blitz@2.0.0-alpha.62
|
||||
|
||||
## 2.0.0-alpha.61
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [240f378b]
|
||||
- blitz@2.0.0-alpha.61
|
||||
|
||||
## 2.0.0-alpha.60
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [1d863f35]
|
||||
- blitz@2.0.0-alpha.60
|
||||
|
||||
## 2.0.0-alpha.59
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- blitz@2.0.0-alpha.59
|
||||
|
||||
## 2.0.0-alpha.58
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 83b35590: Truncate errors from `api/auth/<strategy>/callback` request to 100 characters before passing them to the `?authError=` query parameter
|
||||
- Updated dependencies [83b35590]
|
||||
- blitz@2.0.0-alpha.58
|
||||
|
||||
## 2.0.0-alpha.57
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [3511d5b6]
|
||||
- blitz@2.0.0-alpha.57
|
||||
|
||||
## 2.0.0-alpha.56
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 3f20a474: Update `deleteSession` return type — allow undefined values
|
||||
- abe2afcc: Fix a long-standing issue with occasional blitz auth flakiness
|
||||
|
||||
This bug would sometimes cause users to be logged out or to experience an CSRFTokenMismatchError. This bug, when encountered, usually by lots of setPublicData or session.create calls, would not set the cookie headers correctly resulting in cookies being set to a previous state or in a possibly undefined state.
|
||||
|
||||
There are no security concerns as far as I can tell.
|
||||
|
||||
- 8bcb471a: Fix auth issue where session token and publicData cookie were updated unnecessarily, leading to potential user logout
|
||||
|
||||
- Previously, we were updating the session token each time public data changed. This is not needed, and it would cause race condition bugs where a user could be unexpectedly logged out because a request already in flight would not match the new session token.
|
||||
- Previously, we were updating the publicData cookie even when it hadn't changed. This may reduce unnecessary re-renders on the client.
|
||||
|
||||
- Updated dependencies [abb1ad5d]
|
||||
- Updated dependencies [abe2afcc]
|
||||
- Updated dependencies [0ac6e171]
|
||||
- Updated dependencies [8bcb471a]
|
||||
- blitz@2.0.0-alpha.56
|
||||
|
||||
## 2.0.0-alpha.55
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 1c809094: Fix `Page.authenticate` not working for layout components
|
||||
- Updated dependencies [8f166a5d]
|
||||
- Updated dependencies [54a66a95]
|
||||
- blitz@2.0.0-alpha.55
|
||||
|
||||
## 2.0.0-alpha.54
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@blitzjs/auth",
|
||||
"version": "2.0.0-alpha.54",
|
||||
"version": "2.0.0-alpha.62",
|
||||
"scripts": {
|
||||
"build": "unbuild",
|
||||
"predev": "wait-on -d 250 ../blitz/dist/index-server.d.ts",
|
||||
@@ -26,7 +26,7 @@
|
||||
"@types/secure-password": "3.1.1",
|
||||
"b64-lite": "1.4.0",
|
||||
"bad-behavior": "1.0.1",
|
||||
"blitz": "2.0.0-alpha.54",
|
||||
"blitz": "2.0.0-alpha.62",
|
||||
"cookie": "0.4.1",
|
||||
"cookie-session": "2.0.0",
|
||||
"debug": "4.3.3",
|
||||
@@ -39,7 +39,7 @@
|
||||
"url": "0.11.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@blitzjs/config": "workspace:2.0.0-alpha.54",
|
||||
"@blitzjs/config": "workspace:2.0.0-alpha.62",
|
||||
"@testing-library/react": "13.0.0",
|
||||
"@testing-library/react-hooks": "7.0.2",
|
||||
"@types/cookie": "0.4.1",
|
||||
|
||||
@@ -216,8 +216,8 @@ export function getAuthValues<TProps = any>(
|
||||
) {
|
||||
if (!Page) return {}
|
||||
|
||||
let authenticate = "authenticate" in Page && Page.authenticate
|
||||
let redirectAuthenticatedTo = "redirectAuthenticatedTo" in Page && Page.redirectAuthenticatedTo
|
||||
let authenticate = (Page as BlitzPage)?.authenticate
|
||||
let redirectAuthenticatedTo = (Page as BlitzPage)?.redirectAuthenticatedTo
|
||||
|
||||
if (authenticate === undefined && redirectAuthenticatedTo === undefined) {
|
||||
const layout = "getLayout" in Page && Page.getLayout?.(<Page {...props} />)
|
||||
|
||||
@@ -105,7 +105,6 @@ export function AuthServerPlugin(options: AuthPluginOptions): BlitzServerPlugin<
|
||||
IncomingMessage,
|
||||
ServerResponse & {blitzCtx: Ctx}
|
||||
> = async (req, res, next) => {
|
||||
console.log("Starting sessionMiddleware...")
|
||||
if (!res.blitzCtx?.session) {
|
||||
await getSession(req, res)
|
||||
}
|
||||
|
||||
41
packages/blitz-auth/src/server/auth-sessions.test.ts
Normal file
41
packages/blitz-auth/src/server/auth-sessions.test.ts
Normal file
@@ -0,0 +1,41 @@
|
||||
import {expect, describe, it} from "vitest"
|
||||
import {setCookie} from "./auth-sessions"
|
||||
import cookie from "cookie"
|
||||
import {ServerResponse} from "http"
|
||||
|
||||
describe("blitz-auth", () => {
|
||||
describe("setCookie", () => {
|
||||
it("works with empty start", async () => {
|
||||
const res = new ServerResponse({} as any)
|
||||
setCookie(res, cookie.serialize("A", "a-value", {}))
|
||||
expect(res.getHeader("Set-Cookie")).toBe("A=a-value")
|
||||
})
|
||||
|
||||
it("works with string start", async () => {
|
||||
const res = new ServerResponse({} as any)
|
||||
res.setHeader("Set-Cookie", cookie.serialize("A", "a-value", {}))
|
||||
setCookie(res, cookie.serialize("B", "b-value", {}))
|
||||
expect(res.getHeader("Set-Cookie")).toEqual(["A=a-value", "B=b-value"])
|
||||
})
|
||||
|
||||
it("works with array start for new name", async () => {
|
||||
const res = new ServerResponse({} as any)
|
||||
res.setHeader("Set-Cookie", [
|
||||
cookie.serialize("A", "a-value", {}),
|
||||
cookie.serialize("B", "b-value", {}),
|
||||
])
|
||||
setCookie(res, cookie.serialize("C", "c-value", {}))
|
||||
expect(res.getHeader("Set-Cookie")).toEqual(["A=a-value", "B=b-value", "C=c-value"])
|
||||
})
|
||||
|
||||
it("works with array start for existing name", async () => {
|
||||
const res = new ServerResponse({} as any)
|
||||
res.setHeader("Set-Cookie", [
|
||||
cookie.serialize("A", "a-value", {}),
|
||||
cookie.serialize("B", "b-value", {}),
|
||||
])
|
||||
setCookie(res, cookie.serialize("A", "new-a-value", {}))
|
||||
expect(res.getHeader("Set-Cookie")).toEqual(["A=new-a-value", "B=b-value"])
|
||||
})
|
||||
})
|
||||
})
|
||||
@@ -385,7 +385,7 @@ const parseAnonymousSessionToken = (token: string) => {
|
||||
}
|
||||
}
|
||||
|
||||
const setCookie = (res: ServerResponse, cookieStr: string) => {
|
||||
export const setCookie = (res: ServerResponse, cookieStr: string) => {
|
||||
const getCookieName = (c: string) => c.split("=", 2)[0]
|
||||
const appendCookie = () => append(res, "Set-Cookie", cookieStr)
|
||||
|
||||
@@ -407,7 +407,7 @@ const setCookie = (res: ServerResponse, cookieStr: string) => {
|
||||
for (let i = 0; i < cookiesHeader.length; i++) {
|
||||
if (cookieName === getCookieName(cookiesHeader[i] || "")) {
|
||||
cookiesHeader[i] = cookieStr
|
||||
res.setHeader("Set-Cookie", cookieStr)
|
||||
res.setHeader("Set-Cookie", cookiesHeader)
|
||||
return
|
||||
}
|
||||
}
|
||||
@@ -801,30 +801,16 @@ async function refreshSession(
|
||||
const expiresAt = addYears(new Date(), 30)
|
||||
setAnonymousSessionCookie(req, res, anonymousSessionToken, expiresAt)
|
||||
setPublicDataCookie(req, res, publicDataToken, expiresAt)
|
||||
setCSRFCookie(req, res, sessionKernel.antiCSRFToken, expiresAt)
|
||||
} else if (global.sessionConfig.method === "essential" && "sessionToken" in sessionKernel) {
|
||||
const expiresAt = addMinutes(new Date(), global.sessionConfig.sessionExpiryMinutes as number)
|
||||
const publicDataToken = createPublicDataToken(sessionKernel.publicData)
|
||||
|
||||
let sessionToken: string
|
||||
// Only generate new session token if public data actually changed
|
||||
// Otherwise if new session token is generated just for refresh, then
|
||||
// we have race condition bugs
|
||||
if (publicDataChanged) {
|
||||
sessionToken = createSessionToken(sessionKernel.handle, sessionKernel.publicData)
|
||||
} else {
|
||||
sessionToken = sessionKernel.sessionToken
|
||||
}
|
||||
|
||||
setSessionCookie(req, res, sessionToken, expiresAt)
|
||||
setPublicDataCookie(req, res, publicDataToken, expiresAt)
|
||||
setCSRFCookie(req, res, sessionKernel.antiCSRFToken, expiresAt)
|
||||
|
||||
debug("Updating session in db with", {expiresAt})
|
||||
if (publicDataChanged) {
|
||||
debug("Public data has changed")
|
||||
const publicDataToken = createPublicDataToken(sessionKernel.publicData)
|
||||
setPublicDataCookie(req, res, publicDataToken, expiresAt)
|
||||
await global.sessionConfig.updateSession(sessionKernel.handle, {
|
||||
expiresAt,
|
||||
hashedSessionToken: hash256(sessionToken),
|
||||
publicData: JSON.stringify(sessionKernel.publicData),
|
||||
})
|
||||
} else {
|
||||
|
||||
@@ -11,6 +11,7 @@ import {
|
||||
RequestMiddleware,
|
||||
MiddlewareResponse,
|
||||
secureProxyMiddleware,
|
||||
truncateString,
|
||||
} from "blitz"
|
||||
import {IncomingMessage, ServerResponse} from "http"
|
||||
import {PublicData, SessionContext} from "../shared"
|
||||
@@ -161,7 +162,10 @@ export function passportAuth(config: BlitzPassportConfig): ApiHandler {
|
||||
"/"
|
||||
|
||||
if (error) {
|
||||
redirectUrl += "?authError=" + encodeURIComponent(error.toString())
|
||||
console.error(`Login via ${strategyName} was unsuccessful.`)
|
||||
console.error(error)
|
||||
redirectUrl +=
|
||||
"?authError=" + encodeURIComponent(truncateString(error.toString(), 100))
|
||||
res.setHeader("Location", redirectUrl)
|
||||
res.statusCode = 302
|
||||
res.end()
|
||||
|
||||
@@ -47,7 +47,7 @@ export interface SessionConfigMethods {
|
||||
handle: string,
|
||||
session: Partial<SessionModel>,
|
||||
) => Promise<SessionModel | undefined>
|
||||
deleteSession: (handle: string) => Promise<SessionModel>
|
||||
deleteSession: (handle: string) => Promise<SessionModel | undefined>
|
||||
}
|
||||
|
||||
export interface SessionConfig extends SessionConfigMethods {
|
||||
|
||||
@@ -1,5 +1,63 @@
|
||||
# @blitzjs/next
|
||||
|
||||
## 2.0.0-alpha.62
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 31d7a6f4: Set prefix in moduleNameWrapper's options in Blitz's jest configuration
|
||||
- @blitzjs/rpc@2.0.0-alpha.62
|
||||
|
||||
## 2.0.0-alpha.61
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @blitzjs/rpc@2.0.0-alpha.61
|
||||
|
||||
## 2.0.0-alpha.60
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @blitzjs/rpc@2.0.0-alpha.60
|
||||
|
||||
## 2.0.0-alpha.59
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 3b213a35: Export router-context from browser entrypoint
|
||||
- Updated dependencies [3b213a35]
|
||||
- @blitzjs/rpc@2.0.0-alpha.59
|
||||
|
||||
## 2.0.0-alpha.58
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 6ab9db78: Infer result type in the `api` handler and allow customizing it
|
||||
- Updated dependencies [c721c104]
|
||||
- @blitzjs/rpc@2.0.0-alpha.58
|
||||
|
||||
## 2.0.0-alpha.57
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 0f18c68d: Avoid reassigning queryClient in prefetch methods
|
||||
- Updated dependencies [716e188d]
|
||||
- @blitzjs/rpc@2.0.0-alpha.57
|
||||
|
||||
## 2.0.0-alpha.56
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- d9fc5d8e: Allow prefetching multiple queries in gSSP and gSP
|
||||
- @blitzjs/rpc@2.0.0-alpha.56
|
||||
|
||||
## 2.0.0-alpha.55
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 8d9ea00e: Fix prefetching multiple queries causes only the last one to be passed to page
|
||||
- Updated dependencies [df7cee84]
|
||||
- @blitzjs/rpc@2.0.0-alpha.55
|
||||
|
||||
## 2.0.0-alpha.54
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -21,6 +21,7 @@ function createJestConfigForNext(options) {
|
||||
// This ensures any path aliases in tsconfig also work in jest
|
||||
...pathsToModuleNameMapper(
|
||||
(tsConfig && tsConfig.compilerOptions && tsConfig.compilerOptions.paths) || {},
|
||||
{prefix: "<rootDir>/"},
|
||||
),
|
||||
"\\.(jpg|jpeg|png|gif|webp|ico)$": path.resolve(__dirname, "./jest-preset/image-mock.js"),
|
||||
},
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@blitzjs/next",
|
||||
"version": "2.0.0-alpha.54",
|
||||
"version": "2.0.0-alpha.62",
|
||||
"scripts": {
|
||||
"build": "unbuild",
|
||||
"dev": "pnpm predev && pnpm watch unbuild src --wait=0.2",
|
||||
@@ -24,7 +24,7 @@
|
||||
"eslint.js"
|
||||
],
|
||||
"dependencies": {
|
||||
"@blitzjs/rpc": "2.0.0-alpha.54",
|
||||
"@blitzjs/rpc": "2.0.0-alpha.62",
|
||||
"@types/hoist-non-react-statics": "3.3.1",
|
||||
"debug": "4.3.3",
|
||||
"fs-extra": "10.0.1",
|
||||
@@ -33,7 +33,7 @@
|
||||
"superjson": "1.8.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@blitzjs/config": "workspace:2.0.0-alpha.54",
|
||||
"@blitzjs/config": "workspace:2.0.0-alpha.62",
|
||||
"@testing-library/dom": "8.13.0",
|
||||
"@testing-library/jest-dom": "5.16.3",
|
||||
"@testing-library/react": "13.0.0",
|
||||
@@ -43,7 +43,7 @@
|
||||
"@types/react": "18.0.1",
|
||||
"@types/react-dom": "17.0.14",
|
||||
"@types/testing-library__react-hooks": "4.0.0",
|
||||
"blitz": "2.0.0-alpha.54",
|
||||
"blitz": "2.0.0-alpha.62",
|
||||
"cross-spawn": "7.0.3",
|
||||
"find-up": "4.1.0",
|
||||
"next": "12.2.0",
|
||||
|
||||
@@ -6,7 +6,7 @@ import type {
|
||||
Simplify,
|
||||
} from "blitz"
|
||||
import Head from "next/head"
|
||||
import React from "react"
|
||||
import React, {ReactNode} from "react"
|
||||
import {QueryClient, QueryClientProvider} from "react-query"
|
||||
import {Hydrate, HydrateOptions} from "react-query/hydration"
|
||||
import {withSuperJSONPage} from "./superjson"
|
||||
@@ -19,6 +19,7 @@ import {RouterContext} from "./router-context"
|
||||
export * from "./error-boundary"
|
||||
export * from "./error-component"
|
||||
export * from "./use-params"
|
||||
export * from "./router-context"
|
||||
export {Routes} from ".blitz"
|
||||
|
||||
const compose =
|
||||
@@ -80,7 +81,7 @@ export type BlitzPage<P = {}> = React.ComponentType<P> & {
|
||||
suppressFirstRenderFlicker?: boolean
|
||||
redirectAuthenticatedTo?: RedirectAuthenticatedTo | RedirectAuthenticatedToFn
|
||||
}
|
||||
export type BlitzLayout<P = {}> = React.ComponentType<P> & {
|
||||
export type BlitzLayout<P = {}> = React.ComponentType<P & {children: ReactNode}> & {
|
||||
authenticate?: boolean | {redirectTo?: string | RouteUrlObject}
|
||||
redirectAuthenticatedTo?: RedirectAuthenticatedTo | RedirectAuthenticatedToFn
|
||||
}
|
||||
|
||||
@@ -40,10 +40,10 @@ export interface BlitzNextApiResponse
|
||||
extends MiddlewareResponse,
|
||||
Omit<NextApiResponse, keyof MiddlewareResponse> {}
|
||||
|
||||
export type NextApiHandler = (
|
||||
export type NextApiHandler<TResult> = (
|
||||
req: NextApiRequest,
|
||||
res: BlitzNextApiResponse,
|
||||
) => void | Promise<void>
|
||||
) => TResult | void | Promise<TResult | void>
|
||||
|
||||
type SetupBlitzOptions = {
|
||||
plugins: BlitzServerPlugin<RequestMiddleware, Ctx>[]
|
||||
@@ -74,11 +74,32 @@ export type BlitzGSPHandler<
|
||||
GetStaticProps<TProps, Query, PD>
|
||||
>
|
||||
|
||||
export type BlitzAPIHandler = (
|
||||
req: Parameters<NextApiHandler>[0],
|
||||
res: Parameters<NextApiHandler>[1],
|
||||
export type BlitzAPIHandler<TResult> = (
|
||||
req: NextApiRequest,
|
||||
res: BlitzNextApiResponse,
|
||||
ctx: Ctx,
|
||||
) => ReturnType<NextApiHandler>
|
||||
) => TResult | void | Promise<TResult | void>
|
||||
|
||||
const prefetchQueryFactory = (
|
||||
ctx: BlitzCtx,
|
||||
): {
|
||||
getClient: () => QueryClient | null
|
||||
prefetchQuery: AddParameters<PrefetchQueryFn, [boolean?]>
|
||||
} => {
|
||||
let queryClient: null | QueryClient = null
|
||||
|
||||
return {
|
||||
getClient: () => queryClient,
|
||||
prefetchQuery: async (fn, input, defaultOptions = {}, infinite = false) => {
|
||||
if (!queryClient) {
|
||||
queryClient = new QueryClient({defaultOptions})
|
||||
}
|
||||
|
||||
const queryKey = infinite ? getInfiniteQueryKey(fn, input) : getQueryKey(fn, input)
|
||||
await queryClient.prefetchQuery(queryKey, () => fn(input, ctx))
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
export const setupBlitzServer = ({plugins, onError}: SetupBlitzOptions) => {
|
||||
const middlewares = plugins.flatMap((p) => p.requestMiddlewares)
|
||||
@@ -94,26 +115,15 @@ export const setupBlitzServer = ({plugins, onError}: SetupBlitzOptions) => {
|
||||
(y, f) => (f ? f(y) : y),
|
||||
(res as MiddlewareResponse).blitzCtx,
|
||||
)
|
||||
let queryClient: null | QueryClient = null
|
||||
|
||||
const prefetchQuery: AddParameters<PrefetchQueryFn, [boolean?]> = async (
|
||||
fn,
|
||||
input,
|
||||
defaultOptions = {},
|
||||
infinite = false,
|
||||
) => {
|
||||
queryClient = new QueryClient({defaultOptions})
|
||||
|
||||
const queryKey = infinite ? getInfiniteQueryKey(fn, input) : getQueryKey(fn, input)
|
||||
await queryClient.prefetchQuery(queryKey, () => fn(input, ctx))
|
||||
}
|
||||
const {getClient, prefetchQuery} = prefetchQueryFactory(ctx)
|
||||
|
||||
ctx.prefetchQuery = prefetchQuery
|
||||
ctx.prefetchInfiniteQuery = (...args) => prefetchQuery(...args, true)
|
||||
|
||||
try {
|
||||
const result = await handler({req, res, ctx, ...rest})
|
||||
return withSuperJsonProps(withDehydratedState(result, queryClient))
|
||||
return withSuperJsonProps(withDehydratedState(result, getClient()))
|
||||
} catch (err: any) {
|
||||
onError?.(err)
|
||||
throw err
|
||||
@@ -126,26 +136,14 @@ export const setupBlitzServer = ({plugins, onError}: SetupBlitzOptions) => {
|
||||
): GetStaticProps<TProps, Query, PD> =>
|
||||
async (context) => {
|
||||
const ctx = contextMiddleware.reduceRight((y, f) => (f ? f(y) : y), {} as Ctx)
|
||||
let queryClient: null | QueryClient = null
|
||||
|
||||
const prefetchQuery: AddParameters<PrefetchQueryFn, [boolean?]> = async (
|
||||
fn,
|
||||
input,
|
||||
defaultOptions = {},
|
||||
infinite = false,
|
||||
) => {
|
||||
queryClient = new QueryClient({defaultOptions})
|
||||
|
||||
const queryKey = infinite ? getInfiniteQueryKey(fn, input) : getQueryKey(fn, input)
|
||||
await queryClient.prefetchQuery(queryKey, () => fn(input, ctx))
|
||||
}
|
||||
const {getClient, prefetchQuery} = prefetchQueryFactory(ctx)
|
||||
|
||||
ctx.prefetchQuery = prefetchQuery
|
||||
ctx.prefetchInfiniteQuery = (...args) => prefetchQuery(...args, true)
|
||||
|
||||
try {
|
||||
const result = await handler({...context, ctx: ctx})
|
||||
return withSuperJsonProps(withDehydratedState(result, queryClient))
|
||||
return withSuperJsonProps(withDehydratedState(result, getClient()))
|
||||
} catch (err: any) {
|
||||
onError?.(err)
|
||||
throw err
|
||||
@@ -153,7 +151,9 @@ export const setupBlitzServer = ({plugins, onError}: SetupBlitzOptions) => {
|
||||
}
|
||||
|
||||
const api =
|
||||
(handler: BlitzAPIHandler): NextApiHandler =>
|
||||
<TResult = Promise<void> | void>(
|
||||
handler: BlitzAPIHandler<TResult>,
|
||||
): NextApiHandler<TResult | void> =>
|
||||
async (req, res) => {
|
||||
try {
|
||||
await handleRequestWithMiddleware(req, res, middlewares)
|
||||
|
||||
@@ -1,5 +1,78 @@
|
||||
# @blitzjs/rpc
|
||||
|
||||
## 2.0.0-alpha.62
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [365e6709]
|
||||
- blitz@2.0.0-alpha.62
|
||||
- @blitzjs/auth@2.0.0-alpha.62
|
||||
|
||||
## 2.0.0-alpha.61
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [240f378b]
|
||||
- blitz@2.0.0-alpha.61
|
||||
- @blitzjs/auth@2.0.0-alpha.61
|
||||
|
||||
## 2.0.0-alpha.60
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [1d863f35]
|
||||
- blitz@2.0.0-alpha.60
|
||||
- @blitzjs/auth@2.0.0-alpha.60
|
||||
|
||||
## 2.0.0-alpha.59
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 3b213a35: Remove debug console.log
|
||||
- @blitzjs/auth@2.0.0-alpha.59
|
||||
- blitz@2.0.0-alpha.59
|
||||
|
||||
## 2.0.0-alpha.58
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- c721c104: Pass `signal` from useQuery to Blitz internal rpc client to be able to cancel queries on unmount
|
||||
- Updated dependencies [83b35590]
|
||||
- blitz@2.0.0-alpha.58
|
||||
- @blitzjs/auth@2.0.0-alpha.58
|
||||
|
||||
## 2.0.0-alpha.57
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 716e188d: Fix queries/mutations lookup on Windows
|
||||
- Updated dependencies [3511d5b6]
|
||||
- blitz@2.0.0-alpha.57
|
||||
- @blitzjs/auth@2.0.0-alpha.57
|
||||
|
||||
## 2.0.0-alpha.56
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [3f20a474]
|
||||
- Updated dependencies [abb1ad5d]
|
||||
- Updated dependencies [abe2afcc]
|
||||
- Updated dependencies [0ac6e171]
|
||||
- Updated dependencies [8bcb471a]
|
||||
- @blitzjs/auth@2.0.0-alpha.56
|
||||
- blitz@2.0.0-alpha.56
|
||||
|
||||
## 2.0.0-alpha.55
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- df7cee84: Fix pipe resolver return type
|
||||
- Updated dependencies [8f166a5d]
|
||||
- Updated dependencies [54a66a95]
|
||||
- Updated dependencies [1c809094]
|
||||
- blitz@2.0.0-alpha.55
|
||||
- @blitzjs/auth@2.0.0-alpha.55
|
||||
|
||||
## 2.0.0-alpha.54
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@blitzjs/rpc",
|
||||
"version": "2.0.0-alpha.54",
|
||||
"version": "2.0.0-alpha.62",
|
||||
"scripts": {
|
||||
"build": "unbuild",
|
||||
"predev": "wait-on -d 250 ../blitz/dist/index-server.d.ts && wait-on -d 250 ../blitz-auth/dist/index-browser.d.ts",
|
||||
@@ -20,7 +20,7 @@
|
||||
"dist/**"
|
||||
],
|
||||
"dependencies": {
|
||||
"@blitzjs/auth": "2.0.0-alpha.54",
|
||||
"@blitzjs/auth": "2.0.0-alpha.62",
|
||||
"b64-lite": "1.4.0",
|
||||
"bad-behavior": "1.0.1",
|
||||
"chalk": "^4.1.0",
|
||||
@@ -30,11 +30,11 @@
|
||||
"zod": "3.17.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@blitzjs/config": "workspace:2.0.0-alpha.54",
|
||||
"@blitzjs/config": "workspace:2.0.0-alpha.62",
|
||||
"@types/debug": "4.1.7",
|
||||
"@types/react": "18.0.1",
|
||||
"@types/react-dom": "17.0.14",
|
||||
"blitz": "2.0.0-alpha.54",
|
||||
"blitz": "2.0.0-alpha.62",
|
||||
"next": "12.2.0",
|
||||
"react": "18.0.0",
|
||||
"react-dom": "18.0.0",
|
||||
@@ -43,7 +43,7 @@
|
||||
"watch": "1.0.2"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"blitz": "2.0.0-alpha.54",
|
||||
"blitz": "2.0.0-alpha.62",
|
||||
"next": ">=12.2.0"
|
||||
},
|
||||
"publishConfig": {
|
||||
|
||||
@@ -85,7 +85,7 @@ export function useQuery<
|
||||
const {data, ...queryRest} = useReactQuery({
|
||||
queryKey: routerIsReady ? queryKey : ["_routerNotReady_"],
|
||||
queryFn: routerIsReady
|
||||
? () => enhancedResolverRpcClient(params, {fromQueryHook: true})
|
||||
? ({signal}) => enhancedResolverRpcClient(params, {fromQueryHook: true}, signal)
|
||||
: (emptyQueryFn as any),
|
||||
...options,
|
||||
enabled,
|
||||
@@ -170,7 +170,7 @@ export function usePaginatedQuery<
|
||||
const {data, ...queryRest} = useReactQuery({
|
||||
queryKey: routerIsReady ? queryKey : ["_routerNotReady_"],
|
||||
queryFn: routerIsReady
|
||||
? () => enhancedResolverRpcClient(params, {fromQueryHook: true})
|
||||
? ({signal}) => enhancedResolverRpcClient(params, {fromQueryHook: true}, signal)
|
||||
: (emptyQueryFn as any),
|
||||
...options,
|
||||
keepPreviousData: true,
|
||||
@@ -267,10 +267,8 @@ export function useInfiniteQuery<
|
||||
// Without this cache for usePaginatedQuery and this will conflict and break.
|
||||
queryKey: routerIsReady ? queryKey : ["_routerNotReady_"],
|
||||
queryFn: routerIsReady
|
||||
? ({pageParam}) =>
|
||||
enhancedResolverRpcClient(getQueryParams(pageParam), {
|
||||
fromQueryHook: true,
|
||||
})
|
||||
? ({pageParam, signal}) =>
|
||||
enhancedResolverRpcClient(getQueryParams(pageParam), {fromQueryHook: true}, signal)
|
||||
: (emptyQueryFn as any),
|
||||
...options,
|
||||
enabled,
|
||||
|
||||
@@ -39,7 +39,7 @@ export interface EnhancedRpc {
|
||||
}
|
||||
|
||||
export interface RpcClientBase<Input = unknown, Result = unknown> {
|
||||
(params: Input, opts?: RpcOptions): Promise<Result>
|
||||
(params: Input, opts?: RpcOptions, signal?: AbortSignal): Promise<Result>
|
||||
}
|
||||
|
||||
export interface RpcClient<Input = unknown, Result = unknown>
|
||||
@@ -57,7 +57,7 @@ export function __internal_buildRpcClient({
|
||||
}: BuildRpcClientParams): RpcClient {
|
||||
const fullRoutePath = normalizeApiRoute("/api/rpc" + routePath)
|
||||
|
||||
const httpClient: RpcClientBase = async (params, opts = {}) => {
|
||||
const httpClient: RpcClientBase = async (params, opts = {}, signal = undefined) => {
|
||||
const debug = (await import("debug")).default("blitz:rpc")
|
||||
if (!opts.fromQueryHook && !opts.fromInvoke) {
|
||||
console.warn(
|
||||
@@ -93,9 +93,6 @@ export function __internal_buildRpcClient({
|
||||
serialized = serialize(params)
|
||||
}
|
||||
|
||||
// Create a new AbortController instance for this request
|
||||
const controller = new AbortController()
|
||||
|
||||
const promise = window
|
||||
.fetch(fullRoutePath, {
|
||||
method: "POST",
|
||||
@@ -108,7 +105,7 @@ export function __internal_buildRpcClient({
|
||||
params: serialized.meta,
|
||||
},
|
||||
}),
|
||||
signal: controller.signal,
|
||||
signal,
|
||||
})
|
||||
.then(async (response) => {
|
||||
debug("Received request for", routePath)
|
||||
|
||||
@@ -80,7 +80,7 @@ export function installWebpackConfig({
|
||||
webpackRuleOptions,
|
||||
}: InstallWebpackConfigOptions) {
|
||||
webpackConfig.module.rules.push({
|
||||
test: /\/\[\[\.\.\.blitz]]\.[jt]s$/,
|
||||
test: /[\\/]\[\[\.\.\.blitz]]\.[jt]sx?$/,
|
||||
use: [
|
||||
{
|
||||
loader: loaderServer,
|
||||
@@ -146,10 +146,10 @@ export function rpcHandler(config: RpcConfig) {
|
||||
"It seems your Blitz RPC endpoint file is not named [[...blitz]].(jt)s. Please ensure it is",
|
||||
)
|
||||
|
||||
const relativeRoutePath = req.query.blitz.join("/")
|
||||
const relativeRoutePath = (req.query.blitz as string[])?.join("/")
|
||||
const routePath = "/" + relativeRoutePath
|
||||
|
||||
const loadableResolver = resolverMap[routePath]
|
||||
const loadableResolver = resolverMap?.[routePath]
|
||||
if (!loadableResolver) {
|
||||
throw new Error("No resolver for path: " + routePath)
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import {dirname, join, posix} from "path"
|
||||
import {dirname, join, posix, relative} from "path"
|
||||
import {promises} from "fs"
|
||||
import {
|
||||
assertPosixPath,
|
||||
@@ -37,6 +37,10 @@ export async function loader(this: Loader, input: string): Promise<string> {
|
||||
|
||||
module.exports = loader
|
||||
|
||||
function slash(str: string) {
|
||||
return str.replace(/\\/g, "/")
|
||||
}
|
||||
|
||||
export async function transformBlitzRpcServer(
|
||||
src: string,
|
||||
id: string,
|
||||
@@ -54,7 +58,7 @@ export async function transformBlitzRpcServer(
|
||||
code += "\n\n"
|
||||
|
||||
for (let resolverFilePath of resolvers) {
|
||||
const relativeResolverPath = posix.relative(dirname(id), join(root, resolverFilePath))
|
||||
const relativeResolverPath = slash(relative(dirname(id), join(root, resolverFilePath)))
|
||||
const routePath = convertPageFilePathToRoutePath(resolverFilePath, options?.resolverPath)
|
||||
code += `__internal_addBlitzRpcResolver('${routePath}', () => import('${relativeResolverPath}'));`
|
||||
code += "\n"
|
||||
|
||||
@@ -54,7 +54,7 @@ function pipe<A, B, C, D, E, F, G, CA = Ctx, CB = CA, CC = CB, CD = CC, CE = CD,
|
||||
de: PipeFn<D, E, CD, CE>,
|
||||
ef: PipeFn<E, F, CE, CF>,
|
||||
fg: PipeFn<F, G, CF, CG>,
|
||||
): (input: A, ctx: CA) => EnsurePromise<CG>
|
||||
): (input: A, ctx: CA) => EnsurePromise<G>
|
||||
function pipe<
|
||||
A,
|
||||
B,
|
||||
|
||||
@@ -1,5 +1,77 @@
|
||||
# blitz
|
||||
|
||||
## 2.0.0-alpha.62
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 365e6709: Fixes the db seed command so that the database can disconnect after running the seed file.
|
||||
- @blitzjs/generator@2.0.0-alpha.62
|
||||
|
||||
## 2.0.0-alpha.61
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 240f378b: Passes the correct arguments (without flags) to any bin command ran with the blitz cli
|
||||
- @blitzjs/generator@2.0.0-alpha.61
|
||||
|
||||
## 2.0.0-alpha.60
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 1d863f35: Fix APP_ENV not being set before loading env config
|
||||
- @blitzjs/generator@2.0.0-alpha.60
|
||||
|
||||
## 2.0.0-alpha.59
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @blitzjs/generator@2.0.0-alpha.59
|
||||
|
||||
## 2.0.0-alpha.58
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- 83b35590: Truncate errors from `api/auth/<strategy>/callback` request to 100 characters before passing them to the `?authError=` query parameter
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [e339e2fd]
|
||||
- @blitzjs/generator@2.0.0-alpha.58
|
||||
|
||||
## 2.0.0-alpha.57
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 3511d5b6: Temporarily skip version check
|
||||
- @blitzjs/generator@2.0.0-alpha.57
|
||||
|
||||
## 2.0.0-alpha.56
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- abb1ad5d: Improve codemod utilities
|
||||
- abe2afcc: Fix a long-standing issue with occasional blitz auth flakiness
|
||||
|
||||
This bug would sometimes cause users to be logged out or to experience an CSRFTokenMismatchError. This bug, when encountered, usually by lots of setPublicData or session.create calls, would not set the cookie headers correctly resulting in cookies being set to a previous state or in a possibly undefined state.
|
||||
|
||||
There are no security concerns as far as I can tell.
|
||||
|
||||
- 0ac6e171: fixes blitz not loading custom server
|
||||
- 8bcb471a: Fix auth issue where session token and publicData cookie were updated unnecessarily, leading to potential user logout
|
||||
|
||||
- Previously, we were updating the session token each time public data changed. This is not needed, and it would cause race condition bugs where a user could be unexpectedly logged out because a request already in flight would not match the new session token.
|
||||
- Previously, we were updating the publicData cookie even when it hadn't changed. This may reduce unnecessary re-renders on the client.
|
||||
- @blitzjs/generator@2.0.0-alpha.56
|
||||
|
||||
## 2.0.0-alpha.55
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 8f166a5d: Check for new versions when running CLI
|
||||
- 54a66a95: Show all blitz packages when running `blitz version` command
|
||||
- Updated dependencies [ab4d9de7]
|
||||
- @blitzjs/generator@2.0.0-alpha.55
|
||||
|
||||
## 2.0.0-alpha.54
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "blitz",
|
||||
"version": "2.0.0-alpha.54",
|
||||
"version": "2.0.0-alpha.62",
|
||||
"scripts": {
|
||||
"build": "unbuild",
|
||||
"dev": "watch unbuild src --wait=0.2",
|
||||
@@ -23,8 +23,9 @@
|
||||
"blitz": "bin/blitz"
|
||||
},
|
||||
"dependencies": {
|
||||
"@blitzjs/generator": "2.0.0-alpha.54",
|
||||
"@blitzjs/generator": "2.0.0-alpha.62",
|
||||
"arg": "5.0.1",
|
||||
"boxen": "7.0.0",
|
||||
"chalk": "^4.1.0",
|
||||
"console-table-printer": "2.10.0",
|
||||
"cross-spawn": "7.0.3",
|
||||
@@ -37,6 +38,7 @@
|
||||
"find-up": "4.1.0",
|
||||
"fs-extra": "10.0.1",
|
||||
"hasbin": "1.2.3",
|
||||
"node-fetch": "3.2.3",
|
||||
"npm-which": "3.0.1",
|
||||
"ora": "5.3.0",
|
||||
"os-name": "5.0.1",
|
||||
@@ -52,7 +54,7 @@
|
||||
"watchpack": "2.1.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@blitzjs/config": "workspace:2.0.0-alpha.54",
|
||||
"@blitzjs/config": "workspace:2.0.0-alpha.62",
|
||||
"@types/cookie": "0.4.1",
|
||||
"@types/cross-spawn": "6.0.2",
|
||||
"@types/debug": "4.1.7",
|
||||
@@ -69,7 +71,6 @@
|
||||
"@types/test-listen": "1.1.0",
|
||||
"@types/watchpack": "1.1.1",
|
||||
"express": "4.17.3",
|
||||
"node-fetch": "3.2.3",
|
||||
"react": "18.0.0",
|
||||
"test-listen": "1.1.0",
|
||||
"typescript": "^4.5.3",
|
||||
|
||||
@@ -51,7 +51,7 @@ const runSeed = async (seedBasePath: string) => {
|
||||
throw err
|
||||
}
|
||||
|
||||
const db = require(dbPath)
|
||||
const db = require(dbPath).default
|
||||
await db.$disconnect()
|
||||
console.log("Done Seeding")
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ import {CliCommand} from "../index"
|
||||
import arg from "arg"
|
||||
import {AppGenerator, AppGeneratorOptions, getLatestVersion} from "@blitzjs/generator"
|
||||
import {runPrisma} from "../../prisma-utils"
|
||||
import {checkLatestVersion} from "../utils/check-latest-version"
|
||||
|
||||
const forms = {
|
||||
"react-final-form": "React Final Form" as const,
|
||||
@@ -218,9 +219,9 @@ const determinePkgManagerToInstallDeps = async () => {
|
||||
}
|
||||
|
||||
const newApp: CliCommand = async (argv) => {
|
||||
const shouldUpgrade = !args["--skip-upgrade"]
|
||||
const shouldUpgrade = false // !args["--skip-upgrade"]
|
||||
if (shouldUpgrade) {
|
||||
//TODO: Handle checking for updates
|
||||
await checkLatestVersion()
|
||||
}
|
||||
|
||||
await determineProjectName()
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
import {NON_STANDARD_NODE_ENV} from "./utils/constants"
|
||||
import arg from "arg"
|
||||
import {loadEnvConfig} from "../env-utils"
|
||||
import {getCommandBin} from "./utils/config"
|
||||
import spawn from "cross-spawn"
|
||||
import {readdirSync} from "fs-extra"
|
||||
import resolveFrom from "resolve-from"
|
||||
import pkgDir from "pkg-dir"
|
||||
import {join} from "path"
|
||||
|
||||
import {loadEnvConfig} from "../env-utils"
|
||||
import {NON_STANDARD_NODE_ENV} from "./utils/constants"
|
||||
import {getCommandBin} from "./utils/config"
|
||||
import {readVersions} from "./utils/read-versions"
|
||||
|
||||
import {getPkgManager} from "./utils/helpers"
|
||||
|
||||
const commonArgs = {
|
||||
// Flags
|
||||
@@ -57,15 +57,13 @@ if (aliases[args._[0] as Alias]) {
|
||||
|
||||
const forwardedArgs = blitzCommand ? args._.slice(1) : args._
|
||||
|
||||
const globalBlitzPath = resolveFrom(__dirname, "blitz")
|
||||
const localBlitzPath = resolveFrom.silent(process.cwd(), "blitz")
|
||||
|
||||
async function runCommandFromBin() {
|
||||
if (!args._[0]) {
|
||||
console.log("No command specified")
|
||||
process.exit(1)
|
||||
}
|
||||
let commandBin: string | null = null
|
||||
|
||||
try {
|
||||
commandBin = await getCommandBin(args._[0])
|
||||
} catch (e: any) {
|
||||
@@ -76,25 +74,24 @@ async function runCommandFromBin() {
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
const result = spawn.sync(commandBin, process.argv.slice(3), {stdio: "inherit"})
|
||||
const result = spawn.sync(commandBin, args._.slice(1), {stdio: "inherit"})
|
||||
process.exit(result.status || 0)
|
||||
}
|
||||
|
||||
async function printEnvInfo() {
|
||||
const osName = await import("os-name")
|
||||
const envinfo = await import("envinfo")
|
||||
const pkgManager = readdirSync(process.cwd()).includes("pnpm-lock.yaml")
|
||||
? "pnpm"
|
||||
: readdirSync(process.cwd()).includes("yarn-lock.yaml")
|
||||
? "yarn"
|
||||
: "npm"
|
||||
|
||||
const pkgManager = getPkgManager()
|
||||
const env = await envinfo.default.run(
|
||||
{
|
||||
System: ["OS", "CPU", "Memory", "Shell"],
|
||||
Binaries: ["Node", "Yarn", "npm", "pnpm"],
|
||||
npmPackages: [
|
||||
"blitz",
|
||||
"@blitzjs/rpc",
|
||||
"@blitzjs/auth",
|
||||
"@blitzjs/next",
|
||||
"typescript",
|
||||
"react",
|
||||
"react-dom",
|
||||
@@ -106,18 +103,13 @@ async function printEnvInfo() {
|
||||
{showNotFound: true},
|
||||
)
|
||||
|
||||
const globalBlitzPkgJsonPath = pkgDir.sync(globalBlitzPath)
|
||||
const localBlitzPkgJsonPath = pkgDir.sync(localBlitzPath)
|
||||
|
||||
if (globalBlitzPkgJsonPath && globalBlitzPkgJsonPath !== localBlitzPkgJsonPath) {
|
||||
// This branch won't run if user does `npx blitz` or `yarn blitz`
|
||||
const globalVersion = require(join(globalBlitzPkgJsonPath, "package.json")).version
|
||||
const {globalVersion, localVersions} = readVersions()
|
||||
if (globalVersion) {
|
||||
console.log(`Blitz version: ${globalVersion} (global)`)
|
||||
}
|
||||
|
||||
if (localBlitzPkgJsonPath) {
|
||||
const localVersion = require(join(localBlitzPkgJsonPath, "package.json")).version
|
||||
console.log(`Blitz version: ${localVersion} (local)`)
|
||||
if (localVersions.blitz) {
|
||||
console.log(`Blitz version: ${localVersions.blitz} (local)`)
|
||||
}
|
||||
|
||||
console.log(
|
||||
@@ -129,6 +121,9 @@ async function printEnvInfo() {
|
||||
}
|
||||
|
||||
async function main() {
|
||||
if (args["--env"]) {
|
||||
process.env.APP_ENV = args["--env"]
|
||||
}
|
||||
loadEnvConfig(process.cwd(), undefined, {error: console.error, info: console.info})
|
||||
|
||||
// Version is inlined into the file using taskr build pipeline
|
||||
@@ -136,10 +131,6 @@ async function main() {
|
||||
await printEnvInfo()
|
||||
}
|
||||
|
||||
if (args["--env"]) {
|
||||
process.env.APP_ENV = args["--env"]
|
||||
}
|
||||
|
||||
if (args["--help"]) {
|
||||
forwardedArgs.push("--help")
|
||||
}
|
||||
|
||||
185
packages/blitz/src/cli/utils/check-latest-version.ts
Normal file
185
packages/blitz/src/cli/utils/check-latest-version.ts
Normal file
@@ -0,0 +1,185 @@
|
||||
import findUp from "find-up"
|
||||
import resolveFrom from "resolve-from"
|
||||
import {join, dirname} from "path"
|
||||
import fs from "fs"
|
||||
import {readVersions, resolveVersionType} from "./read-versions"
|
||||
import {getPkgManager} from "./helpers"
|
||||
import superjson from "superjson"
|
||||
|
||||
const returnNpmEndpoint = (packageName: string) => {
|
||||
return `https://registry.npmjs.org/-/package/${packageName}/dist-tags`
|
||||
}
|
||||
|
||||
function getUpdateString(packageName: string, tag: string, isGlobal?: boolean) {
|
||||
const pkgManager = getPkgManager()
|
||||
switch (pkgManager) {
|
||||
case "npm":
|
||||
return `npm install${isGlobal ? " -g" : ""} ${packageName}@${tag}`
|
||||
case "yarn":
|
||||
return `yarn${isGlobal ? " global" : ""} add ${packageName}@${tag}`
|
||||
case "pnpm":
|
||||
return `pnpm install${isGlobal ? " -g" : ""} ${packageName}@${tag}`
|
||||
}
|
||||
}
|
||||
const isInternalBlitzMonorepoDevelopment = fs.existsSync(
|
||||
join(process.cwd(), "..", "..", "packages", "blitz", "dist", "chunks"),
|
||||
)
|
||||
|
||||
async function findNodeModulesRoot(src: string) {
|
||||
const blitzPkgLocation = dirname(
|
||||
(await findUp("package.json", {
|
||||
cwd: resolveFrom(src, "blitz"),
|
||||
})) ?? "",
|
||||
)
|
||||
|
||||
if (!blitzPkgLocation) {
|
||||
throw new Error("Internal Blitz Error: unable to find 'blitz' package location")
|
||||
}
|
||||
|
||||
return blitzPkgLocation.includes(".pnpm")
|
||||
? join(blitzPkgLocation, "../../../../")
|
||||
: join(blitzPkgLocation, "../")
|
||||
}
|
||||
|
||||
export async function checkLatestVersion() {
|
||||
if (!isInternalBlitzMonorepoDevelopment) {
|
||||
const fetch = await import("node-fetch")
|
||||
const boxen = await import("boxen")
|
||||
const versions = readVersions()
|
||||
const nodeModulesRoot = await findNodeModulesRoot(process.cwd())
|
||||
const dotBlitzCacheExists = fs.existsSync(
|
||||
join(nodeModulesRoot, ".blitz", "checkUpdateCache.json"),
|
||||
)
|
||||
let dotBlitzCache
|
||||
let shouldRun = true
|
||||
|
||||
if (dotBlitzCacheExists) {
|
||||
dotBlitzCache = fs.readFileSync(join(nodeModulesRoot, ".blitz", "checkUpdateCache.json"))
|
||||
const now = new Date()
|
||||
const msBetweenTimes = Math.abs(
|
||||
superjson.parse<{lastUpdated: Date}>(dotBlitzCache.toString()).lastUpdated.getTime() -
|
||||
now.getTime(),
|
||||
)
|
||||
const hoursBetweenTimes = msBetweenTimes / (60 * 60 * 1000)
|
||||
shouldRun = hoursBetweenTimes > 24
|
||||
}
|
||||
|
||||
if (shouldRun) {
|
||||
let errors: {message: string; instructions: string}[] = []
|
||||
try {
|
||||
const blitzResponse = await fetch.default(returnNpmEndpoint("blitz"))
|
||||
const remoteBlitzVersions = (await blitzResponse.json()) as Record<string, string>
|
||||
|
||||
const blitzNextResponse = await fetch.default(returnNpmEndpoint("@blitzjs/next"))
|
||||
const remoteBlitzNextVersions = (await blitzNextResponse.json()) as Record<string, string>
|
||||
|
||||
const blitzAuthResponse = await fetch.default(returnNpmEndpoint("@blitzjs/auth"))
|
||||
const remoteBlitzAuthVersions = (await blitzAuthResponse.json()) as Record<string, string>
|
||||
|
||||
const blitzRpcResponse = await fetch.default(returnNpmEndpoint("@blitzjs/rpc"))
|
||||
const remoteBlitzRpcVersions = (await blitzRpcResponse.json()) as Record<string, string>
|
||||
|
||||
for (const version of Object.entries(versions)) {
|
||||
if (version[0] === "globalVersion") {
|
||||
const versionType = resolveVersionType(version[1] as string)
|
||||
|
||||
if (remoteBlitzVersions.hasOwnProperty("beta") && versionType !== "beta") {
|
||||
errors.push({
|
||||
message: `blitz(global) (current) ${version[1]} -> (latest) ${remoteBlitzVersions["beta"]}`,
|
||||
instructions: `${getUpdateString("blitz", "beta", true)}`,
|
||||
})
|
||||
} else if (remoteBlitzVersions[versionType] !== version[1]) {
|
||||
errors.push({
|
||||
message: `blitz(global) (current) ${version[1]} -> (latest) ${remoteBlitzVersions[versionType]}`,
|
||||
instructions: `${getUpdateString("blitz", versionType, true)}`,
|
||||
})
|
||||
}
|
||||
} else if (version[0] === "localVersions") {
|
||||
for (const localVersion of Object.entries(version[1])) {
|
||||
const versionType = resolveVersionType(localVersion[1] as string)
|
||||
|
||||
switch (localVersion[0]) {
|
||||
case "blitz":
|
||||
if (remoteBlitzVersions.hasOwnProperty("beta") && versionType !== "beta") {
|
||||
errors.push({
|
||||
message: `blitz (current) ${localVersion[1]} -> (latest) ${remoteBlitzVersions["beta"]}`,
|
||||
instructions: `${getUpdateString("blitz", "beta", false)}`,
|
||||
})
|
||||
} else if (remoteBlitzVersions[versionType] !== localVersion[1]) {
|
||||
errors.push({
|
||||
message: `blitz (current) ${localVersion[1]} -> (latest) ${remoteBlitzVersions[versionType]}`,
|
||||
instructions: `${getUpdateString("blitz", versionType, false)}`,
|
||||
})
|
||||
}
|
||||
break
|
||||
case "blitzAuth":
|
||||
if (remoteBlitzAuthVersions.hasOwnProperty("beta") && versionType !== "beta") {
|
||||
errors.push({
|
||||
message: `@blitzjs/auth (current) ${localVersion[1]} -> (latest) ${remoteBlitzAuthVersions["beta"]}`,
|
||||
instructions: `${getUpdateString("@blitzjs/auth", "beta", false)}`,
|
||||
})
|
||||
} else if (remoteBlitzAuthVersions[versionType] !== localVersion[1]) {
|
||||
errors.push({
|
||||
message: `@blitzjs/auth (current) ${localVersion[1]} -> (latest) ${remoteBlitzAuthVersions[versionType]}`,
|
||||
instructions: `${getUpdateString("@blitzjs/auth", versionType, false)}`,
|
||||
})
|
||||
}
|
||||
break
|
||||
case "blitzNext":
|
||||
if (remoteBlitzNextVersions.hasOwnProperty("beta") && versionType !== "beta") {
|
||||
errors.push({
|
||||
message: `@blitzjs/next (current) ${localVersion[1]} -> (latest) ${remoteBlitzNextVersions["beta"]}`,
|
||||
instructions: `${getUpdateString("@blitzjs/next", "beta", false)}`,
|
||||
})
|
||||
} else if (remoteBlitzNextVersions[versionType] !== localVersion[1]) {
|
||||
errors.push({
|
||||
message: `@blitzjs/next (current) ${localVersion[1]} -> (latest) ${remoteBlitzNextVersions[versionType]}`,
|
||||
instructions: `${getUpdateString("@blitzjs/next", versionType, false)}`,
|
||||
})
|
||||
}
|
||||
break
|
||||
case "blitzRpc":
|
||||
if (remoteBlitzRpcVersions.hasOwnProperty("beta") && versionType !== "beta") {
|
||||
errors.push({
|
||||
message: `@blitzjs/rpc (current) ${localVersion[1]} -> (latest) ${remoteBlitzRpcVersions["beta"]}`,
|
||||
instructions: `${getUpdateString("@blitzjs/rpc", "beta", false)}`,
|
||||
})
|
||||
} else if (remoteBlitzRpcVersions[versionType] !== localVersion[1]) {
|
||||
errors.push({
|
||||
message: `@blitzjs/rpc (current) ${localVersion[1]} -> (latest) ${remoteBlitzRpcVersions[versionType]}`,
|
||||
instructions: `${getUpdateString("@blitzjs/rpc", versionType, false)}`,
|
||||
})
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log(
|
||||
boxen.default(
|
||||
`You are running outdated blitz packages\n\n ${errors
|
||||
.map((e) => e.message)
|
||||
.join("\n")} \n\n Run the following to update:\n ${errors
|
||||
.map((e) => e.instructions)
|
||||
.join("\n")}`,
|
||||
{padding: 1},
|
||||
),
|
||||
)
|
||||
|
||||
const dotBlitz = join(nodeModulesRoot, ".blitz")
|
||||
fs.writeFileSync(
|
||||
join(dotBlitz, "checkUpdateCache.json"),
|
||||
superjson.stringify({lastUpdated: new Date()}),
|
||||
)
|
||||
} catch (err) {
|
||||
if (err instanceof fetch.FetchError) {
|
||||
// TODO: Check if network error and throw otherwise
|
||||
// pass fetch error
|
||||
} else {
|
||||
console.log(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
9
packages/blitz/src/cli/utils/helpers.ts
Normal file
9
packages/blitz/src/cli/utils/helpers.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import {readdirSync} from "fs-extra"
|
||||
|
||||
export function getPkgManager() {
|
||||
return readdirSync(process.cwd()).includes("pnpm-lock.yaml")
|
||||
? "pnpm"
|
||||
: readdirSync(process.cwd()).includes("yarn-lock.yaml")
|
||||
? "yarn"
|
||||
: "npm"
|
||||
}
|
||||
@@ -7,6 +7,7 @@ import {
|
||||
startCustomServer,
|
||||
buildCustomServer,
|
||||
} from "./next-utils"
|
||||
import {checkLatestVersion} from "./check-latest-version"
|
||||
import {readBlitzConfig} from "../../server-utils"
|
||||
|
||||
export async function build(config: ServerConfig) {
|
||||
@@ -18,7 +19,7 @@ export async function build(config: ServerConfig) {
|
||||
|
||||
export async function dev(config: ServerConfig) {
|
||||
const {rootFolder, nextBin} = await normalize({...config, env: "dev"})
|
||||
|
||||
void checkLatestVersion()
|
||||
if (customServerExists()) {
|
||||
console.log("Using your custom server")
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ import type {ServerConfig} from "./config"
|
||||
const debug = require("debug")("blitz:utils")
|
||||
|
||||
export function getProjectRootSync() {
|
||||
return path.dirname(process.cwd())
|
||||
return process.cwd()
|
||||
}
|
||||
|
||||
export function getCustomServerPath() {
|
||||
|
||||
79
packages/blitz/src/cli/utils/read-versions.ts
Normal file
79
packages/blitz/src/cli/utils/read-versions.ts
Normal file
@@ -0,0 +1,79 @@
|
||||
import {join} from "path"
|
||||
import pkgDir from "pkg-dir"
|
||||
import resolveFrom from "resolve-from"
|
||||
|
||||
const globalBlitzPath = resolveFrom(__dirname, "blitz")
|
||||
const localBlitzPath = resolveFrom.silent(process.cwd(), "blitz")
|
||||
const localBlitzAuthPath = resolveFrom.silent(process.cwd(), "@blitzjs/auth")
|
||||
const localBlitzRpcPath = resolveFrom.silent(process.cwd(), "@blitzjs/rpc")
|
||||
const localBlitzNextPath = resolveFrom.silent(process.cwd(), "@blitzjs/next")
|
||||
|
||||
export function readVersions() {
|
||||
const globalBlitzPkgJsonPath = pkgDir.sync(globalBlitzPath)
|
||||
const localBlitzPkgJsonPath = pkgDir.sync(localBlitzPath)
|
||||
const localBlitzAuthPkgJsonPath = pkgDir.sync(localBlitzAuthPath)
|
||||
const localBlitzNextPkgJsonPath = pkgDir.sync(localBlitzNextPath)
|
||||
const localBlitzRpcPkgJsonPath = pkgDir.sync(localBlitzRpcPath)
|
||||
|
||||
const versions: {
|
||||
globalVersion?: string
|
||||
localVersions: {
|
||||
blitz?: string
|
||||
blitzAuth?: string
|
||||
blitzRpc?: string
|
||||
blitzNext?: string
|
||||
}
|
||||
} = {globalVersion: "", localVersions: {}}
|
||||
|
||||
// This branch won't run if user does `npx blitz` or `yarn blitz`
|
||||
if (globalBlitzPkgJsonPath && globalBlitzPkgJsonPath !== localBlitzPkgJsonPath) {
|
||||
versions.globalVersion = require(join(globalBlitzPkgJsonPath, "package.json")).version
|
||||
}
|
||||
|
||||
if (localBlitzPkgJsonPath) {
|
||||
versions.localVersions.blitz = require(join(localBlitzPkgJsonPath, "package.json")).version
|
||||
}
|
||||
|
||||
if (localBlitzAuthPkgJsonPath) {
|
||||
versions.localVersions.blitzAuth = require(join(
|
||||
localBlitzAuthPkgJsonPath,
|
||||
"package.json",
|
||||
)).version
|
||||
}
|
||||
|
||||
if (localBlitzNextPkgJsonPath) {
|
||||
versions.localVersions.blitzNext = require(join(
|
||||
localBlitzNextPkgJsonPath,
|
||||
"package.json",
|
||||
)).version
|
||||
}
|
||||
|
||||
if (localBlitzRpcPkgJsonPath) {
|
||||
versions.localVersions.blitzRpc = require(join(
|
||||
localBlitzRpcPkgJsonPath,
|
||||
"package.json",
|
||||
)).version
|
||||
}
|
||||
|
||||
return versions
|
||||
}
|
||||
|
||||
export function resolveVersionType(version: string) {
|
||||
if (version.includes("alpha")) {
|
||||
return "alpha" as const
|
||||
}
|
||||
|
||||
if (version.includes("beta")) {
|
||||
return "beta" as const
|
||||
}
|
||||
|
||||
if (version.includes("danger")) {
|
||||
return "danger" as const
|
||||
}
|
||||
|
||||
if (version.includes("canary")) {
|
||||
return "canary" as const
|
||||
}
|
||||
|
||||
return "latest" as const
|
||||
}
|
||||
@@ -142,3 +142,7 @@ export function prettyMs(ms: number): string {
|
||||
export function interopDefault(mod: any) {
|
||||
return mod.default || mod
|
||||
}
|
||||
|
||||
export function truncateString(str: string, maxLength: number): string {
|
||||
return str.length > maxLength ? str.substring(0, maxLength - 3) + "..." : str
|
||||
}
|
||||
|
||||
@@ -1,5 +1,77 @@
|
||||
# @blitzjs/codemod
|
||||
|
||||
## 2.0.0-alpha.62
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [365e6709]
|
||||
- blitz@2.0.0-alpha.62
|
||||
- @blitzjs/generator@2.0.0-alpha.62
|
||||
|
||||
## 2.0.0-alpha.61
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [240f378b]
|
||||
- blitz@2.0.0-alpha.61
|
||||
- @blitzjs/generator@2.0.0-alpha.61
|
||||
|
||||
## 2.0.0-alpha.60
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [1d863f35]
|
||||
- blitz@2.0.0-alpha.60
|
||||
- @blitzjs/generator@2.0.0-alpha.60
|
||||
|
||||
## 2.0.0-alpha.59
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @blitzjs/generator@2.0.0-alpha.59
|
||||
- blitz@2.0.0-alpha.59
|
||||
|
||||
## 2.0.0-alpha.58
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- dcdcd040: These are various changes to will make the codemod more dynamic and work with a larger variety of codebases. These fixes are implemented to make the codemod work with flightdeck.
|
||||
- 7e538ba4: Import ErrorComponent as DefaultErrorComponent
|
||||
- 8e00605a: Updates the error messages based on if it's a babel parse error or an unexpected error
|
||||
- Updated dependencies [83b35590]
|
||||
- Updated dependencies [e339e2fd]
|
||||
- blitz@2.0.0-alpha.58
|
||||
- @blitzjs/generator@2.0.0-alpha.58
|
||||
|
||||
## 2.0.0-alpha.57
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [3511d5b6]
|
||||
- blitz@2.0.0-alpha.57
|
||||
- @blitzjs/generator@2.0.0-alpha.57
|
||||
|
||||
## 2.0.0-alpha.56
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [abb1ad5d]
|
||||
- Updated dependencies [abe2afcc]
|
||||
- Updated dependencies [0ac6e171]
|
||||
- Updated dependencies [8bcb471a]
|
||||
- blitz@2.0.0-alpha.56
|
||||
- @blitzjs/generator@2.0.0-alpha.56
|
||||
|
||||
## 2.0.0-alpha.55
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [8f166a5d]
|
||||
- Updated dependencies [54a66a95]
|
||||
- Updated dependencies [ab4d9de7]
|
||||
- blitz@2.0.0-alpha.55
|
||||
- @blitzjs/generator@2.0.0-alpha.55
|
||||
|
||||
## 2.0.0-alpha.54
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@blitzjs/codemod",
|
||||
"version": "2.0.0-alpha.54",
|
||||
"version": "2.0.0-alpha.62",
|
||||
"scripts": {
|
||||
"build": "unbuild",
|
||||
"dev": "watch unbuild src --wait=0.2",
|
||||
@@ -25,9 +25,9 @@
|
||||
"@babel/plugin-proposal-class-properties": "7.17.12",
|
||||
"@babel/plugin-syntax-jsx": "7.17.12",
|
||||
"@babel/plugin-syntax-typescript": "7.17.12",
|
||||
"@blitzjs/generator": "2.0.0-alpha.54",
|
||||
"@blitzjs/generator": "2.0.0-alpha.62",
|
||||
"arg": "5.0.1",
|
||||
"blitz": "2.0.0-alpha.54",
|
||||
"blitz": "2.0.0-alpha.62",
|
||||
"chalk": "^4.1.0",
|
||||
"cross-spawn": "7.0.3",
|
||||
"debug": "4.3.3",
|
||||
|
||||
@@ -184,6 +184,10 @@ const upgradeLegacy = async () => {
|
||||
BlitzLayout: "@blitzjs/next",
|
||||
}
|
||||
|
||||
const renames: Record<string, string> = {
|
||||
ErrorComponent: "DefaultErrorComponent",
|
||||
}
|
||||
|
||||
getAllFiles(appDir, [], [], [".ts", ".tsx", ".js", ".jsx"]).forEach((filename) => {
|
||||
const program = getCollectionFromSource(path.resolve(appDir, filename))
|
||||
const parsedProgram = program.get()
|
||||
@@ -197,7 +201,13 @@ const upgradeLegacy = async () => {
|
||||
? specifier.imported.value
|
||||
: specifier.imported.name
|
||||
if (importedName in specialImports) {
|
||||
addNamedImport(program, importedName, specialImports[importedName]!)
|
||||
addNamedImport(
|
||||
program,
|
||||
importedName,
|
||||
specialImports[importedName]!,
|
||||
undefined,
|
||||
renames[importedName],
|
||||
)
|
||||
removeImport(program, importedName, "blitz")
|
||||
}
|
||||
})
|
||||
@@ -433,6 +443,7 @@ const upgradeLegacy = async () => {
|
||||
j.Identifier,
|
||||
(node) => node.name === "middleware",
|
||||
)
|
||||
|
||||
if (middlewareArray.length) {
|
||||
const middlewares = middlewareArray
|
||||
.get()
|
||||
@@ -451,7 +462,12 @@ const upgradeLegacy = async () => {
|
||||
let importStatements = []
|
||||
for (let nodes of blitzConfigProgram.get().value.program.body) {
|
||||
if (nodes.type === "ImportDeclaration") {
|
||||
if (nodes.source.value !== "blitz") {
|
||||
// Find duplicates
|
||||
const dup = blitzServerProgram.find(
|
||||
j.ImportDeclaration,
|
||||
(node) => node.source.value === nodes.source.value,
|
||||
)
|
||||
if (nodes.source.value !== "blitz" && !dup.length) {
|
||||
importStatements.push(nodes)
|
||||
}
|
||||
}
|
||||
@@ -466,11 +482,7 @@ const upgradeLegacy = async () => {
|
||||
}
|
||||
}
|
||||
|
||||
importStatements.forEach((s) =>
|
||||
blitzServerProgram
|
||||
.get()
|
||||
.value.program.body.unshift(j.variableDeclaration(s.kind, s.declarations)),
|
||||
)
|
||||
importStatements.forEach((s) => blitzServerProgram.get().value.program.body.unshift(s))
|
||||
|
||||
fs.writeFileSync(
|
||||
`${appDir}/blitz-server.${isTypescript ? "ts" : "js"}`,
|
||||
@@ -741,40 +753,50 @@ const upgradeLegacy = async () => {
|
||||
const parsedProgram = program.get()
|
||||
|
||||
const findRouterQueryImport = findImport(program, "next/router")
|
||||
findRouterQueryImport?.forEach((node) => {
|
||||
const getNode = node.get()
|
||||
getNode.value.specifiers.slice().forEach((specifier: any, index: number) => {
|
||||
const importedName =
|
||||
specifier.imported.type === "StringLiteral"
|
||||
? specifier.imported.value
|
||||
: specifier.imported.name
|
||||
if (importedName === "useRouterQuery") {
|
||||
addNamedImport(program, "useRouter", "next/router")
|
||||
getNode.value.specifiers.splice(index, 1)
|
||||
// Removed left overs
|
||||
if (!getNode.value.specifiers?.length) {
|
||||
const index = parsedProgram.value.program.body.indexOf(getNode.value)
|
||||
parsedProgram.value.program.body.splice(index, 1)
|
||||
|
||||
if (findRouterQueryImport?.length) {
|
||||
findRouterQueryImport?.forEach((node) => {
|
||||
const getNode = node.get()
|
||||
getNode.value.specifiers.slice().forEach((specifier: any, index: number) => {
|
||||
const importedName = (): string | null => {
|
||||
if (specifier.imported) {
|
||||
if (specifier.imported.type === "StringLiteral") {
|
||||
return specifier.imported.value
|
||||
} else if (specifier.imported.type === "Identifier") {
|
||||
return specifier.imported.name
|
||||
}
|
||||
}
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
if (importedName() && importedName() === "useRouterQuery") {
|
||||
addNamedImport(program, "useRouter", "next/router")
|
||||
getNode.value.specifiers.splice(index, 1)
|
||||
// Removed left overs
|
||||
if (!getNode.value.specifiers?.length) {
|
||||
const index = parsedProgram.value.program.body.indexOf(getNode.value)
|
||||
parsedProgram.value.program.body.splice(index, 1)
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
const findCallUseRouterQuery = program.find(
|
||||
j.CallExpression,
|
||||
(node) => node.callee.name === "useRouterQuery",
|
||||
)
|
||||
findCallUseRouterQuery.forEach((call) => {
|
||||
const nodePath = call.get()
|
||||
nodePath.parentPath.value.init = j.expressionStatement(
|
||||
j.memberExpression(
|
||||
j.callExpression(j.identifier("useRouter"), []),
|
||||
j.identifier("query"),
|
||||
),
|
||||
const findCallUseRouterQuery = program.find(
|
||||
j.CallExpression,
|
||||
(node) => node.callee.name === "useRouterQuery",
|
||||
)
|
||||
})
|
||||
findCallUseRouterQuery.forEach((call) => {
|
||||
const nodePath = call.get()
|
||||
nodePath.parentPath.value.init = j.expressionStatement(
|
||||
j.memberExpression(
|
||||
j.callExpression(j.identifier("useRouter"), []),
|
||||
j.identifier("query"),
|
||||
),
|
||||
)
|
||||
})
|
||||
|
||||
fs.writeFileSync(filepath, program.toSource())
|
||||
fs.writeFileSync(filepath, program.toSource())
|
||||
}
|
||||
})
|
||||
|
||||
getAllFiles(appDir, [], [], [".ts", ".tsx", ".js", ".jsx"]).forEach((file) => {
|
||||
@@ -786,45 +808,54 @@ const upgradeLegacy = async () => {
|
||||
j.ImportDeclaration,
|
||||
(node) => node.source.value === "next/router",
|
||||
)
|
||||
findRouterQueryImport.forEach((node) => {
|
||||
const getNode = node.get()
|
||||
getNode.value.specifiers.slice().forEach((specifier: any, index: number) => {
|
||||
const importedName =
|
||||
specifier.imported.type === "StringLiteral"
|
||||
? specifier.imported.value
|
||||
: specifier.imported.name
|
||||
if (importedName === "useRouterQuery") {
|
||||
parsedProgram.value.program.body.unshift(
|
||||
j.importDeclaration(
|
||||
[j.importSpecifier(j.identifier("useRouter"))],
|
||||
j.stringLiteral("next/router"),
|
||||
),
|
||||
)
|
||||
getNode.value.specifiers.splice(index, 1)
|
||||
// Removed left overs
|
||||
if (!getNode.value.specifiers?.length) {
|
||||
const index = parsedProgram.value.program.body.indexOf(getNode.value)
|
||||
parsedProgram.value.program.body.splice(index, 1)
|
||||
if (findRouterQueryImport?.length) {
|
||||
findRouterQueryImport.forEach((node) => {
|
||||
const getNode = node.get()
|
||||
getNode.value.specifiers.slice().forEach((specifier: any, index: number) => {
|
||||
const importedName = (): string | null => {
|
||||
if (specifier.imported) {
|
||||
if (specifier.imported.type === "StringLiteral") {
|
||||
return specifier.imported.value
|
||||
} else if (specifier.imported.type === "Identifier") {
|
||||
return specifier.imported.name
|
||||
}
|
||||
}
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
if (importedName() && importedName() === "useRouterQuery") {
|
||||
parsedProgram.value.program.body.unshift(
|
||||
j.importDeclaration(
|
||||
[j.importSpecifier(j.identifier("useRouter"))],
|
||||
j.stringLiteral("next/router"),
|
||||
),
|
||||
)
|
||||
getNode.value.specifiers.splice(index, 1)
|
||||
// Removed left overs
|
||||
if (!getNode.value.specifiers?.length) {
|
||||
const index = parsedProgram.value.program.body.indexOf(getNode.value)
|
||||
parsedProgram.value.program.body.splice(index, 1)
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
const findCallUseRouterQuery = program.find(
|
||||
j.CallExpression,
|
||||
(node) => node.callee.name === "useRouterQuery",
|
||||
)
|
||||
findCallUseRouterQuery.forEach((call) => {
|
||||
const nodePath = call.get()
|
||||
nodePath.parentPath.value.init = j.expressionStatement(
|
||||
j.memberExpression(
|
||||
j.callExpression(j.identifier("useRouter"), []),
|
||||
j.identifier("query"),
|
||||
),
|
||||
const findCallUseRouterQuery = program.find(
|
||||
j.CallExpression,
|
||||
(node) => node.callee.name === "useRouterQuery",
|
||||
)
|
||||
})
|
||||
findCallUseRouterQuery.forEach((call) => {
|
||||
const nodePath = call.get()
|
||||
nodePath.parentPath.value.init = j.expressionStatement(
|
||||
j.memberExpression(
|
||||
j.callExpression(j.identifier("useRouter"), []),
|
||||
j.identifier("query"),
|
||||
),
|
||||
)
|
||||
})
|
||||
|
||||
fs.writeFileSync(filepath, program.toSource())
|
||||
fs.writeFileSync(filepath, program.toSource())
|
||||
}
|
||||
})
|
||||
},
|
||||
})
|
||||
@@ -907,9 +938,11 @@ const upgradeLegacy = async () => {
|
||||
)
|
||||
|
||||
const documentHead = program
|
||||
.find(j.Identifier, (node) => node.name === "DocumentHead")
|
||||
.find(j.JSXElement, (node) => node.openingElement.name.name === "DocumentHead")
|
||||
.get()
|
||||
documentHead.value.name = "Head"
|
||||
|
||||
documentHead.value.openingElement.name.name = "Head"
|
||||
documentHead.value.closingElement.name.name = "Head"
|
||||
|
||||
const blitzScript = program.find(j.Identifier, (node) => node.name === "BlitzScript").get()
|
||||
blitzScript.value.name = "NextScript"
|
||||
@@ -959,15 +992,20 @@ const upgradeLegacy = async () => {
|
||||
const program = getCollectionFromSource(file)
|
||||
|
||||
const defaultExportPath = findDefaultExportPath(program)
|
||||
if (!defaultExportPath) {
|
||||
return
|
||||
|
||||
if (defaultExportPath) {
|
||||
const {node} = defaultExportPath
|
||||
|
||||
if (node.declaration.type === "Identifier") {
|
||||
node.declaration = j.callExpression(j.identifier("api"), [node.declaration as any])
|
||||
addNamedImport(program, "api", "app/blitz-server")
|
||||
} else if (node.declaration.type === "FunctionDeclaration") {
|
||||
node.declaration = j.template.expression`api(${node.declaration})`
|
||||
addNamedImport(program, "api", "app/blitz-server")
|
||||
}
|
||||
|
||||
fs.writeFileSync(path.join(path.resolve(file)), program.toSource())
|
||||
}
|
||||
|
||||
const {node} = defaultExportPath
|
||||
node.declaration = j.callExpression(j.identifier("api"), [node.declaration as any])
|
||||
addNamedImport(program, "api", "app/blitz-server")
|
||||
|
||||
fs.writeFileSync(path.join(path.resolve(file)), program.toSource())
|
||||
})
|
||||
}
|
||||
},
|
||||
@@ -1118,8 +1156,23 @@ const upgradeLegacy = async () => {
|
||||
try {
|
||||
await step.action()
|
||||
} catch (err) {
|
||||
const error = err as {code: string} | string
|
||||
spinner.fail(`${step.name}`)
|
||||
log.error(err as string)
|
||||
log.error(error as string)
|
||||
|
||||
if (error && typeof error === "object" && error.code === "BABEL_PARSE_ERROR") {
|
||||
log.error(
|
||||
log.withBrand(
|
||||
"Don't panic, go to the file with the error & manually fix it. Then run the codemod again. It will continue where it left off.",
|
||||
),
|
||||
)
|
||||
} else {
|
||||
log.error(
|
||||
log.withBrand(
|
||||
"This is an unexpected error. Please ask for help in the discord #general-help channel. https://discord.blitzjs.com",
|
||||
),
|
||||
)
|
||||
}
|
||||
failedAt = index + 1
|
||||
fs.writeJsonSync(".migration.json", {
|
||||
failedAt,
|
||||
|
||||
@@ -168,6 +168,7 @@ export function addNamedImport(
|
||||
importStatement: string,
|
||||
importFrom: string,
|
||||
defaultSpecifier?: boolean,
|
||||
asImport?: string,
|
||||
) {
|
||||
const existingImport = program.find(
|
||||
j.ImportDeclaration,
|
||||
@@ -183,7 +184,11 @@ export function addNamedImport(
|
||||
if (existingSpecifier.length) {
|
||||
return
|
||||
}
|
||||
existingImport.get().value.specifiers.push(j.importSpecifier(j.identifier(importStatement)))
|
||||
existingImport
|
||||
.get()
|
||||
.value.specifiers.push(
|
||||
j.importSpecifier(j.identifier(importStatement), asImport ? j.identifier(asImport) : null),
|
||||
)
|
||||
} else {
|
||||
program
|
||||
.get()
|
||||
@@ -194,7 +199,12 @@ export function addNamedImport(
|
||||
j.stringLiteral(importFrom),
|
||||
)
|
||||
: j.importDeclaration(
|
||||
[j.importSpecifier(j.identifier(importStatement))],
|
||||
[
|
||||
j.importSpecifier(
|
||||
j.identifier(importStatement),
|
||||
asImport ? j.identifier(asImport) : null,
|
||||
),
|
||||
],
|
||||
j.stringLiteral(importFrom),
|
||||
),
|
||||
)
|
||||
@@ -224,7 +234,16 @@ export function getAllFiles(
|
||||
skipDirs?: string[],
|
||||
allowedExt?: string[],
|
||||
) {
|
||||
let currentFiles = fs.readdirSync(dirPath)
|
||||
let currentFiles: string[] = []
|
||||
try {
|
||||
currentFiles = fs.readdirSync(dirPath)
|
||||
} catch (e: any) {
|
||||
if (e.code === "ENOENT") {
|
||||
return []
|
||||
}
|
||||
|
||||
throw e
|
||||
}
|
||||
|
||||
currentFiles.forEach((file) => {
|
||||
if (fs.statSync(dirPath + "/" + file).isDirectory()) {
|
||||
|
||||
@@ -1,5 +1,21 @@
|
||||
# @blitzjs/config
|
||||
|
||||
## 2.0.0-alpha.62
|
||||
|
||||
## 2.0.0-alpha.61
|
||||
|
||||
## 2.0.0-alpha.60
|
||||
|
||||
## 2.0.0-alpha.59
|
||||
|
||||
## 2.0.0-alpha.58
|
||||
|
||||
## 2.0.0-alpha.57
|
||||
|
||||
## 2.0.0-alpha.56
|
||||
|
||||
## 2.0.0-alpha.55
|
||||
|
||||
## 2.0.0-alpha.54
|
||||
|
||||
## 2.0.0-alpha.53
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@blitzjs/config",
|
||||
"private": true,
|
||||
"version": "2.0.0-alpha.54",
|
||||
"version": "2.0.0-alpha.62",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@typescript-eslint/eslint-plugin": "5.9.1",
|
||||
|
||||
@@ -1,5 +1,29 @@
|
||||
# @blitzjs/generator
|
||||
|
||||
## 2.0.0-alpha.62
|
||||
|
||||
## 2.0.0-alpha.61
|
||||
|
||||
## 2.0.0-alpha.60
|
||||
|
||||
## 2.0.0-alpha.59
|
||||
|
||||
## 2.0.0-alpha.58
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- e339e2fd: Add hoist pattern entry for react-query in new app templates
|
||||
|
||||
## 2.0.0-alpha.57
|
||||
|
||||
## 2.0.0-alpha.56
|
||||
|
||||
## 2.0.0-alpha.55
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- ab4d9de7: Don't try to copy RPC API endpoint in templates that don't have it
|
||||
|
||||
## 2.0.0-alpha.54
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@blitzjs/generator",
|
||||
"version": "2.0.0-alpha.54",
|
||||
"version": "2.0.0-alpha.62",
|
||||
"scripts": {
|
||||
"dev": "watch unbuild src --wait=0.2",
|
||||
"build": "unbuild && pnpm build:templates",
|
||||
@@ -45,7 +45,7 @@
|
||||
"vinyl": "2.2.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@blitzjs/config": "2.0.0-alpha.54",
|
||||
"@blitzjs/config": "2.0.0-alpha.62",
|
||||
"@juanm04/cpx": "2.0.1",
|
||||
"@types/babel__core": "7.1.19",
|
||||
"@types/diff": "5.0.2",
|
||||
|
||||
@@ -30,6 +30,7 @@ export interface AppGeneratorOptions extends GeneratorOptions {
|
||||
form?: "React Final Form" | "React Hook Form" | "Formik"
|
||||
onPostInstall?: () => Promise<void>
|
||||
}
|
||||
|
||||
type PkgManager = "npm" | "yarn" | "pnpm"
|
||||
|
||||
export class AppGenerator extends Generator<AppGeneratorOptions> {
|
||||
@@ -76,10 +77,14 @@ export class AppGenerator extends Generator<AppGeneratorOptions> {
|
||||
this.destinationPath(this.options.useTs ? "package.ts.json" : "package.js.json"),
|
||||
this.destinationPath("package.json"),
|
||||
)
|
||||
this.fs.move(
|
||||
this.destinationPath(`pages/api/rpc/blitzrpcroute.${this.options.useTs ? "ts" : "js"}`),
|
||||
this.destinationPath(`pages/api/rpc/[[...blitz]].${this.options.useTs ? "ts" : "js"}`),
|
||||
)
|
||||
|
||||
const rpcEndpointPath = `pages/api/rpc/blitzrpcroute.${this.options.useTs ? "ts" : "js"}`
|
||||
if (this.fs.exists(rpcEndpointPath)) {
|
||||
this.fs.move(
|
||||
this.destinationPath(rpcEndpointPath),
|
||||
this.destinationPath(`pages/api/rpc/[[...blitz]].${this.options.useTs ? "ts" : "js"}`),
|
||||
)
|
||||
}
|
||||
|
||||
if (!this.options.template.skipForms) {
|
||||
this.updateForms()
|
||||
@@ -286,6 +291,7 @@ export class AppGenerator extends Generator<AppGeneratorOptions> {
|
||||
}
|
||||
commitSpinner.succeed()
|
||||
}
|
||||
|
||||
private updateForms() {
|
||||
const pkg = this.fs.readJSON(this.destinationPath("package.json")) as
|
||||
| Record<string, any>
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import Head from "next/head"
|
||||
import React, { FC } from "react"
|
||||
import React, {FC} from "react"
|
||||
import {BlitzLayout} from "@blitzjs/next"
|
||||
|
||||
const Layout: FC<{ title?: string; children?: React.ReactNode }> = ({ title, children }) => {
|
||||
const Layout: BlitzLayout<{title?: string; children?: React.ReactNode}> = ({title, children}) => {
|
||||
return (
|
||||
<>
|
||||
<Head>
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
save-exact=true
|
||||
legacy-peer-deps=true
|
||||
strict-peer-dependencies=false
|
||||
strict-peer-dependencies=false
|
||||
side-effects-cache=false
|
||||
|
||||
public-hoist-pattern[]=react-query
|
||||
public-hoist-pattern[]=next
|
||||
public-hoist-pattern[]=secure-password
|
||||
public-hoist-pattern[]=*jest*
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
"@blitzjs/auth": "alpha",
|
||||
"@blitzjs/next": "alpha",
|
||||
"@blitzjs/rpc": "alpha",
|
||||
"@prisma/client": "3.9.0",
|
||||
"@prisma/client": "4.0.0",
|
||||
"blitz": "alpha",
|
||||
"next": "12.2.0",
|
||||
"prisma": "4.0.0",
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
"@blitzjs/auth": "alpha",
|
||||
"@blitzjs/next": "alpha",
|
||||
"@blitzjs/rpc": "alpha",
|
||||
"@prisma/client": "3.9.0",
|
||||
"@prisma/client": "4.0.0",
|
||||
"blitz": "alpha",
|
||||
"next": "12.2.0",
|
||||
"prisma": "4.0.0",
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
save-exact=true
|
||||
legacy-peer-deps=true
|
||||
strict-peer-dependencies=false
|
||||
strict-peer-dependencies=false
|
||||
side-effects-cache=false
|
||||
|
||||
public-hoist-pattern[]=react-query
|
||||
public-hoist-pattern[]=next
|
||||
public-hoist-pattern[]=secure-password
|
||||
public-hoist-pattern[]=*jest*
|
||||
public-hoist-pattern[]=@testing-library/*
|
||||
# Needed for Blitz to work properly. Don't remove the lines above.
|
||||
# Needed for Blitz to work properly. Don't remove the lines above.
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
"@typescript-eslint/parser": "5.9.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@blitzjs/config": "2.0.0-alpha.54",
|
||||
"@blitzjs/config": "2.0.0-alpha.62",
|
||||
"@types/react": "18.0.1",
|
||||
"@types/react-dom": "17.0.14",
|
||||
"react": "18.0.0",
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
diff --git a/dist/build/webpack-config.js b/dist/build/webpack-config.js
|
||||
index f9cab03b74411376898fbf5bd14c187236d9ad1b..f91706ec39cc53d642e477ecc10978b17d2b8bb4 100755
|
||||
--- a/dist/build/webpack-config.js
|
||||
+++ b/dist/build/webpack-config.js
|
||||
@@ -910,6 +910,7 @@ async function getBaseWebpackConfig(dir, { buildId , config , compilerType , dev
|
||||
"process.env.__NEXT_I18N_SUPPORT": JSON.stringify(!!config.i18n),
|
||||
"process.env.__NEXT_I18N_DOMAINS": JSON.stringify((ref9 = config.i18n) == null ? void 0 : ref9.domains),
|
||||
"process.env.__NEXT_ANALYTICS_ID": JSON.stringify(config.analyticsId),
|
||||
+ 'process.env.__NEXT_REACT_ONRECOVERABLE_ERROR': config.reactOnRecoverableError,
|
||||
...isNodeServer || isEdgeServer ? {
|
||||
// Fix bad-actors in the npm ecosystem (e.g. `node-formidable`)
|
||||
// This is typically found in unmaintained modules from the
|
||||
diff --git a/dist/client/index.js b/dist/client/index.js
|
||||
index 74242a1991af91cc44c2d4af3516f9225043f987..ed2f298d65a636fa79b3d580ad6e3aa0792efcfd 100755
|
||||
--- a/dist/client/index.js
|
||||
+++ b/dist/client/index.js
|
||||
@@ -475,7 +475,11 @@ function renderReactElement(domEl, fn) {
|
||||
if (process.env.__NEXT_REACT_ROOT) {
|
||||
if (!reactRoot) {
|
||||
// Unlike with createRoot, you don't need a separate root.render() call here
|
||||
- reactRoot = ReactDOM.hydrateRoot(domEl, reactEl);
|
||||
+ reactRoot = ReactDOM.hydrateRoot(domEl, reactEl, Boolean(process.env.__NEXT_REACT_ONRECOVERABLE_ERROR)
|
||||
+ ? {
|
||||
+ onRecoverableError: process.env.__NEXT_REACT_ONRECOVERABLE_ERROR,
|
||||
+ }
|
||||
+ : undefined);
|
||||
// TODO: Remove shouldHydrate variable when React 18 is stable as it can depend on `reactRoot` existing
|
||||
shouldHydrate = false;
|
||||
} else {
|
||||
186
pnpm-lock.yaml
generated
186
pnpm-lock.yaml
generated
@@ -41,7 +41,7 @@ importers:
|
||||
"@blitzjs/rpc": workspace:*
|
||||
"@hookform/resolvers": 2.8.8
|
||||
"@next/bundle-analyzer": 12.0.8
|
||||
"@prisma/client": 3.9.0
|
||||
"@prisma/client": 4.0.0
|
||||
"@testing-library/react": 13.0.0
|
||||
"@testing-library/react-hooks": 7.0.2
|
||||
"@types/jest": 27.4.1
|
||||
@@ -49,7 +49,7 @@ importers:
|
||||
"@types/preview-email": 2.0.1
|
||||
"@types/react": 18.0.1
|
||||
"@typescript-eslint/eslint-plugin": 5.9.1
|
||||
blitz: workspace:2.0.0-alpha.53
|
||||
blitz: workspace:2.0.0-alpha.61
|
||||
eslint: 7.32.0
|
||||
eslint-config-next: 12.2.0
|
||||
eslint-config-prettier: 8.5.0
|
||||
@@ -74,7 +74,7 @@ importers:
|
||||
"@blitzjs/next": link:../../packages/blitz-next
|
||||
"@blitzjs/rpc": link:../../packages/blitz-rpc
|
||||
"@hookform/resolvers": 2.8.8_react-hook-form@7.29.0
|
||||
"@prisma/client": 3.9.0_prisma@4.0.0
|
||||
"@prisma/client": 4.0.0_prisma@4.0.0
|
||||
blitz: link:../../packages/blitz
|
||||
next: 12.2.0_zpnidt7m3osuk7shl3s4oenomq
|
||||
prisma: 4.0.0
|
||||
@@ -111,7 +111,7 @@ importers:
|
||||
"@blitzjs/next": workspace:*
|
||||
"@blitzjs/rpc": workspace:*
|
||||
"@next/bundle-analyzer": 12.0.8
|
||||
"@prisma/client": 3.9.0
|
||||
"@prisma/client": 4.0.0
|
||||
"@types/jest": 27.4.1
|
||||
"@types/passport-twitter": 1.0.37
|
||||
"@types/react": 18.0.1
|
||||
@@ -131,7 +131,7 @@ importers:
|
||||
"@blitzjs/config": link:../../packages/config
|
||||
"@blitzjs/next": link:../../packages/blitz-next
|
||||
"@blitzjs/rpc": link:../../packages/blitz-rpc
|
||||
"@prisma/client": 3.9.0_prisma@4.0.0
|
||||
"@prisma/client": 4.0.0_prisma@4.0.0
|
||||
"@types/jest": 27.4.1
|
||||
"@types/passport-twitter": 1.0.37
|
||||
blitz: link:../../packages/blitz
|
||||
@@ -155,7 +155,7 @@ importers:
|
||||
"@blitzjs/config": workspace:*
|
||||
"@blitzjs/next": workspace:*
|
||||
"@next/bundle-analyzer": 12.0.8
|
||||
"@prisma/client": 3.9.0
|
||||
"@prisma/client": 4.0.0
|
||||
"@types/express": 4.17.13
|
||||
"@types/fs-extra": 9.0.13
|
||||
"@types/node-fetch": 2.6.1
|
||||
@@ -176,7 +176,7 @@ importers:
|
||||
"@blitzjs/auth": link:../../packages/blitz-auth
|
||||
"@blitzjs/config": link:../../packages/config
|
||||
"@blitzjs/next": link:../../packages/blitz-next
|
||||
"@prisma/client": 3.9.0_prisma@4.0.0
|
||||
"@prisma/client": 4.0.0_prisma@4.0.0
|
||||
blitz: link:../../packages/blitz
|
||||
lowdb: 3.0.0
|
||||
next: 12.2.0_zpnidt7m3osuk7shl3s4oenomq
|
||||
@@ -242,7 +242,7 @@ importers:
|
||||
"@blitzjs/next": workspace:*
|
||||
"@blitzjs/rpc": workspace:*
|
||||
"@next/bundle-analyzer": 12.0.8
|
||||
"@prisma/client": 3.9.0
|
||||
"@prisma/client": 4.0.0
|
||||
"@types/express": 4.17.13
|
||||
"@types/fs-extra": 9.0.13
|
||||
"@types/node-fetch": 2.6.1
|
||||
@@ -263,7 +263,7 @@ importers:
|
||||
"@blitzjs/auth": link:../../packages/blitz-auth
|
||||
"@blitzjs/next": link:../../packages/blitz-next
|
||||
"@blitzjs/rpc": link:../../packages/blitz-rpc
|
||||
"@prisma/client": 3.9.0_prisma@4.0.0
|
||||
"@prisma/client": 4.0.0_prisma@4.0.0
|
||||
blitz: link:../../packages/blitz
|
||||
lowdb: 3.0.0
|
||||
next: 12.2.0_zpnidt7m3osuk7shl3s4oenomq
|
||||
@@ -290,7 +290,7 @@ importers:
|
||||
"@blitzjs/config": workspace:*
|
||||
"@blitzjs/next": workspace:*
|
||||
"@blitzjs/rpc": workspace:*
|
||||
"@prisma/client": 3.9.0
|
||||
"@prisma/client": 4.0.0
|
||||
"@testing-library/react": 13.0.0
|
||||
"@types/react": 18.0.1
|
||||
"@vitejs/plugin-react": 1.3.0
|
||||
@@ -311,7 +311,7 @@ importers:
|
||||
"@blitzjs/config": link:../../packages/config
|
||||
"@blitzjs/next": link:../../packages/blitz-next
|
||||
"@blitzjs/rpc": link:../../packages/blitz-rpc
|
||||
"@prisma/client": 3.9.0_prisma@4.0.0
|
||||
"@prisma/client": 4.0.0_prisma@4.0.0
|
||||
blitz: link:../../packages/blitz
|
||||
next: 12.2.0_zpnidt7m3osuk7shl3s4oenomq
|
||||
prisma: 4.0.0
|
||||
@@ -324,7 +324,7 @@ importers:
|
||||
"@vitejs/plugin-react": 1.3.0
|
||||
delay: 5.0.0
|
||||
eslint: 7.32.0
|
||||
eslint-config-next: 12.2.0_hrkuebk64jiu2ut2d2sm4oylnu
|
||||
eslint-config-next: 12.2.3_hrkuebk64jiu2ut2d2sm4oylnu
|
||||
eslint-plugin-testing-library: 5.0.1_hrkuebk64jiu2ut2d2sm4oylnu
|
||||
jsdom: 19.0.0
|
||||
typescript: 4.6.3
|
||||
@@ -373,7 +373,7 @@ importers:
|
||||
"@blitzjs/next": workspace:*
|
||||
"@blitzjs/rpc": workspace:*
|
||||
"@next/bundle-analyzer": 12.0.8
|
||||
"@prisma/client": 3.9.0
|
||||
"@prisma/client": 4.0.0
|
||||
"@types/express": 4.17.13
|
||||
"@types/fs-extra": 9.0.13
|
||||
"@types/node-fetch": 2.6.1
|
||||
@@ -394,7 +394,7 @@ importers:
|
||||
"@blitzjs/auth": link:../../packages/blitz-auth
|
||||
"@blitzjs/next": link:../../packages/blitz-next
|
||||
"@blitzjs/rpc": link:../../packages/blitz-rpc
|
||||
"@prisma/client": 3.9.0_prisma@4.0.0
|
||||
"@prisma/client": 4.0.0_prisma@4.0.0
|
||||
blitz: link:../../packages/blitz
|
||||
lowdb: 3.0.0
|
||||
next: 12.2.0_zpnidt7m3osuk7shl3s4oenomq
|
||||
@@ -475,8 +475,8 @@ importers:
|
||||
|
||||
packages/blitz:
|
||||
specifiers:
|
||||
"@blitzjs/config": workspace:2.0.0-alpha.53
|
||||
"@blitzjs/generator": 2.0.0-alpha.53
|
||||
"@blitzjs/config": workspace:2.0.0-alpha.61
|
||||
"@blitzjs/generator": 2.0.0-alpha.61
|
||||
"@types/cookie": 0.4.1
|
||||
"@types/cross-spawn": 6.0.2
|
||||
"@types/debug": 4.1.7
|
||||
@@ -493,6 +493,7 @@ importers:
|
||||
"@types/test-listen": 1.1.0
|
||||
"@types/watchpack": 1.1.1
|
||||
arg: 5.0.1
|
||||
boxen: 7.0.0
|
||||
chalk: ^4.1.0
|
||||
console-table-printer: 2.10.0
|
||||
cross-spawn: 7.0.3
|
||||
@@ -529,6 +530,7 @@ importers:
|
||||
dependencies:
|
||||
"@blitzjs/generator": link:../generator
|
||||
arg: 5.0.1
|
||||
boxen: 7.0.0
|
||||
chalk: 4.1.2
|
||||
console-table-printer: 2.10.0
|
||||
cross-spawn: 7.0.3
|
||||
@@ -541,6 +543,7 @@ importers:
|
||||
find-up: 4.1.0
|
||||
fs-extra: 10.0.1
|
||||
hasbin: 1.2.3
|
||||
node-fetch: 3.2.3
|
||||
npm-which: 3.0.1
|
||||
ora: 5.3.0
|
||||
os-name: 5.0.1
|
||||
@@ -572,7 +575,6 @@ importers:
|
||||
"@types/test-listen": 1.1.0
|
||||
"@types/watchpack": 1.1.1
|
||||
express: 4.17.3
|
||||
node-fetch: 3.2.3
|
||||
react: 18.0.0
|
||||
test-listen: 1.1.0
|
||||
typescript: 4.6.3
|
||||
@@ -582,7 +584,7 @@ importers:
|
||||
|
||||
packages/blitz-auth:
|
||||
specifiers:
|
||||
"@blitzjs/config": workspace:2.0.0-alpha.53
|
||||
"@blitzjs/config": workspace:2.0.0-alpha.61
|
||||
"@testing-library/react": 13.0.0
|
||||
"@testing-library/react-hooks": 7.0.2
|
||||
"@types/b64-lite": 1.3.0
|
||||
@@ -596,7 +598,7 @@ importers:
|
||||
"@types/secure-password": 3.1.1
|
||||
b64-lite: 1.4.0
|
||||
bad-behavior: 1.0.1
|
||||
blitz: 2.0.0-alpha.53
|
||||
blitz: 2.0.0-alpha.61
|
||||
cookie: 0.4.1
|
||||
cookie-session: 2.0.0
|
||||
debug: 4.3.3
|
||||
@@ -647,8 +649,8 @@ importers:
|
||||
|
||||
packages/blitz-next:
|
||||
specifiers:
|
||||
"@blitzjs/config": workspace:2.0.0-alpha.53
|
||||
"@blitzjs/rpc": 2.0.0-alpha.53
|
||||
"@blitzjs/config": workspace:2.0.0-alpha.61
|
||||
"@blitzjs/rpc": 2.0.0-alpha.61
|
||||
"@testing-library/dom": 8.13.0
|
||||
"@testing-library/jest-dom": 5.16.3
|
||||
"@testing-library/react": 13.0.0
|
||||
@@ -659,7 +661,7 @@ importers:
|
||||
"@types/react": 18.0.1
|
||||
"@types/react-dom": 17.0.14
|
||||
"@types/testing-library__react-hooks": 4.0.0
|
||||
blitz: 2.0.0-alpha.53
|
||||
blitz: 2.0.0-alpha.61
|
||||
cross-spawn: 7.0.3
|
||||
debug: 4.3.3
|
||||
find-up: 4.1.0
|
||||
@@ -708,14 +710,14 @@ importers:
|
||||
|
||||
packages/blitz-rpc:
|
||||
specifiers:
|
||||
"@blitzjs/auth": 2.0.0-alpha.53
|
||||
"@blitzjs/config": workspace:2.0.0-alpha.53
|
||||
"@blitzjs/auth": 2.0.0-alpha.61
|
||||
"@blitzjs/config": workspace:2.0.0-alpha.61
|
||||
"@types/debug": 4.1.7
|
||||
"@types/react": 18.0.1
|
||||
"@types/react-dom": 17.0.14
|
||||
b64-lite: 1.4.0
|
||||
bad-behavior: 1.0.1
|
||||
blitz: 2.0.0-alpha.53
|
||||
blitz: 2.0.0-alpha.61
|
||||
chalk: ^4.1.0
|
||||
debug: 4.3.3
|
||||
next: 12.2.0
|
||||
@@ -757,12 +759,12 @@ importers:
|
||||
"@babel/plugin-syntax-typescript": 7.17.12
|
||||
"@babel/preset-env": 7.12.10
|
||||
"@blitzjs/config": workspace:*
|
||||
"@blitzjs/generator": 2.0.0-alpha.53
|
||||
"@blitzjs/generator": 2.0.0-alpha.61
|
||||
"@types/jscodeshift": 0.11.2
|
||||
"@types/node": 17.0.16
|
||||
arg: 5.0.1
|
||||
ast-types: 0.14.2
|
||||
blitz: 2.0.0-alpha.53
|
||||
blitz: 2.0.0-alpha.61
|
||||
chalk: ^4.1.0
|
||||
cross-spawn: 7.0.3
|
||||
debug: 4.3.3
|
||||
@@ -817,7 +819,7 @@ importers:
|
||||
"@babel/plugin-transform-typescript": 7.12.1
|
||||
"@babel/preset-env": 7.12.10
|
||||
"@babel/types": 7.12.10
|
||||
"@blitzjs/config": 2.0.0-alpha.53
|
||||
"@blitzjs/config": 2.0.0-alpha.61
|
||||
"@juanm04/cpx": 2.0.1
|
||||
"@mrleebo/prisma-ast": 0.2.6
|
||||
"@types/babel__core": 7.1.19
|
||||
@@ -908,7 +910,7 @@ importers:
|
||||
|
||||
packages/pkg-template:
|
||||
specifiers:
|
||||
"@blitzjs/config": 2.0.0-alpha.53
|
||||
"@blitzjs/config": 2.0.0-alpha.61
|
||||
"@types/react": 18.0.1
|
||||
"@types/react-dom": 17.0.14
|
||||
"@typescript-eslint/eslint-plugin": 5.9.1
|
||||
@@ -3449,6 +3451,15 @@ packages:
|
||||
dependencies:
|
||||
glob: 7.1.7
|
||||
|
||||
/@next/eslint-plugin-next/12.2.3:
|
||||
resolution:
|
||||
{
|
||||
integrity: sha512-B2e8Yg1MpuLsGxhCx4rU8/Tcnr5wFmCx1O2eyLXBPnaCcsFXfGCo067ujagtDLtWASL3GNgzg78U1SB0dbc38A==,
|
||||
}
|
||||
dependencies:
|
||||
glob: 7.1.7
|
||||
dev: true
|
||||
|
||||
/@next/swc-android-arm-eabi/12.2.0:
|
||||
resolution:
|
||||
{
|
||||
@@ -3634,12 +3645,12 @@ packages:
|
||||
}
|
||||
dev: true
|
||||
|
||||
/@prisma/client/3.9.0_prisma@4.0.0:
|
||||
/@prisma/client/4.0.0_prisma@4.0.0:
|
||||
resolution:
|
||||
{
|
||||
integrity: sha512-PByWVI7l+KYUQL/pqR81363qhUh3LhYMIYn2czz5slbt3JC6aAk+Wm7PE9nalqSE6s4xSIYdHj6N0yTNqr86sA==,
|
||||
integrity: sha512-g1h2OGoRo7anBVQ9Cw3gsbjwPtvf7i0pkGxKeZICtwkvE5CZXW+xZF4FZdmrViYkKaAShbISL0teNpu9ecpf4g==,
|
||||
}
|
||||
engines: {node: ">=12.6"}
|
||||
engines: {node: ">=14.17"}
|
||||
requiresBuild: true
|
||||
peerDependencies:
|
||||
prisma: "*"
|
||||
@@ -3647,14 +3658,14 @@ packages:
|
||||
prisma:
|
||||
optional: true
|
||||
dependencies:
|
||||
"@prisma/engines-version": 3.9.0-58.bcc2ff906db47790ee902e7bbc76d7ffb1893009
|
||||
"@prisma/engines-version": 3.16.0-49.da41d2bb3406da22087b849f0e911199ba4fbf11
|
||||
prisma: 4.0.0
|
||||
dev: false
|
||||
|
||||
/@prisma/engines-version/3.9.0-58.bcc2ff906db47790ee902e7bbc76d7ffb1893009:
|
||||
/@prisma/engines-version/3.16.0-49.da41d2bb3406da22087b849f0e911199ba4fbf11:
|
||||
resolution:
|
||||
{
|
||||
integrity: sha512-5Dh+qTDhpPR66w6NNAnPs+/W/Qt4r1DSd+qhfPFcDThUK4uxoZKGlPb2IYQn5LL+18aIGnmteDf7BnVMmvBNSQ==,
|
||||
integrity: sha512-PiZhdD624SrYEjyLboI0X7OugNbxUzDJx9v/6ldTKuqNDVUCmRH/Z00XwDi/dgM4FlqOSO+YiUsSiSKjxxG8cw==,
|
||||
}
|
||||
dev: false
|
||||
|
||||
@@ -4833,7 +4844,6 @@ packages:
|
||||
typescript: 4.6.3
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
dev: false
|
||||
|
||||
/@typescript-eslint/experimental-utils/5.28.0_hrkuebk64jiu2ut2d2sm4oylnu:
|
||||
resolution:
|
||||
@@ -5888,6 +5898,23 @@ packages:
|
||||
widest-line: 3.1.0
|
||||
dev: false
|
||||
|
||||
/boxen/7.0.0:
|
||||
resolution:
|
||||
{
|
||||
integrity: sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==,
|
||||
}
|
||||
engines: {node: ">=14.16"}
|
||||
dependencies:
|
||||
ansi-align: 3.0.1
|
||||
camelcase: 7.0.0
|
||||
chalk: 5.0.1
|
||||
cli-boxes: 3.0.0
|
||||
string-width: 5.1.2
|
||||
type-fest: 2.16.0
|
||||
widest-line: 4.0.1
|
||||
wrap-ansi: 8.0.1
|
||||
dev: false
|
||||
|
||||
/brace-expansion/1.1.11:
|
||||
resolution:
|
||||
{
|
||||
@@ -6155,6 +6182,14 @@ packages:
|
||||
}
|
||||
engines: {node: ">=10"}
|
||||
|
||||
/camelcase/7.0.0:
|
||||
resolution:
|
||||
{
|
||||
integrity: sha512-JToIvOmz6nhGsUhAYScbo2d6Py5wojjNfoxoc2mEVLUdJ70gJK2gnd+ABY1Tc3sVMyK7QDPtN0T/XdlCQWITyQ==,
|
||||
}
|
||||
engines: {node: ">=14.16"}
|
||||
dev: false
|
||||
|
||||
/caniuse-lite/1.0.30001339:
|
||||
resolution:
|
||||
{
|
||||
@@ -6214,7 +6249,6 @@ packages:
|
||||
integrity: sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==,
|
||||
}
|
||||
engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
|
||||
dev: true
|
||||
|
||||
/char-regex/1.0.2:
|
||||
resolution:
|
||||
@@ -6336,6 +6370,14 @@ packages:
|
||||
engines: {node: ">=6"}
|
||||
dev: false
|
||||
|
||||
/cli-boxes/3.0.0:
|
||||
resolution:
|
||||
{
|
||||
integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==,
|
||||
}
|
||||
engines: {node: ">=10"}
|
||||
dev: false
|
||||
|
||||
/cli-cursor/3.1.0:
|
||||
resolution:
|
||||
{
|
||||
@@ -6849,7 +6891,6 @@ packages:
|
||||
integrity: sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==,
|
||||
}
|
||||
engines: {node: ">= 12"}
|
||||
dev: true
|
||||
|
||||
/data-urls/2.0.0:
|
||||
resolution:
|
||||
@@ -8400,7 +8441,34 @@ packages:
|
||||
transitivePeerDependencies:
|
||||
- eslint-import-resolver-webpack
|
||||
- supports-color
|
||||
dev: false
|
||||
|
||||
/eslint-config-next/12.2.3_hrkuebk64jiu2ut2d2sm4oylnu:
|
||||
resolution:
|
||||
{
|
||||
integrity: sha512-xAQqAqwa2bu9ZMRypz58ym4tNCo22Wc6LuoLpbpf3yW5c4ZkVib9934AgGDDvh2zKrP56Z6X0Pp6gNnuuZzcRw==,
|
||||
}
|
||||
peerDependencies:
|
||||
eslint: ^7.23.0 || ^8.0.0
|
||||
typescript: ">=3.3.1"
|
||||
peerDependenciesMeta:
|
||||
typescript:
|
||||
optional: true
|
||||
dependencies:
|
||||
"@next/eslint-plugin-next": 12.2.3
|
||||
"@rushstack/eslint-patch": 1.1.3
|
||||
"@typescript-eslint/parser": 5.28.0_hrkuebk64jiu2ut2d2sm4oylnu
|
||||
eslint: 7.32.0
|
||||
eslint-import-resolver-node: 0.3.6
|
||||
eslint-import-resolver-typescript: 2.7.1_hpmu7kn6tcn2vnxpfzvv33bxmy
|
||||
eslint-plugin-import: 2.26.0_zhtk6rij7obli3ams3sxis7j7e
|
||||
eslint-plugin-jsx-a11y: 6.5.1_eslint@7.32.0
|
||||
eslint-plugin-react: 7.30.0_eslint@7.32.0
|
||||
eslint-plugin-react-hooks: 4.5.0_eslint@7.32.0
|
||||
typescript: 4.6.3
|
||||
transitivePeerDependencies:
|
||||
- eslint-import-resolver-webpack
|
||||
- supports-color
|
||||
dev: true
|
||||
|
||||
/eslint-config-prettier/8.5.0:
|
||||
resolution:
|
||||
@@ -8410,7 +8478,6 @@ packages:
|
||||
hasBin: true
|
||||
peerDependencies:
|
||||
eslint: ">=7.0.0"
|
||||
dev: false
|
||||
|
||||
/eslint-config-prettier/8.5.0_eslint@7.32.0:
|
||||
resolution:
|
||||
@@ -9197,7 +9264,6 @@ packages:
|
||||
dependencies:
|
||||
node-domexception: 1.0.0
|
||||
web-streams-polyfill: 3.2.1
|
||||
dev: true
|
||||
|
||||
/file-entry-cache/6.0.1:
|
||||
resolution:
|
||||
@@ -9409,7 +9475,6 @@ packages:
|
||||
engines: {node: ">=12.20.0"}
|
||||
dependencies:
|
||||
fetch-blob: 3.1.5
|
||||
dev: true
|
||||
|
||||
/forwarded/0.2.0:
|
||||
resolution:
|
||||
@@ -10919,7 +10984,7 @@ packages:
|
||||
pretty-format: 27.5.1
|
||||
slash: 3.0.0
|
||||
strip-json-comments: 3.1.1
|
||||
ts-node: 10.7.0_fxg3r7oju3tntkxsvleuiot4fa
|
||||
ts-node: 10.7.0_typescript@4.6.3
|
||||
transitivePeerDependencies:
|
||||
- bufferutil
|
||||
- canvas
|
||||
@@ -12853,7 +12918,6 @@ packages:
|
||||
integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==,
|
||||
}
|
||||
engines: {node: ">=10.5.0"}
|
||||
dev: true
|
||||
|
||||
/node-fetch/3.2.3:
|
||||
resolution:
|
||||
@@ -12865,7 +12929,6 @@ packages:
|
||||
data-uri-to-buffer: 4.0.0
|
||||
fetch-blob: 3.1.5
|
||||
formdata-polyfill: 4.0.10
|
||||
dev: true
|
||||
|
||||
/node-gyp-build/4.4.0:
|
||||
resolution:
|
||||
@@ -16075,6 +16138,7 @@ packages:
|
||||
typescript: 4.6.3
|
||||
v8-compile-cache-lib: 3.0.1
|
||||
yn: 3.1.1
|
||||
dev: false
|
||||
|
||||
/ts-node/10.7.0_typescript@4.6.3:
|
||||
resolution:
|
||||
@@ -16107,7 +16171,6 @@ packages:
|
||||
typescript: 4.6.3
|
||||
v8-compile-cache-lib: 3.0.1
|
||||
yn: 3.1.1
|
||||
dev: false
|
||||
|
||||
/tsconfig-paths/3.14.1:
|
||||
resolution:
|
||||
@@ -16406,6 +16469,14 @@ packages:
|
||||
engines: {node: ">=8"}
|
||||
dev: false
|
||||
|
||||
/type-fest/2.16.0:
|
||||
resolution:
|
||||
{
|
||||
integrity: sha512-qpaThT2HQkFb83gMOrdKVsfCN7LKxP26Yq+smPzY1FqoHRjqmjqHXA7n5Gkxi8efirtbeEUxzfEdePthQWCuHw==,
|
||||
}
|
||||
engines: {node: ">=12.20"}
|
||||
dev: false
|
||||
|
||||
/type-is/1.6.18:
|
||||
resolution:
|
||||
{
|
||||
@@ -16919,7 +16990,6 @@ packages:
|
||||
integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==,
|
||||
}
|
||||
engines: {node: ">= 8"}
|
||||
dev: true
|
||||
|
||||
/webidl-conversions/5.0.0:
|
||||
resolution:
|
||||
@@ -17093,6 +17163,16 @@ packages:
|
||||
string-width: 4.2.3
|
||||
dev: false
|
||||
|
||||
/widest-line/4.0.1:
|
||||
resolution:
|
||||
{
|
||||
integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==,
|
||||
}
|
||||
engines: {node: ">=12"}
|
||||
dependencies:
|
||||
string-width: 5.1.2
|
||||
dev: false
|
||||
|
||||
/windows-release/5.0.1:
|
||||
resolution:
|
||||
{
|
||||
@@ -17145,6 +17225,18 @@ packages:
|
||||
string-width: 4.2.3
|
||||
strip-ansi: 6.0.1
|
||||
|
||||
/wrap-ansi/8.0.1:
|
||||
resolution:
|
||||
{
|
||||
integrity: sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g==,
|
||||
}
|
||||
engines: {node: ">=12"}
|
||||
dependencies:
|
||||
ansi-styles: 6.1.0
|
||||
string-width: 5.1.2
|
||||
strip-ansi: 7.0.1
|
||||
dev: false
|
||||
|
||||
/wrappy/1.0.2:
|
||||
resolution:
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user