1
0
mirror of synced 2026-02-03 18:01:02 -05:00

Compare commits

...

368 Commits

Author SHA1 Message Date
Blitz.js Bot
fa6e96731a (meta) updated @iojcde contributions 2022-07-25 08:36:58 -04:00
Blitz.js Bot
f59dfda878 (meta) added @iojcde as contributor 2022-07-22 10:43:55 -04:00
Blitz.js Bot
e15c62a8d8 (meta) added @SerekKiri as contributor 2022-07-20 02:12:31 -04:00
Blitz.js Bot
f97c123ddb (meta) updated @the-bayer contributions 2022-07-14 06:11:38 -04:00
Blitz.js Bot
7fd287f004 (meta) updated @Zeko369 contributions 2022-07-12 08:41:32 -04:00
Blitz.js Bot
f0bbdf561d (meta) added @Trancever as contributor 2022-07-11 05:35:13 -04:00
Brandon Bayer
a9c6bcc63f Update CODEOWNERS 2022-07-05 18:06:07 +02:00
Blitz.js Bot
e1fc695d24 (meta) updated @datner contributions 2022-06-30 05:05:37 -04:00
Blitz.js Bot
525e436b9d (meta) added @sergous as contributor 2022-06-20 07:19:40 -04:00
Blitz.js Bot
a98f972bef (meta) added @remlse as contributor 2022-06-20 06:50:14 -04:00
Blitz.js Bot
1c2fdfee37 (meta) added @datner as contributor 2022-06-19 12:13:48 -04:00
Blitz.js Bot
8102086400 (meta) added @jakedee as contributor 2022-06-19 08:49:58 -04:00
Blitz.js Bot
0366729a95 (meta) updated @andreasasprou contributions 2022-06-13 11:07:46 -04:00
Blitz.js Bot
352d2af366 (meta) added @iDavidB as contributor 2022-06-08 17:50:05 -04:00
Blitz.js Bot
9b8c4039f0 (meta) added @webdeb as contributor 2022-06-07 13:09:03 -04:00
Blitz.js Bot
262b647855 (meta) added @minho42 as contributor 2022-06-07 13:05:48 -04:00
Min ho Kim
03017046f7 Fix typos in docs (#3395)
(ignore)
2022-06-07 10:05:43 -07:00
Blitz.js Bot
28d2671ddb (meta) added @paulm17 as contributor 2022-06-07 13:02:32 -04:00
Blitz.js Bot
86da1612da (meta) added @rmassie as contributor 2022-06-07 12:59:17 -04:00
Blake Bayer
919465c9b6 Add try/catch in change password mutation (#3337)
* Revert "Update change password w/ try/catch"

This reverts commit 186532ef2d.

* Update changePassword.ts

* Update packages/generator/templates/app/app/auth/mutations/changePassword.ts

Co-authored-by: Aleksandra <alexsandra.sikora@gmail.com>

* Update changePassword.ts

* Apply suggestions from code review

Co-authored-by: Aleksandra <alexsandra.sikora@gmail.com>
2022-05-10 11:27:13 +02:00
Blitz.js Bot
b84ed74496 (meta) updated @ganeshmani contributions 2022-05-08 08:44:55 -04:00
Blitz.js Bot
dc86c78bd1 (meta) added @the-bayer as contributor 2022-04-29 08:31:27 -04:00
Blake Bayer
45b38cc836 Revert "Update change password w/ try/catch" (#3323)
This reverts commit 186532ef2d.
2022-04-29 14:31:23 +02:00
the-bayer
186532ef2d Update change password w/ try/catch 2022-04-27 11:30:25 -04:00
Blitz.js Bot
77858c5558 (meta) updated @dillonraphael contributions 2022-04-15 08:35:51 -04:00
Aleksandra
e9a98ffe3d bump recipe/example versions (ignore) 2022-04-12 12:46:49 +02:00
Aleksandra
2c06dd6f18 v0.45.4 2022-04-12 12:45:36 +02:00
Aleksandra
881d686233 Upgradereact and @types/react in new app templates, update types (#3282)
(newapp)
2022-04-12 12:38:49 +02:00
Blitz.js Bot
a7deaafbc7 (meta) updated @dillonraphael contributions 2022-04-07 12:46:42 -04:00
Blitz.js Bot
7c698f0b35 (meta) added @Caslus as contributor 2022-04-04 04:45:50 -04:00
Blitz.js Bot
09a8c94392 (meta) added @timfee as contributor 2022-04-04 04:36:59 -04:00
Tim Feeley
35b9ded76e Fix typo in recipe step name (#3265)
(ignore)
2022-04-04 10:36:54 +02:00
Blitz.js Bot
85c10b9d3f (meta) added @davidbarker as contributor 2022-04-04 04:20:49 -04:00
Blitz.js Bot
2675942c58 (meta) added @jscyo as contributor 2022-03-28 05:59:31 -04:00
Aleksandra
b3ad310f6f Add JDLT to sponsors list (#3226)
(meta)
2022-03-10 10:20:09 -05:00
Blitz.js Bot
d41385b592 (meta) added @numanaral as contributor 2022-03-06 14:37:25 -05:00
Husnul Jahneer
dfbab3919d Add @husnuljahneer as L1 Maintainer (#3142)
(meta)
2022-02-28 10:50:13 -05:00
Blitz.js Bot
e5c607164e (meta) added @eai04191 as contributor 2022-02-24 19:20:19 -05:00
John Vandivier
49d1e91a64 don't suggest faker.js in code comments (#3178)
(newapp)
2022-02-23 10:09:58 +01:00
Blitz.js Bot
19ea640705 (meta) added @Lokprakash-babu as contributor 2022-02-23 03:03:14 -05:00
Brandon Bayer
f2d814813f (newapp) change preview-email to just in time import so it doesn't need to be in production deps 2022-02-17 11:29:31 -05:00
dependabot[bot]
f99ebf5f37 Bump superjson from 1.7.5 to 1.8.1 in /nextjs (#3165)
Bumps [superjson](https://github.com/blitz-js/superjson) from 1.7.5 to 1.8.1.
- [Release notes](https://github.com/blitz-js/superjson/releases)
- [Commits](https://github.com/blitz-js/superjson/compare/v1.7.5...v1.8.1)

---
updated-dependencies:
- dependency-name: superjson
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-11 12:43:41 +01:00
Aleksandra
ef2c0cdd67 bump recipe/example versions (ignore) 2022-02-09 17:07:08 +01:00
Aleksandra
d658af7407 v0.45.3 2022-02-09 17:05:40 +01:00
Brandon Bayer
0f8f15f31c upgrade superjson (#3162)
(patch)
2022-02-09 10:51:50 -05:00
Brandon Bayer
600467035a fix blitz logging to respect FORCE_COLOR=0 (#3157)
(patch)
2022-02-09 12:40:12 +01:00
Aleksandra Sikora
d25aee1313 Bump @prisma/sdk in installer and cli packages (#3158)
(ignore)
2022-02-08 13:45:33 +01:00
dependabot[bot]
0cc2a3aab7 Bump node-fetch from 2.6.1 to 2.6.7 in /nextjs (#3156)
(ignore)
2022-02-08 11:09:14 +01:00
Mochi
75e6b9fb74 Add NextUI recipe (#3152)
(recipe)
2022-02-07 11:50:50 +01:00
Aleksandra Sikora
6e8a65fa7f Update sponsors list (#3153)
(ignore)
2022-01-28 17:01:24 +01:00
Blitz.js Bot
01dce6b09a (meta) added @ReykCS as contributor 2022-01-26 14:21:20 -05:00
Aleksandra Sikora
ceeed729c6 Remove outdated tests (#3141)
(ignore)
2022-01-24 13:16:40 +01:00
Blitz.js Bot
7f35af5bd2 (meta) added @husnuljahneer as contributor 2022-01-23 08:30:20 -05:00
Blitz.js Bot
c603195004 (meta) added @shellord as contributor 2022-01-21 05:45:44 -05:00
saheenshoukath
bac35e06c8 Add @shellord as L1 maintainer (#3140) 2022-01-21 11:45:39 +01:00
Aleksandra
7add9cad87 bump recipe/example versions (ignore) 2022-01-20 11:41:47 +01:00
Aleksandra
16dae9b081 v0.45.2 2022-01-20 11:40:16 +01:00
Brandon Bayer
9f52f36c18 Fix passport adapter secureProxy to always work regardless of request headers (#3135)
(patch)
2022-01-19 17:29:21 -05:00
Aleksandra
621d87fdb7 bump recipe/example versions (ignore) 2022-01-18 18:28:24 +01:00
Aleksandra
871e709076 v0.45.1 2022-01-18 18:27:00 +01:00
Brandon Bayer
1e3ae5d445 fix passport adapter to work behind cloudfront (#3132)
(patch)
2022-01-18 12:11:23 -05:00
Aleksandra Sikora
a344c1f89e Update Seedling Sponsors list (#3130)
(ignore)
2022-01-17 11:02:34 +01:00
Blitz.js Bot
ee742530d9 (meta) added @Nfinished as contributor 2022-01-10 07:17:38 -05:00
Adam Trager
f102f4c873 Fix useRedirectAuthenticatedSession is not a function (#3117)
(patch)
2022-01-10 13:17:32 +01:00
Aleksandra
eebeeee6b7 bump recipe/example versions (ignore) 2022-01-06 16:27:01 +01:00
Aleksandra
18842fd56f v0.45.0 2022-01-06 16:25:41 +01:00
Blitz.js Bot
ea1e75b355 (meta) added @ospfranco as contributor 2022-01-04 06:59:45 -05:00
Aleksandra Sikora
34ed51a0db Fix blitz g mutation creating a file with invalid name (#3104)
(patch)
2022-01-03 19:24:08 +01:00
Marcus Reinhardt
4ce4bb92bb Add addRunCommandStep to the recipe builder (#3090)
(recipes)
2022-01-03 17:00:05 +01:00
Blitz.js Bot
75ed86eafb (meta) added @maltekiessling as contributor 2022-01-01 15:57:06 -05:00
Blitz.js Bot
a4bcfb4737 (meta) added @dineshgadge as contributor 2021-12-29 13:05:08 -05:00
Dinesh Gadge
bfd3be403e Fix RedirectError not redirecting on the client (#3100)
(patch)
2021-12-29 19:05:03 +01:00
Brandon Bayer
bfd75229c1 bump recipe/example versions (ignore) 2021-12-24 12:54:12 -05:00
Brandon Bayer
91172b82d9 v0.45.0-canary.0 2021-12-24 12:52:42 -05:00
Blitz.js Bot
c9f416713a (meta) added @robertrisch as contributor 2021-12-23 09:24:26 -05:00
Blitz.js Bot
11eb4208e6 (meta) added @arpitdalal as contributor 2021-12-21 17:18:42 -05:00
Aleksandra Sikora
fbd387a30c Update sponsors list (#3089)
(ignore)
2021-12-21 17:44:56 +01:00
Blitz.js Bot
018e2405f2 (meta) added @c-ciobanu as contributor 2021-12-21 07:59:16 -05:00
Blitz.js Bot
c631f1ef15 (meta) added @sarahdayan as contributor 2021-12-20 12:21:38 -05:00
Sarah Dayan
3ce4f97de7 Update links to PostgreSQL guide (#3087)
(meta)
2021-12-20 18:21:33 +01:00
JuanM04
77ad2c02ce Update material-ui recipe — remove @mui/styles (#3076)
(recipe)
2021-12-20 15:19:51 +01:00
Aleksandra Sikora
ecf5a29e19 Support custom templates folder with blitz generate (#3068)
(minor)
2021-12-17 16:42:58 +01:00
Blitz.js Bot
ec8632a3e9 (meta) added @kreako as contributor 2021-12-16 09:11:53 -05:00
Blitz.js Bot
98f91e24c1 (meta) added @SofianeDjellouli as contributor 2021-12-14 05:56:59 -05:00
Blitz.js Bot
49c5a1e1be (meta) updated @zenhob contributions 2021-12-14 05:50:28 -05:00
Francesco Sardo
9a00412049 Fix inconsistent formatting in LoginForm component and Login page (#3063)
(newapp)
2021-12-13 16:48:04 +01:00
John Vandivier
03fd49bb29 Use free tier by default in Render recipe (#3060)
(recipe)
2021-12-13 12:41:13 +01:00
Brandon Bayer
8b607b9463 bump recipe/example versions (ignore) 2021-12-11 17:00:54 -05:00
Brandon Bayer
e3472171a5 v0.44.4 2021-12-11 16:59:28 -05:00
Aleksandra Sikora
5f1c6a4571 Move installer package to nextjs/packages (#3044)
(patch)
2021-12-10 13:26:54 +01:00
Mochi
d05f00c0a8 Update tailwindcss recipe to v3 (#3050)
(recipe)
2021-12-10 12:22:13 +01:00
Aleksandra Sikora
0715bb7a02 Load env vars for blitz new command - ignore cached variables (#3043)
(patch)
2021-12-09 19:30:49 +01:00
JuanM04
00d1ddff0b Set blitz version to latest in new apps templates (#3048)
(newapp)
2021-12-09 15:52:56 +01:00
Blitz.js Bot
0f99de91ae (meta) added @skotchpine as contributor 2021-12-08 13:18:08 -05:00
tyler
9cff223033 Load nested mutations and queries in blitz console (#3031)
(patch)
2021-12-08 19:18:02 +01:00
Aleksandra Sikora
1d6021dd36 Upgrade @mrleebo/prisma-ast version and fix breaking @db.Text (#3041)
(patch)
2021-12-08 18:20:04 +01:00
Aleksandra Sikora
c4df5d8d04 Remove nullish coalescing from post-install script (#3040)
(patch)
2021-12-08 16:25:02 +01:00
Brandon Bayer
9019f1cf27 bump recipe/example versions (ignore) 2021-12-06 18:19:46 -05:00
Brandon Bayer
d92b7efe00 v0.44.3 2021-12-06 18:18:25 -05:00
Brandon Bayer
daea45eeb2 relax some unnecessary type requirements for blitz.config.ts (#3036)
(patch)
2021-12-06 18:17:02 -05:00
Brandon Bayer
8dcc5ebe23 fix blitz build not loading production env by default (#3037)
(patch)
2021-12-06 18:16:41 -05:00
Brandon Bayer
d36138361d bump recipe/example versions (ignore) 2021-12-06 15:56:24 -05:00
Brandon Bayer
831b0d4bcd v0.44.2 2021-12-06 15:55:01 -05:00
Brandon Bayer
5d9fcd22be fix env file loading to default to development instead of production (#3033)
(patch)
2021-12-06 15:52:50 -05:00
Brandon Bayer
1c51ab403b fix so that blitz config env config values can be type string | undefined (#3034)
(patch)
2021-12-06 15:52:09 -05:00
Brandon Bayer
c3c9e89302 bump recipe/example versions (ignore) 2021-12-06 13:05:55 -05:00
Brandon Bayer
e842c9f224 v0.44.1 2021-12-06 13:04:26 -05:00
JuanM04
abeb0c5d14 Fix APP_ENV loading to not load all .env files (#3026)
Co-authored-by: Brandon Bayer <b@bayer.ws> (patch)
2021-12-06 13:02:41 -05:00
Brandon Bayer
18d1a685a9 Fix windows incompatibility with nested dependency (#3030)
(patch)
2021-12-06 12:56:48 -05:00
Blitz.js Bot
9255050eee (meta) added @MukulKolpe as contributor 2021-12-06 12:20:37 -05:00
Mukul Kolpe
915f5fa479 Fix next_stdlib__WEBPACK_IMPORTED_MODULE_1__.connectMiddleware is not a function (#3024)
(patch)
2021-12-06 12:20:32 -05:00
Aleksandra Sikora
24dcac6978 Fix jest-preset syntax error (#3027)
(patch)
2021-12-06 11:50:04 -05:00
JuanM04
adef11ba8e Update default app blitz-env.d.ts 2021-12-05 19:45:18 -03:00
Blitz.js Bot
4233caa909 (meta) added @david-arteaga as contributor 2021-12-05 09:47:39 -05:00
Aleksandra
8f5cad91d4 bump recipe/example versions (ignore) 2021-12-03 22:55:11 +01:00
Aleksandra
ac5121beda v0.44.0 2021-12-03 22:53:40 +01:00
Aleksandra Sikora
5460fbb484 Move display package to nextjs fork (#2989)
(meta)
2021-12-03 16:46:55 -05:00
Aleksandra Sikora
ad71e15290 Make prefetching work with usePaginatedQuery and useInfiniteQuery (#3014)
(patch)
2021-12-03 20:54:40 +01:00
Aleksandra Sikora
4aba0d31f6 Load env variables based on APP_ENV or -e flag (#2878)
(minor)
2021-12-03 16:05:37 +01:00
Blitz.js Bot
19ad91709e (meta) added @divpreet as contributor 2021-12-03 08:23:32 -05:00
Blitz.js Bot
74efbad6d0 (meta) added @ajanth97 as contributor 2021-11-27 07:58:45 -05:00
Ilya
0fd6a4d5e3 Support RouteUrlObject as redirect.destination in GetServerSideProps/GetStaticProps (#2932)
(minor)
2021-11-24 14:12:47 +01:00
Blitz.js Bot
1c12da5495 (meta) added @davidchristie as contributor 2021-11-24 04:41:37 -05:00
Aleksandra Sikora
c4c90477c5 Upgrade react to 18-beta in new app templates (#2998)
(newapp)
2021-11-23 14:11:24 +01:00
dependabot[bot]
a9aaeec047 Bump tar from 2.2.2 to 4.4.18 in /nextjs (#2996)
(patch)
2021-11-22 13:33:28 +01:00
JuanM04
8420f6ddb8 Add "volta" settings to package.json and update node-version (#2994)
(meta)
2021-11-22 12:30:12 +01:00
Brandon Bayer
3a1ea75a55 fix missing BlitzConfig type (#2987)
(patch)
2021-11-19 18:11:28 +01:00
Blitz.js Bot
b23c2cdc36 (meta) added @noxify as contributor 2021-11-18 11:44:27 -05:00
Marcus Reinhardt
12c081b830 Add info about a required manual step to graphql-apollo-server recipe (#2905)
(recipe)
2021-11-18 17:44:21 +01:00
Aleksandra Sikora
11492dcfbd Upgrade typescript to 4.5 (#2973)
(newapp)
2021-11-18 15:50:43 +01:00
JuanM04
de874ca20e Fix lint warnings (#2968)
(meta)
2021-11-18 14:00:50 +01:00
Brandon Bayer
92ab9c3867 move blitz babel config into nextjs fork (#2903)
(patch)
2021-11-17 19:19:49 -05:00
Aleksandra
12c1b7331b bump recipe/example versions (ignore) 2021-11-17 17:29:35 +01:00
Aleksandra
c98788425d v0.43.0 2021-11-17 17:28:25 +01:00
Aleksandra Sikora
a279fb90af Update zod validators in new app template (#2971)
(newapp)
2021-11-17 13:06:48 +01:00
Aleksandra Sikora
4f868ad2ac Fix routes manifest location when using pnpm (#2963)
(patch)
2021-11-17 10:52:28 +01:00
Ilya
522da1a3d7 Add --file flag to blitz db seed command (#2962)
(minor)
2021-11-16 16:42:35 +01:00
JuanM04
e767f51182 Install recipes automatically (blitz install --yes) (#2954)
(minor)
2021-11-16 16:08:01 +01:00
JuanM04
3479686f44 Add vanilla-extract recipe (#2946)
(recipe)
2021-11-16 14:29:53 +01:00
Brandon Bayer
fafab00edc Move superjson integration from babel plugin into core (#2939)
(patch)
2021-11-15 22:19:33 -05:00
Aleksandra Sikora
fe7a3c3a85 Disable autoRun for jest extension by default (#2943)
(patch)
2021-11-15 13:44:51 +01:00
Aleksandra Sikora
252c9b11fe Add @damilolarandolph as L1 maintainer (#2953)
(meta)
2021-11-14 15:58:01 +01:00
Blitz.js Bot
9ddc85dbe3 (meta) added @rockmanvnx6 as contributor 2021-11-14 09:48:06 -05:00
JuanM04
ee07fc3b3f Unify recipes Program types and fix blitz install (#2952)
(patch)
2021-11-14 15:47:31 +01:00
JuanM04
18c6981958 @blitzjs/installer improvements (#2887) 2021-11-12 12:37:36 +01:00
Aleksandra Sikora
f85b0efc33 add meetkai as seedling sponsor (#2938)
(meta)
2021-11-11 18:28:21 +01:00
Blitz.js Bot
da8925ab51 (meta) added @coryhouse as contributor 2021-11-11 08:44:43 -05:00
Blitz.js Bot
23f85d6c27 (meta) added @danestves as contributor 2021-11-11 06:04:33 -05:00
Blitz.js Bot
58d566983a (meta) added @basilk76 as contributor 2021-11-10 12:56:35 -05:00
Aleksandra Sikora
6b59d21e2d Fix installing dependencies of styled-components recipe (#2934)
(recipe)
2021-11-10 14:15:57 +01:00
Blitz.js Bot
f2b2e5a414 (meta) added @5minpause as contributor 2021-11-10 07:37:47 -05:00
Blitz.js Bot
862e54b453 (meta) added @netwarex as contributor 2021-11-10 04:46:12 -05:00
Péter Nyári
32983cb454 Add Passenger recipe (#2890)
(recipe)
2021-11-10 10:46:06 +01:00
Blitz.js Bot
47c3c947ef (meta) added @NorfeldtAbtion as contributor 2021-11-09 14:13:41 -05:00
Blitz.js Bot
20e7c16237 (meta) updated @lovethebomb contributions 2021-11-08 12:16:32 -05:00
Blitz.js Bot
c512b7a29e (meta) added @lovethebomb as contributor 2021-11-08 11:53:04 -05:00
Lucas Heymès
5870251839 Add ability to set blitz logging type to json (#2888)
(patch)
2021-11-08 17:52:53 +01:00
Brandon Bayer
457015ae5b bump recipe/example versions (ignore) 2021-11-06 15:19:40 -04:00
Brandon Bayer
a19c480c19 v0.42.4 2021-11-06 15:18:19 -04:00
Brandon Bayer
2f397f0e99 v0.42.3 2021-11-06 14:57:41 -04:00
Brandon Bayer
c081599547 v0.42.2 2021-11-06 14:51:31 -04:00
Brandon Bayer
e3876b387e fix build TypeError: Cannot read property 'children' of undefined (#2924)
(patch)
2021-11-06 14:49:26 -04:00
Brandon Bayer
937e4061d6 bump recipe/example versions (ignore) 2021-11-06 13:15:12 -04:00
Brandon Bayer
3312b4316b v0.42.1 2021-11-06 13:14:15 -04:00
Brandon Bayer
6653f31b27 Fix build error: No QueryClient set (#2914)
(patch)
2021-11-06 13:09:47 -04:00
Blitz.js Bot
e109813b67 (meta) added @thisdotrob as contributor 2021-11-06 12:28:26 -04:00
Brandon Bayer
4384ce0514 (newapp) On login page, pass user to the onSuccess callback (#2919) 2021-11-05 17:32:51 -04:00
Blitz.js Bot
a1d8008cb5 (meta) added @chrisj-back2work as contributor 2021-11-05 13:42:51 -04:00
Blitz.js Bot
919e9f637d (meta) added @lucasvazq as contributor 2021-11-04 06:17:09 -04:00
Lucas Vazquez
d2f2e4b315 Show the error message from prisma generate when blitz codegen fails (#2891)
(patch)
2021-11-04 11:17:02 +01:00
Brandon Bayer
c91de5134e move Blitz eslint config into nextjs fork (#2902)
(meta)
2021-11-03 18:48:58 -04:00
Aleksandra
8fa479a991 bump recipe/example versions (ignore) 2021-11-03 16:37:05 +01:00
Aleksandra
6d93450ae0 v0.42.0 2021-11-03 16:35:08 +01:00
Brandon Bayer
c089980fca bump recipe/example versions (ignore) 2021-11-02 18:59:08 -04:00
Brandon Bayer
f4cf751b96 v0.41.2-canary.5 2021-11-02 18:58:02 -04:00
Brandon Bayer
46b8103b5f fix so middleware errors (like CSRFMissmatchError) don't crash the server (#2901)
(patch)
2021-11-02 18:08:20 -04:00
Brandon Bayer
9fc06a2279 update monorepo browserslist version (#2900)
(meta)
2021-11-02 16:51:24 -04:00
Aleksandra Sikora
731bf5451d Fix using HOCs in _app.js (#2897)
(patch)
2021-11-02 16:07:59 -04:00
Brandon Bayer
e660b7b89d update influxdb telemetry token
(ignore)
2021-11-02 15:23:18 -04:00
Blitz.js Bot
046587d025 (meta) added @devtombiz as contributor 2021-10-29 08:25:44 -04:00
Thomas Brenneur
2dd578a2db Add next-rosetta example (#2872)
(example)
2021-10-29 14:25:39 +02:00
Blitz.js Bot
afd6e3f914 (meta) added @dvnrsn as contributor 2021-10-28 08:06:35 -04:00
Devin Rasmussen
e183fb4afb Export MutateFunction type from blitz/react-query (#2882)
(patch)
2021-10-28 14:06:30 +02:00
Blitz.js Bot
aa008866cc (meta) added @cbejensen as contributor 2021-10-26 18:42:14 -04:00
Aleksandra Sikora
b388a50352 add prompt to blitz new to choose javascript or typescript (#2739) 2021-10-22 11:41:06 +02:00
Simon Knott
fa78180768 Update dehydrated state integration test for Map (#2649)
Co-authored-by: Cody George <cody.george@airtasker.com> (meta)
2021-10-21 18:15:51 -04:00
Blitz.js Bot
f8e9d75afd (meta) added @RobertBroersma as contributor 2021-10-21 12:01:38 -04:00
Aleksandra Sikora
797618e338 Fix blitz generate in javascript projects (#2859)
(patch)
2021-10-21 10:43:24 -04:00
Blitz.js Bot
52d569e47e (meta) added @cj as contributor 2021-10-21 06:45:11 -04:00
CJ Lazell
f85ae04953 Allow setting secureCookies in sessionMiddleware config (#2361)
(patch)
2021-10-21 12:45:05 +02:00
Brandon Bayer
2fc6c07133 bump recipe/example versions (ignore) 2021-10-20 19:33:34 -04:00
Brandon Bayer
feba2b6ea9 v0.41.2-canary.4 2021-10-20 19:32:17 -04:00
Brandon Bayer
51d91c3c9d Remove internal @blitzjs/config package and move @blitzjs/repl into core (meta) (#2860) 2021-10-20 19:30:59 -04:00
Brandon Bayer
a5d3d02275 bump recipe/example versions (ignore) 2021-10-20 18:43:00 -04:00
Brandon Bayer
5fcd1d5b23 v0.41.2-canary.3 2021-10-20 18:42:04 -04:00
Brandon Bayer
a808d3c120 fix broken route manifest in 0.41.2-canary.2 (#2870)
(patch)
2021-10-20 18:40:08 -04:00
Geoffrey
8fc8800088 Add support for async experimental.initServer() (#2798)
Co-authored-by: Brandon Bayer <b@bayer.ws> (minor)
2021-10-20 18:19:39 -04:00
Blitz.js Bot
4d1c997a56 (meta) added @vivek7405 as contributor 2021-10-20 18:13:56 -04:00
Vivek
90d96552be Add bulma recipe (recipe) (#2850)
Co-authored-by: Aleksandra Sikora <alexsandra.sikora@gmail.com>
Co-authored-by: Brandon Bayer <b@bayer.ws>
2021-10-20 18:13:51 -04:00
Blitz.js Bot
7c4e9c81a0 (meta) added @sitek94 as contributor 2021-10-20 15:26:41 -04:00
Blitz.js Bot
40a6c7d0aa (meta) added @camsloanftc as contributor 2021-10-20 15:12:00 -04:00
Brandon Bayer
60b9f444c0 pin react and react-dom versions in package.json (And I think fix the cannot find module react issue) (#2868)
(newapp)
2021-10-20 12:18:50 -04:00
Aleksandra Sikora
4d95e31013 Update seedling sponsors list in Readme (#2867)
(ignore)
2021-10-20 16:17:01 +02:00
Moyuru
eb4097be96 Update material-ui recipe, migrate from v4 to v5 (#2853)
(recipe)
2021-10-20 15:36:45 +02:00
Brandon Bayer
f1c000e8f1 bump recipe/example versions (ignore) 2021-10-19 18:25:08 -04:00
Brandon Bayer
13b7e6ab0b v0.41.2-canary.2 2021-10-19 18:23:49 -04:00
Brandon Bayer
6ac61768d9 Move internal @blitzjs/core package into nextjs fork core (meta) (#2857) 2021-10-19 18:22:14 -04:00
Brandon Bayer
f4f6fd91a9 bump recipe/example versions (ignore) 2021-10-19 18:11:16 -04:00
Brandon Bayer
8f653d9eda v0.41.2-canary.1 2021-10-19 18:09:09 -04:00
Brandon Bayer
291e8b904f v0.41.2-canary.0 2021-10-19 18:02:59 -04:00
Aleksandra Sikora
6f37571dab fix blitz generate --dry-run flag not being respected (#2858)
(patch)
2021-10-19 11:53:54 -04:00
JuanM04
4e6f82910b Update new apps dependencies, format files, improve readmes (#2849)
(newapp)
2021-10-19 11:57:58 +02:00
Blitz.js Bot
5fc4cbbdb2 (meta) updated @mochi-sann contributions 2021-10-19 05:23:21 -04:00
Aleksandra Sikora
dc05944074 Update L1 maintainers list in readme (#2856)
(ignore)
2021-10-18 16:50:39 +02:00
Blitz.js Bot
e2490b9528 (meta) added @mochi-sann as contributor 2021-10-18 07:13:05 -04:00
Moyuru
3c62425418 Allow user to select a recipe with blitz install command (#2828)
(minor)
2021-10-18 13:12:59 +02:00
Aleksandra Sikora
c29735fab8 add missing React import to LabeledTextField in fauna example (#2854)
(ignore)
2021-10-18 11:17:50 +02:00
Blitz.js Bot
8a5596f9b6 (meta) added @shawn-fetanat as contributor 2021-10-15 21:20:25 -04:00
JuanM04
1457ec8635 Add authenticated layout support with Layout.authenticate (#2825)
Co-authored-by: Brandon Bayer <b@bayer.ws> (minor)
2021-10-15 11:02:05 -04:00
Aleksandra Sikora
71be602fbd add a minimal app template (#2764)
(minor)
2021-10-15 13:05:55 +02:00
Blitz.js Bot
6a539a30ee (meta) added @p-siriphanthong as contributor 2021-10-15 06:23:49 -04:00
Punn Siriphanthong
df2c1dd6da Improve error message on a duplicate page name error (#2823)
(patch)
2021-10-15 12:23:43 +02:00
Aleksandra Sikora
3d17eae8b8 Add Cypress example (#2836) 2021-10-14 18:17:39 -04:00
Aleksandra
3db0f77463 bump recipe/example versions (ignore) 2021-10-13 17:10:21 +02:00
Aleksandra
93c03ea36e v0.41.1 2021-10-13 17:08:32 +02:00
Blitz.js Bot
fa7ac116f7 (meta) added @MuckHub as contributor 2021-10-12 17:17:20 -04:00
Piotrek Tomczewski
c2e69b5de8 Make blitz codegen generate prisma client if prisma is installed (#2830)
(minor)
2021-10-11 21:09:26 +02:00
JuanM04
f280035fa7 PR template update (#2833)
(ignore)
2021-10-11 18:49:38 +02:00
martinsaxa
48f762cb7a show an error if invalid model name is passed to blitz generate (#2802)
(patch)
2021-10-11 16:46:03 +02:00
Blitz.js Bot
f3f85b6831 (meta) added @maybebored as contributor 2021-10-11 08:39:31 -04:00
Mayuran
cfdfb69c45 add tsdoc comments for withRouter and useRouter functions (#2784)
(meta)
2021-10-11 14:39:26 +02:00
Blitz.js Bot
9e405aa8b8 (meta) added @Abduttayyeb as contributor 2021-10-08 06:19:31 -04:00
Abduttayyeb M.r
853254df2c Fix typo in rfc-docs/01-architecture.md file (#2824)
(ignore)
2021-10-08 12:19:26 +02:00
Blitz.js Bot
350a98da5f (meta) updated @namirsab contributions 2021-10-08 06:11:17 -04:00
Namir
3473cec6d4 Show an error if a reserved word is used for blitz generate's model name (#2813)
(patch)
2021-10-08 12:11:12 +02:00
Blitz.js Bot
baeefff47a (meta) updated @beerose contributions 2021-10-07 09:49:50 -04:00
Aleksandra Sikora
bdc560a1d4 Fix blitz new next steps message (#2818)
(patch)
2021-10-07 15:49:44 +02:00
Aleksandra Sikora
5b4413dd87 Prevent duplicated ComponentPropsWithoutRef import when installing chakra-ui (#2817)
(patch)
2021-10-07 15:17:33 +02:00
Abdullah Mzaien
cf448a801e Add missing information to stitches recipe README (#2812)
(meta)
2021-10-07 11:50:09 +02:00
Blitz.js Bot
c4f6f78dde (meta) added @scttcper as contributor 2021-10-06 18:34:14 -04:00
Blitz.js Bot
9e9c63d896 (meta) added @namirsab as contributor 2021-10-06 17:06:27 -04:00
Blitz.js Bot
e45822407f (meta) updated @Vandivier contributions 2021-10-06 11:49:09 -04:00
Aleksandra
ac4f9f3702 bump recipe/example versions (ignore) 2021-10-06 17:42:23 +02:00
Aleksandra
b6adb749ce v0.41.0 2021-10-06 17:40:56 +02:00
Blitz.js Bot
ea566b2c3a (meta) updated @g3offrey contributions 2021-10-06 07:04:45 -04:00
Geoffrey
87eefafb22 add a spinner during the blitz new version check (#2791)
(patch)

* add a spinner during the blitz new version check

* improve the ux on blitz new upgrade

* Apply suggestions from code review

Co-authored-by: Aleksandra Sikora <alexsandra.sikora@gmail.com>
2021-10-06 13:04:40 +02:00
Blitz.js Bot
6056ed85d9 (meta) added @Vandivier as contributor 2021-10-06 05:32:25 -04:00
John Vandivier
8fef7b7407 add support for shorthand uuid syntax in blitz generate (#2808)
(minor)
2021-10-06 11:32:20 +02:00
Blitz.js Bot
25cdbbbf53 (meta) added @9j as contributor 2021-10-05 12:14:33 -04:00
Bahk Chanhee
db2c28d014 Disable ink-spinner as a temporary measure (#2799)
(patch)

* fix: Disable ink-spinner as a temporary measure

* Update packages/installer/src/executors/add-dependency-executor.tsx

Co-authored-by: Aleksandra Sikora <alexsandra.sikora@gmail.com>
2021-10-05 18:14:28 +02:00
Blitz.js Bot
39e089bac2 (meta) updated @g3offrey contributions 2021-10-05 10:51:10 -04:00
Blitz.js Bot
17853ee542 (meta) updated @piotrski contributions 2021-10-05 10:44:18 -04:00
Piotrek Tomczewski
9dd420c313 Add README for theme-ui recipe (#2803)
(meta)
2021-10-05 16:44:13 +02:00
kimngan-bui
4d930541d9 Add README for reflexjs recipe (#2778)
(meta)
2021-10-05 11:01:09 +02:00
kimngan-bui
eaf4862915 Add README for render recipe (#2779)
(meta)
2021-10-05 11:00:25 +02:00
kimngan-bui
3bcfda462d Add README for secureheaders recipe (#2780)
(meta)
2021-10-05 10:59:34 +02:00
Blitz.js Bot
ef362299c6 (meta) added @kimngan-bui as contributor 2021-10-05 04:57:24 -04:00
kimngan-bui
d64cf5323a Add README for tailwind recipe (#2777)
(meta)
2021-10-05 10:57:19 +02:00
Blitz.js Bot
aa560d229e (meta) added @keevan as contributor 2021-10-04 05:40:56 -04:00
Kevin Pham
6ff9fd9196 Add README for styled-components recipe (#2776)
(meta)
2021-10-04 11:40:52 +02:00
Blitz.js Bot
99b5876c36 (meta) added @g3offrey as contributor 2021-10-04 05:38:08 -04:00
Geoffrey
62dc284abe display an error if loading a module fails in blitz console (#2792)
(patch)
2021-10-04 11:38:03 +02:00
Brandon Bayer
c0dc8f4d02 bump recipe/example versions (ignore) 2021-10-02 16:56:19 -04:00
Brandon Bayer
505c2cb9e6 v0.40.0 2021-10-02 16:55:18 -04:00
Brandon Bayer
5165bd1b20 bump recipe/example versions (ignore) 2021-10-02 16:44:47 -04:00
Brandon Bayer
86335620c1 v0.40.0-canary.10 2021-10-02 16:43:46 -04:00
JuanM04
e637a4908a Fix Yarn Berry gitignore for new apps (#2775)
(patch)
2021-10-02 16:32:26 -04:00
Abdullah Mzaien
e8874ff573 Add stitches recipe (#2773)
(recipe)
2021-10-02 16:31:50 -04:00
Brandon Bayer
2cc9f302da Fix ssr with auth pages failing on Vercel on canary release (#2787)
(patch)
2021-10-02 16:24:11 -04:00
Brandon Bayer
ad06a9f005 Fix failing session test (#2786)
(ignore)
2021-10-02 16:04:31 -04:00
Brandon Bayer
5105ed4650 Fix suspense/hydration bug (on canary) (#2785)
(patch)
2021-10-02 15:13:05 -04:00
Brandon Bayer
25782cd292 Fix CSRFTokenMissmatch error for anonymous sessions after significant time of inactivity (#2762)
(patch)
2021-10-02 12:28:46 -04:00
Blitz.js Bot
c28ecb6187 (meta) updated @johnmurphy01 contributions 2021-10-01 15:10:25 -04:00
John Murphy
5a46cc0438 Add README files to recipes (#2774) 2021-10-01 21:10:20 +02:00
Brandon Bayer
3040fd5d03 Fix CSRFTokenMismatchError on logout (#2761)
(patch)
2021-10-01 12:46:40 -04:00
John Murphy
fa0fa21444 add README to gh-action-yarn-postgres recipe (#2771)
(ignore)
2021-10-01 15:57:06 +02:00
John Murphy
61560a3e63 add README to gh-action-yarn-mariadb recipe (#2770)
(ignore)
2021-10-01 15:56:05 +02:00
John Murphy
2a6fab08a0 Add README to emotion recipe (#2769)
(ignore)
2021-10-01 15:55:18 +02:00
John Murphy
74e3776286 add README to bumbag ui recipe (#2768)
(ignore)
2021-10-01 15:52:34 +02:00
Aleksandra Sikora
99f146e54b jest-preset: handle static assets for next/image (#2763)
(patch)
2021-10-01 08:25:48 +02:00
Blitz.js Bot
f5829db520 (meta) added @ajwgeek as contributor 2021-09-30 19:44:53 -04:00
Blitz.js Bot
db611a1888 (meta) added @martinsaxa as contributor 2021-09-30 15:36:09 -04:00
martinsaxa
862b21ce9c passportAuth — improve error message if req.query.auth is undefined (#2766)
(patch)
2021-09-30 21:36:01 +02:00
Blitz.js Bot
3fb73272fa (meta) added @johnmurphy01 as contributor 2021-09-30 02:21:19 -04:00
John Murphy
b2f1a654af add README for Base Web recipe (#2760)
(ignore)
2021-09-30 08:21:13 +02:00
Mark Hughes
6b9fb74163 (recipe) add recipe for ghost cms (#2693)
Co-authored-by: Brandon Bayer <b@bayer.ws>
2021-09-29 11:25:52 -04:00
Blitz.js Bot
be4ac2ceb6 (meta) added @Fedeorlandau as contributor 2021-09-29 09:37:59 -04:00
Federico Joel Orlandau
810da1b490 Update fauna integration documentation (#2759)
(ignore)
2021-09-29 15:37:55 +02:00
Blitz.js Bot
41df687a96 (meta) added @davyengone as contributor 2021-09-29 08:35:02 -04:00
Aleksandra Sikora
805e2cf4b1 Retire @nitaking from L1 Maintainers (#2756)
(meta)
2021-09-28 19:03:33 +02:00
Aleksandra Sikora
06686a4c8b make jest-preset work in plain js projects (#2740)
(patch)
2021-09-27 12:12:38 +02:00
Blitz.js Bot
f79dad995a (meta) added @npverni as contributor 2021-09-24 17:30:04 -04:00
Blitz.js Bot
c95e0cc9c3 (meta) added @emilygracekz as contributor 2021-09-24 03:06:52 -04:00
Emily
db203e8a6f Update prisma 2.x to prisma 3.x (#2731)
(newapp)
2021-09-24 09:06:47 +02:00
Brandon Bayer
2ff4fcfe2f bump recipe/example versions (ignore) 2021-09-23 14:55:45 -04:00
Brandon Bayer
c5941bf703 v0.40.0-canary.9 2021-09-23 14:54:06 -04:00
Brandon Bayer
cd8914f285 Fix Internal Blitz Error: process.env.BLITZ_APP_DIR is not set (in canary release) (#2736)
(patch)
2021-09-23 14:49:26 -04:00
Blitz.js Bot
9f835f42f7 (meta) updated @s-r-x contributions 2021-09-23 13:37:27 -04:00
Ilya
dba9e4333d Add package manager prompt to blitz new (minor) (#2715)
* Add package manager prompt to blitz new

* make pnpm the default package manager in blitz new if pnpm is installed

* add yarn flag in blitz new

* add form flag in blitz new

* refactor the upgrade part in blitz new

* in blitz new when looking up for a globally installed blitz first try pnpm, then yarn, then npm

* replace yarn with pnpm install in commands/new test
2021-09-23 13:37:22 -04:00
Aleksandra Sikora
20eb67b27e remove tsc step from pre-push and ignore types.ts file in js apps (#2734)
(newapp)
2021-09-23 19:33:06 +02:00
Brandon Bayer
0bffe867b9 Fix broken vercel deployments on canary release (#2730)
(patch)
2021-09-23 13:25:49 -04:00
Aleksandra Sikora
fbc23ebd63 add @beerose as codeowner (#2735)
(meta)
2021-09-23 13:18:33 -04:00
Blitz.js Bot
a4975d10cf (meta) added @bcye as contributor 2021-09-23 04:58:08 -04:00
Bruce
f9e7d168b8 remove typescript bits from package.json generated for js projects (#1402)
(newapp)

Co-authored-by: Aleksandra <alexsandra.sikora@gmail.com>
2021-09-23 10:58:02 +02:00
Blitz.js Bot
554a91a2eb (meta) added @fuzzthink as contributor 2021-09-23 02:48:06 -04:00
John Leung
273f72076f update "Read the Documentation" link in Readme (#2733)
(meta)
2021-09-23 08:48:01 +02:00
Brandon Bayer
e704aca0ed add Aleksandra to core team as Lead Maintainer
(meta)
2021-09-22 11:08:22 -04:00
Blitz.js Bot
29b5b311cb (meta) added @isaka1022 as contributor 2021-09-21 11:38:21 -04:00
Amane
caea4d96f7 add sakura-ui recipe README (#2710) 2021-09-21 11:38:16 -04:00
Blitz.js Bot
89b0f96536 (meta) updated @kotx contributions 2021-09-11 08:40:53 -04:00
Brandon Bayer
ebf3f5d803 bump recipe/example versions (ignore) 2021-09-10 16:33:08 -04:00
Brandon Bayer
8b1008488f v0.40.0-canary.8 2021-09-10 16:29:40 -04:00
Blitz.js Bot
994cba856b (meta) added @kotx as contributor 2021-09-10 16:27:18 -04:00
Kot
1e92fe3b76 Fix internal middleware to use forwarded header to set protocol (#2705)
(patch)
2021-09-10 16:27:14 -04:00
Andreas Asprou
76c5a00eec Fix first build of custom server when customServer.hotReload: false (#2698)
* Fix custom-server hot reload on first run (patch)

We want to build custom-server, but only run watch if specified.

* Fix custom server - do not build twice in prd
2021-09-10 16:25:31 -04:00
Blitz.js Bot
927db971b9 (meta) added @andreasasprou as contributor 2021-09-10 16:08:52 -04:00
Andreas Asprou
93213387de Fix missing BLITZ_APP_DIR error when running a custom server (#2699)
BLITZ_APP_DIR is set to the appropriate values when running:

- Blitz routes CLI command
- next start
- next dev

But not when running a custom server. The above should fix it. (patch)
2021-09-10 16:08:48 -04:00
meehawk
4c00ddd741 fix(cli): blitz install to work with pnpm (#2702) 2021-09-08 18:46:01 -04:00
Brandon Bayer
b6cc8b1904 update fauna logo 2021-09-08 10:51:12 -04:00
depfu[bot]
15fe99ed56 🚨 [security] Update tar: 6.1.0 → 6.1.11 (patch) (#2687)
Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com>
2021-09-01 11:48:56 -04:00
Blitz.js Bot
5fe42c1204 (meta) added @maciejmyslinski as contributor 2021-08-30 19:26:12 -04:00
Brandon Bayer
285d76d3b2 git subrepo push nextjs
subrepo:
  subdir:   "nextjs"
  merged:   "a29d5fd3b"
upstream:
  origin:   "git@github.com:blitz-js/next.js.git"
  branch:   "canary"
  commit:   "a29d5fd3b"
git-subrepo:
  version:  "0.4.3"
  origin:   "https://github.com/ingydotnet/git-subrepo"
  commit:   "2f68596" (ignore)
2021-08-30 19:17:00 -04:00
Brandon Bayer
c261e5c987 update react-query to 3.21.1 (and fix an infinite loop bug) (#2684)
(patch)
2021-08-30 19:15:00 -04:00
Blitz.js Bot
0f027bd2c8 (meta) added @ratson as contributor 2021-08-30 19:14:36 -04:00
(◕ᴥ◕)
962b521ade (newapp) Use jest.config.ts for Typescript apps (#2663)
* Convert app template Jest config to TypeScript

* Add config for JS users

* Update packages/generator/templates/app/README.md

* Update packages/generator/templates/app/README.md

Co-authored-by: Brandon Bayer <b@bayer.ws>
2021-08-30 19:14:32 -04:00
Brandon Bayer
3936039c38 bump recipe/example versions (ignore) 2021-08-27 16:53:18 -04:00
Brandon Bayer
5c219f1e60 v0.40.0-canary.7 2021-08-27 16:52:06 -04:00
Brandon Bayer
294bcd2de3 fix route manifest for mdx pages (#2678)
(patch)
2021-08-27 16:50:11 -04:00
Brandon Bayer
a131cf8502 bump recipe/example versions (ignore) 2021-08-27 15:17:21 -04:00
Brandon Bayer
961c73b23c v0.40.0-canary.6 2021-08-27 15:16:08 -04:00
Brandon Bayer
8c5a67cd28 git subrepo push nextjs
subrepo:
  subdir:   "nextjs"
  merged:   "1fde8e923"
upstream:
  origin:   "git@github.com:blitz-js/next.js.git"
  branch:   "canary"
  commit:   "1fde8e923"
git-subrepo:
  version:  "0.4.3"
  origin:   "https://github.com/ingydotnet/git-subrepo"
  commit:   "2f68596" (ignore)
2021-08-27 15:14:31 -04:00
Brandon Bayer
6be7bc48a2 Upgrade internal Typescript version and potentially improve TS perf (patch) (#2669)
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2021-08-27 15:14:06 -04:00
Brandon Bayer
5a8ee866ba (newapp) Few improvements to LabeledTextField (#2677) 2021-08-27 15:08:18 -04:00
Brandon Bayer
4320589461 Fix usage with pnpm (#2673)
(patch)
2021-08-27 12:01:48 -04:00
Brandon Bayer
05f6a09ae1 fix missing BlitzScript.getInlineScriptSource in canary release (#2676)
(patch)
2021-08-27 12:01:12 -04:00
Daniel Bannert
723904bdf5 (recipe) removed unused htmlescape import in secureheaders recipe (#2675)
Co-authored-by: danielb <daniel.bannert@limango.de>
2021-08-27 11:22:36 -04:00
Brandon Bayer
83bcd441b0 add Boostry as bronze sponsor
(meta)
2021-08-27 09:51:29 -04:00
Roshan Manuel
ee97985859 Use parseAsync by default and add argument to parse sync to common zod validations (#2616)
* don't throw an error if checkYarn is null or checkYarn.stdout is null or undefined

* make sure to check if this version is less than the latest version

* fix forgotpassword test template, sync auth example tests

* revert to ensure monorepo tests work

* revert to original password and index tests

* remove merge reference

* fix merge issue

* Quirrel recipe: start > dev, double quote command

* add Suspense boundary

* Update packages/generator/templates/app/app/pages/_app.tsx

* send "blitz.js" in x-powered-by header

* Update test for powered-by-header

Considered making the test check to see if anything at all was present, but not needed for our use case right now

* Update test to check for x-powered-by

* update favicon to be orange in new blitz apps

* Support both NEXT_PUBLIC_ and BLITZ_PUBLIC_ 

Make webpack take environment variables prefixed with either NEXT_PUBLIC_ and BLITZ_PUBLIC_ to the frontends environemtn variables

* Revert "Support both NEXT_PUBLIC_ and BLITZ_PUBLIC_ "

This reverts commit 9760bcb70d.

* define parser type, add argument to resolver zod

* Add tests for argument, no value

* add ability to parse async, and tests

* Fix lint issue

* use fn overloads, return promise conditionally

* Update packages/core/src/server/resolver.ts

* fix linter issue

Co-authored-by: Roshan Manuel <Roshan,manuel@angelic-group.com>
Co-authored-by: Brandon Bayer <b@bayer.ws>

(major)
2021-08-25 11:54:23 -04:00
Brandon Bayer
8d98843573 (recipe) fix secureheaders recipe 2021-08-25 11:38:46 -04:00
Brandon Bayer
5441e59ac1 git subrepo push nextjs
subrepo:
  subdir:   "nextjs"
  merged:   "0cad51126"
upstream:
  origin:   "git@github.com:blitz-js/next.js.git"
  branch:   "canary"
  commit:   "0cad51126"
git-subrepo:
  version:  "0.4.3"
  origin:   "https://github.com/ingydotnet/git-subrepo"
  commit:   "2f68596" (ignore)
2021-08-24 19:24:03 -04:00
Brandon Bayer
af11aafd46 bump recipe/example versions (ignore) 2021-08-24 19:14:30 -04:00
Brandon Bayer
25fafd92f4 v0.40.0-canary.5 2021-08-24 19:13:23 -04:00
Brandon Bayer
e49da74a53 Fix <Link> not working correctly with i18n and basepath (#2668)
(patch)
2021-08-24 19:02:42 -04:00
Brandon Bayer
827bcf3afe 🎉 Remove custom blitz compiler - all custom features now in core framework! (#2662)
(minor)
2021-08-24 18:52:32 -04:00
Ilya
46b40881bc Fix useQuery hooks to not cache data during SSR (#2666)
(patch)
2021-08-23 12:28:42 -04:00
JuanM04
ff1572b37a Added BLITZ_TELEMETRY_DISABLED env variable (#2664)
(patch)
2021-08-23 12:16:49 -04:00
Blitz.js Bot
5cf84a699b (meta) added @mwcampbell as contributor 2021-08-22 12:56:30 -04:00
Brandon Bayer
1ed6dd1d39 bump recipe/example versions (ignore) 2021-08-20 09:55:25 -04:00
Brandon Bayer
c99b1fc9db v0.40.0-canary.4 2021-08-20 09:54:16 -04:00
Brandon Bayer
18b3f32abb Fix No matching version found for eslint-config-next
(patch)
2021-08-20 09:51:26 -04:00
Andreas Bollig
f9889367a6 Fix serialization of RedirectError (#2659)
Co-authored-by: Jeremy Liberman <jeremy@jeremyliberman.com> (patch)
2021-08-19 16:53:49 -04:00
Blitz.js Bot
2b2c9f1040 (meta) added @damilolarandolph as contributor 2021-08-19 16:48:17 -04:00
Blitz.js Bot
a8f5db494d (meta) added @hashimwarren as contributor 2021-08-19 16:47:28 -04:00
Brandon Bayer
468d03b51e bump recipe/example versions (ignore) 2021-08-19 10:15:03 -04:00
Brandon Bayer
f1c458fe12 v0.40.0-canary.3 2021-08-19 10:13:20 -04:00
Brandon Bayer
f434845f53 fix publish
(ignore)
2021-08-19 10:09:27 -04:00
Brandon Bayer
8e7d397965 v0.40.0-canary.2 2021-08-19 10:02:34 -04:00
Brandon Bayer
15de5ff1ab git subrepo push --force nextjs
subrepo:
  subdir:   "nextjs"
  merged:   "b76e72a2b"
upstream:
  origin:   "git@github.com:blitz-js/next.js.git"
  branch:   "canary"
  commit:   "b76e72a2b"
git-subrepo:
  version:  "0.4.3"
  origin:   "https://github.com/ingydotnet/git-subrepo"
  commit:   "2f68596" (ignore)
2021-08-19 09:56:56 -04:00
Brandon Bayer
cefb5c18ce Upgrade next.js to 11.1.0 (#2656)
(minor)
2021-08-18 22:32:39 -04:00
Andreas Bollig
99f3f83335 Fix RedirectError incorrectly failing Cypress tests (#2655)
(patch)
2021-08-18 17:39:20 -04:00
Brandon Bayer
fb41714083 bump recipe/example versions (ignore) 2021-08-17 19:53:40 -04:00
Brandon Bayer
18a8d7cdd9 v0.40.0-canary.1 2021-08-17 19:51:01 -04:00
Brandon Bayer
3e267be382 fix nextjs build 2021-08-17 19:30:44 -04:00
Brandon Bayer
b7dadba616 git subrepo push nextjs
subrepo:
  subdir:   "nextjs"
  merged:   "08cae3bd0"
upstream:
  origin:   "git@github.com:blitz-js/next.js.git"
  branch:   "canary"
  commit:   "08cae3bd0"
git-subrepo:
  version:  "0.4.3"
  origin:   "https://github.com/ingydotnet/git-subrepo"
  commit:   "2f68596"
2021-08-17 11:07:40 -04:00
Brandon Bayer
aa85d1d47e bump recipe/example versions (ignore) 2021-08-16 18:59:27 -04:00
Brandon Bayer
44197a760c v0.40.0-canary.0 2021-08-16 18:58:06 -04:00
Brandon Bayer
f6354d2dd5 Next.js Fork Migration: Move query/mutation support into nextjs core (#2516)
(major)
2021-08-16 18:56:28 -04:00
Brandon Bayer
c9c995eafb bump recipe/example versions (ignore) 2021-08-13 12:31:43 -05:00
1561 changed files with 47546 additions and 24692 deletions

View File

@@ -309,7 +309,8 @@
"profile": "https://github.com/Zeko369",
"contributions": [
"code",
"doc"
"doc",
"test"
]
},
{
@@ -625,7 +626,8 @@
"avatar_url": "https://avatars0.githubusercontent.com/u/17050715?v=4",
"profile": "https://cloudnweb.dev/",
"contributions": [
"code"
"code",
"test"
]
},
{
@@ -970,7 +972,9 @@
"avatar_url": "https://avatars0.githubusercontent.com/u/3496193?v=4",
"profile": "https://twitter.com/dillonraphael",
"contributions": [
"code"
"code",
"test",
"doc"
]
},
{
@@ -1547,7 +1551,8 @@
"avatar_url": "https://avatars0.githubusercontent.com/u/244174?v=4",
"profile": "https://github.com/piotrski",
"contributions": [
"code"
"code",
"doc"
]
},
{
@@ -2005,7 +2010,8 @@
"profile": "http://aleksandra.codes",
"contributions": [
"code",
"doc"
"doc",
"test"
]
},
{
@@ -2962,7 +2968,8 @@
"avatar_url": "https://avatars.githubusercontent.com/u/12092?v=4",
"profile": "http://zackhobson.com/",
"contributions": [
"code"
"code",
"doc"
]
},
{
@@ -3008,8 +3015,836 @@
"profile": "https://github.com/s-r-x",
"contributions": [
"code",
"doc",
"test"
]
},
{
"login": "hashimwarren",
"name": "Hashim Warren",
"avatar_url": "https://avatars.githubusercontent.com/u/6027587?v=4",
"profile": "https://github.com/hashimwarren",
"contributions": [
"doc"
]
},
{
"login": "damilolarandolph",
"name": "Damilola Randolph",
"avatar_url": "https://avatars.githubusercontent.com/u/43427949?v=4",
"profile": "https://damilolarandolph.com",
"contributions": [
"doc"
]
},
{
"login": "mwcampbell",
"name": "Matt Campbell",
"avatar_url": "https://avatars.githubusercontent.com/u/214820?v=4",
"profile": "https://github.com/mwcampbell",
"contributions": [
"doc"
]
},
{
"login": "ratson",
"name": "(◕ᴥ◕)",
"avatar_url": "https://avatars.githubusercontent.com/u/2682937?v=4",
"profile": "https://github.com/ratson",
"contributions": [
"code"
]
},
{
"login": "maciejmyslinski",
"name": "Mat Milbury",
"avatar_url": "https://avatars.githubusercontent.com/u/11421186?v=4",
"profile": "maciejmyslinski.com",
"contributions": [
"doc"
]
},
{
"login": "andreasasprou",
"name": "Andreas Asprou",
"avatar_url": "https://avatars.githubusercontent.com/u/8077469?v=4",
"profile": "https://andreas.fyi",
"contributions": [
"code",
"test"
]
},
{
"login": "kotx",
"name": "Kot",
"avatar_url": "https://avatars.githubusercontent.com/u/33439542?v=4",
"profile": "https://github.com/kotx",
"contributions": [
"code",
"test",
"doc"
]
},
{
"login": "isaka1022",
"name": "Amane",
"avatar_url": "https://avatars.githubusercontent.com/u/28589716?v=4",
"profile": "https://github.com/isaka1022",
"contributions": [
"doc"
]
},
{
"login": "fuzzthink",
"name": "John Leung",
"avatar_url": "https://avatars.githubusercontent.com/u/20699?v=4",
"profile": "johnleung.com",
"contributions": [
"doc"
]
},
{
"login": "bcye",
"name": "Bruce",
"avatar_url": "https://avatars.githubusercontent.com/u/29666239?v=4",
"profile": "roettgers.co",
"contributions": [
"code"
]
},
{
"login": "emilygracekz",
"name": "Emily",
"avatar_url": "https://avatars.githubusercontent.com/u/57361805?v=4",
"profile": "https://github.com/emilygracekz",
"contributions": [
"code"
]
},
{
"login": "npverni",
"name": "Nathan Verni",
"avatar_url": "https://avatars.githubusercontent.com/u/3537?v=4",
"profile": "https://github.com/npverni",
"contributions": [
"doc"
]
},
{
"login": "davyengone",
"name": "Davy Engone",
"avatar_url": "https://avatars.githubusercontent.com/u/4896002?v=4",
"profile": "https://davyengone.io",
"contributions": [
"doc"
]
},
{
"login": "Fedeorlandau",
"name": "Federico Joel Orlandau",
"avatar_url": "https://avatars.githubusercontent.com/u/10283686?v=4",
"profile": "https://fedeorlandau.dev/",
"contributions": [
"doc",
"code"
]
},
{
"login": "johnmurphy01",
"name": "John Murphy",
"avatar_url": "https://avatars.githubusercontent.com/u/2939548?v=4",
"profile": "https://github.com/johnmurphy01",
"contributions": [
"doc",
"code"
]
},
{
"login": "martinsaxa",
"name": "martinsaxa",
"avatar_url": "https://avatars.githubusercontent.com/u/33789474?v=4",
"profile": "https://github.com/martinsaxa",
"contributions": [
"code"
]
},
{
"login": "ajwgeek",
"name": "Austin Walhof",
"avatar_url": "https://avatars.githubusercontent.com/u/2135600?v=4",
"profile": "https://github.com/ajwgeek",
"contributions": [
"doc"
]
},
{
"login": "g3offrey",
"name": "Geoffrey",
"avatar_url": "https://avatars.githubusercontent.com/u/11151445?v=4",
"profile": "g3offrey.dev",
"contributions": [
"code",
"doc",
"test"
]
},
{
"login": "keevan",
"name": "Kevin Pham",
"avatar_url": "https://avatars.githubusercontent.com/u/9924643?v=4",
"profile": "https://github.com/keevan",
"contributions": [
"doc"
]
},
{
"login": "kimngan-bui",
"name": "kimngan-bui",
"avatar_url": "https://avatars.githubusercontent.com/u/20723478?v=4",
"profile": "https://github.com/kimngan-bui",
"contributions": [
"doc"
]
},
{
"login": "9j",
"name": "Bahk Chanhee",
"avatar_url": "https://avatars.githubusercontent.com/u/11691670?v=4",
"profile": "world.hey.com/bach",
"contributions": [
"code"
]
},
{
"login": "Vandivier",
"name": "John Vandivier",
"avatar_url": "https://avatars.githubusercontent.com/u/5559355?v=4",
"profile": "http://www.afterecon.com/",
"contributions": [
"code",
"test",
"doc"
]
},
{
"login": "namirsab",
"name": "Namir",
"avatar_url": "https://avatars.githubusercontent.com/u/6980777?v=4",
"profile": "http://namirsab.github.io",
"contributions": [
"doc",
"code",
"test"
]
},
{
"login": "scttcper",
"name": "Scott Cooper",
"avatar_url": "https://avatars.githubusercontent.com/u/1400464?v=4",
"profile": "https://twitter.com/scttcper",
"contributions": [
"doc"
]
},
{
"login": "Abduttayyeb",
"name": "Abduttayyeb M.r",
"avatar_url": "https://avatars.githubusercontent.com/u/55306260?v=4",
"profile": "abduttayyeb.github.io",
"contributions": [
"doc"
]
},
{
"login": "maybebored",
"name": "Mayuran",
"avatar_url": "https://avatars.githubusercontent.com/u/20951181?v=4",
"profile": "https://github.com/maybebored",
"contributions": [
"code"
]
},
{
"login": "MuckHub",
"name": "Aleksei Vesselko",
"avatar_url": "https://avatars.githubusercontent.com/u/54979136?v=4",
"profile": "https://github.com/MuckHub",
"contributions": [
"doc"
]
},
{
"login": "p-siriphanthong",
"name": "Punn Siriphanthong",
"avatar_url": "https://avatars.githubusercontent.com/u/29949429?v=4",
"profile": "https://p-siriphanthong.github.io/",
"contributions": [
"code"
]
},
{
"login": "shawn-fetanat",
"name": "Shawn Fetanat",
"avatar_url": "https://avatars.githubusercontent.com/u/83679827?v=4",
"profile": "https://my-portfolio-292eb.web.app",
"contributions": [
"doc"
]
},
{
"login": "mochi-sann",
"name": "Moyuru",
"avatar_url": "https://avatars.githubusercontent.com/u/44772513?v=4",
"profile": "https://github.com/mochi-sann",
"contributions": [
"code",
"test",
"doc"
]
},
{
"login": "camsloanftc",
"name": "Cam Sloan",
"avatar_url": "https://avatars.githubusercontent.com/u/16295659?v=4",
"profile": "https://github.com/camsloanftc",
"contributions": [
"doc"
]
},
{
"login": "sitek94",
"name": "Maciek Sitkowski",
"avatar_url": "https://avatars.githubusercontent.com/u/58401630?v=4",
"profile": "https://macieksitkowski.com",
"contributions": [
"doc"
]
},
{
"login": "vivek7405",
"name": "Vivek",
"avatar_url": "https://avatars.githubusercontent.com/u/24492244?v=4",
"profile": "https://github.com/vivek7405",
"contributions": [
"doc",
"code"
]
},
{
"login": "cj",
"name": "CJ Lazell",
"avatar_url": "https://avatars.githubusercontent.com/u/1819?v=4",
"profile": "http://cj.io",
"contributions": [
"code"
]
},
{
"login": "RobertBroersma",
"name": "Robert",
"avatar_url": "https://avatars.githubusercontent.com/u/4519828?v=4",
"profile": "robertbroersma.com",
"contributions": [
"doc"
]
},
{
"login": "cbejensen",
"name": "Christian Jensen",
"avatar_url": "https://avatars.githubusercontent.com/u/12374723?v=4",
"profile": "https://christianjensen.netlify.com",
"contributions": [
"doc"
]
},
{
"login": "dvnrsn",
"name": "Devin Rasmussen",
"avatar_url": "https://avatars.githubusercontent.com/u/9112811?v=4",
"profile": "https://github.com/dvnrsn",
"contributions": [
"code"
]
},
{
"login": "devtombiz",
"name": "Thomas Brenneur",
"avatar_url": "https://avatars.githubusercontent.com/u/23282613?v=4",
"profile": "www.linkedin.com/in/devtom",
"contributions": [
"code",
"doc",
"test"
]
},
{
"login": "lucasvazq",
"name": "Lucas Vazquez",
"avatar_url": "https://avatars.githubusercontent.com/u/38964964?v=4",
"profile": "https://lucasvazq.github.io/",
"contributions": [
"code"
]
},
{
"login": "chrisj-back2work",
"name": "Chris Johnson",
"avatar_url": "https://avatars.githubusercontent.com/u/68551954?v=4",
"profile": "https://github.com/chrisj-back2work",
"contributions": [
"doc"
]
},
{
"login": "thisdotrob",
"name": "Rob Stevenson",
"avatar_url": "https://avatars.githubusercontent.com/u/12902589?v=4",
"profile": "https://github.com/thisdotrob",
"contributions": [
"doc"
]
},
{
"login": "lovethebomb",
"name": "Lucas Heymès",
"avatar_url": "https://avatars.githubusercontent.com/u/1363056?v=4",
"profile": "www.lucas.computer",
"contributions": [
"code",
"doc"
]
},
{
"login": "NorfeldtAbtion",
"name": "Lasse Norfeldt",
"avatar_url": "https://avatars.githubusercontent.com/u/53769763?v=4",
"profile": "https://github.com/NorfeldtAbtion",
"contributions": [
"doc"
]
},
{
"login": "netwarex",
"name": "Péter Nyári",
"avatar_url": "https://avatars.githubusercontent.com/u/6048614?v=4",
"profile": "https://nyaripeter.hu/",
"contributions": [
"doc",
"code"
]
},
{
"login": "5minpause",
"name": "Holger Frohloff",
"avatar_url": "https://avatars.githubusercontent.com/u/84148?v=4",
"profile": "https://www.holgerfrohloff.de",
"contributions": [
"doc"
]
},
{
"login": "basilk76",
"name": "Basil Khan",
"avatar_url": "https://avatars.githubusercontent.com/u/45275512?v=4",
"profile": "https://github.com/basilk76",
"contributions": [
"doc"
]
},
{
"login": "danestves",
"name": "Daniel Esteves",
"avatar_url": "https://avatars.githubusercontent.com/u/31737273?v=4",
"profile": "https://danestves.com/",
"contributions": [
"doc"
]
},
{
"login": "coryhouse",
"name": "Cory House",
"avatar_url": "https://avatars.githubusercontent.com/u/1688997?v=4",
"profile": "http://www.bitnative.com",
"contributions": [
"doc"
]
},
{
"login": "rockmanvnx6",
"name": "Austin (Thang Pham)",
"avatar_url": "https://avatars.githubusercontent.com/u/16440123?v=4",
"profile": "https://auspham.dev/",
"contributions": [
"doc"
]
},
{
"login": "noxify",
"name": "Marcus Reinhardt",
"avatar_url": "https://avatars.githubusercontent.com/u/521777?v=4",
"profile": "https://jammeryhq.com",
"contributions": [
"doc",
"code"
]
},
{
"login": "davidchristie",
"name": "David Christie",
"avatar_url": "https://avatars.githubusercontent.com/u/12044333?v=4",
"profile": "https://github.com/davidchristie",
"contributions": [
"doc"
]
},
{
"login": "ajanth97",
"name": "Ajanth",
"avatar_url": "https://avatars.githubusercontent.com/u/50458502?v=4",
"profile": "https://github.com/ajanth97",
"contributions": [
"doc"
]
},
{
"login": "divpreet",
"name": "Div",
"avatar_url": "https://avatars.githubusercontent.com/u/2805650?v=4",
"profile": "https://github.com/divpreet",
"contributions": [
"doc"
]
},
{
"login": "david-arteaga",
"name": "David Arteaga",
"avatar_url": "https://avatars.githubusercontent.com/u/7199015?v=4",
"profile": "https://github.com/david-arteaga",
"contributions": [
"doc"
]
},
{
"login": "MukulKolpe",
"name": "Mukul Kolpe",
"avatar_url": "https://avatars.githubusercontent.com/u/78664749?v=4",
"profile": "https://github.com/MukulKolpe",
"contributions": [
"code"
]
},
{
"login": "skotchpine",
"name": "tyler",
"avatar_url": "https://avatars.githubusercontent.com/u/13043909?v=4",
"profile": "https://github.com/skotchpine",
"contributions": [
"code"
]
},
{
"login": "SofianeDjellouli",
"name": "Sofiane Djellouli",
"avatar_url": "https://avatars.githubusercontent.com/u/38258952?v=4",
"profile": "https://github.com/SofianeDjellouli",
"contributions": [
"doc"
]
},
{
"login": "kreako",
"name": "kreako",
"avatar_url": "https://avatars.githubusercontent.com/u/65113001?v=4",
"profile": "https://github.com/kreako",
"contributions": [
"doc"
]
},
{
"login": "sarahdayan",
"name": "Sarah Dayan",
"avatar_url": "https://avatars.githubusercontent.com/u/5370675?v=4",
"profile": "https://sarahdayan.dev",
"contributions": [
"code"
]
},
{
"login": "c-ciobanu",
"name": "Cristi Ciobanu",
"avatar_url": "https://avatars.githubusercontent.com/u/33382714?v=4",
"profile": "https://github.com/c-ciobanu",
"contributions": [
"doc"
]
},
{
"login": "arpitdalal",
"name": "Arpit Dalal",
"avatar_url": "https://avatars.githubusercontent.com/u/61059807?v=4",
"profile": "https://arpitdalal.dev",
"contributions": [
"doc"
]
},
{
"login": "robertrisch",
"name": "robertrisch",
"avatar_url": "https://avatars.githubusercontent.com/u/73828816?v=4",
"profile": "https://github.com/robertrisch",
"contributions": [
"doc"
]
},
{
"login": "dineshgadge",
"name": "Dinesh Gadge",
"avatar_url": "https://avatars.githubusercontent.com/u/186976?v=4",
"profile": "https://github.com/dineshgadge",
"contributions": [
"code"
]
},
{
"login": "maltekiessling",
"name": "Malte Kießling",
"avatar_url": "https://avatars.githubusercontent.com/u/30420110?v=4",
"profile": "https://github.com/maltekiessling",
"contributions": [
"doc"
]
},
{
"login": "ospfranco",
"name": "Oscar Franco",
"avatar_url": "https://avatars.githubusercontent.com/u/1634213?v=4",
"profile": "ospfranco.com",
"contributions": [
"doc"
]
},
{
"login": "Nfinished",
"name": "Adam Trager",
"avatar_url": "https://avatars.githubusercontent.com/u/1719791?v=4",
"profile": "adamtrager.com",
"contributions": [
"code"
]
},
{
"login": "shellord",
"name": "saheenshoukath",
"avatar_url": "https://avatars.githubusercontent.com/u/2632896?v=4",
"profile": "https://saheen.codes",
"contributions": [
"doc"
]
},
{
"login": "husnuljahneer",
"name": "Husnul Jahneer",
"avatar_url": "https://avatars.githubusercontent.com/u/54552763?v=4",
"profile": "https://jahneer.me",
"contributions": [
"doc"
]
},
{
"login": "ReykCS",
"name": "Reyk",
"avatar_url": "https://avatars.githubusercontent.com/u/40463716?v=4",
"profile": "https://github.com/ReykCS",
"contributions": [
"doc"
]
},
{
"login": "Lokprakash-babu",
"name": "Lokprakash Babu",
"avatar_url": "https://avatars.githubusercontent.com/u/60031382?v=4",
"profile": "https://github.com/Lokprakash-babu",
"contributions": [
"doc"
]
},
{
"login": "eai04191",
"name": "eai04191",
"avatar_url": "https://avatars.githubusercontent.com/u/3516343?v=4",
"profile": "https://mizle.net",
"contributions": [
"doc"
]
},
{
"login": "numanaral",
"name": "Numan",
"avatar_url": "https://avatars.githubusercontent.com/u/25233323?v=4",
"profile": "https://numanaral.github.io/?ref=github",
"contributions": [
"doc"
]
},
{
"login": "jscyo",
"name": "Joel Coutinho",
"avatar_url": "https://avatars.githubusercontent.com/u/6310783?v=4",
"profile": "https://github.com/jscyo",
"contributions": [
"doc"
]
},
{
"login": "davidbarker",
"name": "David Barker",
"avatar_url": "https://avatars.githubusercontent.com/u/1597139?v=4",
"profile": "https://github.com/davidbarker",
"contributions": [
"doc"
]
},
{
"login": "timfee",
"name": "Tim Feeley",
"avatar_url": "https://avatars.githubusercontent.com/u/3246342?v=4",
"profile": "http://www.timfeeley.com/",
"contributions": [
"code"
]
},
{
"login": "Caslus",
"name": "lucas philippe",
"avatar_url": "https://avatars.githubusercontent.com/u/22855640?v=4",
"profile": "https://github.com/Caslus",
"contributions": [
"doc"
]
},
{
"login": "the-bayer",
"name": "Blake Bayer",
"avatar_url": "https://avatars.githubusercontent.com/u/94391693?v=4",
"profile": "https://github.com/the-bayer",
"contributions": [
"code",
"doc"
]
},
{
"login": "rmassie",
"name": "R Massie",
"avatar_url": "https://avatars.githubusercontent.com/u/7375518?v=4",
"profile": "https://github.com/rmassie",
"contributions": [
"doc"
]
},
{
"login": "paulm17",
"name": "Paul",
"avatar_url": "https://avatars.githubusercontent.com/u/387463?v=4",
"profile": "https://github.com/paulm17",
"contributions": [
"doc"
]
},
{
"login": "minho42",
"name": "Min ho Kim",
"avatar_url": "https://avatars.githubusercontent.com/u/15278512?v=4",
"profile": "https://minho42.com",
"contributions": [
"doc"
]
},
{
"login": "webdeb",
"name": "webdeb",
"avatar_url": "https://avatars.githubusercontent.com/u/14992140?v=4",
"profile": "https://github.com/webdeb",
"contributions": [
"doc"
]
},
{
"login": "iDavidB",
"name": "David",
"avatar_url": "https://avatars.githubusercontent.com/u/32268383?v=4",
"profile": "https://github.com/iDavidB",
"contributions": [
"doc",
"code",
"test"
]
},
{
"login": "jakedee",
"name": "Jake Dowie",
"avatar_url": "https://avatars.githubusercontent.com/u/5058625?v=4",
"profile": "https://jdlt.co.uk",
"contributions": [
"doc"
]
},
{
"login": "datner",
"name": "Datner",
"avatar_url": "https://avatars.githubusercontent.com/u/22598347?v=4",
"profile": "https://github.com/datner",
"contributions": [
"doc",
"code",
"test"
]
},
{
"login": "remlse",
"name": "remlse",
"avatar_url": "https://avatars.githubusercontent.com/u/54984957?v=4",
"profile": "https://github.com/remlse",
"contributions": [
"doc"
]
},
{
"login": "sergous",
"name": "Sergei Smirnov",
"avatar_url": "https://avatars.githubusercontent.com/u/545151?v=4",
"profile": "https://github.com/sergous",
"contributions": [
"doc"
]
},
{
"login": "Trancever",
"name": "Dawid Urbaniak",
"avatar_url": "https://avatars.githubusercontent.com/u/18584155?v=4",
"profile": "https://twitter.com/trensik",
"contributions": [
"doc",
"code"
]
},
{
"login": "SerekKiri",
"name": "Kacper Potyrała",
"avatar_url": "https://avatars.githubusercontent.com/u/29735836?v=4",
"profile": "kiri.dev",
"contributions": [
"doc"
]
},
{
"login": "iojcde",
"name": "Jeeho Ahn",
"avatar_url": "https://avatars.githubusercontent.com/u/31413538?v=4",
"profile": "jcde.xyz",
"contributions": [
"doc",
"tool"
]
}
],
"contributorsPerLine": 7,

View File

@@ -48,6 +48,8 @@ eslint.config.*
/nextjs/packages/next-codemod/**/*.js
/nextjs/packages/next-codemod/**/*.d.ts
/nextjs/packages/next-env/**/*.d.ts
/nextjs/packages/next/build/swc/tests/fixture/**
/nextjs/test/integration/async-modules/**
/nextjs/test/integration/eslint/**
/nextjs/test/integration/babel/**
/nextjs/test-timings.json

View File

@@ -1,5 +1,5 @@
module.exports = {
parser: "babel-eslint",
parser: "@babel/eslint-parser",
env: {
browser: true,
commonjs: true,
@@ -8,10 +8,18 @@ module.exports = {
},
parserOptions: {
ecmaVersion: 6,
requireConfigFile: false,
sourceType: "module",
ecmaFeatures: {
jsx: true,
},
babelOptions: {
presets: ["@babel/preset-env", "@babel/preset-react"],
caller: {
// Eslint supports top level await when a parser for it is included. We enable the parser by default for Babel.
supportsTopLevelAwait: true,
},
},
},
plugins: ["import", "unicorn", "simple-import-sort"],
extends: ["react-app"],

4
.github/CODEOWNERS vendored
View File

@@ -1,8 +1,8 @@
# https://help.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners
* @flybayer
* @beerose
# packages/cli/**/* @aem, @flybayer
# packages/generator/**/* @aem @flybayer
packages/generator/templates**/* @flybayer
# packages/generator/templates**/* @flybayer
# packages/installer/**/* @aem @flybayer

View File

@@ -16,4 +16,4 @@ Closes: ?
## Feature Checklist
- [ ] Integration test added (see [test docs](https://blitzjs.com/docs/contributing#running-tests) if needed)
- [ ] Documentation added/updated (submit PR to [blitzjs.com repo](https://github.com/blitz-js/blitzjs.com))
- [ ] Documentation added/updated (submit PR to [blitzjs.com repo `canary` branch](https://github.com/blitz-js/blitzjs.com/tree/canary))

View File

@@ -15,6 +15,10 @@ jobs:
steps:
- uses: actions/checkout@v2
- name: Use Node.js
uses: actions/setup-node@v2
with:
node-version: "14"
- name: Count size
uses: preactjs/compressed-size-action@v2
with:

View File

@@ -30,9 +30,9 @@ jobs:
path: |
${{ steps.yarn-cache-dir-path.outputs.dir }}
**/node_modules
key: ${{ runner.os }}-${{ runner.node_version}}-yarn-v13-${{ hashFiles('yarn.lock') }}
key: ${{ runner.os }}-${{ runner.node_version}}-yarn-v14-${{ hashFiles('yarn.lock') }}
restore-keys: |
${{ runner.os }}-${{ runner.node_version}}-yarn-v13-
${{ runner.os }}-${{ runner.node_version}}-yarn-v14-
- name: Install dependencies
run: yarn install --frozen-lockfile --silent
env:
@@ -41,8 +41,8 @@ jobs:
run: yarn manypkg check
env:
CI: true
- name: Build next.js
run: yarn build:nextjs
- name: Build packages
run: yarn build
env:
CI: true
- name: yarn lint
@@ -54,7 +54,7 @@ jobs:
name: Build
runs-on: ubuntu-latest
env:
NEXT_TELEMETRY_DISABLED: 1
BLITZ_TELEMETRY_DISABLED: 1
steps:
- uses: actions/checkout@v2
with:
@@ -74,9 +74,9 @@ jobs:
path: |
${{ steps.yarn-cache-dir-path.outputs.dir }}
**/node_modules
key: ${{ runner.os }}-${{ runner.node_version}}-yarn-v13-${{ hashFiles('yarn.lock') }}
key: ${{ runner.os }}-${{ runner.node_version}}-yarn-v14-${{ hashFiles('yarn.lock') }}
restore-keys: |
${{ runner.os }}-${{ runner.node_version}}-yarn-v13-
${{ runner.os }}-${{ runner.node_version}}-yarn-v14-
- run: yarn install --frozen-lockfile --check-files
- name: Build Packages
run: yarn build
@@ -91,13 +91,17 @@ jobs:
needs: build-linux
runs-on: ubuntu-latest
env:
NEXT_TELEMETRY_DISABLED: 1
BLITZ_TELEMETRY_DISABLED: 1
steps:
- uses: actions/cache@v2
id: restore-build
with:
path: ./*
key: ${{ runner.os }}-${{ github.sha }}
- name: Use Node.js
uses: actions/setup-node@v2
with:
node-version: "14"
- name: Setup kernel to increase watchers
if: runner.os == 'Linux'
run: echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
@@ -106,19 +110,51 @@ jobs:
env:
CI: true
testNextPackages:
name: Next - Test Packages
defaults:
run:
working-directory: nextjs
needs: build-linux
runs-on: ubuntu-latest
env:
BLITZ_TELEMETRY_DISABLED: 1
steps:
- uses: actions/cache@v2
id: restore-build
with:
path: ./*
key: ${{ runner.os }}-${{ github.sha }}
- name: Use Node.js
uses: actions/setup-node@v2
with:
node-version: "14"
- name: Setup kernel to increase watchers
if: runner.os == 'Linux'
run: echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
- name: Test Next Packages
run: yarn testonly:packages
env:
CI: true
testBlitzExamples:
timeout-minutes: 30
name: Blitz - Test Example Apps (ubuntu-latest)
needs: build-linux
runs-on: ubuntu-latest
env:
NEXT_TELEMETRY_DISABLED: 1
BLITZ_TELEMETRY_DISABLED: 1
DEBUG: blitz:session
steps:
- uses: actions/cache@v2
id: restore-build
with:
path: ./*
key: ${{ runner.os }}-${{ github.sha }}
- name: Use Node.js
uses: actions/setup-node@v2
with:
node-version: "14"
# Needed to get cypress binary
- run: yarn cypress install
- name: Install sass
@@ -136,7 +172,7 @@ jobs:
name: Blitz - Test Example Apps (windows-latest)
runs-on: windows-latest
env:
NEXT_TELEMETRY_DISABLED: 1
BLITZ_TELEMETRY_DISABLED: 1
steps:
- uses: actions/checkout@v2
with:
@@ -156,9 +192,9 @@ jobs:
# path: |
# ${{ steps.yarn-cache-dir-path.outputs.dir }}
# **/node_modules
# key: ${{ runner.os }}-${{ runner.node_version}}-yarn-v13-${{ hashFiles('yarn.lock') }}
# key: ${{ runner.os }}-${{ runner.node_version}}-yarn-v14-${{ hashFiles('yarn.lock') }}
# restore-keys: |
# ${{ runner.os }}-${{ runner.node_version}}-yarn-v13-
# ${{ runner.os }}-${{ runner.node_version}}-yarn-v14-
- run: yarn install --frozen-lockfile --check-files
- name: Build Packages
run: yarn build
@@ -179,14 +215,14 @@ jobs:
runs-on: ubuntu-latest
needs: build-linux
env:
NEXT_TELEMETRY_DISABLED: 1
BLITZ_TELEMETRY_DISABLED: 1
steps:
- uses: actions/cache@v2
id: restore-build
with:
path: ./*
key: ${{ runner.os }}-${{ github.sha }}
- run: ./check-pre-compiled.sh
- run: ./scripts/check-pre-compiled.sh
testUnit:
name: Nextjs - Test Unit
@@ -196,7 +232,7 @@ jobs:
runs-on: ubuntu-latest
needs: build-linux
env:
NEXT_TELEMETRY_DISABLED: 1
BLITZ_TELEMETRY_DISABLED: 1
NEXT_TEST_JOB: 1
HEADLESS: true
steps:
@@ -212,7 +248,7 @@ jobs:
needs: build-linux
runs-on: ubuntu-latest
env:
NEXT_TELEMETRY_DISABLED: 1
BLITZ_TELEMETRY_DISABLED: 1
NEXT_TEST_JOB: 1
HEADLESS: true
steps:
@@ -221,6 +257,10 @@ jobs:
with:
path: ./*
key: ${{ runner.os }}-${{ github.sha }}
- name: Use Node.js
uses: actions/setup-node@v2
with:
node-version: "14"
# TODO: remove after we fix watchpack watching too much
- name: Setup kernel to increase watchers
@@ -233,7 +273,7 @@ jobs:
name: Blitz - Test Integration (Windows)
runs-on: windows-latest
env:
NEXT_TELEMETRY_DISABLED: 1
BLITZ_TELEMETRY_DISABLED: 1
NEXT_TEST_JOB: 1
HEADLESS: true
steps:
@@ -255,9 +295,9 @@ jobs:
# path: |
# ${{ steps.yarn-cache-dir-path.outputs.dir }}
# **/node_modules
# key: ${{ runner.os }}-${{ runner.node_version}}-yarn-v13-${{ hashFiles('yarn.lock') }}
# key: ${{ runner.os }}-${{ runner.node_version}}-yarn-v14-${{ hashFiles('yarn.lock') }}
# restore-keys: |
# ${{ runner.os }}-${{ runner.node_version}}-yarn-v13-
# ${{ runner.os }}-${{ runner.node_version}}-yarn-v14-
- run: yarn install --frozen-lockfile --check-files
- name: Build Packages
run: yarn build
@@ -271,7 +311,7 @@ jobs:
runs-on: ubuntu-latest
needs: build-linux
env:
NEXT_TELEMETRY_DISABLED: 1
BLITZ_TELEMETRY_DISABLED: 1
NEXT_TEST_JOB: 1
HEADLESS: true
strategy:
@@ -284,7 +324,10 @@ jobs:
with:
path: ./*
key: ${{ runner.os }}-${{ github.sha }}
- name: Use Node.js
uses: actions/setup-node@v2
with:
node-version: "14"
# TODO: remove after we fix watchpack watching too much
- name: Setup kernel to increase watchers
if: runner.os == 'Linux'
@@ -295,7 +338,7 @@ jobs:
name: Nextjs - Test Integration (Windows)
runs-on: windows-latest
env:
NEXT_TELEMETRY_DISABLED: 1
BLITZ_TELEMETRY_DISABLED: 1
NEXT_TEST_JOB: 1
HEADLESS: true
steps:
@@ -317,9 +360,9 @@ jobs:
# path: |
# ${{ steps.yarn-cache-dir-path.outputs.dir }}
# **/node_modules
# key: ${{ runner.os }}-${{ runner.node_version}}-yarn-v13-${{ hashFiles('yarn.lock') }}
# key: ${{ runner.os }}-${{ runner.node_version}}-yarn-v14-${{ hashFiles('yarn.lock') }}
# restore-keys: |
# ${{ runner.os }}-${{ runner.node_version}}-yarn-v13-
# ${{ runner.os }}-${{ runner.node_version}}-yarn-v14-
- run: yarn install --frozen-lockfile --check-files
- name: Build Packages
run: yarn build
@@ -334,7 +377,7 @@ jobs:
runs-on: ubuntu-latest
needs: build-linux
env:
NEXT_TELEMETRY_DISABLED: 1
BLITZ_TELEMETRY_DISABLED: 1
NEXT_TEST_JOB: 1
HEADLESS: true
TEST_ELECTRON: 1
@@ -362,6 +405,7 @@ jobs:
testIntegrationBlitzWin,
testUnit,
testBlitzPackages,
testNextPackages,
testBlitzExamples,
testBlitzExamplesWin,
]
@@ -378,7 +422,7 @@ jobs:
env:
HEADLESS: true
BROWSER_NAME: "firefox"
NEXT_TELEMETRY_DISABLED: 1
BLITZ_TELEMETRY_DISABLED: 1
steps:
- uses: actions/cache@v2
id: restore-build
@@ -397,7 +441,7 @@ jobs:
env:
BROWSERSTACK: true
BROWSER_NAME: "safari"
NEXT_TELEMETRY_DISABLED: 1
BLITZ_TELEMETRY_DISABLED: 1
SKIP_LOCAL_SELENIUM_SERVER: true
BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }}
BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }}
@@ -420,7 +464,7 @@ jobs:
BROWSERSTACK: true
LEGACY_SAFARI: true
BROWSERNAME: "safari"
NEXT_TELEMETRY_DISABLED: 1
BLITZ_TELEMETRY_DISABLED: 1
SKIP_LOCAL_SELENIUM_SERVER: true
BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }}
BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }}

3
.gitignore vendored
View File

@@ -30,4 +30,7 @@ examples/auth2
db.sqlite-journal
test/integration/**/db.json
test/**/*/out
test/**/blitz-env.d.ts
examples/**/blitz-env.d.ts
.blitz**

View File

@@ -2,4 +2,4 @@
# Minimal config. version is the only required field.
version = 1
merge.automerge_label = "0 - <(^_^)> - merge it! ✌️"
approve.auto_approve_usernames = ["flybayer", "depfu"]
approve.auto_approve_usernames = ["flybayer", "beerose", "depfu"]

View File

@@ -1 +1 @@
12.20.0
14.18.1

View File

@@ -4,6 +4,12 @@
## Notes For Core Team
### To Publish a new NPM Package under `@blitzjs/` namespace
1. cd into the package directory
2. Run `npm publish --tag danger --access public`
- `--access public` is required because scoped packages are set to private by default
### Syncing Next.js Fork
1. Run `yarn push-nextjs`
@@ -19,11 +25,12 @@
6. Resolve all merge conflicts and complete merge
7. Run `yarn` and make sure all builds complete
8. Run `yarn lint` and fix any issues
9. `git push`
4. Run `yarn pull next-nextjs`
9. Commit all changes to finish merge
10. `git push`
4. Run `yarn pull-nextjs`
5. Run `yarn`
6. Run `yarn manypkg check` and optionally `yarn manypkg fix` to fix any issues
7. Under `nextjs/`, run `./check-pre-compiled.sh` and commit the changes
7. Under `nextjs/`, run `./scripts/check-pre-compiled.sh` and commit the changes
8. Run `yarn build:nextjs`
9. Run `yarn lint` - fix any issues
10. Run `yarn build` - fix any issues
@@ -33,3 +40,52 @@
14. Any doc updates needed?
15. Merge PR
16. `yarn push-nextjs`
#### Troubleshooting
##### yarn lint - Failed to load parser
Caused by invalid version of `@babel/eslint-parser`. `7.13.14` is a working version. I think it may be an incompatibility between this version and the version of eslint?
- change version of eslint-parser
- run `yarn --check-files`
- run `./scripts/check-pre-compiled.sh` from `./nextjs/`
- run `yarn build:nextjs` from root
- Try linting again
```
~/c/blitz> yarn lint
yarn run v1.22.10
$ eslint --ext ".js,.ts,.tsx" .
Oops! Something went wrong! :(
ESLint: 7.21.0
Error: Failed to load parser './parser.js' declared in 'examples/auth/.eslintrc.js » eslint-config-blitz » eslint-config-next': Cannot find module '@babel/parser'
at webpackEmptyContext (/Users/b/c/blitz/nextjs/packages/next/dist/compiled/babel/bundle.js:1:33258)
at Object.73139 (/Users/b/c/blitz/nextjs/packages/next/dist/compiled/babel/bundle.js:2194:783181)
at __nccwpck_require__ (/Users/b/c/blitz/nextjs/packages/next/dist/compiled/babel/bundle.js:2194:1065271)
at Object.eslintParser (/Users/b/c/blitz/nextjs/packages/next/dist/compiled/babel/bundle.js:1:43676)
at Object.<anonymous> (/Users/b/c/blitz/nextjs/packages/next/dist/compiled/babel/eslint-parser.js:1:100)
at Module._compile (/Users/b/c/blitz/node_modules/v8-compile-cache/v8-compile-cache.js:192:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)
at Module.load (internal/modules/cjs/loader.js:863:32)
at Function.Module._load (internal/modules/cjs/loader.js:708:14)
at Module.require (internal/modules/cjs/loader.js:887:19)
error Command failed with exit code 2.
```
##### Failed to compile - LICENSE
This error occurs sometimes when you import code from packages/next/build/utils.ts into some other code like config-shared.ts. Solution is to move the code into another file.
```
Failed to compile.
../../../packages/next/dist/compiled/webpack/LICENSE
Module parse failed: Unexpected token (1:10)
You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See webpack.js.org/concepts#loaders
> Copyright JS Foundation and other contributors
|
| Permission is hereby granted, free of charge, to any person obtaining
```

213
README.md
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-319-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-408-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">
@@ -22,7 +22,7 @@
<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" target="_blank">Read the Documentation</a></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.
@@ -107,18 +107,21 @@ Your financial contributions help ensure Blitz continues to be developed and mai
<table>
<tr>
<td><a aria-label="Andreas Asprou" href="https://andreas.fyi">
<img alt="" src="https://raw.githubusercontent.com/blitz-js/blitz/canary/assets/andreas.jpg" width="40px"/>
</a></td>
<td><a aria-label="Robert Malko" href="https://github.com/malkomalko">
<img alt="" src="https://raw.githubusercontent.com/blitz-js/blitz/canary/assets/rob_blitz.jpg" width="40px"/>
</a></td>
<td><a aria-label="Digas" href="https://digsas.com">
<img alt="" src="https://raw.githubusercontent.com/blitz-js/blitz/canary/assets/digsas.svg" width="40px"/>
</a></td>
<td><a aria-label="userTrack" href="https://www.usertrack.net/?ref=blitzjs">
<img alt="" src="https://raw.githubusercontent.com/blitz-js/blitz/canary/assets/usertrack.png" width="40px"/>
</a></td>
<td>
<a aria-label="Andreas Asprou" href="https://andreas.fyi">
<img alt="" src="https://raw.githubusercontent.com/blitz-js/blitz/canary/assets/andreas.jpg" width="40px"/>
</a>
</td>
<td>
<a aria-label="MeetKai" href="https://meetkai.com/?ref=blitzjs">
<img alt="" src="https://raw.githubusercontent.com/blitz-js/blitz/canary/assets/meetkai.png" width="40px"/>
</a>
</td>
<td>
<a aria-label="JDLT" href="https://jdlt.co.uk/?ref=blitzjs">
<img alt="" src="https://raw.githubusercontent.com/blitz-js/blitz/canary/assets/jdlt.png" width="40px"/>
</a>
</td>
</tr>
</table>
@@ -132,11 +135,15 @@ Your financial contributions help ensure Blitz continues to be developed and mai
</a></td>
<td><a aria-label="RIT" href="https://rit-inc.co.jp/?utm_source=BlitzJS&utm_medium=sponsorship&utm_campaign=BlitzJS_Sponsorship_2021">
<img alt="" src="https://raw.githubusercontent.com/blitz-js/blitz/canary/assets/rit_logo.png" width="200px">
</a></td>
<td><a aria-label="Boostry" href="https://boostry.co.jp/?utm_source=BlitzJS&utm_medium=sponsorship&utm_campaign=BlitzJS_Sponsorship_2021">
<img alt="" src="https://raw.githubusercontent.com/blitz-js/blitz/canary/assets/boostry.svg" width="200px">
</a></td>
</tr>
</table>
### 🥈 Silver Sponsors
<table>
@@ -145,11 +152,6 @@ Your financial contributions help ensure Blitz continues to be developed and mai
<a aria-label="Fauna" href="https://dashboard.fauna.com/accounts/register?utm_source=BlitzJS&utm_medium=sponsorship&utm_campaign=BlitzJS_Sponsorship_2020">
<img alt="" src="https://raw.githubusercontent.com/blitz-js/blitz/canary/assets/Fauna_Logo_Blue.png" width="300px">
</a>
</td>
<td>
<a aria-label="GraphCMS" href="https://graphcms.com/?utm_source=BlitzJS&utm_medium=sponsorship&utm_campaign=BlitzJS_Sponsorship_2021">
<img alt="" src="https://raw.githubusercontent.com/blitz-js/blitz/canary/assets/graphcms.png" width="300px">
</a>
</td>
</tr>
</table>
@@ -174,6 +176,8 @@ Your financial contributions help ensure Blitz continues to be developed and mai
<table>
<tr>
<td align="center"><a href="https://twitter.com/flybayer"><img src="https://avatars3.githubusercontent.com/u/8813276?v=4" width="100px;" alt=""/><br /><sub><b>Brandon Bayer</b></sub></a><br />Creator</td>
<td align="center"><a href="http://aleksandra.codes"><img src="https://avatars.githubusercontent.com/u/9019397?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Aleksandra Sikora</b></sub></a><br />Lead Maintainer</td>
</tr>
</table>
<!-- markdownlint-enable -->
@@ -209,22 +213,6 @@ _Issue triage, pull request triage, community encouragement and moderation, etc_
<table>
<tr>
<td align="center"><a href="http://jeremyliberman.com/"><img src="https://avatars3.githubusercontent.com/u/2754163?v=4" width="100px;" alt=""/><br /><sub><b>Jeremy Liberman</b></td>
<td align="center"><a href="https://twitter.com/nitaking_"><img src="https://avatars2.githubusercontent.com/u/10850034?v=4" width="100px;" alt=""/><br /><sub><b>Satoshi Nitawaki</b></sub></a></td>
<td align="center"><a href="https://github.com/engelkes-finstreet"><img src="https://avatars0.githubusercontent.com/u/36962022?s=460&u=34cfc4a3d6da0a87026f6068c371779c68daa3a2&v=4" width="100px;" alt=""/><br /><sub><b>Patrick Engelkes</b></sub></a></td>
<td align="center"><a href="https://twitter.com/myrondavis"><img src="https://avatars2.githubusercontent.com/u/1430136?v=4" width="100px;" alt=""/><br /><sub><b>Myron Davis</b></sub></a></td>
<td align="center"><a href="https://twitter.com/NaReto1125_"><img src="https://avatars.githubusercontent.com/reo777" width="100px;" alt=""/><br /><sub><b>Reo Ishiyama</b></sub></a></td>
<td align="center">
<a href="https://kevinlangleyjr.com">
<img
src="https://avatars.githubusercontent.com/u/877634?v=4"
width="100px;"
alt=""
/><br />
<sub>
<b>Kevin Langley Jr.</b>
</sub>
</a>
</td>
<td align="center">
<a href="https://mina.ca">
<img src="https://avatars.githubusercontent.com/mabadir" width="100px;" alt="Mina Abadir avatar" /><br />
@@ -233,8 +221,6 @@ _Issue triage, pull request triage, community encouragement and moderation, etc_
</sub>
</a>
</td>
</tr>
<tr>
<td align="center">
<a href="https://builtforfifty.com">
<img src="https://avatars.githubusercontent.com/abuuzayr" width="100px;" alt="Abu Uzayr avatar" /><br />
@@ -243,6 +229,30 @@ _Issue triage, pull request triage, community encouragement and moderation, etc_
</sub>
</a>
</td>
<td align="center">
<a href="https://damilolarandolph.com/">
<img src="https://avatars.githubusercontent.com/damilolarandolph" width="100px;" alt="Damilola Randolph avatar" /><br />
<sub>
<b>Damilola Randolph</b>
</sub>
</a>
</td>
<td align="center">
<a href="https://www.saheen.me/">
<img src="https://avatars.githubusercontent.com/shellord" width="100px;" alt="Saheen Shoukath avatar" /><br />
<sub>
<b>Saheen Shoukath</b>
</sub>
</a>
</td>
<td align="center">
<a href="https://jahneer.me">
<img src="https://avatars.githubusercontent.com/husnuljahneer" width="100px;" alt="Husnul Jahneer avatar" /><br />
<sub>
<b>Husnul Jahneer</b>
</sub>
</a>
</td>
</tr>
</table>
<!-- markdownlint-enable -->
@@ -297,7 +307,7 @@ Thanks to these wonderful people ([emoji key](https://allcontributors.org/docs/e
</tr>
<tr>
<td align="center"><a href="https://github.com/sonnypgs"><img src="https://avatars3.githubusercontent.com/u/1431300?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Sonny</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=sonnypgs" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/Zeko369"><img src="https://avatars3.githubusercontent.com/u/3064377?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Fran Zekan</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=Zeko369" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=Zeko369" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/Zeko369"><img src="https://avatars3.githubusercontent.com/u/3064377?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Fran Zekan</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=Zeko369" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=Zeko369" title="Documentation">📖</a> <a href="https://github.com/blitz-js/blitz/commits?author=Zeko369" title="Tests">⚠️</a></td>
<td align="center"><a href="http://twitter.com/JanBaykara"><img src="https://avatars2.githubusercontent.com/u/237556?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jan Baykara</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=janbaykara" title="Documentation">📖</a></td>
<td align="center"><a href="https://mikeattara.com"><img src="https://avatars1.githubusercontent.com/u/31483629?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mike Perry Y Attara</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=mikeattara" title="Documentation">📖</a></td>
<td align="center"><a href="https://devanthe.dev"><img src="https://avatars0.githubusercontent.com/u/354652?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Devan</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=DevanB" title="Documentation">📖</a></td>
@@ -338,7 +348,7 @@ Thanks to these wonderful people ([emoji key](https://allcontributors.org/docs/e
<td align="center"><a href="http://anteprimorac.com.hr"><img src="https://avatars0.githubusercontent.com/u/972083?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ante Primorac</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=anteprimorac" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=anteprimorac" title="Documentation">📖</a></td>
<td align="center"><a href="http://mykalmachon.dev"><img src="https://avatars1.githubusercontent.com/u/7844994?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mykal Machon</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=MykalMachon" title="Code">💻</a></td>
<td align="center"><a href="https://jamiedavenport.dev"><img src="https://avatars2.githubusercontent.com/u/1329874?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jamie Davenport</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=jamiedavenport" title="Code">💻</a> <a href="#maintenance-jamiedavenport" title="Maintenance">🚧</a></td>
<td align="center"><a href="https://cloudnweb.dev/"><img src="https://avatars0.githubusercontent.com/u/17050715?v=4?s=100" width="100px;" alt=""/><br /><sub><b>GaneshMani</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=ganeshmani" title="Code">💻</a></td>
<td align="center"><a href="https://cloudnweb.dev/"><img src="https://avatars0.githubusercontent.com/u/17050715?v=4?s=100" width="100px;" alt=""/><br /><sub><b>GaneshMani</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=ganeshmani" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=ganeshmani" title="Tests">⚠️</a></td>
</tr>
<tr>
<td align="center"><a href="http://ramonmorcillo.com"><img src="https://avatars3.githubusercontent.com/u/31936665?v=4?s=100" width="100px;" alt=""/><br /><sub><b>reymon359</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=reymon359" title="Code">💻</a></td>
@@ -387,7 +397,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="Tests">⚠️</a> <a href="https://github.com/blitz-js/blitz/commits?author=dillonraphael" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/clgeoio"><img src="https://avatars2.githubusercontent.com/u/37571416?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Cody G</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=clgeoio" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=clgeoio" title="Tests">⚠️</a></td>
<td align="center"><a href="https://github.com/madflow"><img src="https://avatars0.githubusercontent.com/u/183248?v=4?s=100" width="100px;" alt=""/><br /><sub><b>madflow</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=madflow" title="Documentation">📖</a></td>
<td align="center"><a href="https://twitter.com/nitaking_"><img src="https://avatars2.githubusercontent.com/u/10850034?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Satoshi Nitawaki</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=nitaking" title="Code">💻</a> <a href="#maintenance-nitaking" title="Maintenance">🚧</a> <a href="#question-nitaking" title="Answering Questions">💬</a> <a href="https://github.com/blitz-js/blitz/commits?author=nitaking" title="Documentation">📖</a></td>
@@ -467,7 +477,7 @@ Thanks to these wonderful people ([emoji key](https://allcontributors.org/docs/e
<td align="center"><a href="https://chriswray.dev/"><img src="https://avatars0.githubusercontent.com/u/53663762?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Christopher Wray</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=cwray-tech" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/piotrski"><img src="https://avatars0.githubusercontent.com/u/244174?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Piotrek Tomczewski</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=piotrski" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/piotrski"><img src="https://avatars0.githubusercontent.com/u/244174?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Piotrek Tomczewski</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=piotrski" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=piotrski" title="Documentation">📖</a></td>
<td align="center"><a href="http://raph.site"><img src="https://avatars3.githubusercontent.com/u/1575946?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Raphaël Huchet</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=rap2hpoutre" title="Documentation">📖</a> <a href="https://github.com/blitz-js/blitz/commits?author=rap2hpoutre" title="Tests">⚠️</a> <a href="https://github.com/blitz-js/blitz/commits?author=rap2hpoutre" title="Code">💻</a></td>
<td align="center"><a href="http://kattcorp.com"><img src="https://avatars1.githubusercontent.com/u/459267?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alex Johansson</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=KATT" title="Code">💻</a></td>
<td align="center"><a href="http://davidmazza.com"><img src="https://avatars0.githubusercontent.com/u/120893?v=4?s=100" width="100px;" alt=""/><br /><sub><b>David Mazza</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=dmzza" title="Code">💻</a></td>
@@ -530,7 +540,7 @@ Thanks to these wonderful people ([emoji key](https://allcontributors.org/docs/e
<td align="center"><a href="https://brianypliu.com"><img src="https://avatars.githubusercontent.com/u/3888780?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Brian Liu</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=LBrian" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="http://aleksandra.codes"><img src="https://avatars.githubusercontent.com/u/9019397?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Aleksandra Sikora</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=beerose" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=beerose" title="Documentation">📖</a></td>
<td align="center"><a href="http://aleksandra.codes"><img src="https://avatars.githubusercontent.com/u/9019397?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Aleksandra Sikora</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=beerose" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=beerose" title="Documentation">📖</a> <a href="https://github.com/blitz-js/blitz/commits?author=beerose" title="Tests">⚠️</a></td>
<td align="center"><a href="https://juanm04.com"><img src="https://avatars.githubusercontent.com/u/16712703?v=4?s=100" width="100px;" alt=""/><br /><sub><b>JuanM04</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=JuanM04" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=JuanM04" title="Documentation">📖</a> <a href="https://github.com/blitz-js/blitz/commits?author=JuanM04" title="Tests">⚠️</a></td>
<td align="center"><a href="https://github.com/arenddeboer"><img src="https://avatars.githubusercontent.com/u/7022204?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Arend de Boer</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=arenddeboer" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/fmilani"><img src="https://avatars.githubusercontent.com/u/1580375?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Felipe Milani</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=fmilani" title="Documentation">📖</a></td>
@@ -661,14 +671,129 @@ Thanks to these wonderful people ([emoji key](https://allcontributors.org/docs/e
<td align="center"><a href="https://github.com/bravo-kernel"><img src="https://avatars.githubusercontent.com/u/230500?v=4?s=100" width="100px;" alt=""/><br /><sub><b>bravo-kernel</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=bravo-kernel" title="Code">💻</a></td>
<td align="center"><a href="https://samholmes.net"><img src="https://avatars.githubusercontent.com/u/8385528?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Sam Holmes</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=sam3d" title="Code">💻</a></td>
<td align="center"><a href="https://doncicuto.medium.com"><img src="https://avatars.githubusercontent.com/u/30386061?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Miguel Cabrerizo</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=doncicuto" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=doncicuto" title="Documentation">📖</a></td>
<td align="center"><a href="http://zackhobson.com/"><img src="https://avatars.githubusercontent.com/u/12092?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Zack Hobson</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=zenhob" title="Code">💻</a></td>
<td align="center"><a href="http://zackhobson.com/"><img src="https://avatars.githubusercontent.com/u/12092?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Zack Hobson</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=zenhob" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=zenhob" title="Documentation">📖</a></td>
<td align="center"><a href="https://www.mokhtar.dev"><img src="https://avatars.githubusercontent.com/u/13026820?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mokhtar</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=m5r" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/kenkuan"><img src="https://avatars.githubusercontent.com/u/1924968?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ken Kuan</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=kenkuan" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/meehawk"><img src="https://avatars.githubusercontent.com/u/80167324?v=4?s=100" width="100px;" alt=""/><br /><sub><b>meehawk</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=meehawk" title="Code">💻</a></td>
<td align="center"><a href="rahulravindran.in"><img src="https://avatars.githubusercontent.com/u/10168946?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Rahul Ravindran</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=ravindranrahul" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/s-r-x"><img src="https://avatars.githubusercontent.com/u/41614937?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ilya</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=s-r-x" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=s-r-x" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/s-r-x"><img src="https://avatars.githubusercontent.com/u/41614937?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ilya</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=s-r-x" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=s-r-x" title="Documentation">📖</a> <a href="https://github.com/blitz-js/blitz/commits?author=s-r-x" title="Tests">⚠️</a></td>
<td align="center"><a href="https://github.com/hashimwarren"><img src="https://avatars.githubusercontent.com/u/6027587?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Hashim Warren</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=hashimwarren" title="Documentation">📖</a></td>
<td align="center"><a href="https://damilolarandolph.com"><img src="https://avatars.githubusercontent.com/u/43427949?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Damilola Randolph</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=damilolarandolph" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/mwcampbell"><img src="https://avatars.githubusercontent.com/u/214820?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matt Campbell</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=mwcampbell" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/ratson"><img src="https://avatars.githubusercontent.com/u/2682937?v=4?s=100" width="100px;" alt=""/><br /><sub><b>(◕ᴥ◕)</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=ratson" title="Code">💻</a></td>
<td align="center"><a href="maciejmyslinski.com"><img src="https://avatars.githubusercontent.com/u/11421186?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mat Milbury</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=maciejmyslinski" title="Documentation">📖</a></td>
<td align="center"><a href="https://andreas.fyi"><img src="https://avatars.githubusercontent.com/u/8077469?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Andreas Asprou</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=andreasasprou" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=andreasasprou" title="Tests">⚠️</a></td>
<td align="center"><a href="https://github.com/kotx"><img src="https://avatars.githubusercontent.com/u/33439542?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Kot</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=kotx" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=kotx" title="Tests">⚠️</a> <a href="https://github.com/blitz-js/blitz/commits?author=kotx" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/isaka1022"><img src="https://avatars.githubusercontent.com/u/28589716?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Amane</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=isaka1022" title="Documentation">📖</a></td>
<td align="center"><a href="johnleung.com"><img src="https://avatars.githubusercontent.com/u/20699?v=4?s=100" width="100px;" alt=""/><br /><sub><b>John Leung</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=fuzzthink" title="Documentation">📖</a></td>
<td align="center"><a href="roettgers.co"><img src="https://avatars.githubusercontent.com/u/29666239?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Bruce</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=bcye" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/emilygracekz"><img src="https://avatars.githubusercontent.com/u/57361805?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Emily</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=emilygracekz" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/npverni"><img src="https://avatars.githubusercontent.com/u/3537?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Nathan Verni</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=npverni" title="Documentation">📖</a></td>
<td align="center"><a href="https://davyengone.io"><img src="https://avatars.githubusercontent.com/u/4896002?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Davy Engone</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=davyengone" title="Documentation">📖</a></td>
<td align="center"><a href="https://fedeorlandau.dev/"><img src="https://avatars.githubusercontent.com/u/10283686?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Federico Joel Orlandau</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=Fedeorlandau" title="Documentation">📖</a> <a href="https://github.com/blitz-js/blitz/commits?author=Fedeorlandau" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/johnmurphy01"><img src="https://avatars.githubusercontent.com/u/2939548?v=4?s=100" width="100px;" alt=""/><br /><sub><b>John Murphy</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=johnmurphy01" title="Documentation">📖</a> <a href="https://github.com/blitz-js/blitz/commits?author=johnmurphy01" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/martinsaxa"><img src="https://avatars.githubusercontent.com/u/33789474?v=4?s=100" width="100px;" alt=""/><br /><sub><b>martinsaxa</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=martinsaxa" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/ajwgeek"><img src="https://avatars.githubusercontent.com/u/2135600?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Austin Walhof</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=ajwgeek" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center"><a href="g3offrey.dev"><img src="https://avatars.githubusercontent.com/u/11151445?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Geoffrey</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=g3offrey" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=g3offrey" title="Documentation">📖</a> <a href="https://github.com/blitz-js/blitz/commits?author=g3offrey" title="Tests">⚠️</a></td>
<td align="center"><a href="https://github.com/keevan"><img src="https://avatars.githubusercontent.com/u/9924643?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Kevin Pham</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=keevan" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/kimngan-bui"><img src="https://avatars.githubusercontent.com/u/20723478?v=4?s=100" width="100px;" alt=""/><br /><sub><b>kimngan-bui</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=kimngan-bui" title="Documentation">📖</a></td>
<td align="center"><a href="world.hey.com/bach"><img src="https://avatars.githubusercontent.com/u/11691670?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Bahk Chanhee</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=9j" title="Code">💻</a></td>
<td align="center"><a href="http://www.afterecon.com/"><img src="https://avatars.githubusercontent.com/u/5559355?v=4?s=100" width="100px;" alt=""/><br /><sub><b>John Vandivier</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=Vandivier" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=Vandivier" title="Tests">⚠️</a> <a href="https://github.com/blitz-js/blitz/commits?author=Vandivier" title="Documentation">📖</a></td>
<td align="center"><a href="http://namirsab.github.io"><img src="https://avatars.githubusercontent.com/u/6980777?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Namir</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=namirsab" title="Documentation">📖</a> <a href="https://github.com/blitz-js/blitz/commits?author=namirsab" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=namirsab" title="Tests">⚠️</a></td>
<td align="center"><a href="https://twitter.com/scttcper"><img src="https://avatars.githubusercontent.com/u/1400464?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Scott Cooper</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=scttcper" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center"><a href="abduttayyeb.github.io"><img src="https://avatars.githubusercontent.com/u/55306260?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Abduttayyeb M.r</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=Abduttayyeb" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/maybebored"><img src="https://avatars.githubusercontent.com/u/20951181?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mayuran</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=maybebored" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/MuckHub"><img src="https://avatars.githubusercontent.com/u/54979136?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Aleksei Vesselko</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=MuckHub" title="Documentation">📖</a></td>
<td align="center"><a href="https://p-siriphanthong.github.io/"><img src="https://avatars.githubusercontent.com/u/29949429?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Punn Siriphanthong</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=p-siriphanthong" title="Code">💻</a></td>
<td align="center"><a href="https://my-portfolio-292eb.web.app"><img src="https://avatars.githubusercontent.com/u/83679827?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Shawn Fetanat</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=shawn-fetanat" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/mochi-sann"><img src="https://avatars.githubusercontent.com/u/44772513?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Moyuru</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=mochi-sann" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=mochi-sann" title="Tests">⚠️</a> <a href="https://github.com/blitz-js/blitz/commits?author=mochi-sann" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/camsloanftc"><img src="https://avatars.githubusercontent.com/u/16295659?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Cam Sloan</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=camsloanftc" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center"><a href="https://macieksitkowski.com"><img src="https://avatars.githubusercontent.com/u/58401630?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Maciek Sitkowski</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=sitek94" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/vivek7405"><img src="https://avatars.githubusercontent.com/u/24492244?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Vivek</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=vivek7405" title="Documentation">📖</a> <a href="https://github.com/blitz-js/blitz/commits?author=vivek7405" title="Code">💻</a></td>
<td align="center"><a href="http://cj.io"><img src="https://avatars.githubusercontent.com/u/1819?v=4?s=100" width="100px;" alt=""/><br /><sub><b>CJ Lazell</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=cj" title="Code">💻</a></td>
<td align="center"><a href="robertbroersma.com"><img src="https://avatars.githubusercontent.com/u/4519828?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Robert</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=RobertBroersma" title="Documentation">📖</a></td>
<td align="center"><a href="https://christianjensen.netlify.com"><img src="https://avatars.githubusercontent.com/u/12374723?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Christian Jensen</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=cbejensen" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/dvnrsn"><img src="https://avatars.githubusercontent.com/u/9112811?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Devin Rasmussen</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=dvnrsn" title="Code">💻</a></td>
<td align="center"><a href="www.linkedin.com/in/devtom"><img src="https://avatars.githubusercontent.com/u/23282613?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Thomas Brenneur</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=devtombiz" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=devtombiz" title="Documentation">📖</a> <a href="https://github.com/blitz-js/blitz/commits?author=devtombiz" title="Tests">⚠️</a></td>
</tr>
<tr>
<td align="center"><a href="https://lucasvazq.github.io/"><img src="https://avatars.githubusercontent.com/u/38964964?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lucas Vazquez</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=lucasvazq" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/chrisj-back2work"><img src="https://avatars.githubusercontent.com/u/68551954?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Chris Johnson</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=chrisj-back2work" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/thisdotrob"><img src="https://avatars.githubusercontent.com/u/12902589?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Rob Stevenson</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=thisdotrob" title="Documentation">📖</a></td>
<td align="center"><a href="www.lucas.computer"><img src="https://avatars.githubusercontent.com/u/1363056?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lucas Heymès</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=lovethebomb" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=lovethebomb" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/NorfeldtAbtion"><img src="https://avatars.githubusercontent.com/u/53769763?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lasse Norfeldt</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=NorfeldtAbtion" title="Documentation">📖</a></td>
<td align="center"><a href="https://nyaripeter.hu/"><img src="https://avatars.githubusercontent.com/u/6048614?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Péter Nyári</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=netwarex" title="Documentation">📖</a> <a href="https://github.com/blitz-js/blitz/commits?author=netwarex" title="Code">💻</a></td>
<td align="center"><a href="https://www.holgerfrohloff.de"><img src="https://avatars.githubusercontent.com/u/84148?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Holger Frohloff</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=5minpause" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/basilk76"><img src="https://avatars.githubusercontent.com/u/45275512?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Basil Khan</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=basilk76" title="Documentation">📖</a></td>
<td align="center"><a href="https://danestves.com/"><img src="https://avatars.githubusercontent.com/u/31737273?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Daniel Esteves</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=danestves" title="Documentation">📖</a></td>
<td align="center"><a href="http://www.bitnative.com"><img src="https://avatars.githubusercontent.com/u/1688997?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Cory House</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=coryhouse" title="Documentation">📖</a></td>
<td align="center"><a href="https://auspham.dev/"><img src="https://avatars.githubusercontent.com/u/16440123?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Austin (Thang Pham)</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=rockmanvnx6" title="Documentation">📖</a></td>
<td align="center"><a href="https://jammeryhq.com"><img src="https://avatars.githubusercontent.com/u/521777?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Marcus Reinhardt</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=noxify" title="Documentation">📖</a> <a href="https://github.com/blitz-js/blitz/commits?author=noxify" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/davidchristie"><img src="https://avatars.githubusercontent.com/u/12044333?v=4?s=100" width="100px;" alt=""/><br /><sub><b>David Christie</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=davidchristie" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/ajanth97"><img src="https://avatars.githubusercontent.com/u/50458502?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ajanth</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=ajanth97" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/divpreet"><img src="https://avatars.githubusercontent.com/u/2805650?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Div</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=divpreet" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/david-arteaga"><img src="https://avatars.githubusercontent.com/u/7199015?v=4?s=100" width="100px;" alt=""/><br /><sub><b>David Arteaga</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=david-arteaga" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/MukulKolpe"><img src="https://avatars.githubusercontent.com/u/78664749?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mukul Kolpe</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=MukulKolpe" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/skotchpine"><img src="https://avatars.githubusercontent.com/u/13043909?v=4?s=100" width="100px;" alt=""/><br /><sub><b>tyler</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=skotchpine" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/SofianeDjellouli"><img src="https://avatars.githubusercontent.com/u/38258952?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Sofiane Djellouli</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=SofianeDjellouli" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/kreako"><img src="https://avatars.githubusercontent.com/u/65113001?v=4?s=100" width="100px;" alt=""/><br /><sub><b>kreako</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=kreako" title="Documentation">📖</a></td>
<td align="center"><a href="https://sarahdayan.dev"><img src="https://avatars.githubusercontent.com/u/5370675?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Sarah Dayan</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=sarahdayan" title="Code">💻</a></td>
</tr>
<tr>
<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/dineshgadge"><img src="https://avatars.githubusercontent.com/u/186976?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dinesh Gadge</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=dineshgadge" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/maltekiessling"><img src="https://avatars.githubusercontent.com/u/30420110?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Malte Kießling</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=maltekiessling" title="Documentation">📖</a></td>
<td align="center"><a href="ospfranco.com"><img src="https://avatars.githubusercontent.com/u/1634213?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Oscar Franco</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=ospfranco" title="Documentation">📖</a></td>
<td align="center"><a href="adamtrager.com"><img src="https://avatars.githubusercontent.com/u/1719791?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Adam Trager</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=Nfinished" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="https://saheen.codes"><img src="https://avatars.githubusercontent.com/u/2632896?v=4?s=100" width="100px;" alt=""/><br /><sub><b>saheenshoukath</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=shellord" title="Documentation">📖</a></td>
<td align="center"><a href="https://jahneer.me"><img src="https://avatars.githubusercontent.com/u/54552763?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Husnul Jahneer</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=husnuljahneer" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/ReykCS"><img src="https://avatars.githubusercontent.com/u/40463716?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Reyk</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=ReykCS" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/Lokprakash-babu"><img src="https://avatars.githubusercontent.com/u/60031382?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lokprakash Babu</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=Lokprakash-babu" title="Documentation">📖</a></td>
<td align="center"><a href="https://mizle.net"><img src="https://avatars.githubusercontent.com/u/3516343?v=4?s=100" width="100px;" alt=""/><br /><sub><b>eai04191</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=eai04191" title="Documentation">📖</a></td>
<td align="center"><a href="https://numanaral.github.io/?ref=github"><img src="https://avatars.githubusercontent.com/u/25233323?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Numan</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=numanaral" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/jscyo"><img src="https://avatars.githubusercontent.com/u/6310783?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Joel Coutinho</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=jscyo" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/davidbarker"><img src="https://avatars.githubusercontent.com/u/1597139?v=4?s=100" width="100px;" alt=""/><br /><sub><b>David Barker</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=davidbarker" title="Documentation">📖</a></td>
<td align="center"><a href="http://www.timfeeley.com/"><img src="https://avatars.githubusercontent.com/u/3246342?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tim Feeley</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=timfee" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/Caslus"><img src="https://avatars.githubusercontent.com/u/22855640?v=4?s=100" width="100px;" alt=""/><br /><sub><b>lucas philippe</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=Caslus" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/the-bayer"><img src="https://avatars.githubusercontent.com/u/94391693?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Blake Bayer</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=the-bayer" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=the-bayer" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/rmassie"><img src="https://avatars.githubusercontent.com/u/7375518?v=4?s=100" width="100px;" alt=""/><br /><sub><b>R Massie</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=rmassie" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/paulm17"><img src="https://avatars.githubusercontent.com/u/387463?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Paul</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=paulm17" title="Documentation">📖</a></td>
<td align="center"><a href="https://minho42.com"><img src="https://avatars.githubusercontent.com/u/15278512?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Min ho Kim</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=minho42" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/webdeb"><img src="https://avatars.githubusercontent.com/u/14992140?v=4?s=100" width="100px;" alt=""/><br /><sub><b>webdeb</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=webdeb" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/iDavidB"><img src="https://avatars.githubusercontent.com/u/32268383?v=4?s=100" width="100px;" alt=""/><br /><sub><b>David</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=iDavidB" title="Documentation">📖</a> <a href="https://github.com/blitz-js/blitz/commits?author=iDavidB" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=iDavidB" title="Tests">⚠️</a></td>
<td align="center"><a href="https://jdlt.co.uk"><img src="https://avatars.githubusercontent.com/u/5058625?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jake Dowie</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=jakedee" 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> <a href="https://github.com/blitz-js/blitz/commits?author=datner" title="Tests">⚠️</a></td>
<td align="center"><a href="https://github.com/remlse"><img src="https://avatars.githubusercontent.com/u/54984957?v=4?s=100" width="100px;" alt=""/><br /><sub><b>remlse</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=remlse" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/sergous"><img src="https://avatars.githubusercontent.com/u/545151?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Sergei Smirnov</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=sergous" title="Documentation">📖</a></td>
<td align="center"><a href="https://twitter.com/trensik"><img src="https://avatars.githubusercontent.com/u/18584155?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dawid Urbaniak</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=Trancever" title="Documentation">📖</a> <a href="https://github.com/blitz-js/blitz/commits?author=Trancever" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="kiri.dev"><img src="https://avatars.githubusercontent.com/u/29735836?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Kacper Potyrała</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=SerekKiri" title="Documentation">📖</a></td>
<td align="center"><a href="jcde.xyz"><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></td>
</tr>
</table>

View File

@@ -6,5 +6,5 @@ TODO
## Reporting a Vulnerability
Email Brandon Bayer at b@bayer.ws to report a vulnerablity, and he will follow up with you asap.
Email Brandon Bayer at b@bayer.ws to report a vulnerability, and he will follow up with you asap.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 20 KiB

1
assets/boostry.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 143.5 42.09"><defs><style>.cls-1{fill:none;}.cls-2{fill:#d71526;}</style></defs><title>アセット 15</title><g id="レイヤー_2" data-name="レイヤー 2"><g id="レイヤー_1-2" data-name="レイヤー 1"><path d="M21.87,20A13.2,13.2,0,0,1,34.92,6.83c6.44,0,10.88,4.74,10.88,11a13.21,13.21,0,0,1-13,13.21C26.31,31.05,21.87,26.32,21.87,20Zm20.22-2.1c0-4.34-2.9-7.71-7.27-7.71-5.17,0-9.25,4.51-9.25,9.71,0,4.34,2.91,7.71,7.28,7.71A9.52,9.52,0,0,0,42.09,17.94Z"/><path d="M47.67,20a13.2,13.2,0,0,1,13-13.21c6.44,0,10.88,4.74,10.88,11a13.21,13.21,0,0,1-13,13.21C52.11,31.05,47.67,26.32,47.67,20Zm20.22-2.1c0-4.34-2.9-7.71-7.27-7.71-5.17,0-9.25,4.51-9.25,9.71,0,4.34,2.91,7.71,7.28,7.71C63.85,27.65,67.89,23.14,67.89,17.94Z"/><path d="M72.84,24.81a9.7,9.7,0,0,0,6.41,3c2.4,0,4.07-1.4,4.07-3.57,0-1.57-.94-2.64-3.3-3.87l-1.37-.71a6.56,6.56,0,0,1-4.07-6.14c0-3.9,3.2-6.7,7.47-6.7A12.23,12.23,0,0,1,88.57,8.9l-.68,3.51-.23-.18A10.16,10.16,0,0,0,82,10c-2.2,0-3.84,1.4-3.84,3.3,0,1.17.57,2.37,2.51,3.34l1.33.67C85.46,19.07,87,21,87,24c0,4.3-3.11,7.1-7.61,7.1a11.56,11.56,0,0,1-7.45-2.8l.71-3.65Z"/><path d="M106.27,10.63h-5.85l-3.91,20H92.94l3.91-20H91l.66-3.37h15.32Z"/><path d="M115,21.54l5.27,9.08h-4.14l-5.3-9.74-1.91,9.74h-3.57L109.9,7.26h4.77c4.67,0,7.68,2.54,7.68,6.47S119.44,20.74,115,21.54Zm-3.84-2.37h1.33c3.51,0,6.18-2.17,6.18-5.07,0-2.3-1.7-3.7-4.44-3.7h-1.37Z"/><line class="cls-1" x1="72.32" y1="24.47" x2="72.69" y2="24.81"/><path d="M15.4,16.76l-.76-.31.78-.27C19,15,21.06,12.35,21.06,9.23c0-3.92-3.19-6.65-7.75-6.65H6L.5,30.62H9c5.94,0,10.42-3.48,10.42-8.08A6,6,0,0,0,15.4,16.76ZM8.93,5.68H12.3c2.94,0,4.77,1.55,4.77,4,0,3-2.58,5.18-6,5.18H7.13ZM9.1,27.52H4.75L6.59,18h3.82c3.05,0,5,1.7,5,4.32C15.43,25.34,12.76,27.52,9.1,27.52Z"/><polygon class="cls-2" points="134.09 25.12 132.58 21.09 132.54 20.97 132.49 20.86 127.39 7.26 123.39 7.26 130.13 25.3 121.55 42.09 125.56 42.09 131.87 29.85 131.93 29.73 131.98 29.61 134.06 25.58 134.12 25.47 134.18 25.35 134.14 25.24 134.09 25.12"/><polygon points="139.5 7.26 132.65 20.76 132.65 20.76 132.54 20.98 132.58 21.09 134.09 25.12 134.14 25.24 134.18 25.35 143.5 7.26 139.5 7.26"/><rect class="cls-1" width="143" height="42"/></g></g></svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -1,24 +0,0 @@
<svg width="128" height="128" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0)">
<path d="M79.4831 1.95572C70.2813 -0.81923 55.2811 -0.617415 46.1549 2.4098L18.6125 11.5167C9.48627 14.5313 9.38542 19.7784 18.3856 23.1588L49.9743 35.028C58.9744 38.4084 73.6217 38.194 82.5084 34.5487L110.883 22.9192C119.782 19.2739 119.53 14.0267 110.316 11.2518L79.4831 1.95572Z" fill="url(#paint0_linear)"/>
<path d="M84.235 38.6101C75.3357 42.2554 68.0625 53.1029 68.0625 62.727V113.635C68.0625 123.259 74.9071 127.245 83.2644 122.489L109.282 107.706C117.639 102.951 124.912 91.208 125.442 81.6092L127.837 37.8281C128.366 28.2167 121.509 23.3479 112.609 26.9932L84.235 38.6101Z" fill="url(#paint1_linear)"/>
<path d="M0.0071345 37.8409C-0.257575 28.2295 6.877 23.1211 15.8771 26.5015L47.4658 38.3707C56.466 41.7511 63.8274 52.3842 63.8274 62.0082V112.916C63.8274 122.54 56.882 126.715 48.386 122.212L17.0998 105.6C8.60392 101.085 1.44415 89.5306 1.16683 79.9192L0.0071345 37.8409Z" fill="url(#paint2_linear)"/>
</g>
<defs>
<linearGradient id="paint0_linear" x1="63.9326" y1="0" x2="63.9326" y2="124.497" gradientUnits="userSpaceOnUse">
<stop stop-color="#036EB8"/>
<stop offset="1" stop-color="#469196"/>
</linearGradient>
<linearGradient id="paint1_linear" x1="63.9326" y1="0" x2="63.9326" y2="124.497" gradientUnits="userSpaceOnUse">
<stop stop-color="#036EB8"/>
<stop offset="1" stop-color="#469196"/>
</linearGradient>
<linearGradient id="paint2_linear" x1="63.9326" y1="0" x2="63.9326" y2="124.497" gradientUnits="userSpaceOnUse">
<stop stop-color="#036EB8"/>
<stop offset="1" stop-color="#469196"/>
</linearGradient>
<clipPath id="clip0">
<rect width="128" height="128" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

BIN
assets/jdlt.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

BIN
assets/meetkai.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

View File

@@ -25,7 +25,7 @@ export const LoginForm = (props: LoginFormProps) => {
try {
await loginMutation(values)
props.onSuccess?.()
} catch (error) {
} catch (error: any) {
if (error instanceof AuthenticationError) {
return {[FORM_ERROR]: "Sorry, those credentials are invalid"}
} else {

View File

@@ -24,7 +24,7 @@ export const SignupForm = (props: SignupFormProps) => {
try {
await signupMutation(values)
props.onSuccess?.()
} catch (error) {
} catch (error: any) {
if (error.code === "P2002" && error.meta?.target?.includes("email")) {
// This error comes from Prisma
return {email: "This email is already being used"}

View File

@@ -8,8 +8,8 @@ beforeEach(async () => {
})
const generatedToken = "plain-token"
jest.mock("@blitzjs/core/server", () => ({
...jest.requireActual<object>("@blitzjs/core/server")!,
jest.mock("next/stdlib-server", () => ({
...jest.requireActual<object>("next/stdlib-server")!,
generateToken: () => generatedToken,
}))
jest.mock("preview-email", () => jest.fn())

View File

@@ -30,7 +30,7 @@ const ResetPasswordPage: BlitzPage = () => {
onSubmit={async (values) => {
try {
await resetPasswordMutation(values)
} catch (error) {
} catch (error: any) {
if (error.name === "ResetPasswordError") {
return {
[FORM_ERROR]: error.message,

View File

@@ -1,7 +1,7 @@
import {useSession, useRouter, useMutation, Head} from "blitz"
import {useSession, useRouter, useMutation, Head, BlitzLayout} from "blitz"
import logout from "app/auth/mutations/logout"
export default function Layout({title, children}: {title?: string; children: React.ReactNode}) {
const Layout: BlitzLayout<{title?: string}> = ({title, children}) => {
const session = useSession({suspense: false})
const router = useRouter()
const [logoutMutation] = useMutation(logout)
@@ -16,8 +16,8 @@ export default function Layout({title, children}: {title?: string; children: Rea
{session.userId && (
<button
onClick={async () => {
router.push("/")
await logoutMutation()
router.push("/")
}}
>
Logout
@@ -28,3 +28,5 @@ export default function Layout({title, children}: {title?: string; children: Rea
</>
)
}
export default Layout

View File

@@ -1,8 +1,8 @@
import {render} from "test/utils"
import Home from "./index"
jest.mock("@blitzjs/core", () => ({
...jest.requireActual<object>("@blitzjs/core")!,
jest.mock("next/data-client", () => ({
...jest.requireActual<object>("next/data-client")!,
useQuery: () => [
{
id: 1,
@@ -24,4 +24,4 @@ test("renders blitz documentation link", () => {
const element = getByText(/powered by blitz/i)
// @ts-ignore
expect(element).toBeInTheDocument()
})
})

View File

@@ -6,12 +6,14 @@ import {
useRouterQuery,
useMutation,
invoke,
Image,
useQuery,
BlitzPage,
} from "blitz"
import getUser from "app/users/queries/getUser"
import trackView from "app/users/mutations/trackView"
import Layout from "app/core/layouts/Layout"
import logo from "public/logo.png"
import {Routes} from ".blitz"
@@ -88,7 +90,7 @@ const Home: BlitzPage = () => (
<main>
<div className="logo">
<img src="/logo.png" alt="blitz.js" />
<Image src={logo} alt="blitz.js" width={400} height={200} />
</div>
<Suspense fallback={"Loading..."}>

View File

@@ -45,7 +45,7 @@ export const EditProject = () => {
})
await setQueryData(updated)
router.push(`/projects/${updated.id}`)
} catch (error) {
} catch (error: any) {
console.error(error)
return {
[FORM_ERROR]: error.toString(),

View File

@@ -24,7 +24,7 @@ const NewProjectPage: BlitzPage = () => {
try {
const project = await createProjectMutation(values)
router.push(Routes.ShowProjectPage({projectId: project.id}))
} catch (error) {
} catch (error: any) {
console.error(error)
return {
[FORM_ERROR]: error.toString(),

View File

@@ -23,7 +23,7 @@ export const getServerSideProps: GetServerSideProps = async ({req, res}) => {
{res, req},
)
return {props: {user}}
} catch (error) {
} catch (error: any) {
if (error.name === "NotFoundError") {
res.statusCode = 404
res.end()

View File

@@ -0,0 +1,13 @@
import {Ctx} from "blitz"
import db from "db"
export default async function currentUserQuery(_ = null, {session}: Ctx) {
if (!session.userId) return null
const user = await db.user.findFirst({
where: {id: session.userId},
select: {id: true, name: true, email: true, role: true},
})
return user
}

View File

@@ -16,6 +16,9 @@ module.exports = withBundleAnalyzer({
cli: {
clearConsoleOnBlitzDev: false,
},
codegen: {
templateDir: "./my-templates",
},
log: {
// level: "trace",
},

View File

@@ -23,6 +23,7 @@ describe("index page", () => {
cy.location("pathname").should("equal", "/")
cy.contains("button", "Logout")
cy.wait(1000)
})
it("allows the user to log in", () => {
@@ -42,6 +43,7 @@ describe("index page", () => {
cy.location("pathname").should("equal", "/")
cy.wait(1000)
cy.contains("button", "Logout")
cy.wait(1000)
})
it("allows the user to logout", () => {

View File

@@ -4,7 +4,6 @@
* and then export it. That way you can import here and anywhere else
* and use it straight away.
*/
import previewEmail from "preview-email"
type ResetPasswordMailer = {
to: string
@@ -38,6 +37,7 @@ export function forgotPasswordMailer({to, token}: ResetPasswordMailer) {
throw new Error("No production email implementation in mailers/forgotPasswordMailer")
} else {
// Preview email in the browser
const previewEmail = (await import("preview-email")).default
await previewEmail(msg)
}
},

View File

@@ -5,6 +5,7 @@
"dev": "blitz dev",
"build": "blitz build",
"start": "blitz start",
"console": "blitz console",
"studio": "blitz prisma studio",
"lint": "eslint --ignore-path .gitignore --ext .js,.ts,.tsx .",
"analyze": "cross-env ANALYZE=true blitz build",
@@ -29,7 +30,7 @@
},
"dependencies": {
"@prisma/client": "2.24.1",
"blitz": "0.39.0-canary.0",
"blitz": "0.45.4",
"final-form": "4.20.1",
"passport-auth0": "1.4.0",
"passport-github2": "0.1.12",

View File

@@ -17,6 +17,6 @@
"downlevelIteration": true,
"jsx": "preserve"
},
"exclude": ["node_modules", "cypress"],
"exclude": ["node_modules", "cypress", "test"],
"include": ["**/*.ts", "**/*.tsx"]
}

View File

@@ -1,14 +1,3 @@
module.exports = {
parser: "@typescript-eslint/parser",
env: {
es2020: true,
},
extends: ["react-app", "plugin:jsx-a11y/recommended"],
plugins: ["@typescript-eslint", "jsx-a11y"],
rules: {
"import/no-anonymous-default-export": "error",
"import/no-webpack-loader-syntax": "off",
"react/react-in-jsx-scope": "off", // React is always in scope with Blitz
"jsx-a11y/anchor-is-valid": "off", //Doesn't play well with Blitz/Next <Link> usage
},
extends: "blitz",
}

View File

@@ -1,12 +1,6 @@
import {ReactNode} from "react"
import {Head} from "blitz"
import {Head, BlitzLayout} from "blitz"
type LayoutProps = {
title?: string
children: ReactNode
}
const Layout = ({title, children}: LayoutProps) => {
const Layout: BlitzLayout<{title?: string}> = ({title, children}) => {
return (
<>
<Head>

View File

@@ -1,8 +1,9 @@
import {Link, BlitzPage, useMutation} from "blitz"
import {Link, BlitzPage, useMutation, Image} from "blitz"
import Layout from "app/layouts/Layout"
import logout from "app/auth/mutations/logout"
import {useCurrentUser} from "app/hooks/useCurrentUser"
import {Suspense} from "react"
import logo from "public/logo.png"
/*
* This file is just for a pleasant getting started page for your new app.
@@ -54,7 +55,7 @@ const Home: BlitzPage = () => {
<div className="container">
<main>
<div className="logo">
<img src="/logo.png" alt="blitz.js" />
<Image src={logo} alt="blitz.js" />
</div>
<p>
<strong>Congrats!</strong> Your app is ready, including user sign-up and log-in.

View File

@@ -1,4 +1,6 @@
// These reference imports provide type definitions for things like styled-jsx and css modules
/// <reference types="next" />
/// <reference types="next/types/global" />
/// <reference types="next/image-types/global" />
// NOTE: This file should not be edited
// see https://nextjs.org/docs/basic-features/typescript for more information.

View File

@@ -4,8 +4,7 @@
* This seed function is executed when you run `blitz db seed`.
*
* Probably you want to use a library like https://chancejs.com
* or https://github.com/Marak/Faker.js to easily generate
* realistic data.
* to easily generate realistic data.
*/
const seed = async () => {
// for (let i = 0; i < 5; i++) {

View File

@@ -31,7 +31,7 @@
},
"dependencies": {
"@prisma/client": "2.24.1",
"blitz": "0.39.0-canary.0",
"blitz": "0.45.4",
"final-form": "4.20.1",
"prisma": "2.24.1",
"react": "0.0.0-experimental-6a589ad71",

View File

@@ -1,7 +1,7 @@
import blitz from "blitz/custom-server"
import {createServer} from "http"
import {parse} from "url"
import {log} from "@blitzjs/display"
import {log} from "next/dist/server/lib/logging"
const {PORT = "3000"} = process.env
const dev = process.env.NODE_ENV !== "production"

View File

@@ -19,5 +19,5 @@
"tsBuildInfoFile": ".tsbuildinfo"
},
"exclude": ["node_modules"],
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"]
"include": ["blitz-env.d.ts", "**/*.ts", "**/*.tsx"]
}

View File

@@ -0,0 +1,11 @@
# https://EditorConfig.org
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 2
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true

3
examples/cypress/.env Normal file
View File

@@ -0,0 +1,3 @@
# This env file should be checked into source control
# This is the place for default values for all environments
# Values in `.env.local` and `.env.production` will override these values

View File

@@ -0,0 +1,3 @@
module.exports = {
extends: ["blitz"],
}

56
examples/cypress/.gitignore vendored Normal file
View File

@@ -0,0 +1,56 @@
# dependencies
node_modules
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/sdks
!.yarn/versions
.pnp.*
.npm
web_modules/
# blitz
/.blitz/
/.next/
*.sqlite
*.sqlite-journal
.now
.blitz**
blitz-log.log
# misc
.DS_Store
# local env files
.env.local
.env.*.local
.envrc
# Logs
logs
*.log
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Testing
.coverage
*.lcov
.nyc_output
lib-cov
# Caches
*.tsbuildinfo
.eslintcache
.node_repl_history
.yarn-integrity
# Serverless directories
.serverless/
# Stores VSCode versions used for testing VSCode extensions
.vscode-test

7
examples/cypress/.npmrc Normal file
View File

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

View File

@@ -0,0 +1,9 @@
.gitkeep
.env*
*.ico
*.lock
db/migrations
.next
.blitz
.yarn
.pnp*

View File

@@ -0,0 +1,25 @@
# **cypress**
This is an example [Cypress](https://www.cypress.io/) integration.
## Getting Started
Migrate the database:
```
blitz prisma migrate dev
```
Run e2e tests:
```
yarn test:e2e
```
Open Cypress dashboard:
```
yarn cypress:open
```
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.

View File

@@ -0,0 +1,49 @@
import { AuthenticationError, Link, useMutation } from "blitz"
import { LabeledTextField } from "app/core/components/LabeledTextField"
import { Form, FORM_ERROR } from "app/core/components/Form"
import login from "app/auth/mutations/login"
import { Login } from "app/auth/validations"
type LoginFormProps = {
onSuccess?: () => void
}
export const LoginForm = (props: LoginFormProps) => {
const [loginMutation] = useMutation(login)
return (
<div>
<h1>Login</h1>
<Form
submitText="Login"
schema={Login}
initialValues={{ email: "", password: "" }}
onSubmit={async (values) => {
try {
await loginMutation(values)
props.onSuccess?.()
} catch (error: any) {
if (error instanceof AuthenticationError) {
return { [FORM_ERROR]: "Sorry, those credentials are invalid" }
} else {
return {
[FORM_ERROR]:
"Sorry, we had an unexpected error. Please try again. - " + error.toString(),
}
}
}
}}
>
<LabeledTextField name="email" label="Email" placeholder="Email" />
<LabeledTextField name="password" label="Password" placeholder="Password" type="password" />
</Form>
<div style={{ marginTop: "1rem" }}>
Or <Link href="signup">Sign Up</Link>
</div>
</div>
)
}
export default LoginForm

View File

@@ -0,0 +1,43 @@
import { useMutation } from "blitz"
import { LabeledTextField } from "app/core/components/LabeledTextField"
import { Form, FORM_ERROR } from "app/core/components/Form"
import signup from "app/auth/mutations/signup"
import { Signup } from "app/auth/validations"
type SignupFormProps = {
onSuccess?: () => void
}
export const SignupForm = (props: SignupFormProps) => {
const [signupMutation] = useMutation(signup)
return (
<div>
<h1>Create an Account</h1>
<Form
submitText="Create Account"
schema={Signup}
initialValues={{ email: "", password: "" }}
onSubmit={async (values) => {
try {
await signupMutation(values)
props.onSuccess?.()
} catch (error: any) {
if (error.code === "P2002" && error.meta?.target?.includes("email")) {
// This error comes from Prisma
return { email: "This email is already being used" }
} else {
return { [FORM_ERROR]: error.toString() }
}
}
}}
>
<LabeledTextField name="email" label="Email" placeholder="Email" />
<LabeledTextField name="password" label="Password" placeholder="Password" type="password" />
</Form>
</div>
)
}
export default SignupForm

View File

@@ -0,0 +1,23 @@
import { NotFoundError, SecurePassword, resolver } from "blitz"
import db from "db"
import { authenticateUser } from "./login"
import { ChangePassword } from "../validations"
export default resolver.pipe(
resolver.zod(ChangePassword),
resolver.authorize(),
async ({ currentPassword, newPassword }, ctx) => {
const user = await db.user.findFirst({ where: { id: ctx.session.userId! } })
if (!user) throw new NotFoundError()
await authenticateUser(user.email, currentPassword)
const hashedPassword = await SecurePassword.hash(newPassword.trim())
await db.user.update({
where: { id: user.id },
data: { hashedPassword },
})
return true
}
)

View File

@@ -0,0 +1,56 @@
import { hash256, Ctx } from "blitz"
import forgotPassword from "./forgotPassword"
import db from "db"
import previewEmail from "preview-email"
beforeEach(async () => {
await db.$reset()
})
const generatedToken = "plain-token"
jest.mock("next/stdlib-server", () => ({
...jest.requireActual<object>("next/stdlib-server")!,
generateToken: () => generatedToken,
}))
jest.mock("preview-email", () => jest.fn())
describe("forgotPassword mutation", () => {
it("does not throw error if user doesn't exist", async () => {
await expect(forgotPassword({ email: "no-user@email.com" }, {} as Ctx)).resolves.not.toThrow()
})
it("works correctly", async () => {
// Create test user
const user = await db.user.create({
data: {
email: "user@example.com",
tokens: {
// Create old token to ensure it's deleted
create: {
type: "RESET_PASSWORD",
hashedToken: "token",
expiresAt: new Date(),
sentTo: "user@example.com",
},
},
},
include: { tokens: true },
})
// Invoke the mutation
await forgotPassword({ email: user.email }, {} as Ctx)
const tokens = await db.token.findMany({ where: { userId: user.id } })
const token = tokens[0]
// delete's existing tokens
expect(tokens.length).toBe(1)
expect(token.id).not.toBe(user.tokens[0].id)
expect(token.type).toBe("RESET_PASSWORD")
expect(token.sentTo).toBe(user.email)
expect(token.hashedToken).toBe(hash256(generatedToken))
expect(token.expiresAt > new Date()).toBe(true)
expect(previewEmail).toBeCalled()
})
})

View File

@@ -0,0 +1,41 @@
import { resolver, generateToken, hash256 } from "blitz"
import db from "db"
import { forgotPasswordMailer } from "mailers/forgotPasswordMailer"
import { ForgotPassword } from "../validations"
const RESET_PASSWORD_TOKEN_EXPIRATION_IN_HOURS = 4
export default resolver.pipe(resolver.zod(ForgotPassword), async ({ email }) => {
// 1. Get the user
const user = await db.user.findFirst({ where: { email: email.toLowerCase() } })
// 2. Generate the token and expiration date.
const token = generateToken()
const hashedToken = hash256(token)
const expiresAt = new Date()
expiresAt.setHours(expiresAt.getHours() + RESET_PASSWORD_TOKEN_EXPIRATION_IN_HOURS)
// 3. If user with this email was found
if (user) {
// 4. Delete any existing password reset tokens
await db.token.deleteMany({ where: { type: "RESET_PASSWORD", userId: user.id } })
// 5. Save this new token in the database.
await db.token.create({
data: {
user: { connect: { id: user.id } },
type: "RESET_PASSWORD",
expiresAt,
hashedToken,
sentTo: user.email,
},
})
// 6. Send the email
await forgotPasswordMailer({ to: user.email, token }).send()
} else {
// 7. If no user found wait the same time so attackers can't tell the difference
await new Promise((resolve) => setTimeout(resolve, 750))
}
// 8. Return the same result whether a password reset email was sent or not
return
})

View File

@@ -0,0 +1,31 @@
import { resolver, SecurePassword, AuthenticationError } from "blitz"
import db from "db"
import { Login } from "../validations"
import { Role } from "types"
export const authenticateUser = async (rawEmail: string, rawPassword: string) => {
const email = rawEmail.toLowerCase().trim()
const password = rawPassword.trim()
const user = await db.user.findFirst({ where: { email } })
if (!user) throw new AuthenticationError()
const result = await SecurePassword.verify(user.hashedPassword, password)
if (result === SecurePassword.VALID_NEEDS_REHASH) {
// Upgrade hashed password with a more secure hash
const improvedHash = await SecurePassword.hash(password)
await db.user.update({ where: { id: user.id }, data: { hashedPassword: improvedHash } })
}
const { hashedPassword, ...rest } = user
return rest
}
export default resolver.pipe(resolver.zod(Login), async ({ email, password }, ctx) => {
// This throws an error if credentials are invalid
const user = await authenticateUser(email, password)
await ctx.session.$create({ userId: user.id, role: user.role as Role })
return user
})

View File

@@ -0,0 +1,5 @@
import { Ctx } from "blitz"
export default async function logout(_: any, ctx: Ctx) {
return await ctx.session.$revoke()
}

View File

@@ -0,0 +1,82 @@
import resetPassword from "./resetPassword"
import db from "db"
import { hash256, SecurePassword } from "blitz"
beforeEach(async () => {
await db.$reset()
})
const mockCtx: any = {
session: {
$create: jest.fn,
},
}
describe("resetPassword mutation", () => {
it("works correctly", async () => {
expect(true).toBe(true)
// Create test user
const goodToken = "randomPasswordResetToken"
const expiredToken = "expiredRandomPasswordResetToken"
const future = new Date()
future.setHours(future.getHours() + 4)
const past = new Date()
past.setHours(past.getHours() - 4)
const user = await db.user.create({
data: {
email: "user@example.com",
tokens: {
// Create old token to ensure it's deleted
create: [
{
type: "RESET_PASSWORD",
hashedToken: hash256(expiredToken),
expiresAt: past,
sentTo: "user@example.com",
},
{
type: "RESET_PASSWORD",
hashedToken: hash256(goodToken),
expiresAt: future,
sentTo: "user@example.com",
},
],
},
},
include: { tokens: true },
})
const newPassword = "newPassword"
// Non-existent token
await expect(
resetPassword({ token: "no-token", password: "", passwordConfirmation: "" }, mockCtx)
).rejects.toThrowError()
// Expired token
await expect(
resetPassword(
{ token: expiredToken, password: newPassword, passwordConfirmation: newPassword },
mockCtx
)
).rejects.toThrowError()
// Good token
await resetPassword(
{ token: goodToken, password: newPassword, passwordConfirmation: newPassword },
mockCtx
)
// Delete's the token
const numberOfTokens = await db.token.count({ where: { userId: user.id } })
expect(numberOfTokens).toBe(0)
// Updates user's password
const updatedUser = await db.user.findFirst({ where: { id: user.id } })
expect(await SecurePassword.verify(updatedUser!.hashedPassword, newPassword)).toBe(
SecurePassword.VALID
)
})
})

View File

@@ -0,0 +1,47 @@
import { resolver, SecurePassword, hash256 } from "blitz"
import db from "db"
import { ResetPassword } from "../validations"
import login from "./login"
export class ResetPasswordError extends Error {
name = "ResetPasswordError"
message = "Reset password link is invalid or it has expired."
}
export default resolver.pipe(resolver.zod(ResetPassword), async ({ password, token }, ctx) => {
// 1. Try to find this token in the database
const hashedToken = hash256(token)
const possibleToken = await db.token.findFirst({
where: { hashedToken, type: "RESET_PASSWORD" },
include: { user: true },
})
// 2. If token not found, error
if (!possibleToken) {
throw new ResetPasswordError()
}
const savedToken = possibleToken
// 3. Delete token so it can't be used again
await db.token.delete({ where: { id: savedToken.id } })
// 4. If token has expired, error
if (savedToken.expiresAt < new Date()) {
throw new ResetPasswordError()
}
// 5. Since token is valid, now we can update the user's password
const hashedPassword = await SecurePassword.hash(password.trim())
const user = await db.user.update({
where: { id: savedToken.userId },
data: { hashedPassword },
})
// 6. Revoke all existing login sessions for this user
await db.session.deleteMany({ where: { userId: user.id } })
// 7. Now log the user in with the new credentials
await login({ email: user.email, password }, ctx)
return true
})

View File

@@ -0,0 +1,15 @@
import { resolver, SecurePassword } from "blitz"
import db from "db"
import { Signup } from "app/auth/validations"
import { Role } from "types"
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: email.toLowerCase().trim(), hashedPassword, role: "USER" },
select: { id: true, name: true, email: true, role: true },
})
await ctx.session.$create({ userId: user.id, role: user.role as Role })
return user
})

View File

@@ -0,0 +1,48 @@
import { BlitzPage, useMutation } from "blitz"
import Layout from "app/core/layouts/Layout"
import { LabeledTextField } from "app/core/components/LabeledTextField"
import { Form, FORM_ERROR } from "app/core/components/Form"
import { ForgotPassword } from "app/auth/validations"
import forgotPassword from "app/auth/mutations/forgotPassword"
const ForgotPasswordPage: BlitzPage = () => {
const [forgotPasswordMutation, { isSuccess }] = useMutation(forgotPassword)
return (
<div>
<h1>Forgot your password?</h1>
{isSuccess ? (
<div>
<h2>Request Submitted</h2>
<p>
If your email is in our system, you will receive instructions to reset your password
shortly.
</p>
</div>
) : (
<Form
submitText="Send Reset Password Instructions"
schema={ForgotPassword}
initialValues={{ email: "" }}
onSubmit={async (values) => {
try {
await forgotPasswordMutation(values)
} catch (error: any) {
return {
[FORM_ERROR]: "Sorry, we had an unexpected error. Please try again.",
}
}
}}
>
<LabeledTextField name="email" label="Email" placeholder="Email" />
</Form>
)}
</div>
)
}
ForgotPasswordPage.redirectAuthenticatedTo = "/"
ForgotPasswordPage.getLayout = (page) => <Layout title="Forgot Your Password?">{page}</Layout>
export default ForgotPasswordPage

View File

@@ -0,0 +1,23 @@
import { useRouter, BlitzPage } from "blitz"
import Layout from "app/core/layouts/Layout"
import { LoginForm } from "app/auth/components/LoginForm"
const LoginPage: BlitzPage = () => {
const router = useRouter()
return (
<div>
<LoginForm
onSuccess={() => {
const next = router.query.next ? decodeURIComponent(router.query.next as string) : "/"
router.push(next)
}}
/>
</div>
)
}
LoginPage.redirectAuthenticatedTo = "/"
LoginPage.getLayout = (page) => <Layout title="Log In">{page}</Layout>
export default LoginPage

View File

@@ -0,0 +1,61 @@
import { BlitzPage, useRouterQuery, Link, useMutation } from "blitz"
import Layout from "app/core/layouts/Layout"
import { LabeledTextField } from "app/core/components/LabeledTextField"
import { Form, FORM_ERROR } from "app/core/components/Form"
import { ResetPassword } from "app/auth/validations"
import resetPassword from "app/auth/mutations/resetPassword"
import { Routes } from ".blitz"
const ResetPasswordPage: BlitzPage = () => {
const query = useRouterQuery()
const [resetPasswordMutation, { isSuccess }] = useMutation(resetPassword)
return (
<div>
<h1>Set a New Password</h1>
{isSuccess ? (
<div>
<h2>Password Reset Successfully</h2>
<p>
Go to the <Link href={Routes.Home()}>homepage</Link>
</p>
</div>
) : (
<Form
submitText="Reset Password"
schema={ResetPassword}
initialValues={{ password: "", passwordConfirmation: "", token: query.token as string }}
onSubmit={async (values) => {
try {
await resetPasswordMutation(values)
} catch (error: any) {
if (error.name === "ResetPasswordError") {
return {
[FORM_ERROR]: error.message,
}
} else {
return {
[FORM_ERROR]: "Sorry, we had an unexpected error. Please try again.",
}
}
}
}}
>
<LabeledTextField name="password" label="New Password" type="password" />
<LabeledTextField
name="passwordConfirmation"
label="Confirm New Password"
type="password"
/>
</Form>
)}
</div>
)
}
ResetPasswordPage.redirectAuthenticatedTo = "/"
ResetPasswordPage.getLayout = (page) => <Layout title="Reset Your Password">{page}</Layout>
export default ResetPasswordPage

View File

@@ -0,0 +1,20 @@
import { useRouter, BlitzPage } from "blitz"
import Layout from "app/core/layouts/Layout"
import { SignupForm } from "app/auth/components/SignupForm"
import { Routes } from ".blitz"
const SignupPage: BlitzPage = () => {
const router = useRouter()
return (
<div>
<SignupForm onSuccess={() => router.push(Routes.Home())} />
</div>
)
}
SignupPage.redirectAuthenticatedTo = "/"
SignupPage.getLayout = (page) => <Layout title="Sign Up">{page}</Layout>
export default SignupPage

View File

@@ -0,0 +1,33 @@
import { z } from "zod"
const password = z.string().min(10).max(100)
export const Signup = z.object({
email: z.string().email(),
password,
})
export const Login = z.object({
email: z.string().email(),
password: z.string(),
})
export const ForgotPassword = z.object({
email: z.string().email(),
})
export const ResetPassword = z
.object({
password: password,
passwordConfirmation: password,
token: z.string(),
})
.refine((data) => data.password === data.passwordConfirmation, {
message: "Passwords don't match",
path: ["passwordConfirmation"], // set the path of the error
})
export const ChangePassword = z.object({
currentPassword: z.string(),
newPassword: password,
})

View File

@@ -0,0 +1,53 @@
import { ReactNode, PropsWithoutRef } from "react"
import { Form as FinalForm, FormProps as FinalFormProps } from "react-final-form"
import { z } from "zod"
import { validateZodSchema } from "blitz"
export { FORM_ERROR } from "final-form"
export interface FormProps<S extends z.ZodType<any, any>>
extends Omit<PropsWithoutRef<JSX.IntrinsicElements["form"]>, "onSubmit"> {
/** All your form fields */
children?: ReactNode
/** Text to display in the submit button */
submitText?: string
schema?: S
onSubmit: FinalFormProps<z.infer<S>>["onSubmit"]
initialValues?: FinalFormProps<z.infer<S>>["initialValues"]
}
export function Form<S extends z.ZodType<any, any>>({
children,
submitText,
schema,
initialValues,
onSubmit,
...props
}: FormProps<S>) {
return (
<FinalForm
initialValues={initialValues}
validate={validateZodSchema(schema)}
onSubmit={onSubmit}
render={({ handleSubmit, submitting, submitError }) => (
<form onSubmit={handleSubmit} className="form" {...props}>
{/* Form fields supplied as children are rendered here */}
{children}
{submitError && (
<div role="alert" style={{ color: "red" }}>
{submitError}
</div>
)}
{submitText && (
<button type="submit" disabled={submitting}>
{submitText}
</button>
)}
</form>
)}
/>
)
}
export default Form

View File

@@ -0,0 +1,49 @@
import { forwardRef, ComponentPropsWithoutRef, PropsWithoutRef } from "react"
import { useField, UseFieldConfig } from "react-final-form"
export interface LabeledTextFieldProps extends PropsWithoutRef<JSX.IntrinsicElements["input"]> {
/** Field name. */
name: string
/** Field label. */
label: string
/** Field type. Doesn't include radio buttons and checkboxes */
type?: "text" | "password" | "email" | "number"
outerProps?: PropsWithoutRef<JSX.IntrinsicElements["div"]>
labelProps?: ComponentPropsWithoutRef<"label">
fieldProps?: UseFieldConfig<string>
}
export const LabeledTextField = forwardRef<HTMLInputElement, LabeledTextFieldProps>(
({ name, label, outerProps, fieldProps, labelProps, ...props }, ref) => {
const {
input,
meta: { touched, error, submitError, submitting },
} = useField(name, {
parse:
props.type === "number"
? (Number as any)
: // Converting `""` to `null` ensures empty values will be set to null in the DB
(v) => (v === "" ? null : v),
...fieldProps,
})
const normalizedError = Array.isArray(error) ? error.join(", ") : error || submitError
return (
<div {...outerProps}>
<label {...labelProps}>
{label}
<input {...input} disabled={submitting} {...props} ref={ref} />
</label>
{touched && normalizedError && (
<div role="alert" style={{ color: "red" }}>
{normalizedError}
</div>
)}
</div>
)
}
)
export default LabeledTextField

View File

@@ -0,0 +1,7 @@
import { useQuery } from "blitz"
import getCurrentUser from "app/users/queries/getCurrentUser"
export const useCurrentUser = () => {
const [user] = useQuery(getCurrentUser, null)
return user
}

View File

@@ -0,0 +1,22 @@
import { ReactNode } from "react"
import { Head } from "blitz"
type LayoutProps = {
title?: string
children: ReactNode
}
const Layout = ({ title, children }: LayoutProps) => {
return (
<>
<Head>
<title>{title || "cypress"}</title>
<link rel="icon" href="/favicon.ico" />
</Head>
{children}
</>
)
}
export default Layout

View File

@@ -0,0 +1,19 @@
import { Head, ErrorComponent } from "blitz"
// ------------------------------------------------------
// This page is rendered if a route match is not found
// ------------------------------------------------------
export default function Page404() {
const statusCode = 404
const title = "This page could not be found"
return (
<>
<Head>
<title>
{statusCode}: {title}
</title>
</Head>
<ErrorComponent statusCode={statusCode} title={title} />
</>
)
}

View File

@@ -0,0 +1,40 @@
import {
AppProps,
ErrorBoundary,
ErrorComponent,
AuthenticationError,
AuthorizationError,
ErrorFallbackProps,
useQueryErrorResetBoundary,
} from "blitz"
import LoginForm from "app/auth/components/LoginForm"
export default function App({ Component, pageProps }: AppProps) {
const getLayout = Component.getLayout || ((page) => page)
return (
<ErrorBoundary
FallbackComponent={RootErrorFallback}
onReset={useQueryErrorResetBoundary().reset}
>
{getLayout(<Component {...pageProps} />)}
</ErrorBoundary>
)
}
function RootErrorFallback({ error, resetErrorBoundary }: ErrorFallbackProps) {
if (error instanceof AuthenticationError) {
return <LoginForm onSuccess={resetErrorBoundary} />
} else if (error instanceof AuthorizationError) {
return (
<ErrorComponent
statusCode={error.statusCode}
title="Sorry, you are not authorized to access this"
/>
)
} else {
return (
<ErrorComponent statusCode={error.statusCode || 400} title={error.message || error.name} />
)
}
}

View File

@@ -0,0 +1,23 @@
import { Document, Html, DocumentHead, Main, BlitzScript /*DocumentContext*/ } from "blitz"
class MyDocument extends Document {
// Only uncomment if you need to customize this behaviour
// static async getInitialProps(ctx: DocumentContext) {
// const initialProps = await Document.getInitialProps(ctx)
// return {...initialProps}
// }
render() {
return (
<Html lang="en">
<DocumentHead />
<body>
<Main />
<BlitzScript />
</body>
</Html>
)
}
}
export default MyDocument

View File

@@ -0,0 +1,27 @@
import { render } from "test/utils"
import Home from "./index"
jest.mock("next/data-client", () => ({
...jest.requireActual<object>("next/data-client")!,
useQuery: () => [
{
id: 1,
name: "User",
email: "user@email.com",
role: "user",
},
],
}))
test("renders blitz documentation link", () => {
// This is an example of how to ensure a specific item is in the document
// But it's disabled by default (by test.skip) so the test doesn't fail
// when you remove the the default content from the page
// This is an example on how to mock api hooks when testing
const { getByText } = render(<Home />)
const element = getByText(/powered by blitz/i)
// @ts-ignore
expect(element).toBeInTheDocument()
})

View File

@@ -0,0 +1,274 @@
import { Suspense } from "react"
import { Image, Link, BlitzPage, useMutation } from "blitz"
import Layout from "app/core/layouts/Layout"
import { useCurrentUser } from "app/core/hooks/useCurrentUser"
import logout from "app/auth/mutations/logout"
import logo from "public/logo.png"
import { Routes } from ".blitz"
/*
* This file is just for a pleasant getting started page for your new app.
* You can delete everything in here and start from scratch if you like.
*/
const UserInfo = () => {
const currentUser = useCurrentUser()
const [logoutMutation] = useMutation(logout)
if (currentUser) {
return (
<>
<button
className="button small"
onClick={async () => {
await logoutMutation()
}}
>
Logout
</button>
<div>
User id: <code>{currentUser.id}</code>
<br />
User role: <code>{currentUser.role}</code>
</div>
</>
)
} else {
return (
<>
<Link href={Routes.SignupPage()}>
<a className="button small">
<strong>Sign Up</strong>
</a>
</Link>
<Link href={Routes.LoginPage()}>
<a className="button small">
<strong>Login</strong>
</a>
</Link>
</>
)
}
}
const Home: BlitzPage = () => {
return (
<div className="container">
<main>
<div className="logo">
<Image src={logo} alt="blitzjs" />
</div>
<p>
<strong>Congrats!</strong> Your app is ready, including user sign-up and log-in.
</p>
<div className="buttons" style={{ marginTop: "1rem", marginBottom: "1rem" }}>
<Suspense fallback="Loading...">
<UserInfo />
</Suspense>
</div>
<p>
<strong>
To add a new model to your app, <br />
run the following in your terminal:
</strong>
</p>
<pre>
<code>blitz generate all project name:string</code>
</pre>
<div style={{ marginBottom: "1rem" }}>(And select Yes to run prisma migrate)</div>
<div>
<p>
Then <strong>restart the server</strong>
</p>
<pre>
<code>Ctrl + c</code>
</pre>
<pre>
<code>blitz dev</code>
</pre>
<p>
and go to{" "}
<Link href="/projects">
<a>/projects</a>
</Link>
</p>
</div>
<div className="buttons" style={{ marginTop: "5rem" }}>
<a
className="button"
href="https://blitzjs.com/docs/getting-started?utm_source=blitz-new&utm_medium=app-template&utm_campaign=blitz-new"
target="_blank"
rel="noopener noreferrer"
>
Documentation
</a>
<a
className="button-outline"
href="https://github.com/blitz-js/blitz"
target="_blank"
rel="noopener noreferrer"
>
Github Repo
</a>
<a
className="button-outline"
href="https://discord.blitzjs.com"
target="_blank"
rel="noopener noreferrer"
>
Discord Community
</a>
</div>
</main>
<footer>
<a
href="https://blitzjs.com?utm_source=blitz-new&utm_medium=app-template&utm_campaign=blitz-new"
target="_blank"
rel="noopener noreferrer"
>
Powered by Blitz.js
</a>
</footer>
<style jsx global>{`
@import url("https://fonts.googleapis.com/css2?family=Libre+Franklin:wght@300;700&display=swap");
html,
body {
padding: 0;
margin: 0;
font-family: "Libre Franklin", -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen,
Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;
}
* {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
box-sizing: border-box;
}
.container {
min-height: 100vh;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
main {
padding: 5rem 0;
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
main p {
font-size: 1.2rem;
}
p {
text-align: center;
}
footer {
width: 100%;
height: 60px;
border-top: 1px solid #eaeaea;
display: flex;
justify-content: center;
align-items: center;
background-color: #45009d;
}
footer a {
display: flex;
justify-content: center;
align-items: center;
}
footer a {
color: #f4f4f4;
text-decoration: none;
}
.logo {
margin-bottom: 2rem;
}
.logo img {
width: 300px;
}
.buttons {
display: grid;
grid-auto-flow: column;
grid-gap: 0.5rem;
}
.button {
font-size: 1rem;
background-color: #6700eb;
padding: 1rem 2rem;
color: #f4f4f4;
text-align: center;
}
.button.small {
padding: 0.5rem 1rem;
}
.button:hover {
background-color: #45009d;
}
.button-outline {
border: 2px solid #6700eb;
padding: 1rem 2rem;
color: #6700eb;
text-align: center;
}
.button-outline:hover {
border-color: #45009d;
color: #45009d;
}
pre {
background: #fafafa;
border-radius: 5px;
padding: 0.75rem;
text-align: center;
}
code {
font-size: 0.9rem;
font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono,
Bitstream Vera Sans Mono, Courier New, monospace;
}
.grid {
display: flex;
align-items: center;
justify-content: center;
flex-wrap: wrap;
max-width: 800px;
margin-top: 3rem;
}
@media (max-width: 600px) {
.grid {
width: 100%;
flex-direction: column;
}
}
`}</style>
</div>
)
}
Home.suppressFirstRenderFlicker = true
Home.getLayout = (page) => <Layout title="Home">{page}</Layout>
export default Home

View File

@@ -0,0 +1,13 @@
import { Ctx } from "blitz"
import db from "db"
export default async function getCurrentUser(_ = null, { session }: Ctx) {
if (!session.userId) return null
const user = await db.user.findFirst({
where: { id: session.userId },
select: { id: true, name: true, email: true, role: true },
})
return user
}

View File

@@ -0,0 +1,4 @@
module.exports = {
presets: ["blitz/babel"],
plugins: [],
}

View File

@@ -0,0 +1,19 @@
import { BlitzConfig, sessionMiddleware, simpleRolesIsAuthorized } from "blitz"
const config: BlitzConfig = {
middleware: [
sessionMiddleware({
cookiePrefix: "cypress-example",
isAuthorized: simpleRolesIsAuthorized,
}),
],
/* Uncomment this to customize the webpack config
webpack: (config, { buildId, dev, isServer, defaultLoaders, webpack }) => {
// Note: we provide webpack above so you should not `require` it
// Perform customizations to webpack config
// Important: return the modified config
return config
},
*/
}
module.exports = config

View File

@@ -0,0 +1,11 @@
{
"baseUrl": "http://localhost:3099",
"integrationFolder": "test/e2e",
"fixturesFolder": false,
"nodeVersion": "system",
"defaultCommandTimeout": 12000,
"pageLoadTimeout": 120000,
"ignoreTestFiles": ["tsconfig.json"],
"chromeWebSecurity": false,
"video": false
}

View File

@@ -0,0 +1,10 @@
module.exports = {
plugins: ["cypress"],
env: {
"cypress/globals": true,
},
extends: ["plugin:cypress/recommended"],
rules: {
"cypress/no-unnecessary-waiting": "off",
},
}

22
examples/cypress/cypress/global.d.ts vendored Normal file
View File

@@ -0,0 +1,22 @@
declare namespace Cypress {
export interface Chainable {
// task for totally resetting the database
task(event: "db:reset", options?: Partial<Loggable & Timeoutable>): Chainable<boolean>
// task for deleting db data without dropping tables
task(event: "db:clear", options?: Partial<Loggable & Timeoutable>): Chainable<boolean>
// task for seeding db with essential data for tests
task(event: "db:seed", options?: Partial<Loggable & Timeoutable>): Chainable<boolean>
// task for creating a new factory
task(
event: "factory",
args: { name: string; attrs?: any },
options?: Partial<Loggable & Timeoutable>
): Chainable<any>
/**
* Logs-in user by using API request
*/
login({ email: string, password: string }): Chainable<Response>
}
}

View File

@@ -0,0 +1,55 @@
process.env.NODE_ENV = "test"
import { loadEnvConfig } from "@blitzjs/env"
loadEnvConfig()
import "./register-ts-paths"
import db from "db"
import seed from "db/seeds"
import { factory } from "test/factories"
let dbSetup = false
const pluginConfig: Cypress.PluginConfig = (on, _config) => {
on("task", {
factory,
"db:reset": async () => {
if (!dbSetup) {
try {
// Only need to do this once at startup
console.log("Resetting database...")
await db.$reset()
console.log("Database reset.")
dbSetup = true
} catch (error) {
console.error(error)
throw new Error("Failed to set up database in cypress/plugins/index.ts")
}
}
return true
},
// for Postgres
// "db:clear": () => {
// Delete all data without dropping tables, so migration isn't required
// await db.$executeRaw`
// do
// $$
// declare
// l_stmt text;
// begin
// select 'truncate ' || string_agg(format('%I.%I', schemaname, tablename), ',')
// into l_stmt from pg_tables
// where schemaname in ('public');
// execute l_stmt;
// end;
// $$
// `
// return true
// },
"db:seed": async () => {
await seed()
return true
},
})
}
export default pluginConfig

View File

@@ -0,0 +1,2 @@
// @ts-ignore
require("tsconfig-paths").register()

View File

@@ -0,0 +1,10 @@
import "@testing-library/cypress/add-commands"
Cypress.Commands.add("login", ({ email, password }) => {
return cy.request("POST", `/api/rpc/login`, {
params: {
email,
password,
},
})
})

View File

@@ -0,0 +1,24 @@
// ***********************************************************
// This example support/index.js is processed and
// loaded automatically before your test files.
//
// This is a great place to put global configuration and
// behavior that modifies Cypress.
//
// You can change the location of this file or turn off
// automatically serving support files with the
// 'supportFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/configuration
// ***********************************************************
import "./commands"
before(() => {
cy.task("db:reset")
})
beforeEach(() => {
// you can clear the database here
cy.task("db:seed")
})

View File

@@ -0,0 +1,10 @@
{
"extends": "../tsconfig.json",
"compilerOptions": {
"types": ["cypress", "@types/testing-library__cypress"],
"isolatedModules": false,
"tsBuildInfoFile": ".tsbuildinfo.test"
},
"exclude": ["node_modules"],
"include": ["**/*.ts"]
}

View File

@@ -0,0 +1,7 @@
import { enhancePrisma } from "blitz"
import { PrismaClient } from "@prisma/client"
const EnhancedPrisma = enhancePrisma(PrismaClient)
export * from "@prisma/client"
export default new EnhancedPrisma()

View File

@@ -0,0 +1,47 @@
-- CreateTable
CREATE TABLE "User" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" DATETIME NOT NULL,
"name" TEXT,
"email" TEXT NOT NULL,
"hashedPassword" TEXT,
"role" TEXT NOT NULL DEFAULT 'USER'
);
-- CreateTable
CREATE TABLE "Session" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" DATETIME NOT NULL,
"expiresAt" DATETIME,
"handle" TEXT NOT NULL,
"hashedSessionToken" TEXT,
"antiCSRFToken" TEXT,
"publicData" TEXT,
"privateData" TEXT,
"userId" INTEGER,
FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE SET NULL ON UPDATE CASCADE
);
-- CreateTable
CREATE TABLE "Token" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" DATETIME NOT NULL,
"hashedToken" TEXT NOT NULL,
"type" TEXT NOT NULL,
"expiresAt" DATETIME NOT NULL,
"sentTo" TEXT NOT NULL,
"userId" INTEGER NOT NULL,
FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE
);
-- CreateIndex
CREATE UNIQUE INDEX "User.email_unique" ON "User"("email");
-- CreateIndex
CREATE UNIQUE INDEX "Session.handle_unique" ON "Session"("handle");
-- CreateIndex
CREATE UNIQUE INDEX "Token.hashedToken_type_unique" ON "Token"("hashedToken", "type");

View File

@@ -0,0 +1,3 @@
# Please do not edit this file manually
# It should be added in your version-control system (i.e. Git)
provider = "sqlite"

View File

@@ -0,0 +1,65 @@
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
datasource db {
provider = "sqlite"
url = "file:./db.sqlite"
}
generator client {
provider = "prisma-client-js"
}
// --------------------------------------
model User {
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
name String?
email String @unique
hashedPassword String?
role String @default("USER")
tokens Token[]
sessions Session[]
}
model Session {
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
expiresAt DateTime?
handle String @unique
hashedSessionToken String?
antiCSRFToken String?
publicData String?
privateData String?
user User? @relation(fields: [userId], references: [id])
userId Int?
}
model Token {
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
hashedToken String
type String
// See note below about TokenType enum
// type TokenType
expiresAt DateTime
sentTo String
user User @relation(fields: [userId], references: [id])
userId Int
@@unique([hashedToken, type])
}
// NOTE: It's highly recommended to use an enum for the token type
// but enums only work in Postgres.
// See: https://blitzjs.com/docs/database-overview#switch-to-postgre-sql
// enum TokenType {
// RESET_PASSWORD
// }

View File

@@ -0,0 +1,15 @@
// import db from "./index"
/*
* This seed function is executed when you run `blitz db seed`.
*
* Probably you want to use a library like https://chancejs.com
* to easily generate realistic data.
*/
const seed = async () => {
// for (let i = 0; i < 5; i++) {
// await db.project.create({ data: { name: "Project " + i } })
// }
}
export default seed

View File

@@ -0,0 +1,7 @@
import type { Config } from "@jest/types"
const config: Config.InitialOptions = {
preset: "blitz",
}
export default config

View File

@@ -0,0 +1,45 @@
/* TODO - You need to add a mailer integration in `integrations/` and import here.
*
* The integration file can be very simple. Instantiate the email client
* and then export it. That way you can import here and anywhere else
* and use it straight away.
*/
type ResetPasswordMailer = {
to: string
token: string
}
export function forgotPasswordMailer({ to, token }: ResetPasswordMailer) {
// In production, set APP_ORIGIN to your production server origin
const origin = process.env.APP_ORIGIN || process.env.BLITZ_DEV_SERVER_ORIGIN
const resetUrl = `${origin}/reset-password?token=${token}`
const msg = {
from: "TODO@example.com",
to,
subject: "Your Password Reset Instructions",
html: `
<h1>Reset Your Password</h1>
<h3>NOTE: You must set up a production email integration in mailers/forgotPasswordMailer.ts</h3>
<a href="${resetUrl}">
Click here to set a new password
</a>
`,
}
return {
async send() {
if (process.env.NODE_ENV === "production") {
// TODO - send the production email, like this:
// await postmark.sendEmail(msg)
throw new Error("No production email implementation in mailers/forgotPasswordMailer")
} else {
// Preview email in the browser
const previewEmail = (await import("preview-email")).default
await previewEmail(msg)
}
},
}
}

View File

@@ -0,0 +1,62 @@
{
"name": "@examples/cypress",
"version": "0.41.1",
"scripts": {
"dev": "blitz dev",
"build": "blitz build",
"start": "blitz start",
"studio": "blitz prisma studio",
"lint": "eslint --ignore-path .gitignore --ext .js,.ts,.tsx .",
"cy:open": "cypress open",
"cy:run": "cypress run",
"test:server": "blitz prisma migrate deploy && blitz build && blitz start -p 3099",
"test:e2e": "cross-env NODE_ENV=test start-server-and-test test:server http://localhost:3099 cy:run",
"test:jest": "jest --passWithNoTests",
"test": "blitz codegen && prisma generate && yarn test:jest && yarn test:e2e"
},
"prisma": {
"schema": "db/schema.prisma"
},
"prettier": {
"semi": false,
"printWidth": 100
},
"lint-staged": {
"*.{js,ts,tsx}": [
"eslint --fix"
]
},
"husky": {
"hooks": {
"pre-commit": "tsc && lint-staged && pretty-quick --staged",
"pre-push": "npm run lint && npm run test"
}
},
"dependencies": {
"@prisma/client": "2.24.1",
"blitz": "0.45.4",
"final-form": "4.20.1",
"react": "0.0.0-experimental-6a589ad71",
"react-dom": "0.0.0-experimental-6a589ad71",
"react-final-form": "6.5.2",
"zod": "3.10.1"
},
"devDependencies": {
"@testing-library/cypress": "8.0.1",
"@types/preview-email": "2.0.0",
"@types/react": "17.0.2",
"@types/testing-library__cypress": "5.0.9",
"chance": "1.1.8",
"cross-env": "7.0.3",
"cypress": "6.2.1",
"eslint": "7.21.0",
"husky": "5.1.2",
"lint-staged": "10.5.4",
"prettier": "2.2.1",
"pretty-quick": "3.1.0",
"preview-email": "3.0.3",
"prisma": "2.24.1",
"start-server-and-test": "1.11.7"
},
"private": true
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

View File

@@ -0,0 +1,3 @@
module.exports = {
extends: ["../../cypress/.eslintrc.js"],
}

View File

@@ -0,0 +1,35 @@
import { User } from "test/factories"
describe("Login", () => {
describe("with an email that doesnt exist", () => {
it("shows an error", () => {
const email = "nowayshouldIexist@example.com"
const password = "test1234"
cy.visit("/login").wait(100)
cy.findByLabelText(/email/i).type(email)
cy.findByLabelText(/password/i).type(password)
cy.findAllByRole("button", { name: /login/i }).click()
cy.findByText(/invalid/i).should("exist")
})
})
describe("with valid credentials", () => {
it("logs in", () => {
const attrs = { password: "superstrongpassword" }
cy.visit("/login").wait(100)
cy.task("factory", { name: "user", attrs }).then((user: User) => {
cy.findByLabelText(/email/i).type(user.email)
cy.findByLabelText(/password/i).type(attrs.password)
cy.findAllByRole("button", { name: /login/i }).click()
cy.location("pathname").should("equal", "/")
cy.findByText(/logout/i).should("exist")
})
})
})
})

View File

@@ -0,0 +1,14 @@
describe("Signup", () => {
it("creates new account", () => {
const attrs = { email: "blitz@example.com", password: "superstrongpassword" }
cy.visit("/signup").wait(100)
cy.findByLabelText(/email/i).type(attrs.email)
cy.findByLabelText(/password/i).type(attrs.password)
cy.findAllByRole("button", { name: /create account/i }).click()
cy.location("pathname").should("equal", "/")
cy.findByText(/logout/i).should("exist")
})
})

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