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

Compare commits

...

25 Commits

Author SHA1 Message Date
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
74 changed files with 2191 additions and 704 deletions

View File

@@ -971,7 +971,8 @@
"profile": "https://twitter.com/dillonraphael",
"contributions": [
"code",
"doc"
"doc",
"test"
]
},
{
@@ -3630,6 +3631,35 @@
"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"
]
}
],
"contributorsPerLine": 7,

View File

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

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
---
Avoid `invalid config detected` warnings by deleting `"blitz"` key from next config object

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 `prisma generate` as a `blitz codegen` step if "prisma" is found in project's dependencies

View File

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

View File

@@ -27,6 +27,7 @@
"bright-mangos-run",
"calm-carpets-deny",
"calm-nails-wait",
"calm-tomatoes-drive",
"clean-walls-wink",
"cool-doors-invent",
"cool-horses-check",
@@ -36,6 +37,7 @@
"eleven-humans-sort",
"empty-berries-rule",
"empty-turkeys-wave",
"fair-carrots-guess",
"fair-wombats-sneeze",
"famous-kings-explain",
"fast-trainers-kneel",
@@ -49,15 +51,21 @@
"good-apes-drum",
"good-insects-wink",
"gorgeous-buses-scream",
"gorgeous-games-obey",
"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",
"late-steaks-give",
"lemon-games-press",
"lemon-seas-push",
"light-donkeys-double",
"lovely-colts-share",
"lucky-cows-try",
"mean-gorillas-reply",
@@ -74,6 +82,7 @@
"nine-onions-admire",
"ninety-lies-press",
"ninety-pets-heal",
"ninety-rice-tickle",
"olive-bees-buy",
"olive-feet-rhyme",
"olive-sheep-rhyme",
@@ -90,8 +99,10 @@
"quiet-feet-travel",
"quiet-pans-hunt",
"quiet-sloths-rule",
"red-badgers-retire",
"rich-chairs-invent",
"rich-queens-travel",
"shaggy-carpets-brake",
"sharp-falcons-begin",
"shy-olives-hang",
"shy-pumpkins-try",
@@ -105,23 +116,27 @@
"smooth-stingrays-drum",
"soft-adults-smell",
"sour-lemons-hunt",
"spicy-beds-float",
"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-lemons-smile",
"twenty-beans-pump",
"two-carpets-rhyme",
"two-eyes-knock",
"two-kiwis-help",
"two-tigers-type",
"unlucky-papayas-sleep",
@@ -130,6 +145,7 @@
"weak-suns-shave",
"wicked-ghosts-cough",
"wicked-rings-walk",
"wise-frogs-give"
"wise-frogs-give",
"wise-rabbits-complain"
]
}

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 @@
---
"@blitzjs/generator": patch
---
Fix template path for the generator

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 @@
---
"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/generator": patch
---
Update new app templates to use blitz-rpc's resolver function

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-385-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-388-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">
@@ -337,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> <a href="https://github.com/blitz-js/blitz/commits?author=dillonraphael" title="Documentation">📖</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>
@@ -704,6 +704,11 @@ Thanks to these wonderful people ([emoji key](https://allcontributors.org/docs/e
<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>
</tr>
</table>
<!-- markdownlint-restore -->

View File

@@ -29,7 +29,7 @@
"@blitzjs/rpc": "workspace:*",
"@hookform/resolvers": "2.8.8",
"@prisma/client": "4.0.0",
"blitz": "workspace:2.0.0-alpha.63",
"blitz": "workspace:2.0.0-alpha.67",
"next": "12.2.0",
"prisma": "4.0.0",
"react": "18.0.0",

View File

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

View File

@@ -1,5 +1,40 @@
# @blitzjs/auth
## 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

View File

@@ -1,6 +1,6 @@
{
"name": "@blitzjs/auth",
"version": "2.0.0-alpha.63",
"version": "2.0.0-alpha.67",
"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.63",
"blitz": "2.0.0-alpha.67",
"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.63",
"@blitzjs/config": "workspace:2.0.0-alpha.67",
"@testing-library/react": "13.0.0",
"@testing-library/react-hooks": "7.0.2",
"@types/cookie": "0.4.1",

View File

@@ -1,5 +1,35 @@
# @blitzjs/next
## 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

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

@@ -1,6 +1,6 @@
{
"name": "@blitzjs/next",
"version": "2.0.0-alpha.63",
"version": "2.0.0-alpha.67",
"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.63",
"@blitzjs/rpc": "2.0.0-alpha.67",
"@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",
"superjson": "1.8.0"
"superjson": "1.8.0",
"supports-color": "8.1.1"
},
"devDependencies": {
"@blitzjs/config": "workspace:2.0.0-alpha.63",
"@blitzjs/config": "workspace:2.0.0-alpha.67",
"@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.63",
"blitz": "2.0.0-alpha.67",
"cross-spawn": "7.0.3",
"find-up": "4.1.0",
"next": "12.2.0",
@@ -57,9 +58,5 @@
},
"publishConfig": {
"access": "public"
},
"peerDependencies": {
"next": ">=12.2.0",
"react": "*"
}
}

View File

@@ -209,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,38 @@
# @blitzjs/rpc
## 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

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.63",
"version": "2.0.0-alpha.67",
"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.63",
"@blitzjs/auth": "2.0.0-alpha.67",
"@tanstack/react-query": "4.0.10",
"b64-lite": "1.4.0",
"bad-behavior": "1.0.1",
"chalk": "^4.1.0",
"debug": "4.3.3",
"superjson": "1.8.0",
"zod": "3.17.3"
"supports-color": "8.1.1"
},
"devDependencies": {
"@blitzjs/config": "workspace:2.0.0-alpha.63",
"@blitzjs/config": "workspace:2.0.0-alpha.67",
"@types/debug": "4.1.7",
"@types/react": "18.0.1",
"@types/react-dom": "17.0.14",
"blitz": "2.0.0-alpha.63",
"blitz": "2.0.0-alpha.67",
"next": "12.2.0",
"react": "18.0.0",
"react-dom": "18.0.0",
"typescript": "^4.5.3",
"unbuild": "0.7.6",
"watch": "1.0.2"
},
"peerDependencies": {
"blitz": "2.0.0-alpha.63",
"next": ">=12.2.0"
"watch": "1.0.2",
"zod": "3.17.3"
},
"publishConfig": {
"access": "public"

View File

@@ -68,6 +68,11 @@ interface WebpackRule {
export interface InstallWebpackConfigOptions {
webpackConfig: {
resolve: {
alias: {
[key: string]: boolean
}
}
module: {
rules: WebpackRule[]
}
@@ -79,6 +84,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: [

View File

@@ -1,5 +1,46 @@
# blitz
## 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

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.63",
"version": "2.0.0-alpha.67",
"scripts": {
"build": "unbuild",
"dev": "watch unbuild src --wait=0.2",
@@ -23,7 +23,7 @@
"blitz": "bin/blitz"
},
"dependencies": {
"@blitzjs/generator": "2.0.0-alpha.63",
"@blitzjs/generator": "2.0.0-alpha.67",
"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.63",
"@blitzjs/config": "workspace:2.0.0-alpha.67",
"@types/cookie": "0.4.1",
"@types/cross-spawn": "6.0.2",
"@types/debug": "4.1.7",
@@ -78,9 +79,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

@@ -1,276 +1,261 @@
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"
export {}
// import arg from "arg"
// import {CliCommand} from "../index"
// import prompts from "prompts"
const getIsTypeScript = async () =>
require("fs").existsSync(require("path").join(process.cwd(), "tsconfig.json"))
// const getIsTypeScript = async () =>
// require("fs").existsSync(require("path").join(process.cwd(), "tsconfig.json"))
enum ResourceType {
All = "all",
Crud = "crud",
Model = "model",
Pages = "pages",
Queries = "queries",
Query = "query",
Mutations = "mutations",
Mutation = "mutation",
Resource = "resource",
}
// enum ResourceType {
// All = "all",
// Crud = "crud",
// Model = "model",
// Pages = "pages",
// Queries = "queries",
// Query = "query",
// Mutations = "mutations",
// Mutation = "mutation",
// Resource = "resource",
// }
function modelName(input: string = "") {
return singleCamel(input)
}
function modelNames(input: string = "") {
return pluralCamel(input)
}
function ModelName(input: string = "") {
return singlePascal(input)
}
function ModelNames(input: string = "") {
return pluralPascal(input)
}
// function modelName(input: string = "") {
// return singleCamel(input)
// }
// function modelNames(input: string = "") {
// return pluralCamel(input)
// }
// function ModelName(input: string = "") {
// return singlePascal(input)
// }
// function ModelNames(input: string = "") {
// return pluralPascal(input)
// }
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],
}
// 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],
// }
const args = arg(
{
// Types
"--help": Boolean,
"--type": String,
"--name": String,
"--context": String,
"--parent": String,
"--dry-run": Boolean,
"--env": String,
// const args = arg(
// {
// // Types
// "--help": Boolean,
// "--type": String,
// "--name": String,
// "--context": String,
// "--parent": String,
// "--dry-run": Boolean,
// "--env": String,
// Aliases
"-e": "--env",
"-n": "--name",
"-t": "--type",
"-c": "--context",
"-p": "--dry-run",
},
{
permissive: true,
},
)
// // Aliases
// "-e": "--env",
// "-n": "--name",
// "-t": "--type",
// "-c": "--context",
// "-p": "--dry-run",
// },
// {
// permissive: true,
// },
// )
let selectedType: string | keyof typeof generatorMap
let selectedModelName: string | undefined
let selectedContext: string | undefined
let selectedParent: string | undefined = args["--parent"] ?? undefined
// let selectedType: string | keyof typeof generatorMap
// let selectedModelName: string | undefined
// let selectedContext: string | undefined
// let selectedParent: string | undefined = args["--parent"] ?? undefined
const getModelNameAndContext = (
modelName: string,
context?: string,
): {model: string; context?: string} => {
const modelSegments = modelName.split(/[\\/]/)
// const getModelNameAndContext = (
// modelName: string,
// context?: string,
// ): {model: string; context?: string} => {
// const modelSegments = modelName.split(/[\\/]/)
if (modelSegments.length > 1) {
return {
model: modelSegments[modelSegments.length - 1] as string,
context: require("path").join(...modelSegments.slice(0, modelSegments.length - 1)),
}
}
// if (modelSegments.length > 1) {
// return {
// model: modelSegments[modelSegments.length - 1] as string,
// context: require("path").join(...modelSegments.slice(0, modelSegments.length - 1)),
// }
// }
if (Boolean(context)) {
const contextSegments = (context as string).split(/[\\/]/)
// if (Boolean(context)) {
// const contextSegments = (context as string).split(/[\\/]/)
return {
model: modelName,
context: require("path").join(...contextSegments),
}
}
// return {
// model: modelName,
// context: require("path").join(...contextSegments),
// }
// }
return {
model: modelName,
}
}
// return {
// model: modelName,
// }
// }
const validateModelName = (modelName: string): void => {
const RESERVED_MODEL_NAMES = ["page", "api", "query", "mutation"]
if (RESERVED_MODEL_NAMES.includes(modelName)) {
throw new Error(`Names ${RESERVED_MODEL_NAMES} or their plurals cannot be used as model names`)
}
if (!/^[A-Za-z][A-Za-z0-9_]*$/.test(modelName)) {
throw new Error(
`Invalid model name: "${modelName}". Model names need to adhere to this regular expression: [A-Za-z][A-Za-z0-9_]*`,
)
}
}
// const validateModelName = (modelName: string): void => {
// const RESERVED_MODEL_NAMES = ["page", "api", "query", "mutation"]
// if (RESERVED_MODEL_NAMES.includes(modelName)) {
// throw new Error(`Names ${RESERVED_MODEL_NAMES} or their plurals cannot be used as model names`)
// }
// if (!/^[A-Za-z][A-Za-z0-9_]*$/.test(modelName)) {
// throw new Error(
// `Invalid model name: "${modelName}". Model names need to adhere to this regular expression: [A-Za-z][A-Za-z0-9_]*`,
// )
// }
// }
const determineType = async () => {
if (
!args["_"].slice(1)[0] ||
(args["_"].slice(1)[0] &&
!Object.keys(generatorMap).includes(args["_"].slice(1)[0]?.toLowerCase() as string))
) {
const res = await prompts({
type: "select",
name: "type",
message: "Which files to generate",
initial: 0,
choices: Object.entries(generatorMap).map((c) => {
return {title: c[0], value: c[0]}
}),
})
// const determineType = async () => {
// if (
// !args["_"].slice(1)[0] ||
// (args["_"].slice(1)[0] &&
// !Object.keys(generatorMap).includes(args["_"].slice(1)[0]?.toLowerCase() as string))
// ) {
// const res = await prompts({
// type: "select",
// name: "type",
// message: "Which files to generate",
// initial: 0,
// choices: Object.entries(generatorMap).map((c) => {
// return {title: c[0], value: c[0]}
// }),
// })
selectedType = res.type
} else {
selectedType = args["_"].slice(1)[0]?.toLowerCase() as string
}
}
// selectedType = res.type
// } else {
// selectedType = args["_"].slice(1)[0]?.toLowerCase() as string
// }
// }
const determineName = async () => {
if (!args["_"].slice(1)[1]) {
const res = await prompts({
type: "text",
name: "model",
message: `The name of your model, like "user". Can be singular or plural - same result`,
})
// const determineName = async () => {
// if (!args["_"].slice(1)[1]) {
// const res = await prompts({
// type: "text",
// name: "model",
// message: `The name of your model, like "user". Can be singular or plural - same result`,
// })
const {model, context} = getModelNameAndContext(res.model)
selectedModelName = model
selectedContext = context
} else {
const {model, context} = getModelNameAndContext(args["_"].slice(1)[1]!)
selectedModelName = model
selectedContext = context
}
}
// const {model, context} = getModelNameAndContext(res.model)
// selectedModelName = model
// selectedContext = context
// } else {
// const {model, context} = getModelNameAndContext(args["_"].slice(1)[1]!)
// selectedModelName = model
// selectedContext = context
// }
// }
const determineContext = async () => {
if (args["--context"] && !selectedModelName) {
if (args["--name"] && args["--name"].includes("/")) {
throw new Error("Your model should not contain a context when supplying a context explicitly")
}
// const determineContext = async () => {
// if (args["--context"] && !selectedModelName) {
// if (args["--name"] && args["--name"].includes("/")) {
// throw new Error("Your model should not contain a context when supplying a context explicitly")
// }
const res = await prompts({
type: "text",
name: "model",
message: `The name of your model, like "user". Can be singular or plural - same result`,
})
// const res = await prompts({
// type: "text",
// name: "model",
// message: `The name of your model, like "user". Can be singular or plural - same result`,
// })
if (res.model.includes("/")) {
throw new Error("Your model should not contain a context when supplying a context explicitly")
}
const {model, context} = getModelNameAndContext(res.model, args["--context"])
selectedModelName = model
selectedContext = context
}
}
// if (res.model.includes("/")) {
// throw new Error("Your model should not contain a context when supplying a context explicitly")
// }
// const {model, context} = getModelNameAndContext(res.model, args["--context"])
// selectedModelName = model
// selectedContext = context
// }
// }
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
// const getHelp = async () => {
// if (args["--help"]) {
// console.log(`
// # The 'crud' type will generate all queries & mutations for a model
# The 'all' generator will scaffold out everything possible for a model
> blitz generate --type all --name products
// > blitz generate --type crud --name productVariant
# The '--context' flag will allow you to generate files in a nested folder
> blitz generate --type pages --name projects --context admin
// # The 'all' generator will scaffold out everything possible for a model
# Context can also be supplied in the model name directly
> blitz generate --type pages --name admin/projects
// > blitz generate --type all --name products
# 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
// # The '--context' flag will allow you to generate files in a nested folder
# 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").
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 pages --name projects --context admin
> blitz generate --type all --name tasks name:string completed:boolean:default=false belongsTo:project?
// # Context can also be supplied in the model name directly
`)
// > blitz generate --type pages --name admin/projects
process.exit(0)
}
}
// # 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/
const generate: CliCommand = async (argv) => {
await getHelp()
await determineType()
await determineContext()
if (!selectedModelName) {
await determineName()
}
// > blitz generate --type all --name tasks --parent=projects
try {
const singularRootContext = modelName(selectedModelName)
validateModelName(singularRootContext)
// # 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").
// Both of the commands below will generate the proper database model for a Task.
// const {loadConfigProduction} = await import("next/dist/server/config-shared")
// const blitzConfig = loadConfigProduction(process.cwd())
const generators = generatorMap[selectedType as keyof typeof generatorMap]
// > blitz generate --type model --name task name:string completed:boolean:default=false belongsTo:project?
for (const GeneratorClass of generators) {
const generator = new GeneratorClass({
destinationRoot: require("path").resolve(),
// templateDir: blitzConfig.codegen?.templateDir,
extraArgs: args["_"].slice(3) as string[],
modelName: singularRootContext,
modelNames: modelNames(singularRootContext),
ModelName: ModelName(singularRootContext),
ModelNames: ModelNames(singularRootContext),
parentModel: modelName(selectedParent),
parentModels: modelNames(selectedParent),
ParentModel: ModelName(selectedParent),
ParentModels: ModelNames(selectedParent),
name: uncapitalize(selectedModelName!),
Name: capitalize(selectedModelName!),
dryRun: args["--dry-run"],
context: selectedContext,
useTs: await getIsTypeScript(),
})
await generator.run()
}
} catch (error) {
console.log(error)
process.exit(1)
}
}
// > blitz generate --type all --name tasks name:string completed:boolean:default=false belongsTo:project?
export {generate}
// `)
// process.exit(0)
// }
// }
// const generate: CliCommand = async (argv) => {
// await getHelp()
// await determineType()
// await determineContext()
// if (!selectedModelName) {
// await determineName()
// }
// try {
// const singularRootContext = modelName(selectedModelName)
// validateModelName(singularRootContext)
// // const {loadConfigProduction} = await import("next/dist/server/config-shared")
// // const blitzConfig = loadConfigProduction(process.cwd())
// const generators = generatorMap[selectedType as keyof typeof generatorMap]
// for (const GeneratorClass of generators) {
// const generator = new GeneratorClass({
// destinationRoot: require("path").resolve(),
// // templateDir: blitzConfig.codegen?.templateDir,
// extraArgs: args["_"].slice(3) as string[],
// modelName: singularRootContext,
// modelNames: modelNames(singularRootContext),
// ModelName: ModelName(singularRootContext),
// ModelNames: ModelNames(singularRootContext),
// parentModel: modelName(selectedParent),
// parentModels: modelNames(selectedParent),
// ParentModel: ModelName(selectedParent),
// ParentModels: ModelNames(selectedParent),
// name: uncapitalize(selectedModelName!),
// Name: capitalize(selectedModelName!),
// dryRun: args["--dry-run"],
// context: selectedContext,
// useTs: await getIsTypeScript(),
// })
// await generator.run()
// }
// } catch (error) {
// console.log(error)
// process.exit(1)
// }
// }
// export {generate}

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,19 @@ 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"
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 +73,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 +108,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 +127,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 +146,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 +200,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 {

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
@@ -124,7 +124,6 @@ async function main() {
if (args["--env"]) {
process.env.APP_ENV = args["--env"]
}
loadEnvConfig(process.cwd(), undefined, {error: console.error, info: console.info})
// Version is inlined into the file using taskr build pipeline
if (args["_"].length === 0 && args["--version"]) {
@@ -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()
} 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,19 @@ 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()
// void checkLatestVersion()
if (customServerExists()) {
console.log("Using your custom server")

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

@@ -1,38 +0,0 @@
export type AsyncFunc = (...args: any) => Promise<any>
/**
* Infer the type of the parameter from function that takes a single argument
*/
export type FirstParam<F extends (...args: any) => Promise<any>> = Parameters<F>[0]
/**
* If type has a Promise, unwrap it. Otherwise return the original type
*/
export type Await<T> = T extends PromiseLike<infer U> ? U : T
/**
* Ensure the type is a promise
*/
export type EnsurePromise<T> = T extends PromiseLike<unknown> ? T : Promise<T>
/**
* Get the return type of a function which returns a Promise.
*/
export type PromiseReturnType<T extends (...args: any) => Promise<any>> = Await<ReturnType<T>>
export interface CancellablePromise<T> extends Promise<T> {
cancel?: Function
}
export type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (
k: infer I,
) => void
? I
: never
export type Simplify<T> = {[P in keyof T]: T[P]}
export type AddParameters<
TFunction extends (...args: any) => any,
TParameters extends [...args: any],
> = (...args: [...Parameters<TFunction>, ...TParameters]) => ReturnType<TFunction>

View File

@@ -5,3 +5,42 @@ export interface Ctx {}
export interface RouteUrlObject extends Pick<UrlObject, "pathname" | "query"> {
pathname: string
}
export type AsyncFunc = (...args: any) => Promise<any>
/**
* Infer the type of the parameter from function that takes a single argument
*/
export type FirstParam<F extends (...args: any) => Promise<any>> = Parameters<F>[0]
/**
* If type has a Promise, unwrap it. Otherwise return the original type
*/
export type Await<T> = T extends PromiseLike<infer U> ? U : T
/**
* Ensure the type is a promise
*/
export type EnsurePromise<T> = T extends PromiseLike<unknown> ? T : Promise<T>
/**
* Get the return type of a function which returns a Promise.
*/
export type PromiseReturnType<T extends (...args: any) => Promise<any>> = Await<ReturnType<T>>
export interface CancellablePromise<T> extends Promise<T> {
cancel?: Function
}
export type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (
k: infer I,
) => void
? I
: never
export type Simplify<T> = {[P in keyof T]: T[P]}
export type AddParameters<
TFunction extends (...args: any) => any,
TParameters extends [...args: any],
> = (...args: [...Parameters<TFunction>, ...TParameters]) => ReturnType<TFunction>

View File

@@ -1,6 +1,4 @@
import {RequestMiddleware} from "./index-server"
import * as path from "path"
import * as fs from "fs"
import {RequestMiddleware} from "../index-server"
export function assert(condition: any, message: string): asserts condition {
if (!condition) throw new Error(message)

View File

@@ -1,7 +1,5 @@
import {spawn} from "cross-spawn"
import which from "npm-which"
import {Readable} from "stream"
import pEvent from "p-event"
export interface Constructor<T = unknown> {
new (...args: never[]): T
@@ -54,26 +52,3 @@ export const enhancePrisma = <TPrismaClientCtor extends Constructor>(
},
})
}
export const runPrisma = async (args: string[], silent = false) => {
const prismaBin = which(process.cwd()).sync("prisma")
const cp = 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 pEvent(cp, "exit", {rejectionEvents: []})
return {
success: code === 0,
stderr: silent ? cp_stderr.join("") : undefined,
}
}

View File

@@ -0,0 +1,27 @@
import which from "npm-which"
import pEvent from "p-event"
import {Readable} from "stream"
import {spawn} from "cross-spawn"
export const runPrisma = async (args: string[], silent = false) => {
const prismaBin = which(process.cwd()).sync("prisma")
const cp = 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 pEvent(cp, "exit", {rejectionEvents: []})
return {
success: code === 0,
stderr: silent ? cp_stderr.join("") : undefined,
}
}

View File

@@ -3,8 +3,8 @@ import {createServer, IncomingMessage, ServerResponse} from "http"
import fetch from "node-fetch"
import listen from "test-listen"
import {Stream} from "stream"
import {Middleware} from "./index-server"
import {handleRequestWithMiddleware} from "./middleware"
import {Middleware} from "../src/index-server"
import {handleRequestWithMiddleware} from "../src/middleware"
export function sendData(res: ServerResponse, body: any): void {
if (body === null || body === undefined) {

View File

@@ -1,5 +1,5 @@
import {describe, it, expect} from "vitest"
import {paginate} from "./paginate"
import {paginate} from "../src/paginate"
describe("paginate", () => {
const dummyPaginationPromises = {

View File

@@ -1,6 +1,6 @@
import {describe, it, expect} from "vitest"
import {z} from "zod"
import {formatZodError, validateZodSchema} from "./zod-utils"
import {formatZodError, validateZodSchema} from "../src/utils/zod"
const validateSchema = (schema: any, input: any) => {
const result = schema.safeParse(input)

View File

@@ -1,5 +1,47 @@
# @blitzjs/codemod
## 2.0.0-alpha.67
### Patch Changes
- Updated dependencies [ebd74b4e]
- @blitzjs/generator@2.0.0-alpha.67
- blitz@2.0.0-alpha.67
## 2.0.0-alpha.66
### Patch Changes
- Updated dependencies [91aa5356]
- Updated dependencies [928e840b]
- Updated dependencies [240f3f34]
- Updated dependencies [55b1cb20]
- Updated dependencies [4d7d126d]
- Updated dependencies [890b0c0c]
- Updated dependencies [807a2b56]
- Updated dependencies [a3e6c49c]
- Updated dependencies [065db256]
- Updated dependencies [f202aac1]
- @blitzjs/generator@2.0.0-alpha.66
- blitz@2.0.0-alpha.66
## 2.0.0-alpha.65
### Patch Changes
- Updated dependencies [dd5f5174]
- blitz@2.0.0-alpha.65
- @blitzjs/generator@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/generator@2.0.0-alpha.64
## 2.0.0-alpha.63
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@blitzjs/codemod",
"version": "2.0.0-alpha.63",
"version": "2.0.0-alpha.67",
"scripts": {
"build": "unbuild",
"dev": "watch unbuild src --wait=0.2",
@@ -25,9 +25,9 @@
"@babel/plugin-proposal-class-properties": "7.17.12",
"@babel/plugin-syntax-jsx": "7.17.12",
"@babel/plugin-syntax-typescript": "7.17.12",
"@blitzjs/generator": "2.0.0-alpha.63",
"@blitzjs/generator": "2.0.0-alpha.67",
"arg": "5.0.1",
"blitz": "2.0.0-alpha.63",
"blitz": "2.0.0-alpha.67",
"chalk": "^4.1.0",
"cross-spawn": "7.0.3",
"debug": "4.3.3",

View File

@@ -1,5 +1,13 @@
# @blitzjs/config
## 2.0.0-alpha.67
## 2.0.0-alpha.66
## 2.0.0-alpha.65
## 2.0.0-alpha.64
## 2.0.0-alpha.63
## 2.0.0-alpha.62

View File

@@ -1,7 +1,7 @@
{
"name": "@blitzjs/config",
"private": true,
"version": "2.0.0-alpha.63",
"version": "2.0.0-alpha.67",
"license": "MIT",
"dependencies": {
"@typescript-eslint/eslint-plugin": "5.9.1",

View File

@@ -1,5 +1,26 @@
# @blitzjs/generator
## 2.0.0-alpha.67
### Patch Changes
- ebd74b4e: Fix template path for the generator
## 2.0.0-alpha.66
### Patch Changes
- 91aa5356: Include `.env.test` file to the generator templates
- 890b0c0c: Improve `blitz new` messaging and fix minor issues
- 807a2b56: Fixes peer dependency warnings
- a3e6c49c: Fixes the supports-color warning for pnpm
- 065db256: Update new app templates to use blitz-rpc's resolver function
- f202aac1: Mocks @blitzjs/auth instead of blitz inside the forgotPassword mutation test & hardcodes blitz package version types instead of just using the alpha tag.
## 2.0.0-alpha.65
## 2.0.0-alpha.64
## 2.0.0-alpha.63
## 2.0.0-alpha.62

View File

@@ -1,6 +1,6 @@
{
"name": "@blitzjs/generator",
"version": "2.0.0-alpha.63",
"version": "2.0.0-alpha.67",
"scripts": {
"dev": "watch unbuild src --wait=0.2",
"build": "unbuild && pnpm build:templates",
@@ -40,12 +40,13 @@
"pluralize": "8.0.0",
"prettier": "^2.5.1",
"recast": "0.20.5",
"supports-color": "8.1.1",
"tslog": "3.3.1",
"username": "5.1.0",
"vinyl": "2.2.1"
},
"devDependencies": {
"@blitzjs/config": "2.0.0-alpha.63",
"@blitzjs/config": "2.0.0-alpha.67",
"@juanm04/cpx": "2.0.1",
"@types/babel__core": "7.1.19",
"@types/diff": "5.0.2",
@@ -70,8 +71,5 @@
},
"publishConfig": {
"access": "public"
},
"peerDependencies": {
"react": "*"
}
}

View File

@@ -4,9 +4,9 @@ import {readJSONSync, writeJson} from "fs-extra"
import {join} from "path"
import username from "username"
import {Generator, GeneratorOptions, SourceRootType} from "../generator"
import {baseLogger, log} from "../utils/log"
import {fetchLatestVersionsFor} from "../utils/fetch-latest-version-for"
import {getBlitzDependencyVersion} from "../utils/get-blitz-dependency-version"
import {baseLogger, log} from "../utils/log"
function assert(condition: any, message: string): asserts condition {
if (!condition) throw new Error(message)
@@ -27,7 +27,7 @@ export interface AppGeneratorOptions extends GeneratorOptions {
version: string
skipInstall: boolean
skipGit: boolean
form?: "React Final Form" | "React Hook Form" | "Formik"
form?: "finalform" | "hookform" | "formik"
onPostInstall?: () => Promise<void>
}
@@ -126,6 +126,9 @@ export class AppGenerator extends Generator<AppGeneratorOptions> {
pkg.dependencies = newDependencies
pkg.devDependencies = newDevDependencies
pkg.dependencies.blitz = blitzDependencyVersion
pkg.dependencies["@blitzjs/next"] = blitzDependencyVersion
pkg.dependencies["@blitzjs/rpc"] = blitzDependencyVersion
pkg.dependencies["@blitzjs/auth"] = blitzDependencyVersion
const fallbackUsed = dependenciesUsedFallback || devDependenciesUsedFallback
@@ -299,21 +302,18 @@ export class AppGenerator extends Generator<AppGeneratorOptions> {
assert(pkg, "couldn't find package.json")
const ext = this.options.useTs ? "tsx" : "js"
let type: string = ""
switch (this.options.form) {
case "React Final Form":
type = "finalform"
const type = this.options.form
switch (type) {
case "finalform":
pkg.dependencies["final-form"] = "4.x"
pkg.dependencies["react-final-form"] = "6.x"
break
case "React Hook Form":
type = "hookform"
case "hookform":
pkg.dependencies["react-hook-form"] = "7.x"
pkg.dependencies["@hookform/resolvers"] = "2.x"
break
case "Formik":
type = "formik"
case "formik":
pkg.dependencies["formik"] = "2.x"
break
}

View File

@@ -0,0 +1,5 @@
# SQLite is ready to go out of the box, but you can switch to Postgres
# by first changing the provider from "sqlite" to "postgres" in the Prisma
# schema file and by second swapping the DATABASE_URL below.
DATABASE_URL="file:./db_test.sqlite"
# DATABASE_URL=postgresql://__username__@localhost:5432/__name___test

View File

@@ -1,9 +1,9 @@
import { NotFoundError, AuthenticationError } from "blitz"
import { resolver } from "@blitzjs/rpc"
import { SecurePassword } from "@blitzjs/auth"
import db from "db"
import { authenticateUser } from "./login"
import { ChangePassword } from "../validations"
import { resolver } from "@blitzjs/rpc"
import { SecurePassword } from "@blitzjs/auth"
export default resolver.pipe(
resolver.zod(ChangePassword),

View File

@@ -9,8 +9,8 @@ beforeEach(async () => {
})
const generatedToken = "plain-token"
jest.mock("blitz", () => ({
...jest.requireActual<Record<string, unknown>>("blitz")!,
jest.mock("@blitzjs/auth", () => ({
...jest.requireActual<Record<string, unknown>>("@blitzjs/auth")!,
generateToken: () => generatedToken,
}))
jest.mock("preview-email", () => jest.fn())

View File

@@ -1,4 +1,5 @@
import { SecurePassword, hash256 } from "@blitzjs/auth"
import { resolver } from "@blitzjs/rpc"
import db from "db"
import { ResetPassword } from "../validations"
import login from "./login"
@@ -8,10 +9,9 @@ export class ResetPasswordError extends Error {
message = "Reset password link is invalid or it has expired."
}
export default async function resetPassword(input, ctx) {
ResetPassword.parse(input)
export default resolver.pipe(resolver.zod(ResetPassword), async ({ password, token }, ctx) => {
// 1. Try to find this token in the database
const hashedToken = hash256(input.token)
const hashedToken = hash256(token)
const possibleToken = await db.token.findFirst({
where: { hashedToken, type: "RESET_PASSWORD" },
include: { user: true },
@@ -32,7 +32,7 @@ export default async function resetPassword(input, ctx) {
}
// 5. Since token is valid, now we can update the user's password
const hashedPassword = await SecurePassword.hash(input.password.trim())
const hashedPassword = await SecurePassword.hash(password.trim())
const user = await db.user.update({
where: { id: savedToken.userId },
data: { hashedPassword },
@@ -42,7 +42,7 @@ export default async function resetPassword(input, ctx) {
await db.session.deleteMany({ where: { userId: user.id } })
// 7. Now log the user in with the new credentials
await login({ email: user.email, password: input.password }, ctx)
await login({ email: user.email, password }, ctx)
return true
}
})

View File

@@ -1,21 +1,16 @@
import db from "db"
import { SecurePassword } from "@blitzjs/auth"
import { resolver } from "@blitzjs/rpc"
import db from "db"
import { Role } from "types"
import { Signup } from "../validations"
export default async function signup(input, ctx) {
const blitzContext = ctx
const hashedPassword = await SecurePassword.hash((input.password as string) || "test-password")
const email = (input.email as string) || "test" + Math.random() + "@test.com"
export default resolver.pipe(resolver.zod(Signup), async ({ email, password }, ctx) => {
const hashedPassword = await SecurePassword.hash(password.trim())
const user = await db.user.create({
data: { email, hashedPassword, role: "user" },
data: { email: email.toLowerCase().trim(), hashedPassword, role: "USER" },
select: { id: true, name: true, email: true, role: true },
})
await blitzContext.session.$create({
userId: user.id,
role: user.role as Role,
})
return { userId: blitzContext.session.userId, ...user, email: input.email }
}
await ctx.session.$create({ userId: user.id, role: user.role as Role })
return user
})

View File

@@ -0,0 +1,5 @@
# SQLite is ready to go out of the box, but you can switch to Postgres
# by first changing the provider from "sqlite" to "postgres" in the Prisma
# schema file and by second swapping the DATABASE_URL below.
DATABASE_URL="file:./db_test.sqlite"
# DATABASE_URL=postgresql://__username__@localhost:5432/__name___test

View File

@@ -25,7 +25,7 @@
"@typescript-eslint/parser": "5.9.1"
},
"devDependencies": {
"@blitzjs/config": "2.0.0-alpha.63",
"@blitzjs/config": "2.0.0-alpha.67",
"@types/react": "18.0.1",
"@types/react-dom": "17.0.14",
"react": "18.0.0",

1534
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff