1
0
mirror of synced 2026-02-04 12:08:33 -05:00

Compare commits

...

66 Commits

Author SHA1 Message Date
github-actions[bot]
0bc107fd7f Version Packages (alpha) (#3684)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2022-08-10 10:36:04 +02:00
Dillon Raphael
cb55ed266d check if DocumentHead is self closing in the codemod step (#3702) 2022-08-09 13:21:26 -04:00
Aleksandra
271c58ac62 Fix Cannot find module 'generate' error (#3700) 2022-08-09 14:32:22 +02:00
Dillon Raphael
06427f67f2 Throw error if cookiePrefix is undefined during codemod (#3696)
* throws error if cookiePrefix is undefined

* create ExpectedError class
2022-08-08 16:35:17 -04:00
Dillon Raphael
f120f6723a Add DocumentProps to codemod import map (#3695)
* add DocumentProps & DocumentContext to import map & clean up post structuring of _document imports from next/document
2022-08-08 16:10:33 -04:00
Blitz.js Bot
bac5e740ba (meta) added @oltdaniel as contributor 2022-08-08 15:35:24 -04:00
Daniel Oltmanns
630c718129 Fixes #3614 - changed console logs to standard logger (#3693)
* Fixes #3614 - changed console logs to standard logger

I tried to keep the logging format close to what has been present before, by also including the chalk package for coloring.

* Create great-candles-stare.md

Co-authored-by: Dillon Raphael <dillon@creatorsneverdie.com>
2022-08-08 15:35:20 -04:00
Aleksandra
078fe47419 Add '@testing-library/jest-dom' to new app dependecies (#3694) 2022-08-08 19:23:33 +02:00
Aleksandra
8dfaad088d Set correct packages versions in package.json with upgrade-legacy codemod (#3678) 2022-08-08 18:54:21 +02:00
Aleksandra
dd299ae89f Add ts-jest dependency to the new app templates (#3688) 2022-08-08 18:10:22 +02:00
Aleksandra
41608c4c34 Run codegen tasks after installing dependecies in the new command (#3692) 2022-08-08 17:57:39 +02:00
Aleksandra
70b334a2f7 Remove trailing comma from tsconfig.json in new app template (#3687) 2022-08-08 12:12:18 +02:00
Dillon Raphael
f0ca738d56 Run the codegen tasks on blitz dev (#3683) 2022-08-05 19:13:45 +02:00
github-actions[bot]
1010858446 Version Packages (alpha) (#3680)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2022-08-05 15:44:22 +02:00
Dillon Raphael
ebd74b4e97 Fix template path for the generator (#3679) 2022-08-05 15:35:31 +02:00
Aleksandra
8870580710 Utilities cleanup (#3677) 2022-08-05 14:42:25 +02:00
github-actions[bot]
414d758fe8 Version Packages (alpha) (#3653)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2022-08-05 00:04:16 +02:00
Blitz.js Bot
fce0f3135a (meta) added @chaiwattsw as contributor 2022-08-04 17:57:34 -04:00
Chaiwat Trisuwan
9620ef6b1e chore: move zod to devDependencies (#3674) 2022-08-04 23:57:29 +02:00
Dillon Raphael
240f3f3471 exports BlitzServerMiddleware util function (#3671) 2022-08-04 18:54:40 +02:00
Dillon Raphael
91aa535632 Include .env.test to generator templates (#3672)
* adds env test file to generator templates
2022-08-04 18:43:13 +02:00
Aleksandra
ccb1af8d08 Avoid Next's invalid config detected warnings by deleting "blitz" key from the config object (#3670) 2022-08-04 13:21:50 +02:00
Dillon Raphael
807a2b5645 removes peer dependencies and adds to build externals (#3667) 2022-08-04 01:51:13 +02:00
Dillon Raphael
a3e6c49c4d Fixes the supports-color warning for pnpm (#3666)
* add supports-color to package.json
2022-08-04 01:13:33 +02:00
Aleksandra
4d7d126d9c Run prisma generate as a blitz codegen step (#3662) 2022-08-03 18:02:03 +02:00
Aleksandra
890b0c0c9d various blitz new fixes and improvements (#3661) 2022-08-03 12:46:00 +02:00
Dillon Raphael
928e840b59 Fixes loading production env variables by default for blitz build command (#3659) 2022-08-03 01:21:58 +02:00
Dillon Raphael
55b1cb2044 runs codegen on build & remove stopWatcher console log (#3658) 2022-08-03 01:07:44 +02:00
Blitz.js Bot
3a6677b307 (meta) updated @dillonraphael contributions 2022-08-02 16:19:49 -04:00
Dillon Raphael
f202aac183 fixes mock in forgotPassword mutation test & uses hardcoded blitz package versions instead of the alpha tag (#3655) 2022-08-02 22:19:43 +02:00
Aleksandra
065db256d7 Update generator templates to use resolver function (#3652) 2022-08-02 14:49:31 +02:00
github-actions[bot]
ada5cac7e3 Version Packages (alpha) (#3650)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Aleksandra <alexsandra.sikora@gmail.com>
2022-08-02 11:02:12 +02:00
Blitz.js Bot
e286bcb3ff (meta) added @datner as contributor 2022-08-02 04:57:42 -04:00
Datner
dd5f51744f Move enchancePrisma to a browser entrypoint (#3609)
Co-authored-by: Aleksandra <alexsandra.sikora@gmail.com>
2022-08-02 10:57:37 +02:00
github-actions[bot]
99b054a44a Version Packages (alpha) (#3645)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2022-08-01 13:11:24 +02:00
Aleksandra
54db8a46dd Comment out version check until it's fixed & fix missing value in pkg manager options (#3647) 2022-08-01 13:01:56 +02:00
Blitz.js Bot
6125eb7837 (meta) added @tommywong-dev as contributor 2022-08-01 05:08:00 -04:00
Dillon Raphael
62bf12b5c6 Update how cli checks if isInternalBlitzMonorepoDevelopment for codegen (#3644)
Co-authored-by: Aleksandra <alexsandra.sikora@gmail.com>
2022-08-01 11:03:19 +02:00
github-actions[bot]
8e4580a446 Version Packages (alpha) (#3642)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2022-07-30 21:03:36 +02:00
Fran Zekan
f52ca398ee Upgrade React-Query to V4 (#3557) 2022-07-30 20:59:38 +02:00
github-actions[bot]
922bc276d9 Version Packages (alpha) (#3638)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2022-07-29 19:58:38 +02:00
Dillon Raphael
365e67094c Fixes db seed command (#3639)
* require db.default in db runSeed cli command
2022-07-29 19:51:23 +02:00
Dillon Raphael
31d7a6f413 Adds rootDir prefix to tsconfig alias module name mapper (#3634)
Co-authored-by: beerose <alexsandra.sikora@gmail.com>
2022-07-29 11:36:43 +02:00
github-actions[bot]
8726b16bb9 Version Packages (alpha) (#3632) 2022-07-28 20:06:17 +02:00
Dillon Raphael
240f378b54 passes the correct arguments to runCommandFromBin in blitz cli index (#3631) 2022-07-28 19:57:08 +02:00
github-actions[bot]
d6655f0178 Version Packages (alpha) (#3630)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Dillon Raphael <dillon@creatorsneverdie.com>
2022-07-28 16:23:15 +02:00
Blitz.js Bot
001c174cbf (meta) updated @dillonraphael contributions 2022-07-28 10:18:55 -04:00
Dillon Raphael
1d863f352a Fix APP_ENV not being set before running loadEnvConfig (#3629)
* rearanges the order of setting --env before loading envConfig
2022-07-28 16:16:19 +02:00
Blitz.js Bot
a36110171a (meta) added @sherryxiao1988 as contributor 2022-07-27 13:29:50 -04:00
github-actions[bot]
37b5e35e22 Version Packages (alpha) (#3622)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2022-07-27 18:51:31 +02:00
beerose
3b213a35b0 Add missing changesets 2022-07-27 18:46:06 +02:00
Marcus Reinhardt
809f6019be Remove debug print (#3616)
Co-authored-by: Aleksandra <alexsandra.sikora@gmail.com>
2022-07-27 18:44:51 +02:00
Aleksandra
a51b1e85e1 Export router-context from blitz-next (#3621) 2022-07-27 18:23:28 +02:00
Blitz.js Bot
a948dbb7b8 (meta) added @ryanwashburne as contributor 2022-07-27 11:08:20 -04:00
github-actions[bot]
4b91c429ca Version Packages (alpha) (#3588)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2022-07-26 17:09:46 +02:00
Aleksandra
6ab9db7802 Infer result type in the api handler (#3610) 2022-07-26 17:04:39 +02:00
Blitz.js Bot
d3e6b02ad4 (meta) updated @iojcde contributions 2022-07-26 05:21:37 -04:00
Jeeho Ahn
813365da61 (meta) add @iojcde as contributor (#3606) 2022-07-26 11:21:32 +02:00
Blitz.js Bot
6559c25f71 (meta) added @saadaltabari as contributor 2022-07-25 09:08:44 -04:00
saadaltabari
83b355900b Truncate error messages in passportAuth redirectUri (#3596)
Co-authored-by: Fran Zekan <zekan.fran369@gmail.com>
Co-authored-by: Aleksandra <alexsandra.sikora@gmail.com>
2022-07-25 15:08:40 +02:00
Fran Zekan
c721c104db Hook up react-query fetch cancellation (#3590)
Co-authored-by: beerose <alexsandra.sikora@gmail.com>
2022-07-25 14:57:42 +02:00
Fran Zekan
7e538ba451 Import ErrorComponent as DefaultErrorComponent (#3589)
Co-authored-by: Aleksandra <alexsandra.sikora@gmail.com>
2022-07-25 11:33:38 +02:00
Dillon Raphael
8e00605a86 Codemod: update the error messages based on if it's a babel parse error or an unexpected error (#3593) 2022-07-25 11:15:28 +02:00
Dillon Raphael
dcdcd04055 Various codemod fixes (#3576)
Co-authored-by: Aleksandra <alexsandra.sikora@gmail.com>
2022-07-22 20:55:33 +02:00
Fran Zekan
e339e2fd0a Hoist up react-query (#3585)
Co-authored-by: Aleksandra <alexsandra.sikora@gmail.com>
2022-07-22 20:35:37 +02:00
Brandon Bayer
37e1ec4abc Update README.md messaging (#3577)
* Update README.md

* Update pnpm lock

Co-authored-by: Aleksandra <alexsandra.sikora@gmail.com>
2022-07-22 20:23:02 +02:00
139 changed files with 3673 additions and 1236 deletions

View File

@@ -970,7 +970,9 @@
"avatar_url": "https://avatars0.githubusercontent.com/u/3496193?v=4",
"profile": "https://twitter.com/dillonraphael",
"contributions": [
"code"
"code",
"doc",
"test"
]
},
{
@@ -3590,6 +3592,84 @@
"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"
]
},
{
"login": "tommywong-dev",
"name": "tommywong-dev",
"avatar_url": "https://avatars.githubusercontent.com/u/79971095?v=4",
"profile": "https://github.com/tommywong-dev",
"contributions": [
"doc"
]
},
{
"login": "datner",
"name": "Datner",
"avatar_url": "https://avatars.githubusercontent.com/u/22598347?v=4",
"profile": "https://github.com/datner",
"contributions": [
"doc",
"code"
]
},
{
"login": "chaiwattsw",
"name": "Chaiwat Trisuwan",
"avatar_url": "https://avatars.githubusercontent.com/u/30198386?v=4",
"profile": "https://chaiwattsw.com/",
"contributions": [
"doc",
"code"
]
},
{
"login": "oltdaniel",
"name": "Daniel Oltmanns",
"avatar_url": "https://avatars.githubusercontent.com/u/53529846?v=4",
"profile": "oltdaniel.eu",
"contributions": [
"doc",
"code"
]
}
],
"contributorsPerLine": 7,

View File

@@ -0,0 +1,5 @@
---
"@blitzjs/codemod": patch
---
Throw error if cookiePrefix is undefined when running codemod

View 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

View File

@@ -0,0 +1,5 @@
---
"blitz": patch
---
Fixes the db seed command so that the database can disconnect after running the seed file.

View 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.

View File

@@ -0,0 +1,5 @@
---
"@blitzjs/generator": patch
---
Include `.env.test` file to the generator templates

View 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

View File

@@ -0,0 +1,5 @@
---
"@blitzjs/codemod": patch
---
Add DocumentProps & DocumentContext to the codemod import map

View File

@@ -0,0 +1,5 @@
---
"blitz": patch
---
Comment out generate command import until we add the full support back

View File

@@ -0,0 +1,5 @@
---
"blitz": patch
---
Fixes loading production env variables by default for blitz build command

View File

@@ -0,0 +1,5 @@
---
"@blitzjs/next": patch
---
Export router-context from browser entrypoint

View File

@@ -0,0 +1,5 @@
---
"blitz": patch
---
Fix APP_ENV not being set before loading env config

View File

@@ -0,0 +1,5 @@
---
"@blitzjs/next": patch
---
Avoid `invalid config detected` warnings by deleting `"blitz"` key from next config object

View File

@@ -0,0 +1,6 @@
---
"@blitzjs/rpc": patch
"blitz": patch
---
Use internal branded blitz logger for @blitzjs/rpc

View File

@@ -0,0 +1,5 @@
---
"blitz": patch
---
Add BlitzServerMiddleware utility function to wrap middleware in blitz server file

View File

@@ -0,0 +1,5 @@
---
"blitz": patch
---
Runs the codegen on the blitz build command

View File

@@ -0,0 +1,5 @@
---
"blitz": patch
---
Add missing value to "skip" option when choosing a package manager during new app scaffolding

View File

@@ -0,0 +1,5 @@
---
"blitz": patch
---
Fix blitz codegen to work with monorepos

View File

@@ -0,0 +1,5 @@
---
"blitz": patch
---
Run codegen tasks on blitz dev command

View File

@@ -0,0 +1,5 @@
---
"blitz": patch
---
Run `prisma generate` as a `blitz codegen` step if "prisma" is found in project's dependencies

View File

@@ -0,0 +1,5 @@
---
"@blitzjs/generator": patch
---
Add hoist pattern entry for react-query in new app templates

View File

@@ -0,0 +1,6 @@
---
"blitz": patch
"@blitzjs/generator": patch
---
Improve `blitz new` messaging and fix minor issues

View File

@@ -0,0 +1,5 @@
---
"blitz": patch
---
Passes the correct arguments (without flags) to any bin command ran with the blitz cli

View File

@@ -22,40 +22,60 @@
},
"changesets": [
"big-phones-bow",
"blue-pigs-tan",
"breezy-cameras-double",
"breezy-moose-behave",
"bright-mangos-run",
"calm-carpets-deny",
"calm-nails-wait",
"calm-tomatoes-drive",
"clean-walls-wink",
"clever-radios-lie",
"cool-doors-invent",
"cool-horses-check",
"curly-rules-speak",
"curly-seas-serve",
"dirty-monkeys-greet",
"dirty-planets-chew",
"eleven-humans-sort",
"empty-berries-rule",
"empty-turkeys-wave",
"fair-carrots-guess",
"fair-wombats-sneeze",
"famous-kings-explain",
"fast-trainers-kneel",
"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",
"gorgeous-games-obey",
"great-candles-stare",
"great-months-train",
"great-terms-rescue",
"green-papayas-do",
"green-pillows-hammer",
"happy-hotels-visit",
"healthy-rice-shout",
"heavy-apes-judge",
"hot-cups-rhyme",
"hot-drinks-approve",
"hungry-baboons-swim",
"kind-walls-suffer",
"late-steaks-give",
"lemon-games-press",
"lemon-seas-push",
"light-donkeys-double",
"lovely-colts-share",
"lucky-cows-try",
"mean-gorillas-reply",
"modern-cameras-pull",
"modern-ligers-behave",
"moody-bags-walk",
"moody-squids-cheer",
"nervous-beds-travel",
@@ -67,55 +87,76 @@
"nine-onions-admire",
"ninety-lies-press",
"ninety-pets-heal",
"ninety-rice-tickle",
"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",
"red-badgers-retire",
"rich-chairs-invent",
"rich-queens-travel",
"rotten-rocks-remember",
"shaggy-carpets-brake",
"sharp-falcons-begin",
"shy-olives-hang",
"shy-pumpkins-try",
"silent-colts-reply",
"silly-apricots-share",
"six-apricots-kick",
"slimy-humans-impress",
"slimy-needles-taste",
"slow-walls-poke",
"small-socks-confess",
"smooth-planets-admire",
"smooth-stingrays-drum",
"smooth-tools-train",
"soft-adults-smell",
"sour-lemons-hunt",
"spicy-beds-float",
"stale-jobs-drum",
"strong-apes-reply",
"stupid-walls-sell",
"sweet-kiwis-cross",
"swift-drinks-dress",
"tall-meals-learn",
"tame-keys-reply",
"tasty-maps-fetch",
"tasty-news-collect",
"ten-hairs-listen",
"ten-rivers-burn",
"tender-pianos-check",
"thick-parrots-float",
"thirty-countries-build",
"three-lies-pull",
"tidy-clouds-smoke",
"tough-toes-pull",
"twelve-hornets-sip",
"twelve-lemons-smile",
"twenty-beans-pump",
"two-carpets-rhyme",
"two-eyes-knock",
"two-kiwis-help",
"two-tigers-type",
"unlucky-avocados-fix",
"unlucky-papayas-sleep",
"violet-bags-leave",
"violet-lions-help",
"weak-suns-shave",
"wicked-ghosts-cough",
"wise-frogs-give"
"wicked-rings-walk",
"wise-frogs-give",
"wise-rabbits-complain"
]
}

View File

@@ -0,0 +1,5 @@
---
"@blitzjs/codemod": patch
---
Import ErrorComponent as DefaultErrorComponent

View File

@@ -0,0 +1,8 @@
---
"blitz": patch
"@blitzjs/next": patch
"@blitzjs/rpc": patch
"@blitzjs/generator": patch
---
Fixes peer dependency warnings

View File

@@ -0,0 +1,5 @@
---
"blitz": patch
---
Run codegen tasks after creating a new app if user chose yarn as a package manager

View File

@@ -0,0 +1,5 @@
---
"@blitzjs/generator": patch
---
Fix template path for the generator

View File

@@ -0,0 +1,6 @@
---
"@blitzjs/next": patch
"@blitzjs/rpc": patch
---
Upgrade react-query to v4

View File

@@ -0,0 +1,5 @@
---
"@blitzjs/next": patch
---
Infer result type in the `api` handler and allow customizing it

View File

@@ -0,0 +1,5 @@
---
"@blitzjs/generator": patch
---
Remove trailing comma from tsconfig.json file in the new app template"

View 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

View File

@@ -0,0 +1,5 @@
---
"@blitzjs/generator": patch
---
Add ts-jest to dependencies in new app templates

View File

@@ -0,0 +1,8 @@
---
"@blitzjs/auth": patch
"@blitzjs/next": patch
"@blitzjs/rpc": patch
"blitz": patch
"@blitzjs/generator": patch
---
Fixes the supports-color warning for pnpm

View File

@@ -0,0 +1,5 @@
---
"@blitzjs/codemod": patch
---
Set correct packages versions in package.json with upgrade-legacy codemod

View File

@@ -0,0 +1,5 @@
---
"blitz": patch
---
Fix `enhancePrisma is undefined` errors by moving the utility function to a browser entrypoint

View File

@@ -0,0 +1,5 @@
---
"@blitzjs/rpc": patch
---
moves zod to devDependencies

View File

@@ -0,0 +1,5 @@
---
"@blitzjs/rpc": patch
---
Remove debug console.log

View File

@@ -0,0 +1,5 @@
---
"@blitzjs/codemod": patch
---
Fix codemod to accept a self closing `DocumentHead` in the `_document` page

View File

@@ -0,0 +1,5 @@
---
"@blitzjs/generator": patch
---
Update new app templates to use blitz-rpc's resolver function

View File

@@ -0,0 +1,5 @@
---
"@blitzjs/generator": patch
---
Add `@testing-library/jest-dom` to new app dependecies

View File

@@ -0,0 +1,5 @@
---
"@blitzjs/next": patch
---
Set prefix in moduleNameWrapper's options in Blitz's jest configuration

View File

@@ -0,0 +1,5 @@
---
"@blitzjs/generator": patch
---
Mocks @blitzjs/auth instead of blitz inside the forgotPassword mutation test & hardcodes blitz package version types instead of just using the alpha tag.

View File

@@ -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-389-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> <a href="https://github.com/blitz-js/blitz/commits?author=dillonraphael" title="Tests">⚠️</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,16 @@ 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>
<tr>
<td align="center"><a href="https://github.com/tommywong-dev"><img src="https://avatars.githubusercontent.com/u/79971095?v=4?s=100" width="100px;" alt=""/><br /><sub><b>tommywong-dev</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=tommywong-dev" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/datner"><img src="https://avatars.githubusercontent.com/u/22598347?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Datner</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=datner" title="Documentation">📖</a> <a href="https://github.com/blitz-js/blitz/commits?author=datner" title="Code">💻</a></td>
<td align="center"><a href="https://chaiwattsw.com/"><img src="https://avatars.githubusercontent.com/u/30198386?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Chaiwat Trisuwan</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=chaiwattsw" title="Documentation">📖</a> <a href="https://github.com/blitz-js/blitz/commits?author=chaiwattsw" title="Code">💻</a></td>
<td align="center"><a href="oltdaniel.eu"><img src="https://avatars.githubusercontent.com/u/53529846?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Daniel Oltmanns</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=oltdaniel" title="Documentation">📖</a> <a href="https://github.com/blitz-js/blitz/commits?author=oltdaniel" title="Code">💻</a></td>
</tr>
</table>

View File

@@ -1,6 +1,7 @@
save-exact=true
legacy-peer-deps=true
public-hoist-pattern[]=@tanstack/react-query
public-hoist-pattern[]=next
public-hoist-pattern[]=secure-password
public-hoist-pattern[]=*jest*

View File

@@ -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.57",
"@prisma/client": "4.0.0",
"blitz": "workspace:2.0.0-alpha.68",
"next": "12.2.0",
"prisma": "4.0.0",
"react": "18.0.0",

8
apps/web/.npmrc Normal file
View File

@@ -0,0 +1,8 @@
save-exact=true
legacy-peer-deps=true
public-hoist-pattern[]=@tanstack/react-query
public-hoist-pattern[]=next
public-hoist-pattern[]=secure-password
public-hoist-pattern[]=*jest*
public-hoist-pattern[]=@testing-library/*

View File

@@ -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:*",

View File

@@ -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",

View File

@@ -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",

View File

@@ -12,13 +12,13 @@
"@blitzjs/config": "workspace:*",
"@blitzjs/next": "workspace:*",
"@blitzjs/rpc": "workspace:*",
"@prisma/client": "3.9.0",
"@prisma/client": "4.0.0",
"@tanstack/react-query": "4.0.10",
"blitz": "workspace:*",
"next": "12.2.0",
"prisma": "4.0.0",
"react": "18.0.0",
"react-dom": "18.0.0",
"react-query": "3.39.0"
"react-dom": "18.0.0"
},
"devDependencies": {
"@testing-library/react": "13.0.0",

View File

@@ -2,4 +2,4 @@
exports[`useMutation > useMutation calls the resolver with the argument > shouldn't work with query function 1`] = `"\\"useMutation\\" was expected to be called with a mutation but was called with a \\"query\\""`;
exports[`useMutation > useMutation calls the resolver with the argument > shouldn't work with regular functions 1`] = `"Either the file path to your resolver is incorrect (must be in a \\"queries\\" or \\"mutations\\" folder that isn't nested inside \\"pages\\" or \\"api\\") or you are trying to use Blitz's useQuery to fetch from third-party APIs (to do that, import useQuery directly from \\"react-query\\")"`;
exports[`useMutation > useMutation calls the resolver with the argument > shouldn't work with regular functions 1`] = `"Either the file path to your resolver is incorrect (must be in a \\"queries\\" or \\"mutations\\" folder that isn't nested inside \\"pages\\" or \\"api\\") or you are trying to use Blitz's useQuery to fetch from third-party APIs (to do that, import useQuery directly from \\"@tanstack/react-query\\")."`;

View File

@@ -1,5 +1,5 @@
// Vitest Snapshot v1
exports[`useQuery > a "query" that converts the string parameter to uppercase > shouldn't work with mutation function 1`] = `"Cannot read properties of null (reading 'isReady')"`;
exports[`useQuery > a "query" that converts the string parameter to uppercase > shouldn't work with mutation function 1`] = `"\\"useQuery\\" was expected to be called with a query but was called with a \\"mutation\\""`;
exports[`useQuery > a "query" that converts the string parameter to uppercase > shouldn't work with regular functions 1`] = `"Cannot read properties of null (reading 'isReady')"`;
exports[`useQuery > a "query" that converts the string parameter to uppercase > shouldn't work with regular functions 1`] = `"Either the file path to your resolver is incorrect (must be in a \\"queries\\" or \\"mutations\\" folder that isn't nested inside \\"pages\\" or \\"api\\") or you are trying to use Blitz's useQuery to fetch from third-party APIs (to do that, import useQuery directly from \\"@tanstack/react-query\\")."`;

View File

@@ -1,166 +1,190 @@
import {describe, it, expect, beforeAll, vi} from "vitest"
import {act, screen, waitForElementToBeRemoved, waitFor} from "@testing-library/react"
import {useQuery, useInfiniteQuery} from "@blitzjs/rpc"
import {useQuery, useInfiniteQuery, BlitzRpcPlugin, QueryClientProvider} from "@blitzjs/rpc"
import React from "react"
import delay from "delay"
import {buildMutationRpc, buildQueryRpc, render} from "../../utils/blitz-test-utils"
import {buildMutationRpc, buildQueryRpc, mockRouter, render} from "../../utils/blitz-test-utils"
import {RouterContext} from "next/dist/shared/lib/router-context"
beforeAll(() => {
globalThis.__BLITZ_SESSION_COOKIE_PREFIX = "qm-test-cookie-prefix"
globalThis.IS_REACT_ACT_ENVIRONMENT = true
})
describe("useQuery", () => {
it("Placeholder", async () => {
console.log("placeholder")
const setupHook = (
ID: string,
params: any,
queryFn: (...args: any) => any,
options: Parameters<typeof useQuery>[2] = {} as any,
): [{data?: any; setQueryData?: any}, Function] => {
let res = {}
const qc = BlitzRpcPlugin({})
function TestHarness() {
const [data, {setQueryData}] = useQuery(queryFn, params, {
suspense: true,
...options,
} as any)
Object.assign(res, {data, setQueryData})
return (
<div id={`harness-${ID}`}>
<span>{data ? `Ready${ID}` : "No data"}</span>
<span>{data}</span>
</div>
)
}
const ui = () => (
<React.Suspense fallback="Loading...">
<TestHarness />
</React.Suspense>
)
const {rerender} = render(ui(), {
wrapper: ({children}) => (
<QueryClientProvider client={globalThis.queryClient}>
<RouterContext.Provider value={mockRouter}>{children}</RouterContext.Provider>
</QueryClientProvider>
),
})
return [res, () => rerender(ui())]
}
describe('a "query" that converts the string parameter to uppercase', () => {
const upcase = async (args: string) => {
await delay(500)
return args.toUpperCase()
}
it("should work with Blitz queries", async () => {
const [res] = setupHook("2", "test", buildQueryRpc(upcase))
await waitForElementToBeRemoved(() => screen.getByText("Loading..."))
await act(async () => {
await screen.findByText("Ready2")
expect(res.data).toBe("TEST")
})
})
it("should be able to change the data with setQueryData", async () => {
const [res] = setupHook("3", "fooBar", buildQueryRpc(upcase))
await waitForElementToBeRemoved(() => screen.getByText("Loading..."))
await act(async () => {
await screen.findByText("Ready3")
expect(res.data).toBe("FOOBAR")
res.setQueryData((p: string) => p.substr(3, 3), {refetch: false})
await delay(100)
})
expect(res.data).toBe("BAR")
})
it("shouldn't work with regular functions", () => {
console.error = vi.fn()
expect(() => setupHook("4", "test", upcase)).toThrowErrorMatchingSnapshot()
})
it("shouldn't work with mutation function", () => {
console.error = vi.fn()
expect(() => setupHook("5", "test", buildMutationRpc(upcase))).toThrowErrorMatchingSnapshot()
})
it("suspense disabled if enabled is false", async () => {
setupHook("6", "test", buildQueryRpc(upcase), {enabled: false})
await screen.findByText("No data")
})
it("suspense disabled if enabled is undefined", async () => {
setupHook("7", "test", buildQueryRpc(upcase), {enabled: undefined})
await screen.findByText("No data")
})
// it("suspense disabled if enabled is false and suspense set", async () => {
// setupHook("8", "test", buildQueryRpc(upcase), {
// enabled: false,
// suspense: true,
// })
// await screen.findByText("No data")
// })
it("works with options other than enabled & suspense without type error", () => {
const Demo = () => {
useQuery(buildQueryRpc(upcase), undefined, {refetchInterval: 10000})
return <div></div>
}
const ui = () => <Demo />
const {rerender} = render(ui(), {
wrapper: ({children}) => (
<QueryClientProvider client={globalThis.queryClient}>
<RouterContext.Provider value={mockRouter}>{children}</RouterContext.Provider>
</QueryClientProvider>
),
})
})
})
})
// beforeAll(() => {
// globalThis.__BLITZ_SESSION_COOKIE_PREFIX = "qm-test-cookie-prefix"
// globalThis.IS_REACT_ACT_ENVIRONMENT = true
// })
// describe("useQuery", () => {
// const setupHook = (
// params: any,
// queryFn: (...args: any) => any,
// options: Parameters<typeof useQuery>[2] = {} as any,
// ): [{data?: any; setQueryData?: any}, Function] => {
// let res = {}
// function TestHarness() {
// const [data, {setQueryData}] = useQuery(queryFn, params, {
// suspense: true,
// ...options,
// } as any)
// Object.assign(res, {data, setQueryData})
// return (
// <div id="harness">
// <span>{data ? "Ready" : "No data"}</span>
// <span>{data}</span>
// </div>
// )
// }
describe("useInfiniteQuery", () => {
const setupHook = (
ID: string,
params: (arg?: any) => any,
queryFn: (...args: any) => any,
): [{data?: any; setQueryData?: any}, Function] => {
let res = {}
const qc = BlitzRpcPlugin({})
// const ui = () => (
// <React.Suspense fallback="Loading...">
// <TestHarness />
// </React.Suspense>
// )
function TestHarness() {
// TODO - fix typing
//@ts-ignore
const [groupedData] = useInfiniteQuery(queryFn, params, {
suspense: true,
getNextPageParam: () => {},
})
Object.assign(res, {groupedData})
return (
<div id="harness">
<span>{groupedData ? `Ready${ID}` : "No data"}</span>
<div>
{groupedData.map((data: any, i) => (
<div key={i}>{data}</div>
))}
</div>
</div>
)
}
// const {rerender} = render(ui())
// return [res, () => rerender(ui())]
// }
const ui = () => (
<React.Suspense fallback={`Loading${ID}...`}>
<TestHarness />
</React.Suspense>
)
// describe('a "query" that converts the string parameter to uppercase', () => {
// const upcase = async (args: string) => {
// await delay(1000)
// return args.toUpperCase()
// }
// it("should work with Blitz queries", async () => {
// const [res] = setupHook("test", buildQueryRpc(upcase))
// await waitForElementToBeRemoved(() => screen.getByText("Loading..."))
// await act(async () => {
// await screen.findByText("Ready")
// expect(res.data).toBe("TEST")
// })
// })
const {rerender} = render(ui(), {
wrapper: ({children}) => (
<QueryClientProvider client={globalThis.queryClient}>
<RouterContext.Provider value={mockRouter}>{children}</RouterContext.Provider>
</QueryClientProvider>
),
})
return [res, () => rerender(ui())]
}
// it("should be able to change the data with setQueryData", async () => {
// const [res] = setupHook("test", buildQueryRpc(upcase))
// await waitForElementToBeRemoved(() => screen.getByText("Loading..."))
// await act(async () => {
// await screen.findByText("Ready")
// expect(res.data).toBe("TEST")
// res.setQueryData((p: string) => p.substr(1, 2), {refetch: false})
// await waitFor(() => screen.getByText("ES"))
// })
// })
// it("shouldn't work with regular functions", () => {
// console.error = vi.fn()
// expect(() => setupHook("test", upcase)).toThrowErrorMatchingSnapshot()
// })
// it("shouldn't work with mutation function", () => {
// console.error = vi.fn()
// expect(() => setupHook("test", buildMutationRpc(upcase))).toThrowErrorMatchingSnapshot()
// })
// it("suspense disabled if enabled is false", async () => {
// setupHook("test", buildQueryRpc(upcase), {enabled: false})
// await screen.findByText("No data")
// })
// it("suspense disabled if enabled is undefined", async () => {
// setupHook("test", buildQueryRpc(upcase), {enabled: undefined})
// await screen.findByText("No data")
// })
// it("suspense disabled if enabled is false and suspense set", async () => {
// setupHook("test", buildQueryRpc(upcase), {
// enabled: false,
// suspense: true,
// })
// await screen.findByText("No data")
// })
// })
// // it("works with options other than enabled & suspense without type error", () => {
// // const queryFn = ((() => true) as unknown) as () => Promise<boolean>
// // useQuery(queryFn, undefined, {refetchInterval: 10000})
// // })
// })
// describe("useInfiniteQuery", () => {
// const setupHook = (
// params: (arg?: any) => any,
// queryFn: (...args: any) => any,
// ): [{data?: any; setQueryData?: any}, Function] => {
// let res = {}
// function TestHarness() {
// // TODO - fix typing
// //@ts-ignore
// const [groupedData] = useInfiniteQuery(queryFn, params, {
// suspense: true,
// getNextPageParam: () => {},
// })
// Object.assign(res, {groupedData})
// return (
// <div id="harness">
// <span>{groupedData ? "Ready" : "No data"}</span>
// <div>
// {groupedData.map((data: any, i) => (
// <div key={i}>{data}</div>
// ))}
// </div>
// </div>
// )
// }
// const ui = () => (
// <React.Suspense fallback="Loading...">
// <TestHarness />
// </React.Suspense>
// )
// const {rerender} = render(ui())
// return [res, () => rerender(ui())]
// }
// const getItems = ({id}: {id: number}) => {
// if (id === 1) {
// return "item1"
// } else if (id === 2) {
// return "item2"
// } else {
// throw new Error("No item for this id")
// }
// }
// it("should work", async () => {
// setupHook(() => ({id: 1}), buildQueryRpc(getItems))
// await waitForElementToBeRemoved(() => screen.getByText("Loading..."))
// await act(async () => {
// await screen.findByText("item1")
// })
// setupHook(() => ({id: 2}), buildQueryRpc(getItems))
// await act(async () => {
// await screen.findByText("item2")
// })
// })
// })
const getItems = ({id}: {id: number}) => {
if (id === 1) {
return "item1"
} else if (id === 2) {
return "item2"
} else {
throw new Error("No item for this id")
}
}
it("should show loading", async () => {
setupHook("1", () => ({id: 1}), buildQueryRpc(getItems))
await waitForElementToBeRemoved(() => screen.getByText("Loading1..."))
await act(async () => {
await screen.findByText("item1")
})
})
})

View File

@@ -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",

View File

@@ -1,11 +1,12 @@
import {render as defaultRender} from "@testing-library/react"
import {NextRouter} from "next/router"
import {vi} from "vitest"
import {QueryClient, QueryClientProvider} from "react-query"
import React from "react"
import {BlitzRpcPlugin} from "@blitzjs/rpc"
import {vi} from "vitest"
import {QueryClient} from "@tanstack/react-query"
import {BlitzRpcPlugin, QueryClientProvider} from "@blitzjs/rpc"
import {NextRouter} from "next/router"
import {RouterContext} from "next/dist/shared/lib/router-context"
import {render as defaultRender} from "@testing-library/react"
const mockRouter: NextRouter = {
export const mockRouter: NextRouter = {
basePath: "",
pathname: "/",
route: "/",
@@ -56,8 +57,6 @@ const BlitzProvider = ({
return children
}
export const RouterContext = React.createContext(null as any)
RouterContext.displayName = "RouterContext"
const compose =
(...rest) =>
(x: React.ComponentType<any>) =>

View File

@@ -1,34 +1,24 @@
interface ChainMethods {
elementByCss: (selector: string) => Chain<Element>
elementById: () => Chain<Element>
getValue: () => Chain<any>
text: () => Chain<string>
type: () => Chain<any>
moveTo: () => Chain<any>
getComputedCss: () => Chain<any>
getAttribute: () => Chain<any>
hasElementByCssSelector: () => Chain<any>
click: () => Chain<any>
elementsByCss: () => Chain<Element[]>
waitForElementByCss: (arg: string) => Chain<any>
eval: (evalStr: string) => Chain<any>
log: () => Chain<any>
url: () => Chain<any>
back: () => Chain<any>
forward: () => Chain<any>
refresh: () => Chain<any>
setDimensions: (opts: {height: number; width: number}) => Chain<any>
close: () => Chain<any>
quit: () => Chain<any>
}
interface Chain<T> extends Promise<T & ChainMethods>, ChainMethods {}
type Browser = {__brand: "Browser"}
export default function (
appPort: number,
path: string,
waitHydration?: boolean,
allowHydrationRetry?: boolean,
): Promise<Chain<Browser>>
import {BrowserInterface} from "./browsers/base"
export declare const USE_SELENIUM: boolean
/**
*
* @param appPortOrUrl can either be the port or the full URL
* @param url the path/query to append when using appPort
* @param options.waitHydration whether to wait for react hydration to finish
* @param options.retryWaitHydration allow retrying hydration wait if reload occurs
* @param options.disableCache disable cache for page load
* @param options.beforePageLoad the callback receiving page instance before loading page
* @returns thenable browser instance
*/
export default function webdriver(
appPortOrUrl: string | number,
url: string,
options?: {
waitHydration?: boolean
retryWaitHydration?: boolean
disableCache?: boolean
beforePageLoad?: (page: any) => void
locale?: string
},
): Promise<BrowserInterface>
//# sourceMappingURL=next-webdriver.d.ts.map

View File

@@ -5,6 +5,7 @@
"devDependencies": {
"@blitzjs/config": "workspace: *",
"@blitzjs/rpc": "workspace: *",
"@tanstack/react-query": "4.0.10",
"@testing-library/react": "13.0.0",
"@types/express": "4.17.13",
"@types/fs-extra": "9.0.13",
@@ -23,7 +24,6 @@
"playwright-chromium": "1.14.1",
"react": "18.0.0",
"react-dom": "18.0.0",
"react-query": "3.39.0",
"resolve-cwd": "3.0.0",
"resolve-from": "5.0.0",
"rimraf": "3.0.2",

View File

@@ -33,10 +33,15 @@
"prettier": "^2.5.1",
"prettier-plugin-prisma": "3.8.0",
"pretty-quick": "3.1.3",
"turbo": "1.1.5",
"turbo": "1.4.2",
"vitest": "0.8.2",
"wait-on": "6.0.1"
},
"npmClient": "pnpm",
"packageManager": "pnpm@7.4.0-1"
"packageManager": "pnpm@7.4.0-1",
"manypkg": {
"ignoredRules": [
"EXTERNAL_MISMATCH"
]
}
}

View File

@@ -1,5 +1,91 @@
# @blitzjs/auth
## 2.0.0-alpha.68
### Patch Changes
- Updated dependencies [271c58ac]
- Updated dependencies [630c7181]
- Updated dependencies [f0ca738d]
- Updated dependencies [41608c4c]
- blitz@2.0.0-alpha.68
## 2.0.0-alpha.67
### Patch Changes
- blitz@2.0.0-alpha.67
## 2.0.0-alpha.66
### Patch Changes
- a3e6c49c: Fixes the supports-color warning for pnpm
- Updated dependencies [928e840b]
- Updated dependencies [240f3f34]
- Updated dependencies [55b1cb20]
- Updated dependencies [4d7d126d]
- Updated dependencies [890b0c0c]
- Updated dependencies [807a2b56]
- Updated dependencies [a3e6c49c]
- blitz@2.0.0-alpha.66
## 2.0.0-alpha.65
### Patch Changes
- Updated dependencies [dd5f5174]
- blitz@2.0.0-alpha.65
## 2.0.0-alpha.64
### Patch Changes
- Updated dependencies [54db8a46]
- Updated dependencies [62bf12b5]
- blitz@2.0.0-alpha.64
## 2.0.0-alpha.63
### Patch Changes
- blitz@2.0.0-alpha.63
## 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

View File

@@ -1,6 +1,6 @@
{
"name": "@blitzjs/auth",
"version": "2.0.0-alpha.57",
"version": "2.0.0-alpha.68",
"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.57",
"blitz": "2.0.0-alpha.68",
"cookie": "0.4.1",
"cookie-session": "2.0.0",
"debug": "4.3.3",
@@ -36,10 +36,11 @@
"passport": "0.5.2",
"path": "0.12.7",
"secure-password": "4.0.0",
"supports-color": "8.1.1",
"url": "0.11.0"
},
"devDependencies": {
"@blitzjs/config": "workspace:2.0.0-alpha.57",
"@blitzjs/config": "workspace:2.0.0-alpha.68",
"@testing-library/react": "13.0.0",
"@testing-library/react-hooks": "7.0.2",
"@types/cookie": "0.4.1",
@@ -50,7 +51,7 @@
"react": "18.0.0",
"react-dom": "18.0.0",
"typescript": "^4.5.3",
"unbuild": "0.6.9",
"unbuild": "0.7.6",
"watch": "1.0.2"
},
"publishConfig": {

View File

@@ -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)
}

View File

@@ -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()

View File

@@ -1,5 +1,85 @@
# @blitzjs/next
## 2.0.0-alpha.68
### Patch Changes
- Updated dependencies [630c7181]
- @blitzjs/rpc@2.0.0-alpha.68
## 2.0.0-alpha.67
### Patch Changes
- @blitzjs/rpc@2.0.0-alpha.67
## 2.0.0-alpha.66
### Patch Changes
- ccb1af8d: Avoid `invalid config detected` warnings by deleting `"blitz"` key from next config object
- 807a2b56: Fixes peer dependency warnings
- a3e6c49c: Fixes the supports-color warning for pnpm
- Updated dependencies [807a2b56]
- Updated dependencies [a3e6c49c]
- Updated dependencies [9620ef6b]
- @blitzjs/rpc@2.0.0-alpha.66
## 2.0.0-alpha.65
### Patch Changes
- @blitzjs/rpc@2.0.0-alpha.65
## 2.0.0-alpha.64
### Patch Changes
- @blitzjs/rpc@2.0.0-alpha.64
## 2.0.0-alpha.63
### Patch Changes
- f52ca398: Upgrade react-query to v4
- Updated dependencies [f52ca398]
- @blitzjs/rpc@2.0.0-alpha.63
## 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

View File

@@ -2,7 +2,7 @@ import {BuildConfig} from "unbuild"
const config: BuildConfig = {
entries: ["./src/index-browser", "./src/index-server"],
externals: ["index-browser.cjs", "index-browser.mjs", "blitz", ".blitz"],
externals: ["index-browser.cjs", "index-browser.mjs", "blitz", ".blitz", "next", "react"],
declaration: true,
rollup: {
emitCJS: true,

View File

@@ -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"),
},

View File

@@ -1,6 +1,6 @@
{
"name": "@blitzjs/next",
"version": "2.0.0-alpha.57",
"version": "2.0.0-alpha.68",
"scripts": {
"build": "unbuild",
"dev": "pnpm predev && pnpm watch unbuild src --wait=0.2",
@@ -24,16 +24,17 @@
"eslint.js"
],
"dependencies": {
"@blitzjs/rpc": "2.0.0-alpha.57",
"@blitzjs/rpc": "2.0.0-alpha.68",
"@tanstack/react-query": "4.0.10",
"@types/hoist-non-react-statics": "3.3.1",
"debug": "4.3.3",
"fs-extra": "10.0.1",
"hoist-non-react-statics": "3.3.2",
"react-query": "3.39.0",
"superjson": "1.8.0"
"superjson": "1.8.0",
"supports-color": "8.1.1"
},
"devDependencies": {
"@blitzjs/config": "workspace:2.0.0-alpha.57",
"@blitzjs/config": "workspace:2.0.0-alpha.68",
"@testing-library/dom": "8.13.0",
"@testing-library/jest-dom": "5.16.3",
"@testing-library/react": "13.0.0",
@@ -43,7 +44,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.57",
"blitz": "2.0.0-alpha.68",
"cross-spawn": "7.0.3",
"find-up": "4.1.0",
"next": "12.2.0",
@@ -52,14 +53,10 @@
"resolve-from": "5.0.0",
"ts-jest": "27.1.4",
"typescript": "^4.5.3",
"unbuild": "0.6.9",
"unbuild": "0.7.6",
"watch": "1.0.2"
},
"publishConfig": {
"access": "public"
},
"peerDependencies": {
"next": ">=12.2.0",
"react": "*"
}
}

View File

@@ -1,4 +1,4 @@
import {QueryClient} from "react-query"
import {QueryClient} from "@tanstack/react-query"
declare global {
var queryClient: QueryClient

View File

@@ -7,8 +7,7 @@ import type {
} from "blitz"
import Head from "next/head"
import React, {ReactNode} from "react"
import {QueryClient, QueryClientProvider} from "react-query"
import {Hydrate, HydrateOptions} from "react-query/hydration"
import {QueryClient, QueryClientProvider, Hydrate, HydrateOptions} from "@tanstack/react-query"
import {withSuperJSONPage} from "./superjson"
import {Ctx} from "blitz"
import {UrlObject} from "url"
@@ -19,6 +18,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 =

View File

@@ -25,7 +25,7 @@ import {
InstallWebpackConfigOptions,
ResolverPathOptions,
} from "@blitzjs/rpc"
import {DefaultOptions, QueryClient} from "react-query"
import {DefaultOptions, QueryClient} from "@tanstack/react-query"
import {IncomingMessage, ServerResponse} from "http"
import {withSuperJsonProps} from "./superjson"
import {ParsedUrlQuery} from "querystring"
@@ -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,11 @@ 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,
@@ -151,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)
@@ -207,7 +209,8 @@ export function withBlitz(nextConfig: BlitzConfig = {}) {
},
})
return config
const {blitz, ...rest} = config
return rest
}
export type PrefetchQueryFn = <T extends AsyncFunc, TInput = FirstParam<T>>(

View File

@@ -1,5 +1,94 @@
# @blitzjs/rpc
## 2.0.0-alpha.68
### Patch Changes
- 630c7181: Use internal branded blitz logger for @blitzjs/rpc
- @blitzjs/auth@2.0.0-alpha.68
## 2.0.0-alpha.67
### Patch Changes
- @blitzjs/auth@2.0.0-alpha.67
## 2.0.0-alpha.66
### Patch Changes
- 807a2b56: Fixes peer dependency warnings
- a3e6c49c: Fixes the supports-color warning for pnpm
- 9620ef6b: moves zod to devDependencies
- Updated dependencies [a3e6c49c]
- @blitzjs/auth@2.0.0-alpha.66
## 2.0.0-alpha.65
### Patch Changes
- Updated dependencies [dd5f5174]
- blitz@2.0.0-alpha.65
- @blitzjs/auth@2.0.0-alpha.65
## 2.0.0-alpha.64
### Patch Changes
- Updated dependencies [54db8a46]
- Updated dependencies [62bf12b5]
- blitz@2.0.0-alpha.64
- @blitzjs/auth@2.0.0-alpha.64
## 2.0.0-alpha.63
### Patch Changes
- f52ca398: Upgrade react-query to v4
- @blitzjs/auth@2.0.0-alpha.63
- blitz@2.0.0-alpha.63
## 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

View File

@@ -14,6 +14,9 @@ const config: BuildConfig = {
"index-server.cjs",
"index-server.mjs",
"react",
"blitz",
"next",
"zod",
],
declaration: true,
rollup: {

View File

@@ -1,6 +1,6 @@
{
"name": "@blitzjs/rpc",
"version": "2.0.0-alpha.57",
"version": "2.0.0-alpha.68",
"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,31 +20,28 @@
"dist/**"
],
"dependencies": {
"@blitzjs/auth": "2.0.0-alpha.57",
"@blitzjs/auth": "2.0.0-alpha.68",
"@tanstack/react-query": "4.0.10",
"b64-lite": "1.4.0",
"bad-behavior": "1.0.1",
"chalk": "^4.1.0",
"debug": "4.3.3",
"react-query": "3.39.0",
"superjson": "1.8.0",
"zod": "3.17.3"
"supports-color": "8.1.1"
},
"devDependencies": {
"@blitzjs/config": "workspace:2.0.0-alpha.57",
"@blitzjs/config": "workspace:2.0.0-alpha.68",
"@types/debug": "4.1.7",
"@types/react": "18.0.1",
"@types/react-dom": "17.0.14",
"blitz": "2.0.0-alpha.57",
"blitz": "2.0.0-alpha.68",
"next": "12.2.0",
"react": "18.0.0",
"react-dom": "18.0.0",
"typescript": "^4.5.3",
"unbuild": "0.6.9",
"watch": "1.0.2"
},
"peerDependencies": {
"blitz": "2.0.0-alpha.57",
"next": ">=12.2.0"
"unbuild": "0.7.6",
"watch": "1.0.2",
"zod": "3.17.3"
},
"publishConfig": {
"access": "public"

View File

@@ -8,7 +8,11 @@ export {
setQueryData,
getQueryClient,
} from "./react-query-utils"
export {useQueryErrorResetBoundary, QueryClient} from "react-query"
export {dehydrate} from "react-query/hydration"
export {
useQueryErrorResetBoundary,
QueryClientProvider,
QueryClient,
dehydrate,
} from "@tanstack/react-query"
export {invoke} from "./invoke"
export {invokeWithCtx} from "./invokeWithCtx"

View File

@@ -1,4 +1,4 @@
import {QueryClient, QueryKey} from "react-query"
import {QueryClient} from "@tanstack/react-query"
import {serialize} from "superjson"
import {isClient, isServer, AsyncFunc} from "blitz"
import {ResolverType, RpcClient} from "./rpc"
@@ -94,7 +94,7 @@ export const validateQueryFn = <TInput, TResult>(
) => {
if (isClient && !isRpcClient(queryFn) && isNotInUserTestEnvironment()) {
throw new Error(
`Either the file path to your resolver is incorrect (must be in a "queries" or "mutations" folder that isn't nested inside "pages" or "api") or you are trying to use Blitz's useQuery to fetch from third-party APIs (to do that, import useQuery directly from "react-query")`,
`Either the file path to your resolver is incorrect (must be in a "queries" or "mutations" folder that isn't nested inside "pages" or "api") or you are trying to use Blitz's useQuery to fetch from third-party APIs (to do that, import useQuery directly from "@tanstack/react-query").`,
)
}
}
@@ -169,14 +169,7 @@ export function invalidateQuery<TInput, TResult, T extends AsyncFunc>(
}
const fullQueryKey = getQueryKey(resolver, params)
let queryKey: QueryKey
if (params) {
queryKey = fullQueryKey
} else {
// Params not provided, only use first query key item (url)
queryKey = fullQueryKey[0]
}
return getQueryClient().invalidateQueries(queryKey)
return getQueryClient().invalidateQueries(fullQueryKey)
}
export function setQueryData<TInput, TResult, T extends AsyncFunc>(

View File

@@ -9,7 +9,7 @@ import {
useMutation as useReactQueryMutation,
UseMutationOptions,
UseMutationResult,
} from "react-query"
} from "@tanstack/react-query"
import {useSession} from "@blitzjs/auth"
import {isServer, FirstParam, PromiseReturnType, AsyncFunc} from "blitz"
import {
@@ -85,14 +85,14 @@ 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,
})
if (
queryRest.isIdle &&
queryRest.fetchStatus === "idle" &&
isServer &&
suspenseEnabled !== false &&
!data &&
@@ -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,
@@ -178,7 +178,7 @@ export function usePaginatedQuery<
})
if (
queryRest.isIdle &&
queryRest.fetchStatus === "idle" &&
isServer &&
suspenseEnabled !== false &&
!data &&
@@ -267,17 +267,15 @@ 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,
})
if (
queryRest.isIdle &&
queryRest.fetchStatus === "idle" &&
isServer &&
suspenseEnabled !== false &&
!data &&

View File

@@ -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)

View File

@@ -1,4 +1,4 @@
import {QueryClient} from "react-query"
import {QueryClient} from "@tanstack/react-query"
declare global {
var queryClient: QueryClient

View File

@@ -1,6 +1,6 @@
import "./global"
import {createClientPlugin} from "blitz"
import {DefaultOptions, QueryClient} from "react-query"
import {DefaultOptions, QueryClient} from "@tanstack/react-query"
export * from "./data-client/index"
@@ -21,7 +21,7 @@ export const BlitzRpcPlugin = createClientPlugin<BlitzRpcOptions, {queryClient:
...reactQueryOptions,
queries: {
...(typeof window === "undefined" && {cacheTime: 0}),
retry: (failureCount, error: any) => {
retry: (failureCount: number, error: any) => {
if (process.env.NODE_ENV !== "production") return false
// Retry (max. 3 times) only if network error detected

View File

@@ -1,7 +1,8 @@
import {assert, Ctx, prettyMs} from "blitz"
import {assert, baseLogger, Ctx, newLine, prettyMs} from "blitz"
import {NextApiRequest, NextApiResponse} from "next"
import {deserialize, serialize as superjsonSerialize} from "superjson"
import {resolve} from "path"
import chalk from "chalk"
// TODO - optimize end user server bundles by not exporting all client stuff here
export * from "./index-browser"
@@ -68,6 +69,11 @@ interface WebpackRule {
export interface InstallWebpackConfigOptions {
webpackConfig: {
resolve: {
alias: {
[key: string]: boolean
}
}
module: {
rules: WebpackRule[]
}
@@ -79,6 +85,8 @@ export function installWebpackConfig({
webpackConfig,
webpackRuleOptions,
}: InstallWebpackConfigOptions) {
webpackConfig.resolve.alias["npm-which"] = false
webpackConfig.resolve.alias["cross-spawn"] = false
webpackConfig.module.rules.push({
test: /[\\/]\[\[\.\.\.blitz]]\.[jt]sx?$/,
use: [
@@ -149,6 +157,13 @@ export function rpcHandler(config: RpcConfig) {
const relativeRoutePath = (req.query.blitz as string[])?.join("/")
const routePath = "/" + relativeRoutePath
const log = baseLogger().getChildLogger({
prefix: [routePath.replace("/api/rpc/", "") + "()"],
})
const customChalk = new chalk.Instance({
level: log.settings.type === "json" ? 0 : chalk.level,
})
const loadableResolver = resolverMap?.[routePath]
if (!loadableResolver) {
throw new Error("No resolver for path: " + routePath)
@@ -168,7 +183,7 @@ export function rpcHandler(config: RpcConfig) {
if (typeof req.body.params === "undefined") {
const error = {message: "Request body is missing the `params` key"}
console.error(error.message)
log.error(error.message)
res.status(400).json({
result: null,
error,
@@ -182,11 +197,11 @@ export function rpcHandler(config: RpcConfig) {
meta: req.body.meta?.params,
})
console.info("Starting with input:", data ? data : JSON.stringify(data))
log.info(customChalk.dim("Starting with input:"), data ? data : JSON.stringify(data))
const startTime = Date.now()
const result = await resolver(data, (res as any).blitzCtx)
const resolverDuration = Date.now() - startTime
console.debug("Result:", result ? result : JSON.stringify(result))
log.debug(customChalk.dim("Result:"), result ? result : JSON.stringify(result))
const serializerStartTime = Date.now()
const serializedResult = superjsonSerialize(result)
@@ -200,16 +215,22 @@ export function rpcHandler(config: RpcConfig) {
result: serializedResult.meta,
},
})
console.debug(`Next.js serialization:${prettyMs(Date.now() - nextSerializerStartTime)}`)
log.debug(
customChalk.dim(
`Next.js serialization:${prettyMs(Date.now() - nextSerializerStartTime)}`,
),
)
const serializerDuration = Date.now() - serializerStartTime
const duration = Date.now() - startTime
console.info(
`Finished: resolver:${prettyMs(resolverDuration)} serializer:${prettyMs(
serializerDuration,
)} total:${prettyMs(duration)}`,
log.info(
customChalk.dim(
`Finished: resolver:${prettyMs(resolverDuration)} serializer:${prettyMs(
serializerDuration,
)} total:${prettyMs(duration)}`,
),
)
console.log("\n")
newLine()
return
} catch (error: any) {
@@ -219,8 +240,8 @@ export function rpcHandler(config: RpcConfig) {
config.onError?.(error)
console.error(error)
console.log("\n")
log.error(error)
newLine()
if (!error.statusCode) {
error.statusCode = 500
@@ -239,7 +260,7 @@ export function rpcHandler(config: RpcConfig) {
}
} else {
// Everything else is error
console.warn(`${req.method} method not supported`)
log.warn(`${req.method} method not supported`)
res.status(404).end()
return
}

View File

@@ -1,5 +1,103 @@
# blitz
## 2.0.0-alpha.68
### Patch Changes
- 271c58ac: Comment out generate command import until we add the full support back
- 630c7181: Use internal branded blitz logger for @blitzjs/rpc
- f0ca738d: Run codegen tasks on blitz dev command
- 41608c4c: Run codegen tasks after creating a new app if user chose yarn as a package manager
- Updated dependencies [70b334a2]
- Updated dependencies [dd299ae8]
- Updated dependencies [078fe474]
- @blitzjs/generator@2.0.0-alpha.68
## 2.0.0-alpha.67
### Patch Changes
- Updated dependencies [ebd74b4e]
- @blitzjs/generator@2.0.0-alpha.67
## 2.0.0-alpha.66
### Patch Changes
- 928e840b: Fixes loading production env variables by default for blitz build command
- 240f3f34: Add BlitzServerMiddleware utility function to wrap middleware in blitz server file
- 55b1cb20: Runs the codegen on the blitz build command
- 4d7d126d: Run `prisma generate` as a `blitz codegen` step if "prisma" is found in project's dependencies
- 890b0c0c: Improve `blitz new` messaging and fix minor issues
- 807a2b56: Fixes peer dependency warnings
- a3e6c49c: Fixes the supports-color warning for pnpm
- Updated dependencies [91aa5356]
- Updated dependencies [890b0c0c]
- Updated dependencies [807a2b56]
- Updated dependencies [a3e6c49c]
- Updated dependencies [065db256]
- Updated dependencies [f202aac1]
- @blitzjs/generator@2.0.0-alpha.66
## 2.0.0-alpha.65
### Patch Changes
- dd5f5174: Fix `enhancePrisma is undefined` errors by moving the utility function to a browser entrypoint
- @blitzjs/generator@2.0.0-alpha.65
## 2.0.0-alpha.64
### Patch Changes
- 54db8a46: Add missing value to "skip" option when choosing a package manager during new app scaffolding
- 62bf12b5: Fix blitz codegen to work with monorepos
- @blitzjs/generator@2.0.0-alpha.64
## 2.0.0-alpha.63
### Patch Changes
- @blitzjs/generator@2.0.0-alpha.63
## 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

View File

@@ -2,7 +2,7 @@ import {BuildConfig} from "unbuild"
const config: BuildConfig = {
entries: ["./src/index-browser", "./src/index-server", "./src/cli/index"],
externals: ["index-browser.cjs", "index-browser.mjs", "index.cjs", "zod"],
externals: ["index-browser.cjs", "index-browser.mjs", "index.cjs", "zod", "react"],
declaration: true,
rollup: {
emitCJS: true,

View File

@@ -1,6 +1,6 @@
{
"name": "blitz",
"version": "2.0.0-alpha.57",
"version": "2.0.0-alpha.68",
"scripts": {
"build": "unbuild",
"dev": "watch unbuild src --wait=0.2",
@@ -23,7 +23,7 @@
"blitz": "bin/blitz"
},
"dependencies": {
"@blitzjs/generator": "2.0.0-alpha.57",
"@blitzjs/generator": "2.0.0-alpha.68",
"arg": "5.0.1",
"boxen": "7.0.0",
"chalk": "^4.1.0",
@@ -48,13 +48,14 @@
"resolve-cwd": "3.0.0",
"resolve-from": "5.0.0",
"superjson": "1.8.0",
"supports-color": "8.1.1",
"ts-node": "10.7.0",
"tsconfig-paths": "4.0.0",
"tslog": "3.3.1",
"watchpack": "2.1.1"
},
"devDependencies": {
"@blitzjs/config": "workspace:2.0.0-alpha.57",
"@blitzjs/config": "workspace:2.0.0-alpha.68",
"@types/cookie": "0.4.1",
"@types/cross-spawn": "6.0.2",
"@types/debug": "4.1.7",
@@ -74,13 +75,10 @@
"react": "18.0.0",
"test-listen": "1.1.0",
"typescript": "^4.5.3",
"unbuild": "0.6.9",
"unbuild": "0.7.6",
"watch": "1.0.2",
"zod": "3.17.3"
},
"peerDependencies": {
"react": "*"
},
"publishConfig": {
"access": "public"
}

View File

@@ -1,37 +1,14 @@
import {CliCommand} from "../index"
/* @ts-ignore */
import {generateManifest} from "../utils/routes-manifest"
import resolveCwd from "resolve-cwd"
import {join} from "path"
import fs from "fs-extra"
import {codegenTasks} from "../utils/codegen-tasks"
const codegen: CliCommand = async () => {
try {
/*
Updates the user's nextjs file and adds onRecoverableError to the hydrateRoot 3rd parameter object.
We can remove this when https://github.com/vercel/next.js/pull/38207 is merged into next.js
*/
const nextDir = await resolveCwd("next")
const nextClientIndex = join(nextDir, "../..", "client", "index.js")
const readFile = await fs.readFile(nextClientIndex)
const updatedFile = readFile
.toString()
.replace(
/ReactDOM\.hydrateRoot\(.*?\);/,
`ReactDOM.hydrateRoot(domEl, reactEl, process.env.NODE_ENV === 'development' ? {onRecoverableError: (err) => err.toString().includes("could not finish this Suspense boundary") ? null : console.error(err)} : undefined);`,
)
await fs.writeFile(nextClientIndex, updatedFile)
await codegenTasks()
process.exit(0)
} catch (err) {
console.log(err)
process.exit(1)
}
try {
await generateManifest()
} catch (err) {
console.log(err)
}
process.exit(0)
}
export {codegen}

View File

@@ -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")
}

View File

@@ -1,22 +1,14 @@
import arg from "arg"
import {CliCommand} from "../index"
import prompts from "prompts"
import {
capitalize,
FormGenerator,
ModelGenerator,
MutationGenerator,
MutationsGenerator,
PageGenerator,
pluralCamel,
pluralPascal,
QueriesGenerator,
QueryGenerator,
singleCamel,
singlePascal,
uncapitalize,
} from "@blitzjs/generator"
import arg from "arg"
import {CliCommand} from "../index"
import prompts from "prompts"
import chalk from "chalk"
const getIsTypeScript = async () =>
require("fs").existsSync(require("path").join(process.cwd(), "tsconfig.json"))
@@ -47,21 +39,21 @@ function ModelNames(input: string = "") {
}
const generatorMap = {
[ResourceType.All]: [
PageGenerator,
FormGenerator,
QueriesGenerator,
MutationsGenerator,
ModelGenerator,
],
[ResourceType.Crud]: [MutationsGenerator, QueriesGenerator],
[ResourceType.Model]: [ModelGenerator],
[ResourceType.Pages]: [PageGenerator, FormGenerator],
[ResourceType.Queries]: [QueriesGenerator],
[ResourceType.Query]: [QueryGenerator],
[ResourceType.Mutations]: [MutationsGenerator],
[ResourceType.Mutation]: [MutationGenerator],
[ResourceType.Resource]: [QueriesGenerator, MutationsGenerator, ModelGenerator],
// [ResourceType.All]: [
// PageGenerator,
// FormGenerator,
// QueriesGenerator,
// MutationsGenerator,
// ModelGenerator,
// ],
// [ResourceType.Crud]: [MutationsGenerator, QueriesGenerator],
// [ResourceType.Model]: [ModelGenerator],
// [ResourceType.Pages]: [PageGenerator, FormGenerator],
// [ResourceType.Queries]: [QueriesGenerator],
// [ResourceType.Query]: [QueryGenerator],
// [ResourceType.Mutations]: [MutationsGenerator],
// [ResourceType.Mutation]: [MutationGenerator],
// [ResourceType.Resource]: [QueriesGenerator, MutationsGenerator, ModelGenerator],
}
const args = arg(
@@ -196,30 +188,30 @@ const getHelp = async () => {
if (args["--help"]) {
console.log(`
# The 'crud' type will generate all queries & mutations for a model
> blitz generate --type crud --name productVariant
# The 'all' generator will scaffold out everything possible for a model
> blitz generate --type all --name products
# The '--context' flag will allow you to generate files in a nested folder
> blitz generate --type pages --name projects --context admin
# Context can also be supplied in the model name directly
> blitz generate --type pages --name admin/projects
# To generate nested routes for dependent models (e.g. Projects that contain Tasks), specify a parent model.
# To generate nested routes for dependent models (e.g. Projects that contain Tasks), specify a parent model.
For example, this command generates pages under app/tasks/pages/projects/[projectId]/tasks/
> blitz generate --type all --name tasks --parent=projects
# Database models can also be generated directly from the CLI.
Model fields can be specified with any generator that generates a database model ("all", "model", "resource").
Model fields can be specified with any generator that generates a database model ("all", "model", "resource").
Both of the commands below will generate the proper database model for a Task.
> blitz generate --type model --name task name:string completed:boolean:default=false belongsTo:project?
> blitz generate --type all --name tasks name:string completed:boolean:default=false belongsTo:project?

View File

@@ -1,4 +1,3 @@
import {loadEnvConfig} from "../../env-utils"
import prompts from "prompts"
import path from "path"
import chalk from "chalk"
@@ -6,20 +5,20 @@ import hasbin from "hasbin"
import {CliCommand} from "../index"
import arg from "arg"
import {AppGenerator, AppGeneratorOptions, getLatestVersion} from "@blitzjs/generator"
import {runPrisma} from "../../prisma-utils"
import {loadEnvConfig} from "../../utils/env"
import {runPrisma} from "../../utils/run-prisma"
import {checkLatestVersion} from "../utils/check-latest-version"
import {codegenTasks} from "../utils/codegen-tasks"
const forms = {
"react-final-form": "React Final Form" as const,
"react-hook-form": "React Hook Form" as const,
formik: "Formik" as const,
const forms: Record<AppGeneratorOptions["form"], string> = {
finalform: "React Final Form (recommended)",
hookform: "React Hook Form",
formik: "Formik",
}
type TForms = keyof typeof forms
const language = {
typescript: "TypeScript",
javascript: "Javascript",
javascript: "JavaScript",
}
type TLanguage = keyof typeof language
@@ -75,7 +74,7 @@ const args = arg(
let projectName: string = ""
let projectPath: string = ""
let projectLanguage: string | TLanguage = ""
let projectFormLib: AppGeneratorOptions["form"] = undefined
let projectFormLib: AppGeneratorOptions["form"] = "finalform"
let projectTemplate: AppGeneratorOptions["template"] = templates.full
let projectPkgManger: TPkgManager = PREFERABLE_PKG_MANAGER
let shouldInstallDeps: boolean = true
@@ -110,7 +109,7 @@ const determineLanguage = async () => {
const res = await prompts({
type: "select",
name: "language",
message: "Pick which language you'd like to use for your new blitz project",
message: "Pick a new project's language",
initial: 0,
choices: Object.entries(language).map((c) => {
return {title: c[1], value: c[1]}
@@ -129,16 +128,16 @@ const determineFormLib = async () => {
const res = await prompts({
type: "select",
name: "form",
message: "Pick which form you'd like to use for your new blitz project",
message: "Pick a form library (you can switch to something else later if you want)",
initial: 0,
choices: Object.entries(forms).map((c) => {
return {title: c[1], value: c[1]}
return {value: c[0], title: c[1]}
}),
})
projectFormLib = res.form
} else {
projectFormLib = forms[args["--form"] as TForms]
projectFormLib = args["--form"] as AppGeneratorOptions["form"]
}
}
@@ -148,14 +147,17 @@ const determineTemplate = async () => {
!args["--template"] ||
(args["--template"] && !Object.keys(templates).includes(args["--template"].toLowerCase()))
) {
const choices: Array<{value: keyof typeof templates; title: string}> = [
{value: "full", title: "Full - includes DB and auth (Recommended)"},
{value: "minimal", title: "Minimal — no DB, no auth"},
]
const res = await prompts({
type: "select",
name: "template",
message: "Pick which template you'd like to use for your new blitz project",
message: "Pick your new app template",
initial: 0,
choices: Object.entries(templates).map((c) => {
return {title: c[0], value: c[0]}
}),
choices,
})
projectTemplate = templates[res.template as TTemplate]
@@ -199,11 +201,15 @@ const determinePkgManagerToInstallDeps = async () => {
{title: "npm", value: "npm"},
{title: "yarn", value: "yarn", disabled: !IS_YARN_INSTALLED},
{title: "pnpm", value: "pnpm", disabled: !IS_PNPM_INSTALLED},
{title: "skip"},
{title: "skip", value: "skip"},
],
})
projectPkgManger = res.pkgManager
if (res.pkgManager === "skip") {
projectPkgManger = PREFERABLE_PKG_MANAGER
} else {
projectPkgManger = res.pkgManager
}
shouldInstallDeps = res.pkgManager !== "skip"
} else {
@@ -264,6 +270,10 @@ const newApp: CliCommand = async (argv) => {
)
const result = await runPrisma(["migrate", "dev", "--name", "Initial migration"], true)
if (!result.success) throw new Error()
if (projectPkgManger === "yarn") {
await codegenTasks()
}
} catch (error) {
postInstallSteps.push(
"blitz prisma migrate dev (when asked, you can name the migration anything)",

View File

@@ -15,7 +15,7 @@ const build: CliCommand = async () => {
const config: ServerConfig = {
rootFolder: process.cwd(),
inspect: nextArgs["--inspect"],
env: process.env.NODE_ENV === "production" ? "prod" : "dev",
env: "prod",
}
await import("../../utils/next-commands").then((i) => i.build(config))

View File

@@ -1,38 +1,6 @@
import {Readable} from "stream"
import {getCommandBin} from "../utils/config"
import {CliCommand} from "../index"
import arg from "arg"
let prismaBin: string
export const runPrisma = async (args: string[], silent = false) => {
if (!prismaBin) {
try {
prismaBin = await getCommandBin("prisma")
} catch (err) {
throw err
}
}
const cp = require("cross-spawn").spawn(prismaBin, args, {
stdio: silent ? "pipe" : "inherit",
env: process.env,
})
const cp_stderr: string[] = []
if (silent) {
cp.stderr.on("data", (chunk: Readable) => {
cp_stderr.push(chunk.toString())
})
}
const code = await require("p-event")(cp, "exit", {rejectionEvents: []})
return {
success: code === 0,
stderr: silent ? cp_stderr.join("") : undefined,
}
}
import {runPrisma} from "../../utils/run-prisma"
export const runPrismaExitOnError = async (...args: Parameters<typeof runPrisma>) => {
const result = await runPrisma(...args)

View File

@@ -1,7 +1,7 @@
import arg from "arg"
import spawn from "cross-spawn"
import {loadEnvConfig} from "../env-utils"
import {loadEnvConfig} from "../utils/env"
import {NON_STANDARD_NODE_ENV} from "./utils/constants"
import {getCommandBin} from "./utils/config"
import {readVersions} from "./utils/read-versions"
@@ -31,7 +31,7 @@ const commands = {
build: () => import("./commands/next/build").then((i) => i.build),
start: () => import("./commands/next/start").then((i) => i.start),
new: () => import("./commands/new").then((i) => i.newApp),
generate: () => import("./commands/generate").then((i) => i.generate),
// generate: () => import("./commands/generate").then((i) => i.generate),
codegen: () => import("./commands/codegen").then((i) => i.codegen),
db: () => import("./commands/db").then((i) => i.db),
}
@@ -41,7 +41,7 @@ const aliases: Record<string, keyof typeof commands> = {
b: "build",
s: "start",
n: "new",
g: "generate",
// g: "generate",
}
type Command = keyof typeof commands
@@ -63,6 +63,7 @@ async function runCommandFromBin() {
process.exit(1)
}
let commandBin: string | null = null
try {
commandBin = await getCommandBin(args._[0])
} catch (e: any) {
@@ -73,7 +74,7 @@ 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)
}
@@ -120,17 +121,15 @@ async function printEnvInfo() {
}
async function main() {
loadEnvConfig(process.cwd(), undefined, {error: console.error, info: console.info})
if (args["--env"]) {
process.env.APP_ENV = args["--env"]
}
// Version is inlined into the file using taskr build pipeline
if (args["_"].length === 0 && args["--version"]) {
await printEnvInfo()
}
if (args["--env"]) {
process.env.APP_ENV = args["--env"]
}
if (args["--help"]) {
forwardedArgs.push("--help")
}
@@ -145,7 +144,7 @@ async function main() {
}
process.env.NODE_ENV = process.env.NODE_ENV || defaultEnv
loadEnvConfig(process.cwd(), undefined, {error: console.error, info: console.info})
// Make sure commands gracefully respect termination signals (e.g. from Docker)
process.on("SIGTERM", () => process.exit(0))
process.on("SIGINT", () => process.exit(0))

View File

@@ -5,6 +5,7 @@ import fs from "fs"
import {readVersions, resolveVersionType} from "./read-versions"
import {getPkgManager} from "./helpers"
import superjson from "superjson"
import {isInternalBlitzMonorepoDevelopment} from "./helpers"
const returnNpmEndpoint = (packageName: string) => {
return `https://registry.npmjs.org/-/package/${packageName}/dist-tags`
@@ -21,9 +22,6 @@ function getUpdateString(packageName: string, tag: string, isGlobal?: boolean) {
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(

View File

@@ -0,0 +1,54 @@
import {generateManifest} from "./routes-manifest"
import {log} from "../../logging"
import resolveCwd from "resolve-cwd"
import {join} from "path"
import fs from "fs-extra"
import {getPackageJson} from "./get-package-json"
import {runPrisma} from "../../utils/run-prisma"
export const codegenTasks = async () => {
try {
/*
Updates the user's nextjs file and adds onRecoverableError to the hydrateRoot 3rd parameter object.
We can remove this when https://github.com/vercel/next.js/pull/38207 is merged into next.js
*/
const nextDir = await resolveCwd("next")
const nextClientIndex = join(nextDir, "../..", "client", "index.js")
const readFile = await fs.readFile(nextClientIndex)
const updatedFile = readFile
.toString()
.replace(
/ReactDOM\.hydrateRoot\(.*?\);/,
`ReactDOM.hydrateRoot(domEl, reactEl, process.env.NODE_ENV === 'development' ? {onRecoverableError: (err) => err.toString().includes("could not finish this Suspense boundary") ? null : console.error(err)} : undefined);`,
)
await fs.writeFile(nextClientIndex, updatedFile)
log.success("Next.js was successfully patched with a React Suspense fix")
} catch (err) {
log.error(JSON.stringify(err, null, 2))
}
try {
await generateManifest()
log.success("Routes manifest was successfully generated")
const {dependencies, devDependencies} = await getPackageJson()
const hasPrisma = Object.keys({...dependencies, ...devDependencies}).some(
(name) => name === "prisma",
)
if (hasPrisma) {
let prismaSpinner = log.spinner(`Generating Prisma client`).start()
const result = await runPrisma(["generate"], true)
if (result.success) {
prismaSpinner.succeed(log.greenText("Generated Prisma client"))
} else {
prismaSpinner.fail()
console.log("\n" + result.stderr)
process.exit(1)
}
}
} catch (err) {
log.error(JSON.stringify(err, null, 2))
}
}

View File

@@ -0,0 +1,11 @@
import {existsSync} from "fs"
import {readJSON} from "fs-extra"
import {join} from "path"
export const getPackageJson = async () => {
const pkgJsonPath = join(process.cwd(), "package.json")
if (existsSync(pkgJsonPath)) {
return readJSON(pkgJsonPath)
}
return {}
}

View File

@@ -1,4 +1,5 @@
import {readdirSync} from "fs-extra"
import {readdirSync, existsSync} from "fs-extra"
import {join} from "path"
export function getPkgManager() {
return readdirSync(process.cwd()).includes("pnpm-lock.yaml")
@@ -7,3 +8,7 @@ export function getPkgManager() {
? "yarn"
: "npm"
}
export const isInternalBlitzMonorepoDevelopment =
existsSync(join(process.cwd(), "..", "..", "packages", "blitz", "dist", "chunks")) &&
existsSync(join(process.cwd(), "..", "..", "packages", "blitz-next", "dist", "chunks"))

View File

@@ -8,18 +8,20 @@ import {
buildCustomServer,
} from "./next-utils"
import {checkLatestVersion} from "./check-latest-version"
import {readBlitzConfig} from "../../server-utils"
import {readBlitzConfig} from "../../utils/server"
import {codegenTasks} from "./codegen-tasks"
export async function build(config: ServerConfig) {
const {rootFolder, nextBin, watch} = await normalize(config)
await codegenTasks()
await nextBuild(nextBin, rootFolder, {} as any, config)
if (customServerExists()) await buildCustomServer({watch})
}
export async function dev(config: ServerConfig) {
const {rootFolder, nextBin} = await normalize({...config, env: "dev"})
void checkLatestVersion()
await codegenTasks()
// void checkLatestVersion()
if (customServerExists()) {
console.log("Using your custom server")

View File

@@ -58,17 +58,19 @@ export function readVersions() {
return versions
}
export function resolveVersionType(version: string) {
export function resolveVersionType(
version: string,
): "alpha" | "beta" | "canary" | "stable" | "danger" | "latest" {
if (version.includes("alpha")) {
return "alpha" as const
return "alpha"
}
if (version.includes("beta")) {
return "beta" as const
return "beta"
}
if (version.includes("danger")) {
return "danger" as const
return "danger"
}
if (version.includes("canary")) {

View File

@@ -6,6 +6,7 @@ import {outputFile, readdir} from "fs-extra"
import findUp from "find-up"
import resolveFrom from "resolve-from"
import Watchpack from "watchpack"
import {isInternalBlitzMonorepoDevelopment} from "./helpers"
export const CONFIG_FILE = ".blitz.config.compiled.js"
export const NEXT_CONFIG_FILE = "next.config.js"
export const PHASE_PRODUCTION_SERVER = "phase-production-server"
@@ -152,9 +153,9 @@ const normalizeConfig = (phase: string, config: any) => {
}
const loadConfig = (pagesDir: string) => {
let userConfigModule
try {
const path = join(pagesDir, NEXT_CONFIG_FILE)
// eslint-disable-next-line no-eval -- block webpack from following this module path
userConfigModule = eval("require")(path)
} catch {
@@ -162,6 +163,7 @@ const loadConfig = (pagesDir: string) => {
// In case user does not have custom config
userConfigModule = {}
}
let userConfig = normalizeConfig(
PHASE_PRODUCTION_SERVER,
userConfigModule.default || userConfigModule,
@@ -485,7 +487,6 @@ export function parseDefaultExportName(contents: string): string | null {
export async function generateManifest() {
const config = await loadConfig(process.cwd())
const allRoutes = await collectAllRoutes(process.cwd(), config)
const routes: Record<string, RouteManifestEntry> = {}
for (let {filePath, route, type} of allRoutes) {
@@ -527,10 +528,6 @@ export async function generateManifest() {
})
}
export const isInternalBlitzMonorepoDevelopment = __dirname.match(
/[\\/]packages[\\/]blitz[\\/]dist[\\/]chunks$/,
)
async function findNodeModulesRoot(src: string) {
let root: string
if (isInternalBlitzMonorepoDevelopment) {
@@ -593,7 +590,7 @@ export async function stopWatcher(): Promise<void> {
if (!webpackWatcher) {
return
}
console.log("stopWatcher")
webpackWatcher.close()
webpackWatcher = null
}

View File

@@ -79,7 +79,7 @@ if (typeof window !== "undefined" && process.env.NODE_ENV === "development") {
}
export * from "./utils"
export * from "./ts-utils"
export * from "./types"
export * from "./errors"
export * from "./zod-utils"
export * from "./utils/zod"
export * from "./utils/prisma"

View File

@@ -1,19 +1,14 @@
import "./global"
import {IncomingMessage, ServerResponse} from "http"
import {Ctx} from "./types"
// import {findBlitzConfigDirectory} from "./cli/utils/routes-manifest"
// import {readFileSync} from "fs-extra"
export * from "./index-browser"
export * from "./types"
export * from "./prisma-utils"
export * from "./utils/run-prisma"
export * from "./middleware"
export * from "./paginate"
export {baseLogger, newLine, log} from "./logging"
export {startWatcher, stopWatcher} from "./cli/utils/routes-manifest"
// const blitzConfig = findBlitzConfigDirectory() as string
// const file = readFileSync(blitzConfig)
// export const Routes = eval(file.toString())
export interface MiddlewareResponse<C extends Ctx = Ctx> extends ServerResponse {
blitzCtx: C
@@ -59,3 +54,11 @@ export function createSetupServer<TMiddleware extends RequestMiddleware, TExport
) {
return setupServerConstructor
}
export const BlitzServerMiddleware = <
TMiddleware extends RequestMiddleware<any, any> = RequestMiddleware,
>(
middleware: TMiddleware,
): BlitzServerPlugin => ({
requestMiddlewares: [middleware],
})

View File

@@ -92,6 +92,10 @@ const withProgress = (str: string) => {
return withCaret(str)
}
const greenText = (str: string) => {
return `${c.green(str)}`
}
/**
* Logs a branded purple message to stdout.
*
@@ -182,6 +186,7 @@ export const log = {
progress,
spinner,
success,
greenText,
error,
variable,
debug,

Some files were not shown because too many files have changed in this diff Show More