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

Compare commits

...

784 Commits

Author SHA1 Message Date
Brandon Bayer
a0b7a08db6 even stricter typing by removing undefined only if suspense & enabled are true 2021-02-10 12:14:10 -05:00
Brian Liu
91d7a8a353 Merge branch 'canary' into use-query-data-type 2021-02-10 13:48:55 +11:00
Brian Liu
aa681ff50c Added TS function overload for return types 2021-02-10 13:05:26 +11:00
Brandon Bayer
1792cc6788 v0.30.0-canary.7 2021-02-09 19:36:42 -05:00
Michael Ford
dc88bc68d2 Change useSession to use suspense by default (#1888)
Co-authored-by: Brandon Bayer <b@bayer.ws> (major)
2021-02-09 19:21:09 -05:00
allcontributors[bot]
37348f2595 docs: add mtford90 as a contributor (#1899)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2021-02-09 18:53:25 -05:00
Brandon Bayer
bec3cd6cde Add internal BlitzAppRoot component (meta) (#1898) 2021-02-09 18:45:19 -05:00
Brandon Bayer
a9c1171a14 Fix vercel deployments with 0.30-canary (#1897)
(patch)
2021-02-09 18:26:53 -05:00
Brian Liu
7b7eaeee4b Revert "Fixed useQuery return data type"
This reverts commit cb2b6a1777.
2021-02-10 10:08:56 +11:00
Brian Liu
a96b8735cc Revert "Fixed test fails"
This reverts commit cc64243006.
2021-02-10 10:08:44 +11:00
allcontributors[bot]
b46a245f08 docs: add rodrigoehlers as a contributor (#1896)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2021-02-09 17:20:39 -05:00
Rodrigo Ehlers
a5208e2b96 Fix useSession return type to have userId: number | null (#1895)
(patch)
2021-02-09 17:20:24 -05:00
Camilo Gonzalez
4fefbcbbb0 Automatically prompt to run prisma migrate after blitz generate (minor) (#1894)
Co-authored-by: Brandon Bayer <b@bayer.ws>
2021-02-09 12:58:22 -05:00
engelkes-finstreet
258c0491dd Add initialPublicData option to useSession for use with SSR (minor) (#1807)
* Add initial parameter to useSession hook to remove flickering if session is loaded via server side.

* Use better naming.

* Update packages/core/src/supertokens.ts

* fix and cleanup types

Co-authored-by: Brandon Bayer <b@bayer.ws>
2021-02-09 17:12:51 +00:00
Brian Liu
cc64243006 Fixed test fails 2021-02-09 12:25:06 +11:00
Brian Liu
cb2b6a1777 Fixed useQuery return data type 2021-02-09 11:26:42 +11:00
allcontributors[bot]
8ec0d929d8 docs: add lcswillems as a contributor (#1892)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2021-02-08 17:24:46 -05:00
Lucas Willems
adfc529852 Fix typo in anti-csrf cookie name (#1889)
(patch)
2021-02-08 17:24:31 -05:00
depfu[bot]
aebc79fe9c Update all Yarn dependencies (2021-02-08) (#1886)
Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com> (patch)
2021-02-08 17:18:38 -05:00
Brandon Bayer
da6393c538 v0.30.0-canary.6 2021-02-06 19:06:28 -05:00
Brandon Bayer
e51a002892 Add SimpleRolesIsAuthorized<RoleType> type so session.$authorize() can type check the roles AND update new app template accordingly (#1883)
* add `SimpleRolesIsAuthorized<RoleType>` type so `session.$authorize()` can type check the roles AND update new app template accordingly (minor)

* fix type
2021-02-06 19:00:08 -05:00
Brandon Bayer
d73750be0c Fix all known resolver.pipe type issues AND update getModelNames template to use resolver.pipe (#1881)
(patch)
2021-02-06 18:23:29 -05:00
allcontributors[bot]
95781eb6ba docs: add alii as a contributor (#1882)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2021-02-06 18:06:06 -05:00
Alistair Smith
afcd47569c Fix blitz install [RECIPE] not working (#1880)
(patch)
2021-02-06 18:05:44 -05:00
Brandon Bayer
f405b5b4df update auth example project pages from latest templates
(meta)
2021-02-06 17:07:31 -05:00
Brandon Bayer
a0d7378642 v0.30.0-canary.5 2021-02-05 15:51:24 -05:00
Brandon Bayer
60bba38919 fix dependency issue (ignore) 2021-02-05 15:49:27 -05:00
Stratulat Alexandru
901d1cad7e Add paginate resolver utility and add it to blitz generate template (#1199)
Co-authored-by: Brandon Bayer <b@bayer.ws> (minor)
2021-02-05 15:47:16 -05:00
Brandon Bayer
383034d1fe change jest-preset to use .server.test.ts instead of .test.server.ts (ignore) (#1875)
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2021-02-05 14:15:16 -05:00
Brandon Bayer
bd6f37a6b0 (recipe) add gh-action-yarn-postgres recipe which adds a production github action config (#1876) 2021-02-05 11:39:37 -05:00
Brandon Bayer
b1116b6052 end g2i sponsor trial
(ignore)
2021-02-04 21:01:26 -05:00
Brandon Bayer
85c91e2e2e update jest preset with auto client/server environments and ability to use file.test.server.ts (minor) (#1873)
* update jest preset with auto client/server environments and ability to use `file.test.server.ts`

* cleanup
2021-02-05 01:58:20 +00:00
Brandon Bayer
0bad1f181b Massive update to blitz generate templates to generate production ready code (#1870)
(minor)
2021-02-04 20:35:22 -05:00
Brandon Bayer
971e695b30 Change blitz start to blitz dev and blitz start --production to blitz start (#1872)
* Change `blitz start` to `blitz dev` and `blitz start --production` to `blitz start`

* fix alias

* fix help msg (major)
2021-02-04 18:26:29 -05:00
Brandon Bayer
c0e1246dc0 add blitz generate mutation (minor) (#1871) 2021-02-04 18:05:58 -05:00
Brandon Bayer
bce9822d13 Revert "Change blitz start to blitz dev and blitz start --production to blitz start"
This reverts commit e41219944c.
2021-02-04 17:57:19 -05:00
Brandon Bayer
e41219944c Change blitz start to blitz dev and blitz start --production to blitz start 2021-02-04 17:56:30 -05:00
Brandon Bayer
fe0d958368 (newapp) upgrade prisma to 2.16 and change @prisma/cli to new prisma name (#1864)
* (newapp) upgrade prisma to 2.16 and change `@prisma/cli` to new `prisma` name

* fix cli

Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2021-02-04 18:27:19 +00:00
depfu[bot]
06248f6005 Upgrade next: 10.0.5 → 10.0.6 and refactor runtime require statements (patch) (#1828)
* Update next to version 10.0.6

* type fixes

* big refactor to fix resolve config

* more refactor and fix

* fix jest

* fixes

* fix import

Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com>
Co-authored-by: Brandon Bayer <b@bayer.ws>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2021-02-04 18:06:15 +00:00
TagawaHirotaka
24b85b0108 Add cypress for e2e cli testing (meta) (#1846)
* install cypress

* change describe

* refactor tsconfig.json

* Move cypress dependency to the very root package.json of the repo

* Move e2e test scripts to packages/cli/package.json

* Remove package.json

* forget to add it

* setting cypress.json

* fix cypress install

Co-authored-by: Brandon Bayer <b@bayer.ws>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2021-02-04 17:31:31 +00:00
Brandon Bayer
7804d3ea77 Add @lcswillems as a contributor 2021-02-04 12:06:51 -05:00
allcontributors[bot]
6dca78a8ed docs: add merodiro as a contributor (#1862)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2021-02-04 11:56:38 -05:00
Amr A.Mohammed
92679cfa03 (newapp) Add legacy-peer-deps to .npmrc for npm v7 compatibility (#1859) 2021-02-04 11:56:28 -05:00
allcontributors[bot]
46cb60a962 docs: add wafuwafu13 as a contributor (#1861)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2021-02-04 11:46:03 -05:00
depfu[bot]
012d146fd9 Upgrade superjson: 1.5.2 → 1.6.0 (patch) (#1854)
* Update superjson to version 1.6.0

* fix

Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com>
Co-authored-by: Brandon Bayer <b@bayer.ws>
2021-02-03 20:58:01 +00:00
Brandon Bayer
5015693ddd fix db.$reset() error "cached plan must not change result type" (patch) (#1855) 2021-02-03 20:34:47 +00:00
depfu[bot]
e2ab39ed75 Update tslog to version 3.1.1 (#1853)
Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2021-02-03 16:54:10 +00:00
Andreas Bollig
64ced80f77 fix blitz new for people without global git config (patch) (#1847)
* fix blitz new for people without global git config

* adjusted test to reflect changed git parameters in blitz new

* Update packages/generator/src/generators/app-generator.ts

* Update packages/generator/test/generators/app-generator.test.ts

Co-authored-by: Brandon Bayer <b@bayer.ws>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2021-02-03 16:33:54 +00:00
allcontributors[bot]
050c4f7127 docs: add ajmarkow as a contributor (#1852)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2021-02-03 11:08:31 -05:00
allcontributors[bot]
86de3303bf docs: add akbo as a contributor (#1851)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2021-02-03 11:07:16 -05:00
allcontributors[bot]
31724c7b2a docs: add Gim3l as a contributor (#1849)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2021-02-02 16:30:26 -05:00
Gimel Dick
d7647ad2be Add to new app template (#1844) 2021-02-02 16:30:15 -05:00
depfu[bot]
0a3836b30b Update all dependencies (2021-02-01) (#1839)
Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com> (patch)
2021-02-01 18:15:09 -05:00
t.kuriyama
1fccb1dc19 Fix several compiler bugs like ENOENT, file rename broken, default export not component, etc (#1835)
(patch)
2021-02-01 18:02:41 -05:00
Brandon Bayer
7195aaea66 Add @queq1890 as a contributor 2021-02-01 17:51:23 -05:00
Brandon Bayer
d1c4553ddd (newapp) small tweak to error fallback in _app.tsx 2021-02-01 17:50:31 -05:00
Brandon Bayer
8ee5642fb6 v0.30.0-canary.4 2021-01-29 21:28:53 -05:00
Brandon Bayer
7a5695105a Fix bug in resolver.authorize() type (#1834)
(ignore)
2021-01-29 21:26:54 -05:00
Brandon Bayer
d0008711c6 (newapp) update _app.tsx to use new ErrorFallbackProps for better typing (#1833) 2021-01-29 21:16:35 -05:00
Brandon Bayer
83dc0e3e2d Fix enhancePrisma with TS strict:true (#1827)
Co-authored-by: Piotr Monwid-Olechnowicz <hasparus@gmail.com> (patch)
2021-01-29 20:44:52 -05:00
Piotr Monwid-Olechnowicz
89ab77a862 Fix resolver.authorize( doesn't work as type guard (with great effort) (#1831)
Co-authored-by: Brandon Bayer <b@bayer.ws> (patch)
2021-01-29 20:44:34 -05:00
Kazuma Suzuki
b59fbeb0a7 Fix blitz install error message when recipe doesn't exist (patch) (#1815)
* fix error message when recipe doesn't exist

* returns exit code 1 on error

* Update packages/cli/src/commands/install.ts

* some tweaks

Co-authored-by: Brandon Bayer <b@bayer.ws>
2021-01-29 20:15:14 -05:00
allcontributors[bot]
c012c75c87 docs: add rince as a contributor (#1825)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2021-01-29 14:56:01 -05:00
Brandon Bayer
a0615be285 v0.30.0-canary.3 2021-01-29 13:54:58 -05:00
Brandon Bayer
4d7dc8680f Remove resolver.authorizeIf AND remove second options arg to session.$authorize() (major) (#1824)
* remove `resolver.authorizeIf` AND remove second options arg to `session.$authorize()`

* update
2021-01-29 13:47:40 -05:00
Brandon Bayer
9a735f6dd7 tweak PULL_REQUEST_TEMPLATE
(ignore)
2021-01-29 13:32:19 -05:00
Brandon Bayer
0b885c2f57 fix broken API routes because of babel-plugin-superjson-next bug (patch) (#1823)
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2021-01-29 17:36:11 +00:00
Brandon Bayer
3bd030af73 Fix type of resolver.pipe when one of the pipe functions returns a promise (#1822)
(patch)
2021-01-29 12:15:17 -05:00
Brandon Bayer
9ea5d0f259 Rename resolver pipe fns: pipe.resolver to resolver.pipe, pipe.zod to resolver.zod, etc (#1821)
(major)
2021-01-29 11:54:19 -05:00
Brandon Bayer
91886728cf v0.30.0-canary.2 2021-01-27 21:21:31 -05:00
Brandon Bayer
6babea9c15 (newapp) update mutations to use the new pipe functions (#1811)
* (newapp) update mutations to use the new pipe functions

* tweak
2021-01-27 21:19:08 -05:00
Brandon Bayer
8e91c52a12 Fix new app and blitz generate templates to use new session.$ prefix (patch) (#1810)
* fix `blitz generate` templates to use new `session.$authorize()` name (patch)

* more fixes
2021-01-27 20:13:14 -05:00
Brandon Bayer
fb8a13b04c v0.30.0-canary.1 2021-01-27 17:13:51 -05:00
Brandon Bayer
ac55bc453f (newapp) Fix typo in resetPassword.test.ts - create => $create 2021-01-27 17:01:52 -05:00
Brandon Bayer
fcb7884aef fix session.$isAuthorized to not have assertion return type (#1809) 2021-01-27 21:57:23 +00:00
Brandon Bayer
4ec37a5b0b (newapp) fix PublicData typo in types.ts 2021-01-27 16:30:18 -05:00
Brandon Bayer
68488e529f Fix to properly handle http errors (no more Failed to parse json from request to /api/users/queries/getCurrentUser) (patch) (#1808)
* fix to properly handle http errors

* refactor

* fix
2021-01-27 21:28:00 +00:00
Brandon Bayer
d006b0bcd9 update release script
(ignore)
2021-01-27 12:45:57 -05:00
Brandon Bayer
ebc6d47832 v0.30.0-canary.0 2021-01-27 12:31:20 -05:00
Brandon Bayer
50b597ef9f Simplify type definition for PublicData (breaking change) (#1806)
(major)
2021-01-27 12:26:58 -05:00
depfu[bot]
6a6f1f7b2c Update superjson to version 1.5.2 (#1805)
Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com>
2021-01-27 15:11:29 +00:00
Brandon Bayer
cfca59e6ea Add pipe.resolver(), pipe.zod(), pipe.authorize(), and pipe.authorizeIf() for queries/mutations (#1801)
(minor)
2021-01-27 09:43:16 -05:00
Brandon Bayer
57cb14b1ba Improvements to isAuthorized: (1) Ability to strongly type, (2) Change first arg to have ctx, (3) Allow multiple params, (4) add conditional $authorize() (#1796)
Co-authored-by: Aleksandra Sikora <aleksandra@hasura.io> (minor)
2021-01-26 21:29:19 -05:00
Steffan Harris
10a0bed302 (newapp) Update <Form> to easily hide default submit button by making submitText optional (#1800) 2021-01-26 18:48:34 -05:00
Brandon Bayer
9898c578b1 add project model files to auth example
(ignore)
2021-01-26 18:06:35 -05:00
allcontributors[bot]
acc61d2bee docs: add thakkaryash94 as a contributor (#1798)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2021-01-26 16:01:41 -05:00
Flavio
7cc97a1e63 Fix blitz console not working in vanilla JS projects (#1686)
Co-authored-by: Enzo Ferey <enzo.ferey@chance.co>
Co-authored-by: Brandon Bayer <b@bayer.ws> (patch)
2021-01-26 15:50:58 -05:00
allcontributors[bot]
85fe7429a5 docs: add marina-ki as a contributor (#1797)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2021-01-26 15:27:33 -05:00
marina
a3b5e87a96 Fix not all folder names kebab-case from blitz generate (#1790)
(patch)
2021-01-26 15:27:23 -05:00
Brandon Bayer
96793d360c Major improvement to blitz install UX (#1782)
Co-authored-by: David Kramer <davidkramer@me.com> (patch)
2021-01-26 11:45:01 -05:00
depfu[bot]
5d644632e7 Update all dependencies (2021-01-25) (#1792)
Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com> (meta)
2021-01-25 19:31:57 -05:00
Brandon Bayer
8d2e7aba30 Add @jonasthiesen as a contributor 2021-01-25 17:50:22 -05:00
Brandon Bayer
bbec5903d8 change all references/links to Slack over to our new Discord
(meta)
2021-01-25 13:36:14 -05:00
Brandon Bayer
f99a982783 fix blitz/babel preset not passing options through to next/babel (#1789)
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2021-01-24 01:59:29 +00:00
Brandon Bayer
980a0a9ee2 Prefix all ctx.session methods with $ and move publicData fields to top level of ctx.session (#1779)
* make it work

* fix

* finish changing apis in examples (major)
2021-01-23 20:39:16 -05:00
Brandon Bayer
25811cf04b add prisma issue to new issue page (meta) 2021-01-23 13:22:19 -05:00
Jeremy Liberman
05613e8559 docs: Add READMEs to packages that were missing them (#1780)
(meta)
2021-01-22 18:35:35 -05:00
David Kramer
780febd377 Rename chakra recipe to chakra-ui (#1775) 2021-01-22 18:26:49 -05:00
Brandon Bayer
5619dcca97 Change normal resolver logging to log serializer duration (minor) (#1778)
* Change normal resolver logging to log serializer duration

* better
2021-01-22 20:57:04 +00:00
Brandon Bayer
f61ae6e3c6 retry example e2e tests one time if they fail
(meta)
2021-01-22 15:20:19 -05:00
Brandon Bayer
92f67459df Add blitz/babel preset which includes babel-plugin-superjson-next (#1771)
(minor)
2021-01-22 13:19:45 -05:00
Satoshi Nitawaki
b17f9b8e70 Change package.json engines version 12.20 to 12 (#1773)
(meta)
2021-01-22 10:56:51 -05:00
Brandon Bayer
c962b36f2f Add missing type exports like GetStaticPropsContext (patch) (#1772)
* Add missing type exports like `InferGetServerSidePropsType` (patch)

* fix

* more fix

* fix

* reduce example logging

Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2021-01-22 01:48:23 +00:00
Brandon Bayer
d69ca33094 (meta) fix some code formatting 2021-01-21 20:25:30 -05:00
Piotr Monwid-Olechnowicz
9536caa073 Fix type of enhancePrisma constructor args (#1770)
(patch)
2021-01-21 19:18:22 -05:00
Simon Knott
f02cfcee00 Add Quirrel recipe AND add Plain-Text Transformer to recipe APIs (#1764)
(recipe)
2021-01-21 14:26:37 -05:00
Brandon Bayer
7ab1d73f7b Fix prisma errors missing code & meta properties (#1766)
(patch)
2021-01-21 11:35:05 -05:00
Brandon Bayer
933e0f5847 Fix API duration log to include serialization time AND add log serialization duration at DEBUG log level (patch) (#1765) 2021-01-21 11:34:53 -05:00
Brandon Bayer
771bd96706 🎉 Add Forgot Password code to new app template (#1127)
Co-authored-by: aaronfulkerson <31112737+aaronfulkerson@users.noreply.github.com> (newapp)
2021-01-20 21:04:56 -05:00
Brandon Bayer
2f07ae3e80 Change makeServerOnlyPrisma to enhancePrisma which adds db.$reset() for use in tests (#1762)
(minor)
2021-01-20 17:36:17 -05:00
Brandon Bayer
cda62ca155 Fix relative imports from within API routes (patch) (#1761) 2021-01-20 17:09:21 -05:00
Brandon Bayer
7f5d1dcb4e Update blitz generate templates for Prisma 2.15 AND update newapp/examples to Prisma 2.15 (#1759)
* Update `blitz generate` templates for Prisma 2.15 AND update newapp/examples to Prisma 2.15

* fix type error

* actually fix that TS error

* fix

* more fix

(minor)
2021-01-20 16:08:05 -05:00
Brandon Bayer
817b760ab7 Lori retires as L1 maintainer
(meta)
2021-01-20 16:07:24 -05:00
depfu[bot]
4ac527d29f Fix logging issues: Update tslog: 3.0.5 → 3.1.0 (patch) (#1760)
Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com>
2021-01-20 16:04:25 -05:00
tarunama
b87506ae30 chore: unify spell of TypeScript (#1731)
Co-authored-by: Brandon Bayer <b@bayer.ws>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2021-01-20 04:43:28 +00:00
Brandon Bayer
654d9378ad Update jest preset to runInBand and auto disconnect Prisma client after tests (#1753) 2021-01-19 23:05:06 +00:00
Brandon Bayer
fbf9439415 Drastically simplify eslint integration with new eslint-config-blitz package (#1749)
(minor)
2021-01-19 14:54:35 -05:00
depfu[bot]
4bae636085 Update dependencies (2021-01-19) (#1736)
Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com>
Co-authored-by: Brandon Bayer <b@bayer.ws> (patch)
2021-01-19 12:56:12 -05:00
Brandon Bayer
837d3a3126 Fix all queries not being refetched on login (patch) (#1748) 2021-01-19 12:18:50 -05:00
Brandon Bayer
e5baf8c256 Add @marina-ki as a contributor 2021-01-19 11:29:45 -05:00
Brandon Bayer
04ed4952e4 Add @mikeesto as a contributor 2021-01-19 11:27:44 -05:00
Brandon Bayer
39ebadccc1 Change session cookies to have a unique prefixed based on package.json name field (major) (#1743)
* change session cookies to have a unique prefixed based on package.json name field

* fix test
2021-01-19 01:24:09 +00:00
Brandon Bayer
9636017262 (newapp) Add changePassword mutation (#1741) 2021-01-18 18:45:35 -05:00
Brandon Bayer
2fc04d3f02 (newapp) Remove app/auth/auth-utils.ts by moving code into the login mutation (#1740) 2021-01-18 18:44:03 -05:00
allcontributors[bot]
fb8a352349 docs: add bacongravy as a contributor (#1742)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2021-01-18 18:43:53 -05:00
David Kramer
a3a32bbbf4 Automatically disable useQuery suspense when not using concurrent mode (#1735)
(patch)
2021-01-18 18:42:30 -05:00
Robert Malko
d39a9e60a5 Add .yalc folder to ignore paths (#1734)
(patch)
2021-01-18 16:22:17 -05:00
allcontributors[bot]
a6247fb570 docs: add tarunama as a contributor (#1739)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2021-01-18 16:21:28 -05:00
t.kuriyama
9f22ff7525 Fix blitz generate bug when model name ends with number (#1727)
(patch)
2021-01-18 16:18:15 -05:00
Brandon Bayer
cc3c1f1205 Drastically simplify Jest integration with a Blitz jest preset and by moving test dependencies into blitz. (#1725)
(major)
2021-01-16 15:25:13 -05:00
Robert Malko
66d8aa48a7 Add @malkomalko as L1 Maintainer (#1728)
(meta)
2021-01-16 10:40:29 -05:00
Brandon Bayer
c6ee429e61 fix makeServerOnlyPrisma() not working in Jest tests (patch) (#1726) 2021-01-16 00:25:19 +00:00
Brandon Bayer
b243da00ec Add makeServerOnlyPrisma() utility, allow db in client bundle, and update new app template (#1720)
(major)
2021-01-15 14:51:32 -05:00
Brandon Bayer
38bc98755b Change blitz generate to generate all pages in app/pages/ and update new app structure with app/core/ (#1719)
(major)
2021-01-15 14:50:12 -05:00
Robert Malko
a959ae5b58 Remove console.log from reflexjs recipe (#1722)
(recipe)
2021-01-15 13:58:11 -05:00
Brandon Bayer
7b102f654c Add generateToken() and hash256() utilities (#1721) (minor)
* add `generateToken()` and `hash256()` utilities

* fix bundle size
2021-01-14 18:10:47 -05:00
Brandon Bayer
4b293abc41 v0.29.2 2021-01-13 18:32:01 -05:00
Brandon Bayer
82fe3a0eb5 Fix logout not triggering re-renders for all queries (patch) (#1717) 2021-01-13 18:29:10 -05:00
Brandon Bayer
db7a3e5451 Fix: blitz db seed should not run prisma migrations (#1718) 2021-01-13 18:21:37 -05:00
Brandon Bayer
484f434d8e fix blitz compiler to ignore sqlite files (#1716) 2021-01-13 22:29:16 +00:00
Robert Malko
ddb434f847 (newapp) Fix studio package.json script to use new blitz prisma command (#1709) 2021-01-13 11:04:23 -05:00
Brandon Bayer
103609cf0b v0.29.1 2021-01-12 19:29:18 -05:00
Brandon Bayer
8dbb0bbbdb Fix new apps failing to initialize the database in 0.29.0 (patch) (#1707)
* wip

* more stuff

* more
2021-01-13 00:27:34 +00:00
Brandon Bayer
58a68c83fd fix --help flag for blitz prisma command not being sent to prisma (#1706) 2021-01-12 23:07:48 +00:00
Brandon Bayer
a2a5564a96 v0.29.0 2021-01-12 17:32:14 -05:00
Brandon Bayer
2aab361dbc Add isReady: true to mockRouter in test/utils.tsx for Next.js 10.0.5 (newapp) 2021-01-12 15:01:08 -05:00
allcontributors[bot]
a0f827a351 docs: add ranjan-purbey as a contributor (#1705)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2021-01-12 14:38:37 -05:00
Ranjan Purbey
f4bda9f52f Fix extra ms in API log message (#1702)
(patch)
2021-01-12 14:37:20 -05:00
t.kuriyama
92abe2b0b9 Update .eslintrc.js on examples/custom-server to add @typescript-eslint parser/plugin config (#1700)
(meta)
2021-01-12 14:34:31 -05:00
Joaquin Bravo Contreras
62efe3f4ee Prisma 2.13+ Support: Remove all blitz db commands except blitz db seed and use prisma CLI directly (major) (#1661)
Co-authored-by: Brandon Bayer <b@bayer.ws>
2021-01-11 21:41:04 -05:00
allcontributors[bot]
17e08de16b docs: add jackbravo as a contributor (#1699)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2021-01-11 19:15:12 -05:00
allcontributors[bot]
31a88aca89 docs: add rembrandtreyes as a contributor (#1698)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2021-01-11 18:52:45 -05:00
Rembrandt Reyes
aa06d4bf1a Add some tests to @blitzjs/installer (meta) (#1690) 2021-01-11 18:52:15 -05:00
allcontributors[bot]
26c8bfb215 docs: add malkomalko as a contributor (#1697)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2021-01-11 18:49:43 -05:00
Robert Malko
2b0e12a08e Pin versions in chakra recipe (#1695)
(recipe)
2021-01-11 18:49:32 -05:00
depfu[bot]
0d8c0a16b6 Update all Yarn dependencies (2021-01-11) (#1692)
Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com> (meta)
2021-01-11 15:07:08 -05:00
allcontributors[bot]
a9bf1fd3a0 docs: add koolii as a contributor (#1689)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2021-01-09 15:52:00 -05:00
t.kuriyama
c0a392ac4e Update jest config for a deprecated option (#1687)
(meta)
2021-01-09 15:51:22 -05:00
Brandon Bayer
dcb5edc72c Add @doi-t as a contributor 2021-01-09 12:06:16 -05:00
Brandon Bayer
5b57277808 v0.29.0-canary.0 2021-01-08 18:30:43 -05:00
depfu[bot]
9ff878a107 Upgrade next: 10.0.4 → 10.0.5 (patch) (NOTE: need to add isReady to mockRouter in test/utils.ts) (#1681)
* Update next to version 10.0.5

* few fixes

Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com>
Co-authored-by: Brandon Bayer <b@bayer.ws>
2021-01-08 23:28:39 +00:00
Brandon Bayer
87af792e41 Add blitz prisma CLI command for Prisma 2.13+ support (#1685)
* add `blitz prisma` command

* fix type case
2021-01-08 23:07:05 +00:00
Alex Johansson
a957d2f227 Add custom server support! (#1492)
Co-authored-by: Brandon Bayer <b@bayer.ws> (minor)
2021-01-08 17:29:05 -05:00
depfu[bot]
2efcb71d2e Update tslog to version 3.0.5 (#1680)
Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com>
2021-01-07 17:15:11 +00:00
Brandon Bayer
3a94cc10c1 Add SecurePassword utilities to core so you can remove them from auth-utils.ts (minor) (#1667)
(minor)
2021-01-06 18:59:00 -05:00
allcontributors[bot]
afc77338ef docs: add rembrandtreyes as a contributor (#1679)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2021-01-06 17:59:05 -05:00
Rembrandt Reyes
948fad7996 Add config option for cookie domain to sessionMiddleware (#1673)
(minor)
2021-01-06 17:58:49 -05:00
allcontributors[bot]
295436c7e5 docs: add kyken as a contributor (#1678)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2021-01-06 17:54:02 -05:00
Tsuyoshi Osawa
3f95ad3bbf Fix bug preventing a semicolon in session publicData (#1676)
(patch)
2021-01-06 17:53:49 -05:00
Brandon Bayer
396f7e551f Add @creimers as a contributor 2021-01-05 16:18:46 -05:00
Brandon Bayer
2284dd8621 v0.28.0 2021-01-04 15:20:20 -05:00
Brandon Bayer
25d057dd90 Add @linbudu599 as a contributor 2021-01-02 15:00:20 -05:00
Brandon Bayer
9be0d74816 v0.28.0-canary.2 2021-01-01 17:36:09 -05:00
Brandon Bayer
27974e4268 Change a number of dependencies to use ranges to help reduce size of installed node_modules (patch) (#1665)
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2021-01-01 22:13:56 +00:00
Brandon Bayer
c700ee4b9a Change log message from "alpha software" to "beta software" (patch) 2021-01-01 16:54:26 -05:00
Brandon Bayer
da2916fccf (newapp) Update a few dependencies including React to 0.0.0-experimental-3310209d0 (#1662)
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2021-01-01 21:48:43 +00:00
Steffan Harris
59c839c65f Remove unnecessary log message about git core.excludesFiles (patch) (#1663)
* Removed build console message about core.excludesFiles

* Update parse-chokidar-rules-from-gitignore.ts

Co-authored-by: Brandon Bayer <b@bayer.ws>
2021-01-01 21:29:35 +00:00
Brandon Bayer
1341b10e57 Upgrade all dependencies (patch) (#1657) 2020-12-31 18:56:34 -05:00
Kevin Østerkilde
da678523d8 (newapp) Change Final Form <LabeledTextField/> to properly parse numbers (#1658)
See https://github.com/blitz-js/blitz/issues/1636
2020-12-31 16:46:48 -05:00
depfu[bot]
34145212ad Upgrade Node.js to version 12.20.0 (#1655)
Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com>
2020-12-30 22:37:59 +00:00
Brandon Bayer
e4fd4a8990 fix a false duplicate error with .coverage directory in your project (#1654)
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-12-30 21:13:18 +00:00
Brandon Bayer
682664bd0c Improve error message from useQuery for case of incorrect resolver location (patch) (#1653)
* improve error message for useQuery

* tweak
2020-12-30 20:54:46 +00:00
Alex Johansson
384b847b39 Remove unused packages from @blitzjs/server (patch) (#1634)
* Remove unused packages from `packages/server`

* lodash-es

Co-authored-by: Brandon Bayer <b@bayer.ws>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-12-29 23:25:13 +00:00
Alex Johansson
db0cddf5ed Remove pretty-ms dependency (move code into core) (patch) (#1628)
* Remove `pretty-ms` dep

* naïve prettyMs-fn

* use `Date.now` shorthand

* fmt negative numbers as well

Co-authored-by: Brandon Bayer <b@bayer.ws>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-12-29 23:08:34 +00:00
Simon Knott
01754dcbbd Fix bug preventing imports from files/libraries ending in "pages" or "api" (patch) (#1649)
* Add regression example

* Dont rewrite file-imports that end in /pages or /api

Only import directory imports (where import "someDir/pages" actually means "someDir/pages/index.js").

Closes #1646

Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-12-29 22:52:28 +00:00
Alex Johansson
387ffc6a80 Remove implicit auto-build with blitz start --production. blitz build now a pre-requisite (major) (#1623)
* Remove auto-build

* remove `folder-hash` dep

* build before start

Co-authored-by: Brandon Bayer <b@bayer.ws>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-12-29 22:35:45 +00:00
Arjun Dubey
303fad2853 Fix blitz db commands showing incorrect error (patch) (#1648)
* update db.ts

* updated db.ts

* Update packages/cli/src/commands/db.ts

Co-authored-by: Brandon Bayer <b@bayer.ws>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-12-29 22:18:49 +00:00
Alex Johansson
a1227ee37a Remove unused packages from core (patch) (#1630)
* Remove unused packages from `core`

* update lockfile

* lodash-es

Co-authored-by: Brandon Bayer <b@bayer.ws>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-12-29 21:41:51 +00:00
Brandon Bayer
b31e1ac245 Add @timReynolds as a contributor 2020-12-29 16:20:46 -05:00
Brandon Bayer
4e79196222 Add @phillipkregg as a contributor 2020-12-29 16:16:42 -05:00
Brandon Bayer
9b57078d31 bump yarn.lock
(ignore)
2020-12-23 14:22:30 -05:00
Brandon Bayer
cb80788734 v0.28.0-canary.1 2020-12-23 14:21:42 -05:00
depfu[bot]
845d171721 Upgrade next: 10.0.3 → 10.0.4 (patch) (#1644)
Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com>
Co-authored-by: Brandon Bayer <b@bayer.ws>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-12-23 14:18:16 -05:00
Alex Johansson
5f57f3c9ea only use node-fetch (#1642)
next.js bundles it

Co-authored-by: Brandon Bayer <b@bayer.ws>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-12-23 19:17:19 +00:00
Brandon Bayer
96a0fffa00 fix broken css module imports (#1645)
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-12-23 18:50:59 +00:00
Alex Johansson
6d71a60154 Remove unsued dep node-fetch (#1632)
Co-authored-by: Brandon Bayer <b@bayer.ws>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-12-23 18:22:19 +00:00
Alex Johansson
dd5a6b8273 Remove unused packages from file-pipeline (#1631)
Co-authored-by: Brandon Bayer <b@bayer.ws>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-12-23 18:05:42 +00:00
Alex Johansson
a3452937c3 remove hasha dependency (#1627)
Co-authored-by: Brandon Bayer <b@bayer.ws>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-12-23 17:47:58 +00:00
Brandon Bayer
6826920184 update codeowners again
(ignore)
2020-12-23 12:29:30 -05:00
Brandon Bayer
0dc9feeb1e update codeowners
(ignore)
2020-12-23 12:23:15 -05:00
Alex Johansson
12b5161918 Remove unused packages from @blitzjs/installer (patch) (#1633)
Co-authored-by: Brandon Bayer <b@bayer.ws>
2020-12-23 12:17:22 -05:00
Brandon Bayer
e72b602600 Fix CI windows example test and other CI maintenance (#1639) 2020-12-23 11:46:04 -05:00
Brandon Bayer
a271fe9267 Change all agnosticSource tests to not run on windows (#1643)
(meta)
2020-12-22 18:51:15 -05:00
Alex Johansson
75758f8130 Timeout example testing after 20mins (#1640)
(meta)
2020-12-22 18:36:15 -05:00
Brandon Bayer
d48161d203 improve release script patch
(meta)
2020-12-22 13:55:56 -05:00
Reo Ishiyama
1682ce0474 Added Reo as L1 Maintainer to the README (#1637)
(meta)
2020-12-22 13:53:43 -05:00
Alex Johansson
bc7970690c Skip flaky windows packages test (#1635)
(meta)
2020-12-22 13:49:40 -05:00
Brandon Bayer
d9c5299436 v0.28.0-canary.0 2020-12-17 16:24:02 -05:00
Brandon Bayer
bc829d6bd4 update release patch auto categorize allcontributors
(meta)
2020-12-17 16:20:36 -05:00
allcontributors[bot]
ec71d2ad0d docs: add chanand as a contributor (#1621)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2020-12-17 16:17:48 -05:00
chanand
b18393bcab Fix: allow numbers and underscore in names for blitz generate model (#1618)
(patch)
2020-12-17 16:15:27 -05:00
allcontributors[bot]
2eb26617bc docs: add arjundubey-cr as a contributor (#1620)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-12-17 16:12:04 -05:00
Arjun Dubey
95988755ed Fix bug where cancelling blitz install still outputs success message (#1616)
(patch)
2020-12-17 16:11:50 -05:00
allcontributors[bot]
87ad97ce2b docs: add Kosai106 as a contributor (#1619)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-12-17 16:09:45 -05:00
Kevin Østerkilde
a58685229f Add missing exports for LinkProps, ImageProps, and ErrorProps (#1613)
Co-authored-by: Brandon Bayer <b@bayer.ws> (patch)
2020-12-17 16:09:31 -05:00
Brandon Bayer
2ad5b68eab Dylan Brookes retires from core team
(meta)
2020-12-17 13:09:10 -05:00
allcontributors[bot]
8ac511aba3 docs: add jackbravo as a contributor (#1614)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-12-16 11:05:06 -05:00
Steffan Harris
12d93c7532 Removed unstable_ prefix from session middleware (#1607)
(major)
2020-12-15 17:17:18 -05:00
Brandon Bayer
e53f1b21bc fix render logo
(ignore)
2020-12-15 11:42:46 -05:00
Brandon Bayer
b0a4bed5e3 update render logo
(ignore)
2020-12-15 11:40:25 -05:00
Brandon Bayer
a4a672645c update render link
(ignore)
2020-12-14 16:46:47 -05:00
Brandon Bayer
88f9b4b5e5 fix readme logo size
(ignore)
2020-12-14 16:42:12 -05:00
Brandon Bayer
b62dce39dd add Render.com as a Bronze Sponsor!
(meta)
2020-12-14 16:39:48 -05:00
allcontributors[bot]
2b9b79ca2d docs: add mattfwood as a contributor (#1601)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-12-12 17:26:43 -05:00
Matt Wood
aba8492fc0 Minor typo fix in chakra recipe explanation (#1597)
(recipe)
2020-12-12 17:26:31 -05:00
dependabot[bot]
34f5b08101 Bump ini from 1.3.5 to 1.3.8 (#1599)
Bumps [ini](https://github.com/isaacs/ini) from 1.3.5 to 1.3.8.
- [Release notes](https://github.com/isaacs/ini/releases)
- [Commits](https://github.com/isaacs/ini/compare/v1.3.5...v1.3.8)
(meta)
Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-12-12 17:24:37 -05:00
Brandon Bayer
322fc6d0a9 fix readme
(ignore)
2020-12-12 11:30:24 -05:00
Brandon Bayer
34ee44e0bf Add Andreas Asprou as a seedling sponsor
(meta)
2020-12-12 11:26:02 -05:00
Brandon Bayer
4517a675a5 Fix bug where "db" in a path name will break client side imports (patch) (#1594) 2020-12-10 19:01:28 -05:00
Brandon Bayer
6ce248f694 (newapp) Change prisma version to be pinned to a minor version (#1595) 2020-12-10 18:54:42 -05:00
allcontributors[bot]
e68eb6d118 docs: add beeplin as a contributor (#1593)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-12-10 17:51:50 -05:00
tundera
ab81073003 Add Reflexjs recipe (#1585)
Co-authored-by: Brandon Bayer <b@bayer.ws> (recipe)
2020-12-10 17:48:18 -05:00
tundera
78410abe82 Fix and improve Theme UI recipe (#1583)
Co-authored-by: Brandon Bayer <b@bayer.ws> (recipe)
2020-12-10 17:43:20 -05:00
allcontributors[bot]
7d76f646d0 docs: add rayandrews as a contributor (#1592)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-12-10 17:35:36 -05:00
allcontributors[bot]
e97e964099 docs: add AkifumiSato as a contributor (#1591)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-12-10 17:33:38 -05:00
Akifumi Sato
fa358cd328 Remove error stack from console output on testing (#1540)
Co-authored-by: Brandon Bayer <b@bayer.ws> (meta)
2020-12-10 17:31:28 -05:00
Ray Andrew
5360a839d8 Add blitz routes command to see all routes (#1478)
Co-authored-by: Brandon Bayer <b@bayer.ws>
2020-12-10 17:28:25 -05:00
Brandon Bayer
a7493258eb Add G2i as sponsor
(meta)
2020-12-08 18:17:46 -05:00
Brandon Bayer
909f3b3392 fix theme-ui recipe
(ignore)
2020-12-05 19:15:23 -05:00
Brandon Bayer
688b05df78 v0.27.0 2020-12-05 19:07:30 -05:00
allcontributors[bot]
ec301dc22e docs: add markylaing as a contributor (#1578)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-12-05 18:55:35 -05:00
markylaing
df5271c1f0 Change passport adapter to accept an array of objects with authenticate options for each strategy (#1564)
Co-authored-by: Brandon Bayer <b@bayer.ws> (major)
2020-12-05 18:54:29 -05:00
allcontributors[bot]
bad2e3758e docs: add tundera as a contributor (#1577)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-12-05 18:45:53 -05:00
tundera
23b36b83f8 Add Theme UI recipe (including MDX!) (#1366)
Co-authored-by: Brandon Bayer <b@bayer.ws> (recipe)
2020-12-05 18:44:25 -05:00
allcontributors[bot]
94d9daf215 docs: add Khaledgarbaya as a contributor (#1576)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-12-05 18:32:34 -05:00
Khaled Garbaya
aae261c589 Fix blitz generate folder names to always be kebab-case (#1554)
(patch)
2020-12-05 18:31:20 -05:00
Brandon Bayer
4e3261d776 Fix module not found issues by moving isomorphic resolver imports behind experimental flag (#1574)
* move resolver isomorphic imports into an experimental flag

* maybe fix flaky windows test

* fix store test (patch)
2020-12-05 17:29:44 -05:00
Brandon Bayer
74083f704c v0.27.0-canary.3 2020-12-03 18:57:56 -05:00
Brandon Bayer
68e1abf727 add missing dependency
(ignore)
2020-12-03 18:54:53 -05:00
Brandon Bayer
1d3ca10164 v0.27.0-canary.2 2020-12-03 18:48:42 -05:00
Brandon Bayer
0c1cd9cc3f Fix broken blitz install (#1571) 2020-12-03 18:46:49 -05:00
depfu[bot]
e186f86389 Upgrade next.js: 10.0.2 → 10.0.3 (patch) (#1568)
Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com>
2020-12-02 09:37:37 -05:00
Brandon Bayer
6954f448ad v0.27.0-canary.1 2020-12-01 13:01:25 -05:00
Brandon Bayer
656414369c (newapp) Change useCurrentUser hook to not use useSession (fixes UX) (#1563) 2020-12-01 12:57:11 -05:00
Brandon Bayer
760ab549c8 Fix broken blitz install (#1562)
(patch)
2020-12-01 12:56:02 -05:00
Justin Hall
de37d606a3 Update Emotion recipe to v11 (#1559)
(recipe)
2020-12-01 12:04:40 -05:00
Brandon Bayer
e58dbf3486 Add @saintmalik as a contributor 2020-12-01 11:53:33 -05:00
Brandon Bayer
6bb5b04199 Add @ugogo as a contributor 2020-12-01 11:49:53 -05:00
Brandon Bayer
85c2aa280d v0.27.0-canary.0 2020-11-28 13:29:52 -05:00
allcontributors[bot]
f8138f0d4d docs: add jonstuebe as a contributor (#1553)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-11-28 13:24:43 -05:00
Jon Stuebe
894bd7f06d Fix message in the blitz generate pages edit page (#1552)
(patch)
2020-11-28 13:24:28 -05:00
Brandon Bayer
ba7c8c5785 Add log level option to blitz.config.js (#1551)
(minor)
2020-11-28 13:21:29 -05:00
Brandon Bayer
05431ec7b5 v0.26.2 2020-11-27 15:38:21 -05:00
Brandon Bayer
005904e863 Change auth-utils.ts to be side-effect free (newapp) (#1549) 2020-11-27 15:33:57 -05:00
Brandon Bayer
c330651f35 Another try at fixing flaky windows test (meta) (#1548)
* another try at fixing flaky windows test

* revert last test changes and add logs
2020-11-27 15:31:57 -05:00
Brandon Bayer
8af274817d Fix regression in 0.26.1 if you have a test folder inside app/ (patch) (#1547)
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-11-27 15:31:48 -05:00
Brandon Bayer
f06fd070ef Add yalc for testing blitz locally (meta) (#1542) 2020-11-27 14:56:04 -05:00
Brandon Bayer
b9d3f439e8 Add a second css module integration test (meta) (#1538)
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-11-27 14:54:58 -05:00
Brandon Bayer
e49a6c29d1 Fix a flaky file-pipeline test (meta) (#1541) 2020-11-27 13:47:49 -05:00
Brandon Bayer
0b5ca09c7f v0.26.1 2020-11-27 12:22:28 -05:00
allcontributors[bot]
c6f480705d docs: add tpatel as a contributor (#1537)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (patch)
2020-11-27 11:20:27 -05:00
Thibaut Patel
7c3adc460b Fix blitz compiler to ignore gitignored files during processing (#1534)
(patch)
2020-11-27 11:19:07 -05:00
Simon Knott
e8da527325 Fix tree shaking for imports from queries/mutations (#1532)
(patch)
2020-11-27 11:15:29 -05:00
allcontributors[bot]
39d7f092ec docs: add sakulstra as a contributor (#1536)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-11-27 11:09:12 -05:00
Lukas Strassel
6732fa374b fix: add postcss to tailwind recipe (#1533)
I just tried blitz.js the first time and wanted to play around with the recipes.
Installing the tailwindcss recipe broke the app due to to css import errors displaying a prompt to also install postcss which solved the issue, so I guess it makes sense to fix at the recipe level?
2020-11-27 11:07:54 -05:00
Konrad Kalemba
cceae6efa2 Fix to allow for unicode chars in session data (#1527)
(patch)
2020-11-26 11:16:18 -05:00
Brandon Bayer
016af57a07 Add @williamkwao as a contributor 2020-11-26 11:05:33 -05:00
Brandon Bayer
a9ea76e43c update yarn.lock (ignore) 2020-11-24 11:04:25 -05:00
Brandon Bayer
394d7df094 v0.26.0 2020-11-24 11:00:44 -05:00
depfu[bot]
78007fc967 Upgrade @prisma/client: 2.12.0-dev.53 → 2.12.0 (patch) (#1522)
* Update @prisma/client to version 2.12.0

* fix

Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com>
Co-authored-by: Brandon Bayer <b@bayer.ws>
2020-11-24 15:48:49 +00:00
Brandon Bayer
c1ac5b027e Change prisma.findOne to prisma.findFirst for Prisma 2.12 compatibility (#1525)
(minor)
2020-11-24 10:19:19 -05:00
depfu[bot]
b6b898c9b3 Upgrade @prisma/sdk: 2.10.0 → 2.12.0 (example) (#1524)
Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com>
2020-11-24 10:18:31 -05:00
depfu[bot]
f96bcb80d0 Upgrade @prisma/cli: 2.10.0 → 2.12.0 (example) (#1523)
Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com>
2020-11-24 10:18:18 -05:00
Alex Johansson
1194ffde82 Change useParam / useParams to always return undefined for empty/invalid values instead of "" and NaN (patch) (#1491)
* do parsing in useParams instead of useParam

* simplify

# Conflicts:
#	packages/core/src/use-params.ts

* fix typescript error

Co-authored-by: Brandon Bayer <b@bayer.ws>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-11-24 15:16:41 +00:00
allcontributors[bot]
24082d53e0 docs: add Mzaien as a contributor (#1526)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-11-24 10:00:29 -05:00
Abdullah Mzaien
61bbc43497 (recipe) Update tailwind recipe to v2 (#1486)
Co-authored-by: Mzaien <s201540840@kfupm.edu.sa>
Co-authored-by: Brandon Bayer <b@bayer.ws>
2020-11-24 09:58:25 -05:00
allcontributors[bot]
3dcf2bffe2 docs: add rap2hpoutre as a contributor (#1520)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-11-23 21:28:07 -05:00
Raphaël Huchet
653b93b089 Fix bug where blitz db seed will error silently (#1510)
Co-authored-by: Brandon Bayer <b@bayer.ws> (patch)
2020-11-23 21:26:47 -05:00
Alex Johansson
1b663c0e8b Fix lint warnings (#1515)
(meta)
2020-11-23 19:55:02 -05:00
Brandon Bayer
5747642055 Update blitz generate templates for Prisma 2.12.0 compatibility (#1518)
(minor)
2020-11-23 19:24:26 -05:00
Brandon Bayer
53b2e273b4 update fauna link in fauna example readme
(ignore)
2020-11-23 14:25:17 -05:00
Brandon Bayer
3ed4844d87 v0.25.1-canary.3 2020-11-20 21:31:30 -05:00
Ray Andrew
b6b37f4661 Automatically clear .blitz cache when you change blitz versions (#1446)
Co-authored-by: Brandon Bayer <b@bayer.ws> (patch)
2020-11-20 21:29:16 -05:00
Brandon Bayer
236415222d Fix broken css modules imports on canary (patch) (#1499)
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-11-20 21:20:22 -05:00
allcontributors[bot]
bd76ff6049 docs: add rayandrews as a contributor (#1502)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-11-20 21:09:10 -05:00
Alex Johansson
a51757c174 Change useParam() to always return undefined if param doesn’t exist (#1474)
(minor)
2020-11-20 21:03:32 -05:00
allcontributors[bot]
9d8f63df3d docs: add dmzza as a contributor (#1501)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-11-20 21:01:59 -05:00
David Mazza
4890a7cf5b Fix File not found with singular glob (#1493)
(patch)
2020-11-20 21:01:31 -05:00
allcontributors[bot]
8089ec7d15 docs: add KATT as a contributor (#1500)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-11-20 20:59:05 -05:00
Alex Johansson
f6fd1d0285 Cleanup unused args in server (#1494)
(meta)
2020-11-20 20:58:51 -05:00
Brandon Bayer
f655410167 v0.25.1-canary.2 2020-11-20 19:44:22 -05:00
Brandon Bayer
8f20b0729a Add @rap2hpoutre as a contributor 2020-11-20 19:41:07 -05:00
Brandon Bayer
f37e6e8ebc (newapp) Add .next and .blitz to .prettierignore (#1498) 2020-11-20 19:40:36 -05:00
Brandon Bayer
5a934c3211 Fix an import edgecase by only rewriting relative paths imports for files in special folders (patch) (#1496)
* change to only change relative paths for files in special folders

* fix for windows
2020-11-21 00:35:14 +00:00
Brandon Bayer
b079c6e944 update kodiak again
(ignore)
2020-11-20 19:16:21 -05:00
Brandon Bayer
2f0ca0f549 update kodiak config
(ignore)
2020-11-20 19:03:24 -05:00
Brandon Bayer
555ea5bac7 set up Kodiak for PR automerging
(meta)
2020-11-20 18:49:12 -05:00
Brandon Bayer
75b63ed087 yarn.lock
(ignore)
2020-11-18 21:36:42 -05:00
Brandon Bayer
ded2e2a546 v0.25.1-canary.1 2020-11-18 21:35:13 -05:00
Brandon Bayer
f70d8d9a15 Rudi Yardley retired as core member
(meta)
2020-11-18 19:21:12 -05:00
Simon Knott
4d54e89621 Fix ability to import from pages, API routes, and queries/mutations (#1456)
Co-authored-by: Brandon Bayer <b@bayer.ws> (fix)
2020-11-18 19:11:43 -05:00
Brandon Bayer
69b91223d7 Add new Image component from Next.js 10 (#1423)
(minor)
2020-11-18 19:10:11 -05:00
Brandon Bayer
8c5061ead5 Remove undocumented hasOne and hasMany options from blitz generate model (#1476)
(patch)
2020-11-18 17:46:00 -05:00
depfu[bot]
19ffe20330 Upgrade next: 10.0.1 → 10.0.2 (patch) (#1481)
Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com>
2020-11-18 15:27:08 -05:00
Brandon Bayer
9819543f47 v0.25.1-canary.0 2020-11-17 21:47:30 -05:00
Brandon Bayer
b42eec1b66 Fix issue where blitz start --production rebuilds during deployment (#1477)
(patch)
2020-11-17 21:23:58 -05:00
Brandon Bayer
0ef8d16da5 Fix image component external domains not working in production (#1463) 2020-11-17 12:29:39 -05:00
Flavio
37e1ff3427 Added Flavio as L1 Maintainer to the README (#1469)
* Added Flavio as L1 Maintainer to the READMe

* Added Flavio's correct  photo to L1 Maintainer section
2020-11-15 15:06:03 -05:00
allcontributors[bot]
63b0682f06 docs: add piotrski as a contributor (#1467)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-11-14 20:45:13 -05:00
Piotrek Tomczewski
735d2f628b Update Chakra UI Recipe for 1.0 (#1466)
(recipe)
2020-11-14 20:44:55 -05:00
Fran Zekan
d2a3f1a0b1 Only run Lambda warm-up HEAD requests when target is serverless (#159)
Co-authored-by: Brandon Bayer <b@bayer.ws> (patch)
2020-11-14 20:43:36 -05:00
Brandon Bayer
b54cbadebe Fix initial migration for new apps is not included in the initial git commit (#1464)
(patch)
2020-11-14 19:26:53 -05:00
Brandon Bayer
1126b139a9 Add @cwray-tech as a contributor 2020-11-14 10:35:08 -05:00
Brandon Bayer
db44295738 Add Fauna Example (#1458)
(example)
2020-11-14 09:48:01 -05:00
Brandon Bayer
539f457207 v0.25.0 2020-11-11 18:33:47 -05:00
Brandon Bayer
383e856e33 Fix infinite loop with multiple tabs open (#1453)
(patch)
2020-11-11 18:26:59 -05:00
Brandon Bayer
7d05d4e4c4 update bytes newsletter link
(ignore)
2020-11-11 08:59:26 -05:00
Brandon Bayer
1555d09a45 v0.25.0-canary.6 2020-11-10 20:56:28 -05:00
Brandon Bayer
05bf388d8d (newapp) Upgrade react version to 0.0.0-experimental-4ead6b530 (#1451) 2020-11-10 20:50:15 -05:00
Brandon Bayer
41ad93b327 Improve error message for invalid RPC requests (#1450)
(patch)
2020-11-10 20:50:01 -05:00
Brandon Bayer
56b18e40df Add Bytes Newsletter signup banner 2020-11-10 20:48:00 -05:00
Brandon Bayer
e2acb1a6a1 Fix broken static pre-rendering with useQuery (#1444)
(patch)
2020-11-10 20:13:39 -05:00
Brandon Bayer
680c44180c v0.25.0-canary.5 2020-11-09 21:37:28 -05:00
Brandon Bayer
158b6684a7 truly fix the corrupted build this time
(patch)
2020-11-09 21:35:24 -05:00
Brandon Bayer
2a4a209de9 v0.25.0-canary.4 2020-11-09 21:28:51 -05:00
Brandon Bayer
4f862f04b0 fix corrupted build
(patch)
2020-11-09 21:27:20 -05:00
Brandon Bayer
7eb7943b55 v0.25.0-canary.3 2020-11-09 21:09:13 -05:00
Brandon Bayer
bf009c2e3e Fix CLI cannot find module get-latest-version error (#1442)
(patch)
2020-11-09 21:04:17 -05:00
allcontributors[bot]
94ff1da4de docs: add akirabaruah as a contributor (#1441)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-11-09 20:25:06 -05:00
Akira Baruah
a6f4ca0068 Improve error message about git and git config (#1432)
(patch)
2020-11-09 20:24:47 -05:00
dependabot[bot]
533e0cbaae Bump next from 9.5.1 to 10.0.1 in /examples/plain-js (#1431)
Bumps [next](https://github.com/vercel/next.js) from 9.5.1 to 10.0.1.
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/compare/v9.5.1...v10.0.1)

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (meta)
2020-11-07 17:30:28 -05:00
Brandon Bayer
25df2c0c29 Revert react query to 2.5.12 because of concurrent mode bugs (#1430)
(minor)
2020-11-07 16:59:49 -05:00
Brandon Bayer
c4d759304d Add @Talor-A as a contributor 2020-11-07 10:47:00 -05:00
allcontributors[bot]
a856304062 docs: add benediktms as a contributor (#1429)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-11-07 10:43:11 -05:00
Benedikt Schnatterbeck
be7d0ee723 Cypress test fix (#1369)
Co-authored-by: Brandon Bayer <b@bayer.ws> (meta)
2020-11-07 10:42:57 -05:00
Brandon Bayer
91aebf44bc Fix: disable useQuery on first render, when router params don't exist yet AND fix TS type for useRouter() (#1422)
(patch)
2020-11-07 10:38:04 -05:00
Hiroki Isogai
6d45d52f7a Fix cannot read property '_clientVersion' of undefined (#1419)
(patch)
2020-11-05 20:14:08 -05:00
allcontributors[bot]
c451a5d55e docs: add wobsoriano as a contributor (#1420)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-11-05 08:56:54 -05:00
Robert Soriano
646e8ae0f6 Remove React imports from page templates (#1418)
(patch)
2020-11-05 08:56:34 -05:00
Brandon Bayer
28ded0c1b1 v0.25.0-canary.2 2020-11-04 21:58:07 -05:00
Brandon Bayer
8c9de5a1de Fix useInfiniteQuery bug on canary where page params are empty (#1416)
(patch)
2020-11-04 21:50:22 -05:00
Brandon Bayer
a3c468b779 Switch to superjson for error serialization (enables using instanceof) (#1414)
(patch)
2020-11-04 21:04:14 -05:00
Brandon Bayer
6907e92d14 Add @leggsimon as a contributor 2020-11-04 20:49:09 -05:00
Brandon Bayer
418173849b Add @ericsakmar as a contributor 2020-11-04 20:44:08 -05:00
Abu Uzayr
087230e800 Upon blitz new, prompt user for upgrade if blitz version is outdated (#1397)
Co-authored-by: Brandon Bayer <b@bayer.ws> (patch)
2020-11-04 20:01:26 -05:00
Brandon Bayer
1ccfc7e5ba Add @matamatanot as a contributor 2020-11-04 19:15:00 -05:00
allcontributors[bot]
cdbe9e3cef docs: add isoppp as a contributor (#1412)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-11-04 18:56:53 -05:00
Hiroki Isogai
a254b70139 Remove as prop from blitz generate page templates (#1411)
(patch)
2020-11-04 18:56:39 -05:00
depfu[bot]
c3c0e55597 Upgrade next: 10.0.0 → 10.0.1 (#1409)
Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com> (minor)
2020-11-04 18:54:55 -05:00
depfu[bot]
26f8e97b25 Upgrade @prisma/sdk: 2.6.0 → 2.10.0 (#1393)
Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com> (meta)
2020-11-03 09:16:26 -05:00
depfu[bot]
353e4efea6 Upgrade @prisma/cli: 2.4.1 → 2.10.0 (minor) (#1394)
Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com> (example)
2020-10-30 18:37:15 -04:00
depfu[bot]
ae934bc6b7 Upgrade @prisma/client: 2.8.0 → 2.10.0 (minor) (#1395)
Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com> (example)
2020-10-28 22:01:55 -04:00
Brandon Bayer
8ebb383764 commit yarn.lock 2020-10-27 22:19:00 -04:00
Brandon Bayer
8f7b064cee v0.25.0-canary.1 2020-10-27 22:18:13 -04:00
Brandon Bayer
73fa209e9f Fix useInfiniteQuery broken cache (#1391)
(patch)
2020-10-27 22:16:21 -04:00
sirmyron
3372307112 Add sirmyron l1 maintainer (#1389)
Co-authored-by: Myron Davis <myron@dizari.com> (meta)
2020-10-27 21:02:31 -04:00
depfu[bot]
c1e771d8a7 Upgrade next: 9.5.5 → 10.0.0 (major) (#1385)
Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com>
2020-10-27 20:55:46 -04:00
Brandon Bayer
0dc2891387 Remove tailwind example app (#1384)
(example)
2020-10-27 20:54:47 -04:00
allcontributors[bot]
819929e2f6 docs: add mweibel as a contributor (#1382)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-10-25 16:16:31 -04:00
Michael Weibel
e76f23dc3d (newapp) Move typescript to production dependencies (so blitz db seed works on prod deploy) (#1377) 2020-10-25 16:16:11 -04:00
allcontributors[bot]
33c6d8e5e1 docs: add maciekgrzybek as a contributor (#1381)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-10-25 15:57:49 -04:00
maciek_grzybek
f927aa05ee Fix inconsistencies with the CLI -h flag (#1257)
Co-authored-by: Brandon Bayer <b@bayer.ws> (patch)
2020-10-25 15:57:33 -04:00
Jirka Svoboda
2efbe7bd51 Added eslint import sorting (#1345)
(meta)
2020-10-25 15:32:32 -04:00
allcontributors[bot]
c0e88cb509 docs: add machadolucasvp as a contributor (#1380)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-10-25 15:31:43 -04:00
Lucas Machado
cb8c268a14 (newapp) Move tsc from pre-commit to pre-push hook (#1362) 2020-10-25 15:31:28 -04:00
Brandon Bayer
6df771c86e Update @nksaraf as a contributor 2020-10-25 15:29:15 -04:00
Brandon Bayer
dbef6f9389 Add @goleary as a contributor 2020-10-25 15:28:32 -04:00
Brandon Bayer
f4eaebb52a v0.25.0-canary.0 2020-10-21 09:11:26 -05:00
allcontributors[bot]
4df2dfd5fc docs: add nemesv as a contributor (#1373)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-10-21 09:08:19 -05:00
Viktor Nemes
f20de5ad53 Fix blitz db seed not working (#1363)
(patch)
2020-10-21 09:08:04 -05:00
allcontributors[bot]
005edc089a docs: add sirmyron as a contributor (#1361)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-10-18 16:44:35 -05:00
sirmyron
ddab8d063d Added useMemo call for response from useRouter (#1352)
Co-authored-by: Myron Davis <myron@dizari.com> (patch)
2020-10-18 16:44:13 -05:00
Brandon Bayer
308744681b Fix your jest tests failing because of useQuery error message (#1357)
(patch)
2020-10-18 16:35:28 -05:00
allcontributors[bot]
291b988c05 docs: add markhaehnel as a contributor (#1360)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-10-18 16:33:31 -05:00
Mark Hähnel
7fdd97bb7d Fix blitz CLI not using proper exit codes (#1316)
Co-authored-by: Brandon Bayer <b@bayer.ws> (patch)
2020-10-18 16:33:16 -05:00
allcontributors[bot]
02af10133c docs: add dulcehc as a contributor (#1359)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-10-18 16:30:02 -05:00
Dulce Hernández
de01a52886 (newapp) Add incremental:true to tsconfig.json (#1350) 2020-10-18 16:29:39 -05:00
Brandon Bayer
cbcbeefd40 Add @zanedb as a contributor 2020-10-18 16:21:40 -05:00
allcontributors[bot]
7083da0297 docs: add nksaraf as a contributor (#1358)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-10-18 16:12:30 -05:00
Nikhil Saraf
83b08f00eb Fix db.connect error when using without prisma (#1342)
(patch)
2020-10-18 16:12:17 -05:00
Rafael Nunes
3e7bf85750 Adds test to assert useMutation validation (#1351)
(meta)
2020-10-18 15:32:48 -05:00
Brandon Bayer
e9d626d495 (newapp) Fix tests not found if app has blitz in the name (#1355) 2020-10-18 15:30:26 -05:00
André Ericson
bc9983a31e Add setQueryData to react-query-utils AND rename mutate to setQueryData (#1291)
(major)
2020-10-18 10:35:41 -05:00
depfu[bot]
c798d39c4b Fix error stack trace regression by upgrading tslog: 2.9.0 → 2.9.1 (patch) (#1348)
Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com> (patch)
2020-10-17 18:50:06 -05:00
depfu[bot]
0394ced3ff Upgrade superjson: 1.2.3 → 1.3.0 (#1347)
Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com> (patch)
2020-10-17 17:24:13 -05:00
Brandon Bayer
fc40c9dc23 v0.24.3 2020-10-16 12:07:55 -04:00
Jose Felix
728ef2d2a6 Add loading progress indicator to blitz console (#1336)
(patch)
2020-10-16 12:05:28 -04:00
Victor Nahuel Chaves
bc725db4ec Fix can't install any recipe (#1339)
(patch)
2020-10-16 11:51:30 -04:00
allcontributors[bot]
6cd3bb32a7 docs: add sewerynkalemba as a contributor (#1332)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-10-14 19:06:06 -04:00
Seweryn Kalemba
14faf68a0b Export missing AuthenticatedSessionContext type (#1330)
(patch)
2020-10-14 19:05:48 -04:00
allcontributors[bot]
e7bdafc2c5 docs: add ntgussoni as a contributor (#1328)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-10-14 17:24:32 -04:00
Nicolas Torres
241a62e465 Fix .gitignore files not being ignored by blitz (#1150)
Co-authored-by: Brandon Bayer <b@bayer.ws>
Co-authored-by: Rudi Yardley <contact@rudiyardley.com> (patch)
2020-10-14 17:23:00 -04:00
Konrad Kalemba
5118be3ddd Add Recipe for Base Web - a UI framework from Uber (#1319)
(recipe)
2020-10-14 17:02:41 -04:00
allcontributors[bot]
eebe8bcdfb docs: add peter50216 as a contributor (#1327)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-10-14 17:01:12 -04:00
Peter Shih
e4983c6f2e (newapp) Fix tests not working out of box (#1323) 2020-10-14 17:00:14 -04:00
André Ericson
3d3bb20365 Remove incorrect deprecation warning when using useMutation (#1320)
(patch)
2020-10-14 16:31:26 -04:00
Konrad Kalemba
77f9e60a9c Fix recipes to add their providers at the root of App's return function (#1324)
(recipe)
2020-10-14 16:29:08 -04:00
Brandon Bayer
66111f74bf v0.24.2 2020-10-13 21:10:24 -04:00
allcontributors[bot]
c2bb7728b2 docs: add nahue as a contributor (#1321)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-10-13 19:30:46 -04:00
Victor Nahuel Chaves
d5c2fa15e0 Update Ink dependencies (#1171)
Co-authored-by: Brandon Bayer <b@bayer.ws> (meta)
2020-10-13 19:28:26 -04:00
allcontributors[bot]
f93208e75f docs: add wanjuntham as a contributor (#1317)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-10-13 09:42:27 -04:00
wanjuntham
660c7fbb5e Update Next.js from 9.5.3 to 9.5.5 (#1289)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
Co-authored-by: Brandon Bayer <b@bayer.ws> (patch)
Co-authored-by: Cody G <37571416+clgeoio@users.noreply.github.com>
Co-authored-by: engelkes-finstreet <36962022+engelkes-finstreet@users.noreply.github.com>
Co-authored-by: André Ericson <de.ericson@gmail.com>
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
Co-authored-by: Konrad Kalemba <konrad_kal@hotmail.com>
Co-authored-by: Domantas Mauruča <domantas.mauruca@gmail.com>
Co-authored-by: Carlos Fernández <c.fernandez@rpalatam.com.pe>
Co-authored-by: Brandon Bayer <b@bayer.ws>
Co-authored-by: Stratulat Alexandru <alexanderstratulat97@gmail.com>
Co-authored-by: Bruno Crosier <bruno.crosier@gmail.com>

(patch)
2020-10-13 09:39:31 -04:00
allcontributors[bot]
bcb88c72ea docs: add jamiedavenport as a contributor (#1314)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-10-12 21:00:43 -04:00
allcontributors[bot]
b81a3dd314 docs: add engelkes-finstreet as a contributor (#1313)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-10-12 20:59:53 -04:00
allcontributors[bot]
51bdaa118a docs: add sandulat as a contributor (#1312)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-10-12 20:58:59 -04:00
Satoshi Nitawaki
59cf61a26a Remove Ivan from L1 maintainers & Add Patrick Engelkes as Level1 maintainer (#1310)
(meta)
2020-10-12 20:31:05 -04:00
allcontributors[bot]
876eb8327f docs: add nitaking as a contributor (#1311)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-10-12 20:30:01 -04:00
allcontributors[bot]
018e462ce8 docs: add davidlutta as a contributor (#1307)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-10-12 18:23:47 -04:00
David Ezekiel Lutta
74cde8a871 Add getConfig export from core for next/config (#1304)
(minor)
2020-10-12 18:22:41 -04:00
Jamie Davenport
bc9f0e9d85 Add Jamie Davenport as a L1 maintainer (#1301)
(meta)
2020-10-12 17:46:46 -04:00
allcontributors[bot]
683c251693 docs: add alexnaiman as a contributor (#1299)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-10-11 15:11:34 -04:00
Alexandru Naiman
1d02efb21d Fix circular dependencies in blitz core (#1249)
Co-authored-by: Brandon Bayer <b@bayer.ws> (meta)
2020-10-11 15:08:37 -04:00
allcontributors[bot]
f35da93d6d docs: add aaronfulkerson as a contributor (#1295)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-10-10 18:50:33 -04:00
Bruno Crosier
cd2e29b286 Remove "--experimental" from "blitz db studio" (#1272)
Co-authored-by: Brandon Bayer <b@bayer.ws> (patch)
2020-10-10 17:12:20 -04:00
Stratulat Alexandru
82e4f7fd95 Remove Simon Debbarma and Jack Clancy from L1 maintainers. (#1290)
(meta)
2020-10-10 17:06:00 -04:00
Brandon Bayer
99e64fa2e0 Update @aericson as a contributor 2020-10-10 16:45:55 -04:00
Brandon Bayer
9b0dd2ccaa Add @Kosai106 as a contributor 2020-10-10 16:45:46 -04:00
allcontributors[bot]
0235395e54 docs: add cajotafer as a contributor (#1293)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-10-10 16:38:01 -04:00
Carlos Fernández
67ba766a87 (newapp) Add yarn/npx to global install instructions in readme (#1285) 2020-10-10 16:36:54 -04:00
Domantas Mauruča
85216555fc Fix to allow babel config modification in Recipes (#1280)
(patch)
2020-10-10 16:13:50 -04:00
Konrad Kalemba
25ebbc919b Fix all recipes to add their context providers above getLayout() (#1279)
(recipes)
2020-10-10 16:11:05 -04:00
allcontributors[bot]
312dc3a1a9 docs: add aericson as a contributor (#1292)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-10-10 16:09:17 -04:00
André Ericson
f31d2a9770 (newapp) Fix validateDOMNesting error from default home page (#1277) 2020-10-10 16:08:28 -04:00
engelkes-finstreet
0199605d07 Fix blitz generate model to add fields to existing model instead of duplicating (#1251)
(patch)
2020-10-10 16:01:44 -04:00
Cody G
092775a3f2 Fix to not run husky during new app creation (#1270)
(patch)
2020-10-10 15:44:45 -04:00
Cody G
aea6c88b1e Adds tests for useSession in core super tokens (#1258)
(meta)
2020-10-10 15:43:16 -04:00
Stratulat Alexandru
846194a5b1 Add Alexandru Stratulat as L1 Maintainer (#1271)
(meta)
2020-10-07 10:06:19 -04:00
Brandon Bayer
814ed2d59a v0.24.1 2020-10-06 20:33:25 -04:00
Brandon Bayer
41106588ff Fix page template to use useMutation (#1269)
(patch)
2020-10-06 20:32:04 -04:00
Brandon Bayer
6f50d77756 update patch for release script
(meta)
2020-10-06 19:28:52 -04:00
Brandon Bayer
99bf898cdc v0.24.0 2020-10-06 19:24:50 -04:00
Brandon Bayer
4ef7d81018 Few improvements to log colors (#1267)
(patch)
2020-10-06 19:19:56 -04:00
Brandon Bayer
37ce99a37a Fix global CLI on canary by dynamically require server package (#1265)
(patch)
2020-10-06 19:00:10 -04:00
Simon Knott
2f3be902e4 Promote Simon to L2 Maintainership (#1264)
(meta)
2020-10-06 13:55:24 -04:00
Brandon Bayer
968f1d0cb9 v0.24.0-canary.4 2020-10-06 12:11:31 -04:00
Brandon Bayer
0b103bccca Revert "Prefix session cookies with app name (#1229)"
This reverts commit 3d827c8506.
2020-10-06 12:07:42 -04:00
Brandon Bayer
406b643f94 Add @sandulat as a contributor 2020-10-06 12:01:40 -04:00
Brandon Bayer
33c7bec41f v0.24.0-canary.3 2020-10-06 11:23:48 -04:00
Stratulat Alexandru
3d827c8506 Prefix session cookies with app name (#1229)
(minor)
2020-10-06 11:21:46 -04:00
allcontributors[bot]
b04c6d7469 docs: add Dohxis as a contributor (#1261)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-10-06 11:18:54 -04:00
Domantas Mauruča
242e2eadee Add tests for add-dependency-executor (#1259)
(meta)
2020-10-06 11:17:02 -04:00
Brandon Bayer
08303d337b Add back RouterContext and BlitzRouter which got lost in last canary release (#1260)
(patch)
2020-10-06 11:13:46 -04:00
Brandon Bayer
be861c7919 v0.24.0-canary.2 2020-10-05 19:13:19 -04:00
allcontributors[bot]
092045e807 docs: add Alucard17 as a contributor (#1256)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-10-05 18:59:41 -04:00
Alucard17
1e0f17c93a Changed @blitzjs/core to only export public API (#1246)
Co-authored-by: Brandon Bayer <b@bayer.ws> (meta)
2020-10-05 18:58:57 -04:00
Jamie Davenport
310079b3bc Fix Safari compatibility: shim requestIdleCallback (#1247)
(patch)
2020-10-05 18:46:06 -04:00
Brandon Bayer
a81252aeb4 Fix regression on canary of loss of Prisma error code (#1254)
(patch)
2020-10-05 18:15:02 -04:00
allcontributors[bot]
cc58c72d94 docs: add konradkalemba as a contributor (#1255)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-10-05 18:14:09 -04:00
Konrad Kalemba
2162e1c6b4 Fix DocumentContext import in Material UI recipe (#1253)
(recipe)
2020-10-05 18:13:12 -04:00
अभिनाश (Avinash)
d46d860338 (newapp) Fix docs link on default homepage (#1250) 2020-10-05 18:10:55 -04:00
Satoshi Nitawaki
c65360de09 Fix name of blitz db seed command (was blitz seed) (#1239)
(patch)
2020-10-05 17:57:08 -04:00
Kotaro Chikuba
9873fc22de Fix isBlitzRoot() for blank deps/devDeps (#1242)
(patch)
2020-10-05 17:55:31 -04:00
allcontributors[bot]
e6954fbca8 docs: add mizchi as a contributor (#1252)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-10-05 10:03:03 -04:00
Kotaro Chikuba
048ba5f5cb Fix middleware test for win and mac (#1245)
(meta)
2020-10-05 10:01:14 -04:00
Brandon Bayer
bd1063a965 Upgrade prisma version in examples apps (#1238)
(meta)
2020-10-03 12:34:11 -04:00
Brandon Bayer
ae6b22f4f0 v0.24.0-canary.1 2020-10-02 21:57:55 -04:00
Brandon Bayer
f45d2d5ee3 Change log color of query/mutation input args to yellow (#1237)
(minor)
2020-10-02 21:56:02 -04:00
Brandon Bayer
7bc8a249b4 Make ctx.session.authorize() a type guard (#1222)
(minor)
2020-10-02 20:55:51 -04:00
Brandon Bayer
742ff71a97 Add ability to strongly type PublicData! (#1219)
Co-authored-by: Piotr Monwid-Olechnowicz <hasparus@gmail.com> (major)
2020-10-02 20:35:39 -04:00
Brandon Bayer
9291ae3b38 Upgrade monorepo typescript from 3.8 to 4.0 (#1236)
(meta)
2020-10-02 19:22:48 -04:00
allcontributors[bot]
5a5656078b docs: add hasparus as a contributor (#1235)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>(meta)
2020-10-02 18:35:05 -04:00
Brandon Bayer
ea815e83fa Upgrade superjson to 1.2.3 (#1230)
(patch)
2020-10-02 17:19:59 -04:00
Weilbyte
869c00c950 Fix blitz new --js #1208 (#1211)
(patch)
2020-10-02 16:58:24 -04:00
Brandon Bayer
a670693e9d v0.24.0-canary.0 2020-10-02 16:29:22 -04:00
allcontributors[bot]
5de91ad57b docs: add phillippschmedt as a contributor (#1228)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-10-02 16:21:56 -04:00
Phillipp Schmedt
31899458de Enforce NodeJS Version >= 12 for CLI (#1213)
(patch)
2020-10-02 16:21:40 -04:00
Jamie Davenport
dce462ba53 Improve error message when attempting useQuery with regular functions (#1223)
(patch)
2020-10-02 16:20:15 -04:00
Brandon Bayer
5ebed4b05d Update @engelkes-finstreet as a contributor 2020-10-02 16:17:48 -04:00
Brandon Bayer
13353793af Update @engelkes-finstreet as a contributor 2020-10-02 16:17:27 -04:00
Cody G
3583a59aa8 Refactor and add tests for public data store (#1204)
(meta)
2020-10-02 16:14:35 -04:00
Brandon Bayer
1c5aee7c67 Add invalidateQuery utility (#1226)
(minor)
2020-10-02 16:09:34 -04:00
Justin Hall
c87883dbe8 Fix logout mutation usage in generated app index page (#1201)
(newapp)
2020-10-02 16:09:22 -04:00
allcontributors[bot]
7d84561690 docs: add hmajid2301 as a contributor (#1227)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-10-02 16:08:41 -04:00
Haseeb Majid
3f43ffd4fe Don't run prettier is blitz new fails (#1202)
Co-authored-by: Haseeb Majid <haseeb.majid@sky.uk> (patch)
2020-10-02 16:08:26 -04:00
Bruno Crosier
1ac2092129 Change all generated file paths to be kebab-case (#1197)
(minor)
2020-10-02 16:06:57 -04:00
Brandon Bayer
579807ff20 Add getQueryKey utility (#1224)
* done

* fix the bug

* fix infinite query key to be url first like everything else (minor)
2020-10-02 15:50:22 -04:00
Brandon Bayer
566e8be3c3 Fix query cache not being invalidated on route navigation (#1225)
(patch)
2020-10-02 15:10:20 -04:00
Brandon Bayer
1b9eb77964 Rename ssrQuery to invokeWithMiddleware (#1218)
(major)
2020-10-02 12:23:32 -04:00
Brandon Bayer
9f24ba10b2 Add invoke() — the new way to imperatively call queries/mutations (#1217)
(minor)
2020-10-02 11:41:23 -04:00
Brandon Bayer
f5237c31c4 Lots of logging & error improvements!! Remove result logs, redact passwords, etc (#1212)
(minor)
2020-10-02 11:12:32 -04:00
Brandon Bayer
3ddb3870b9 Fix session race condition that would result in CSRF errors or users being logged out (#1209)
(patch)
2020-10-01 21:03:06 -04:00
Brandon Bayer
763252a5ed Fix husky pre-push script for new apps (#1207)
(patch)
2020-10-01 14:29:49 -04:00
Brandon Bayer
6a37f32322 Update @brunocrosier as a contributor 2020-10-01 14:27:35 -04:00
John Cantrell
48e27be1a7 Fix bug with creating new session after revoking current one (#1200)
(patch)
2020-09-30 18:20:11 -04:00
Brandon Bayer
90df4e8409 v0.23.2-canary.3 2020-09-30 11:50:04 -04:00
Brandon Bayer
3b46d96ec8 Minor updates to pages/queries/mutations templates (add useMutation and use db.findFirst) (#1195)
(minor)
2020-09-30 11:47:58 -04:00
Brandon Bayer
13c5a9b802 Fix a resolver type build error (on canary) (#1194)
(patch)
2020-09-30 11:40:34 -04:00
allcontributors[bot]
e6ddebadf5 docs: add ntgussoni as a contributor (#1189)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-09-29 22:13:48 -04:00
allcontributors[bot]
1bb4cf33ff docs: add clgeoio as a contributor (#1190)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-09-29 22:12:56 -04:00
Cody G
36dfbe42f5 Adds tests for core parsePublicDataToken (#1184)
(meta)
2020-09-29 22:09:07 -04:00
Satoshi Nitawaki
6c06f0b62c (newapp) Fix tests not working out of the box (#1165) 2020-09-29 21:49:16 -04:00
Stratulat Alexandru
a83536be21 Reduce re-renders by memoizing useParams and useRouterQuery (#1157)
(patch)
2020-09-29 09:07:51 -04:00
Brandon Bayer
07f9e26827 v0.23.2-canary.2 2020-09-28 18:58:29 -04:00
Brandon Bayer
c5e6221ebb Fix types for useQuery that were broken with useMutation addition (#1181)
(patch)
2020-09-28 18:48:12 -04:00
Brandon Bayer
2b0fe98cf5 v0.23.2-canary.1 2020-09-28 17:32:23 -04:00
allcontributors[bot]
58386ffe2c docs: add lukebennett as a contributor (#1180)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-09-28 17:25:16 -04:00
Luke Bennett
23fc27027a Use npm for husky pre-push hook instead of yarn (#1179)
(newapp)
2020-09-28 17:24:28 -04:00
Brandon Bayer
e4c00094e5 Disable automatic query request cancellation (#1177)
(patch)
2020-09-28 17:14:53 -04:00
Brandon Bayer
a357fd0445 Fix useQuery's mutate and router.push in same frame will cause error (#1176)
* fix mutate

* fix test

* add comment (patch)
2020-09-28 16:54:27 -04:00
Brandon Bayer
c43967984b Add @Kamshak as a contributor 2020-09-28 11:28:52 -04:00
Rudi Yardley
e47d947dc0 Fix bug in dev where files were not being removed correctly when deleted (#1161)
(patch)
2020-09-28 11:06:05 -04:00
Satoshi Nitawaki
ffb54ec064 Add .node-version (#1148)
(meta)
2020-09-28 11:04:46 -04:00
Brandon Bayer
08abc33494 v0.23.2-canary.0 2020-09-26 22:21:14 -04:00
Brandon Bayer
34722f952c 🔥 Add useMutation() and strong typing for ctx and ctx.session (#1160)
(major)
2020-09-26 22:12:29 -04:00
Brandon Bayer
4003b8ac01 Big refactor of internal types for react-query, RPC, and resolvers (#1172)
(meta)
2020-09-26 21:19:19 -04:00
allcontributors[bot]
160b5fc062 docs: add brunocrosier as a contributor (#1159)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-09-24 20:29:01 -04:00
Bruno Crosier
b722c39f79 (newapp) Add "restart server" to instruction to index page (#1140)
Co-authored-by: Brandon Bayer <b@bayer.ws>
2020-09-24 20:28:14 -04:00
allcontributors[bot]
8da7bd7cd4 docs: add jorisre as a contributor (#1158)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
Co-authored-by: Brandon Bayer <b@bayer.ws> (meta)
2020-09-24 20:26:00 -04:00
Joris
712cb172eb Fix: pass undefined through the RPC layer (#1156) 2020-09-24 20:24:57 -04:00
Brandon Bayer
d623d8cc33 v0.23.1-canary.0 2020-09-23 22:26:52 -04:00
Brandon Bayer
5ca38ca6d8 Fix ES5 compatibility: upgrade superjson to 1.2.2 (#1147)
(patch)
2020-09-23 22:22:08 -04:00
Brandon Bayer
db0128c971 Upgrade react-query to 2.23.0 (#945)
(patch)
2020-09-23 22:14:29 -04:00
Mohamed Shaban
856aa53843 Fix blitz console not closing on first Ctrl+D (#1142)
Co-authored-by: Fran Zekan <zekan.fran369@gmail.com>
Co-authored-by: Brandon Bayer <b@bayer.ws> (patch)
2020-09-23 21:57:13 -04:00
Fran Zekan
f9c3f82b27 Add blitz db seed for seeding data in your database (#678)
Co-authored-by: Brandon Bayer <b@bayer.ws> (minor)
2020-09-23 21:42:32 -04:00
allcontributors[bot]
97d5f396de docs: add drmas as a contributor (#1146)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-09-23 21:38:33 -04:00
Rudi Yardley
760fba77ab Speed up blitz start by 40% by adding incremental dev cache (#1137)
(patch)
2020-09-23 21:35:18 -04:00
Brandon Bayer
f83ce0bd72 Redirect MAINTAINERS.md to the new page in the docs 2020-09-23 21:07:15 -04:00
Brandon Bayer
7425952616 (newapp) Improve Form typing: remove need to pass schema type (#1144) 2020-09-23 19:55:27 -04:00
Brandon Bayer
7fac0134b3 Add @kitze as a contributor 2020-09-23 10:24:38 -04:00
Brandon Bayer
df46939fe3 back out no-for-of eslint rule
(meta)
2020-09-22 19:45:11 -04:00
Brandon Bayer
9e88b11496 v0.23.0 2020-09-22 19:28:46 -04:00
Ricardo Trejos
c427ae23d4 Add a timeout to the "retrieving freshest dependencies" step for blitz new(#1132)
(patch)
2020-09-21 20:58:32 -04:00
Enrico Schaaf
cb849c5ba9 Fix blitz autocomplete adding alpha warning message to the shell config (#1122)
(patch)
2020-09-21 19:35:34 -04:00
अभिनाश (Avinash)
6e777dd72a add lint rule to prevent Object.fromEntries in core package (#1129)
(meta)
2020-09-21 19:34:16 -04:00
Brandon Bayer
80ab4876f2 Improve error message for missing SESSION_SECRET_KEY (#1136)
(patch)
2020-09-21 16:00:59 -04:00
Brandon Bayer
cd0bf1f970 (newapp) Change signup & login to lowerCase emails before saving and verifying (#1135) 2020-09-21 14:56:38 -04:00
allcontributors[bot]
5f5a5c8ef7 docs: add enricoschaaf as a contributor (#1128)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-09-19 22:27:51 -04:00
Enrico Schaaf
9a1e0d0de7 Update Taiwind recipe to opt in to future Tailwind CSS changes (#1118)
(recipe)
2020-09-19 22:27:34 -04:00
Brandon Bayer
fb44203510 v0.22.3-canary.0 2020-09-19 22:01:38 -04:00
Brandon Bayer
010057b34c Fix ES5 compatibility (#1124)
(patch)
2020-09-19 21:10:50 -04:00
Brandon Bayer
575e862ae3 Remove prisma client generation from blitz in favor of new package.json schema config (Requires Prisma 2.7.0+ & new field in pkg.json)) (#1121)
(major)
2020-09-19 19:30:03 -04:00
Satoshi Nitawaki
aed6b8875a Fix slack channel name in MAINTAINERS.md (#1117)
(meta)
2020-09-19 10:59:40 -04:00
Satoshi Nitawaki
10b6f859fd Fix blitz new spewing out all the database migration logs (#1116)
(patch)
2020-09-19 10:54:26 -04:00
Brandon Bayer
9ac856c0ee Update @cardotrejos as a contributor 2020-09-19 10:50:09 -04:00
अभिनाश (Avinash)
1ff7f36482 Enable automatic network request cancelation for queries/mutations (#1092)
Co-authored-by: Brandon Bayer <b@bayer.ws> (minor)
2020-09-19 10:47:58 -04:00
Brandon Bayer
df150da37e Fix cli cache file to be in temp directory instead of project directory (#1087)
(patch)
2020-09-19 10:45:37 -04:00
Bhanu Teja Pachipulusu
eb7409c0b3 Add --force flag for blitz db reset command (#1107)
(minor)
2020-09-19 10:44:22 -04:00
Brandon Bayer
1411a1d366 🎉 Add Satoshi Nitawaki as L1 Maintainer (#1119)
(meta)
2020-09-19 10:35:59 -04:00
allcontributors[bot]
ec95cb40de docs: add hardfire as a contributor (#1113)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-09-18 18:15:07 -04:00
Brandon Bayer
b502d7ea1e Add dotenv-flow to jest config for new apps (#1112)
(newapp)
2020-09-18 18:08:03 -04:00
allcontributors[bot]
74bf2a9e4c docs: add doeixd as a contributor (#1109)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-09-18 15:36:03 -04:00
Brandon Bayer
1ee637c367 Revert "add dotenv-flow to jest setup file for new apps"
This reverts commit 23a33f1c3d.
2020-09-18 15:15:41 -04:00
Brandon Bayer
c08771b57e Revert "move it to jest config"
This reverts commit 8a468e4f79.
2020-09-18 15:15:01 -04:00
Brandon Bayer
8a468e4f79 move it to jest config 2020-09-18 15:14:31 -04:00
Brandon Bayer
23a33f1c3d add dotenv-flow to jest setup file for new apps 2020-09-18 15:12:37 -04:00
Brandon Bayer
b3767861a2 Fix inability to have a /test page (#1111)
(patch)
2020-09-18 13:46:56 -04:00
Patrick G
65acfff0ff Add test, tests, spec, specs to build hash ignore list (#1102)
Co-authored-by: Brandon Bayer <b@bayer.ws> (patch)
2020-09-18 11:23:45 -04:00
Brandon Bayer
ab3fc26409 Add @sergiodxa as a contributor 2020-09-18 11:11:05 -04:00
Brandon Bayer
7b7039e0e3 bump CI cache key
(ignore)
2020-09-18 11:05:04 -04:00
engelkes-finstreet
e93f24452c Fix blitz generate pages to use kebab-case for all url paths (#1089)
(patch)
2020-09-18 10:21:00 -04:00
Brandon Bayer
63c9375331 add "recipe" and "newapp" type to release patch
(meta)
2020-09-18 10:01:57 -04:00
Brandon Bayer
adfb486004 Tweaks to new app template pkg scripts: add tsc to pre-commit and lint to pre-push (#1104)
(minor)
2020-09-18 09:58:04 -04:00
Brandon Bayer
5828736369 Improve Recipe for Render.com (#1108)
(recipe)
2020-09-18 09:53:25 -04:00
Brandon Bayer
40a93ee62d Add @tsriram as a contributor 2020-09-18 09:52:42 -04:00
Brandon Bayer
8fa82c7661 Revert "Tweaks to new app template pkg scripts: add tsc to pre-commit and lint to pre-push"
This reverts commit 141003df89.
2020-09-17 16:46:01 -04:00
Brandon Bayer
141003df89 Tweaks to new app template pkg scripts: add tsc to pre-commit and lint to pre-push 2020-09-17 16:44:10 -04:00
Brandon Bayer
6ef7b8a2de Improve rendering of errors in generated Final Form <LabeledTextField> (#1095)
(patch)
2020-09-16 17:09:06 -04:00
allcontributors[bot]
6ade33b849 docs: add taylorcjohnson as a contributor (#1093)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-09-16 09:23:56 -04:00
Taylor Johnson
02d3aa8259 Change the new app schema provider to be just sqlite instead of an array (#1091)
(patch)
2020-09-16 09:23:11 -04:00
Brandon Bayer
1ae2bb3ee3 v0.22.2-canary.0 2020-09-14 22:07:30 -04:00
Brandon Bayer
d84c73d2bb Add @ditorojuan as a contributor 2020-09-14 22:00:56 -04:00
Brandon Bayer
89b55971f1 Add @johnletey as a contributor 2020-09-14 22:00:37 -04:00
Brandon Bayer
fd1856bc7b Add @cktang88 as a contributor 2020-09-14 21:59:28 -04:00
Brandon Bayer
e6dbbababb Add @johncantrell97 as a contributor 2020-09-14 21:59:19 -04:00
Brandon Bayer
3e2b5ddc8e Add @JoseRFelix as a contributor 2020-09-14 21:59:03 -04:00
Brandon Bayer
1b974a0371 Add @obii-bit as a contributor 2020-09-14 21:58:20 -04:00
engelkes-finstreet
8bf9667a15 Fix blitz generate query does not preserve plurality (#1083)
(patch)
2020-09-14 21:50:03 -04:00
yuta0801
94bd4c166c Fix an incorrect error message in blitz start (#1064) 2020-09-14 20:26:55 -04:00
allcontributors[bot]
4ad9f9bdc9 docs: add yuta0801 as a contributor (#1086)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-09-14 20:25:47 -04:00
yuta0801
13e1526ef5 Add --inspect flag to enable Node.js inspector (#1063)
(minor)
2020-09-14 20:25:36 -04:00
Brandon Bayer
ab3021a371 Significantly improve CLI performance: reduce execute time from 1700ms -> 900ms (#1057)
(patch)
2020-09-14 20:15:50 -04:00
allcontributors[bot]
3e506c1dce docs: add xiaoyu-tamu as a contributor (#1085)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (patch)
2020-09-14 20:13:27 -04:00
Michael Li
85356ca8e8 Fix type error for useQuery/usePaginatedQuery options object (#1059)
(patch)
2020-09-14 20:13:00 -04:00
Brandon Bayer
530ce851e4 Add React Bricks as Seedling Sponsor!
(meta)
2020-09-14 12:13:07 -04:00
Brandon Bayer
d953ef795a v0.22.1 2020-09-12 14:03:09 -04:00
Brandon Bayer
7fcb0945a2 Fix bug in default _app.tsx where Links inside ErrorBoundary don't work (#1054)
(patch)
2020-09-12 13:54:49 -04:00
Brandon Bayer
ab4670c21b v0.22.0 2020-09-11 17:48:30 -04:00
Brandon Bayer
1ae7bf77b2 Tiny tweak to Layout component in new apps (#1051)
(minor)
2020-09-11 17:46:35 -04:00
Brandon Bayer
63e3fe1ccb Add link to signup page to login form for new apps (#1050)
(minor)
2020-09-11 17:03:14 -04:00
Jirka Svoboda
280a2b5c4f refactor(server): Added isTypescript explicit flag, config refactored (#1014)
Co-authored-by: Rudi Yardley <contact@rudiyardley.com> (meta)
2020-09-11 11:16:45 -04:00
Brandon Bayer
bf2734d907 v0.21.2-canary.2 2020-09-11 11:10:32 -04:00
Sigurd Moland Wahl
07341c14d3 Fix bug where test files would cause blitz build to fail (#1045)
(patch)
2020-09-11 11:07:46 -04:00
allcontributors[bot]
e150b67cf4 docs: add PixelsCommander as a contributor (#1048)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-09-11 11:04:47 -04:00
Denis Radin
1a1722168c Add secureProxy option the the Passport.js adapter (#1033)
(minor)
2020-09-11 11:04:33 -04:00
dependabot[bot]
7f266b0c98 Bump node-fetch from 2.6.0 to 2.6.1 in /packages/generator (#1042)
Bumps [node-fetch](https://github.com/bitinn/node-fetch) from 2.6.0 to 2.6.1.
- [Release notes](https://github.com/bitinn/node-fetch/releases)
- [Changelog](https://github.com/node-fetch/node-fetch/blob/master/docs/CHANGELOG.md)
- [Commits](https://github.com/bitinn/node-fetch/compare/v2.6.0...v2.6.1)

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (meta)
2020-09-11 09:35:50 -04:00
engelkes-finstreet
6e92a2dfde Update dependencies in new app template (#1036)
(patch)
2020-09-10 22:17:43 -04:00
Ante Primorac
66cd1ec650 Fix: export AppProps as a generic type (#1034)
(patch)
2020-09-10 22:16:51 -04:00
allcontributors[bot]
7c4916324e docs: add engelkes-finstreet as a contributor (#1041)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-09-10 22:12:32 -04:00
engelkes-finstreet
d747e34853 Add ability to set custom authenticateOptions for the Passport.js adapter (#1024)
(minor)
2020-09-10 22:10:37 -04:00
Brandon Bayer
3afab440c8 Add @sirmyron as a contributor 2020-09-10 22:05:04 -04:00
allcontributors[bot]
e576e6332c docs: add nitaking as a contributor (#1040)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-09-10 22:03:49 -04:00
Satoshi Nitawaki
60d0c9d0bf Enable passing extra prisma args to blitz db migrate(#1012)
(minor)
2020-09-10 22:03:34 -04:00
Brandon Bayer
8f800d388b Fix UnhandledPromiseRejectionWarning from useQuery during static pre-rendering (#1038)
(patch)
2020-09-10 09:59:38 -04:00
Brandon Bayer
0fb3163ed5 Revert "Fix UnhandledPromiseRejectionWarning from useQuery during blitz build"
This reverts commit a64cf7d62a.
2020-09-10 09:39:01 -04:00
Brandon Bayer
a64cf7d62a Fix UnhandledPromiseRejectionWarning from useQuery during blitz build 2020-09-10 09:37:56 -04:00
Brandon Bayer
ac78d9a6e1 Fix ctx.session.authorize() throwing AuthorizationError instead of AuthenticationError if user logged out. (#1030)
(patch)
2020-09-09 15:13:53 -04:00
Brandon Bayer
46035af2b3 v0.21.2-canary.1 2020-09-09 12:30:14 -04:00
Ante Primorac
3ee531f221 Fix heroku rebuilding on start (#1029)
(patch)
2020-09-09 12:22:39 -04:00
Brandon Bayer
294be124f2 v0.21.2-canary.0 2020-09-09 10:05:41 -04:00
Ante Primorac
b1b8b5f15e Fix Heroku issue where blitz start --production always rebuilds even after running blitz build(#1023)
(patch)
2020-09-08 21:43:49 -04:00
Brandon Bayer
4f1d80f970 Add @madflow as a contributor 2020-09-08 21:35:17 -04:00
Alan Alickovic
622016f4b7 Fix react warnings from Formik in new apps (#1019)
(patch)
2020-09-08 21:16:09 -04:00
Brandon Bayer
ceb0262540 Minor improvements to default auth-utils.ts file (#1021)
(minor)
2020-09-08 14:40:20 -04:00
allcontributors[bot]
8e9f2d097e docs: add clgeoio as a contributor (#999)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-09-03 09:58:20 -04:00
Cody G
155dfaa4da Adds no-use-before-define lint rule (#998)
(meta)
2020-09-03 09:58:00 -04:00
Brandon Bayer
ec0273f09d v0.21.1 2020-09-02 13:23:20 -04:00
Lori Karikari
7a80f2be2f Upgrade Next.js from 9.5.2 to 9.5.3 (#991)
Co-authored-by: Brandon Bayer <b@bayer.ws> (patch)
2020-09-02 13:16:17 -04:00
Brandon Bayer
0821c019bd Fix some cache key issues with useQuery (#995)
(patch)
2020-09-02 12:06:21 -04:00
Brandon Bayer
f6cc8d152e Fix CI by removing browser setting for cypress (#996)
(meta)
2020-09-02 11:37:25 -04:00
Rafael Nunes
2921cb5a85 Moves auth and recipes to features section (#990) 2020-09-02 10:05:21 -04:00
Brandon Bayer
017c1ff813 v0.21.0 2020-09-01 16:22:14 -04:00
Brandon Bayer
eabe54c8ec Fix blitz db reset (#986)
(patch)
2020-09-01 16:20:28 -04:00
Brandon Bayer
ba14973ad3 Improve the useCurrentUser() hook in the new app template (#985)
(minor)
2020-09-01 15:36:00 -04:00
Brandon Bayer
e29786ba24 Fix Undefined function deleteCookie error after session expires (#982)
(patch)
2020-09-01 15:06:29 -04:00
Brady Pascoe
71e3e48f69 Fix husky git hooks not set up properly in new apps (#980)
Co-authored-by: Brandon Bayer <b@bayer.ws> (patch)
2020-09-01 11:09:18 -04:00
Brandon Bayer
c0ef559eae Revert default react version to 0.0.0-experimental-7f28234f8 because of error boundary bug (#981)
(minor)
2020-09-01 10:30:24 -04:00
Brandon Bayer
60a338b730 Upgrade environment variable support to match Next.js (use dotenv-flow) (#979)
(minor)
2020-08-31 21:55:13 -04:00
Weilbyte
b4039ff9af Improve git init for new apps so it can't get stuck #882 (#888)
Co-authored-by: Brandon Bayer <b@bayer.ws> (patch)
2020-08-31 17:36:01 -04:00
Dillon Raphael
f51a0de5dc Fix session.isAuthorized to not throw an error if user not logged in (#977)
(patch)
2020-08-31 17:22:51 -04:00
allcontributors[bot]
5a006fa89f docs: add dillonraphael as a contributor (#978)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-08-31 17:13:36 -04:00
Brandon Bayer
1ecaa5ea76 v0.20.0 2020-08-31 16:23:11 -04:00
allcontributors[bot]
5d0eb4e44e docs: add jschepmans as a contributor (#974)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-08-31 16:20:58 -04:00
Johan Schepmans
1756d57a39 Update "Whats included?" section in the Readme for new apps (#972)
Co-authored-by: Adam Markon <amarkon895@gmail.com>
Co-authored-by: Brandon Bayer <b@bayer.ws> (patch)
2020-08-31 16:20:43 -04:00
Brandon Bayer
2cf1b63895 Fix issues preventing usage with Typescript strict mode (#970)
(patch)
2020-08-31 16:15:13 -04:00
Brandon Bayer
b0c2a58a83 Add pagination to blitz generate by default (#964)
(minor)
2020-08-31 15:59:33 -04:00
Brandon Bayer
188b8d8ae8 Add @brunocrosier as a contributor 2020-08-31 09:22:59 -04:00
Brandon Bayer
fbd5f2815f Add @yhoiseth as a contributor 2020-08-31 09:22:38 -04:00
Steffan
898f39bf8e Change store example to use single query for both pagination and infinite loading (#881)
Co-authored-by: Brandon Bayer <b@bayer.ws> (example)
2020-08-30 18:18:39 -04:00
Brandon Bayer
91f5056b9d Fix bug when using same query for usePaginatedQuery and useInfiniteQuery (#963)
(patch)
2020-08-30 17:11:48 -04:00
Brandon Bayer
a00a529387 v0.19.0 2020-08-30 16:03:14 -04:00
Brandon Bayer
b5d564fab8 v0.18.1-canary.1 2020-08-30 15:42:39 -04:00
Brandon Bayer
be19dbccf8 add missing dependency
(ignore)
2020-08-30 15:38:58 -04:00
Brandon Bayer
b21df113a8 v0.18.1-canary.0 2020-08-30 15:32:11 -04:00
Brandon Bayer
4e0abb6ca6 Fix useInfiniteQuery() regression in 0.18.0 (#962)
* fix useInfiniteQuery

* tweak (patch)
2020-08-30 15:28:26 -04:00
Brandon Bayer
9cbec551f8 Upgrade tsdx and some other dependencies (#960)
* upgrade tsdx and some other dependencies

* add missing dep (meta)
2020-08-29 17:26:51 -04:00
Brandon Bayer
7531cf66f7 Upgrade default react version to 0.0.0-experimental-94c0244ba (#961)
(minor)
2020-08-29 17:11:07 -04:00
allcontributors[bot]
cf0d77e010 docs: add alan2207 as a contributor (#959)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-08-29 15:40:09 -04:00
Alan Alickovic
713f20d494 Add isLoading property to useSession() hook result (#936)
(minor)
2020-08-29 15:39:53 -04:00
Brandon Bayer
19293c1efb Add .blitz to modulePathIgnorePatterns in Jest config for new apps (#946)
(patch)
2020-08-25 18:50:11 -04:00
George Karagkiaouris
2466a6b98c Automatically run initial db migrations during new app setup (#927)
Co-authored-by: Brandon Bayer <b@bayer.ws> (minor)
2020-08-25 17:32:30 -04:00
allcontributors[bot]
de8e0a6808 docs: add svobik7 as a contributor (#944)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-08-25 17:29:54 -04:00
Jirka Svoboda
8b9252c697 Fix queries and mutations for plain JS projects (#878)
(patch)
2020-08-25 17:29:23 -04:00
allcontributors[bot]
12c0f72243 docs: add karaggeorge as a contributor (#943)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-08-25 17:19:47 -04:00
George Karagkiaouris
5e43599338 Add autocomplete to the Blitz CLI (#928)
* Add autocomplete

* Pin plugin version (minor)
2020-08-25 17:19:18 -04:00
George Karagkiaouris
1bf5bf0492 Fix jest config for new apps and fix example test (#924)
(patch)
2020-08-25 17:17:55 -04:00
Dylan Brookes
ff9f70daa8 Fix mdx files not working (#935)
Co-authored-by: merelinguist <merelinguist@users.noreply.github.com> (patch)
2020-08-25 17:09:43 -04:00
Brandon Bayer
89676e4ba8 Elias retired from L1 maintainer 2020-08-25 15:08:43 -04:00
allcontributors[bot]
679efef951 docs: add bpas247 as a contributor (#934)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-08-22 23:30:17 -04:00
Brady Pascoe
bcd9e8dbc9 Add Formik as form option when creating a new app (#926)
(minor)
2020-08-22 23:29:56 -04:00
allcontributors[bot]
8b0fa91233 docs: add karaggeorge as a contributor (#933)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-08-22 20:58:36 -04:00
George Karagkiaouris
e55e90c345 Fix url encoding for authError in the Passport.js adapter (#925)
(patch)
2020-08-22 20:57:18 -04:00
George Karagkiaouris
4e81c97b2b Fix regex to include dynamic imports (#931) 2020-08-22 18:00:17 +10:00
Dwight Watson
16b414bd3d Remove favicon from generators (#921)
Co-authored-by: Dylan Brookes <24858006+merelinguist@users.noreply.github.com>
2020-08-21 18:36:45 +01:00
Dylan Brookes
8798c9fb3d Fix Tailwind Recipe purging in production (#930)
(ignore)
2020-08-21 08:58:46 -04:00
Brandon Bayer
9f91767246 fix couple dependency version bugs in recipes
(ignore)
2020-08-19 20:45:15 -04:00
Brandon Bayer
a6878b35d0 v0.18.0 2020-08-19 20:40:50 -04:00
Adam Markon
39c3b27038 Migrate Recipes to jscodeshift and Support conditional JSX expressions (#898)
Co-authored-by: Brandon Bayer <b@bayer.ws> (minor)
2020-08-19 20:38:49 -04:00
Brandon Bayer
5cc54ab981 v0.17.1-canary.7 2020-08-19 17:35:52 -04:00
Brandon Bayer
91034216a5 Add prompt for form library when running blitz new (#917)
(minor)
2020-08-19 16:51:21 -04:00
Brandon Bayer
2c78ead4cd Finish adding new Layout component to auth pages in new app template (#919)
(patch)
2020-08-19 15:52:34 -04:00
Brandon Bayer
a0cf98bc47 Some improvements to auth in new app template (#916)
(minor)
2020-08-19 15:07:09 -04:00
Brandon Bayer
6898ead0a5 [RFC] Blitz Auth Session Management (#475)
(ignore)
2020-08-19 14:10:30 -04:00
Weilbyte
c7843e8077 Fix to allow usage without db/index.(ts|js) file (#906)
(patch)
2020-08-19 14:08:15 -04:00
Brandon Bayer
370486291a v0.17.1-canary.6 2020-08-18 21:08:57 -04:00
Brandon Bayer
e26e04c603 add ability to disable CSRF protection (#915) 2020-08-18 20:33:04 -04:00
Brandon Bayer
1fa7d17587 Fix: Refetch all queries if session changes (#914)
(patch)
2020-08-18 20:32:44 -04:00
Brandon Bayer
27bc2e49c4 Change ctx.session.userId type to be any (#912)
(patch)
2020-08-18 18:17:00 -04:00
Dwight Watson
18beb6fb1d Add Persistent layout to new app template with <Layout> and getLayout() (#897)
Co-authored-by: Brandon Bayer <b@bayer.ws> (minor)
2020-08-18 17:58:40 -04:00
allcontributors[bot]
5f68bda686 docs: add cardotrejos as a contributor (#911)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-08-18 17:51:29 -04:00
Ricardo Trejos
81ec5c8528 Bump Prisma Version to Latest in Examples (#866) (#893)
Co-authored-by: Brandon Bayer <b@bayer.ws> (example)
2020-08-18 17:51:10 -04:00
Simon Edelmann
0d0c808cc3 Change useQuery to only retry on network errors by default (#908)
(patch)
2020-08-18 16:47:24 -04:00
allcontributors[bot]
097a2196f3 docs: add Weilbyte as a contributor (#907)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-08-18 12:23:48 -04:00
Weilbyte
c592b04c18 Add --no-git flag to blitz new #889 (WIP) (#905)
(minor)
2020-08-18 12:23:25 -04:00
Brandon Bayer
b0d61dc4f1 v0.17.1-canary.5 2020-08-17 22:45:09 -04:00
Brandon Bayer
f5d7ab9005 Update MEETING_NOTES.md
(ignore)
2020-08-17 21:40:11 -04:00
Dwight Watson
26cc39322a Show blitz install command in blitz help output (#903)
Co-authored-by: Brandon Bayer <b@bayer.ws> (patch)
2020-08-17 20:51:31 -04:00
Brandon Bayer
9441dfc1f7 Fix return types of useParam and useParams (#902)
(patch)
2020-08-17 19:16:59 -04:00
Brandon Bayer
4231c9c97f Fix superjson serialization in Safari (Upgrade superjson to 1.2.1) (#901)
* upgrade superjson to 1.2.0

* upgrade to 1.2.1 (patch)
2020-08-17 19:16:30 -04:00
Todd Geist
9a72648ff8 Fix to not use secure cookies on localhost (#895)
Co-authored-by: Brandon Bayer <b@bayer.ws> (patch)
2020-08-17 17:57:46 -04:00
Adam Markon
2059009c1b Add blitz generate query to generate a single query (#837)
Co-authored-by: Brandon Bayer <b@bayer.ws> (minor)
2020-08-17 17:32:07 -04:00
Dwight Watson
44e32f0206 Capitalize help command description (#899) 2020-08-17 12:51:53 +01:00
allcontributors[bot]
924d431c0d docs: add toddgeist as a contributor (#896)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-08-16 17:40:41 -04:00
allcontributors[bot]
3ee9dd8bea docs: add kripod as a contributor (#892)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-08-16 10:07:03 -04:00
Kristóf Poduszló
fc6817520e Change db/index.ts in new app template to use globalThis instead of global (#813)
Co-authored-by: merelinguist <merelinguist@users.noreply.github.com>
Co-authored-by: Brandon Bayer <b@bayer.ws>
Co-authored-by: Justin Hall <justin.r.hall@gmail.com>
2020-08-16 10:06:44 -04:00
Justin Hall
b53ad3ea4e Add Blitz Recipe for Emotion (#805)
(minor)
2020-08-14 18:04:22 -04:00
allcontributors[bot]
a999408fed docs: add scisteffan as a contributor (#884)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-08-14 17:59:11 -04:00
Brandon Bayer
984a10abef Add @SebastianKurp as a contributor 2020-08-14 17:46:09 -04:00
Brandon Bayer
1a7274e5a6 fix render recipe by adding NODE_ENV=production
(patch)
2020-08-14 17:45:30 -04:00
allcontributors[bot]
3e9810e91a docs: add drenther as a contributor (#883)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
Co-authored-by: Brandon Bayer <b@bayer.ws> (meta)
2020-08-14 17:43:00 -04:00
Soumyajit Pathak
6aa2c5d471 Add material-ui recipe (#840)
(minor)
2020-08-14 17:42:31 -04:00
Dwight Watson
3433411a01 Change new app template to set database through .env (#876)
(minor)
2020-08-14 17:36:20 -04:00
Brandon Bayer
1177e5c9f6 Finish default testing setup for new apps (#847)
(minor)
2020-08-14 17:25:53 -04:00
Dwight Watson
ca5b91c340 Remove trailing space (#879) 2020-08-13 11:22:19 +01:00
Brandon Bayer
ba0aeae3e5 v0.17.1-canary.4 2020-08-12 18:22:45 -05:00
Brandon Bayer
24162830ae Fix superjson serialization for useQuery hook (#875)
* fix superjson serialization for useQuery hook

* update test (patch)
2020-08-12 18:20:48 -05:00
Brandon Bayer
d0015e3f88 Improve default useQuery retry behavior in production (#874)
(patch)
2020-08-12 17:45:57 -05:00
Brandon Bayer
6b2788923e Upgrade Next.js to 9.5.2 (#872)
* upgrade next.js to 9.5.2

* fix type issue (patch)
2020-08-12 17:21:55 -05:00
Brandon Bayer
3b5aa9006d Fix session middleware when deployed to Vercel (#871)
(patch)
2020-08-12 17:01:13 -05:00
allcontributors[bot]
8637ed63ba docs: add pragmaticivan as a contributor (#873)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-08-12 16:51:37 -05:00
Ivan Santos
f78781c63b Update eslint to v7 in new app template and the blitz repo (#853)
(minor)
2020-08-12 16:51:22 -05:00
Brandon Bayer
dc6ffed270 Add SessionContext and session.authorize() to query/mutation generators (#869)
(minor)
2020-08-12 16:46:29 -05:00
Brandon Bayer
2686e1c2ea Fix blitz db reset for Prisma >= 2.2.0 (#870)
(patch)
2020-08-12 16:43:06 -05:00
allcontributors[bot]
59c7fb9b01 docs: add rohanjulka19 as a contributor (#867)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-08-12 14:30:48 -05:00
Brandon Bayer
b6b877e851 fix render recipe 2020-08-12 10:33:52 -05:00
Brandon Bayer
90a7624489 Allow having pageName.test.tsx inside pages (#850) 2020-08-12 11:54:12 +10:00
Brandon Bayer
ade63c53fd Update @dwightwatson as a contributor 2020-08-11 13:52:25 -05:00
allcontributors[bot]
08e6cd3d2e docs: add nettofarah as a contributor (#860)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-08-11 12:31:21 -05:00
Netto Farah
6839b55d1d Update all examples to use latest eslint (#852)
(example)
2020-08-11 12:31:06 -05:00
Brandon Bayer
528a7ec18b Rename .babelrc.js to babel.config.js in new app template (#849)
(patch)
2020-08-08 18:11:11 -05:00
Brandon Bayer
9a3f1a1241 v0.17.1-canary.3 2020-08-08 17:42:02 -05:00
Brandon Bayer
10c1e0cfea Add superjson to mutations (#848)
(patch)
2020-08-08 17:38:27 -05:00
allcontributors[bot]
68162b406c docs: add chris-tse as a contributor (#846)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
Co-authored-by: Brandon Bayer <b@bayer.ws> (meta)
2020-08-08 14:15:10 -05:00
Chris Tse
4cc80b8529 Add extra debugging info to blitz -v (#816)
Co-authored-by: Brandon Bayer <b@bayer.ws> (patch)
2020-08-08 14:14:36 -05:00
allcontributors[bot]
0ae3bd4afa docs: add agoxlea as a contributor (#845)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-08-08 11:01:13 -05:00
Alex Orr
2207889c6d Fix prisma.connect warning with prisma 2.4.0 (#839)
(patch)
2020-08-08 11:01:01 -05:00
Oscar Sirvent
338b390a78 typo on tailwind recipe (#844) 2020-08-08 10:22:48 -05:00
Rafael Nunes
c173b9d09d Add Jest and React Testing Library to new apps (#810)
(minor)
Co-authored-by: Adam Markon <amarkon895@gmail.com>
2020-08-06 09:41:01 -04:00
Brandon Bayer
e1120a0449 tweak render recipe db name
(ignore)
2020-08-05 08:26:33 -04:00
Brandon Bayer
b4551323c8 fix chakra recipe dep version
(ignore) # Please enter the commit message for your changes. Lines starting
2020-08-04 22:08:30 -04:00
Brandon Bayer
50a276f582 v0.17.1-canary.2 2020-08-04 21:58:36 -04:00
Brandon Bayer
63a078be27 Add Blitz Recipe for Render.com (#835)
* Add Blitz Recipe for Render.com

* cleanup (minor)
2020-08-04 21:52:40 -04:00
Brandon Bayer
16ab5675e2 Fix useQuery when resolver returns undefined (#836)
(patch)
2020-08-04 21:52:24 -04:00
Fran Zekan
7509aca08d Add Blitz recipe for Chakra (#830)
Co-authored-by: Brandon Bayer <b@bayer.ws> (minor)
2020-08-04 17:38:11 -04:00
Brandon Bayer
5320bc5211 v0.17.1-canary.1 2020-08-04 17:29:39 -04:00
Brandon Bayer
d32a39993c fix publish script
(ignore)
2020-08-04 17:26:29 -04:00
Brandon Bayer
5795eefaab v0.17.1-canary.0 2020-08-04 17:24:53 -04:00
Brandon Bayer
28e6a0032a Add user signup/login/logout to new app template (#834)
(major)
2020-08-04 16:55:27 -04:00
Brandon Bayer
96fea67112 Ignore flaky cypress test on windows (#832)
(ignore)
2020-08-04 14:32:38 -04:00
Brandon Bayer
9005c58349 Enable full JS object serialization/deserialization for queries/mutations by integrating superjson (#827)
(major)
2020-08-04 13:17:35 -04:00
allcontributors[bot]
dea9200f9d docs: add rubenmoya as a contributor (#831)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-08-04 10:37:46 -04:00
Rubén Moya
b6e72cc5f5 Add e2e tests to auth example (#817)
Co-authored-by: Brandon Bayer <b@bayer.ws> (example)
2020-08-04 10:37:28 -04:00
dependabot[bot]
5165793a4e Bump lodash from 4.17.15 to 4.17.19 in /examples/plain-js (#829)
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.15 to 4.17.19.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.15...4.17.19)

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (meta)
2020-08-04 10:11:10 -04:00
Brandon Bayer
1fe2653b4f remove test from publish script, since we have CI
(ignore)
2020-08-02 15:08:52 -07:00
Brandon Bayer
740b57798f v0.17.0 2020-08-02 15:08:20 -07:00
Brandon Bayer
07cf6d6e26 Fix with-blitz bug when published on npm (#824)
(ignore)
2020-08-02 15:04:38 -07:00
Brandon Bayer
21896944f9 v0.16.5-canary.8 2020-08-02 14:31:38 -07:00
Brandon Bayer
62a5408e6e Fix bug when users use next-compose-plugins and with framework code being transpiled in dev (#823)
* fix bug when users use next-compose-plugins and with framework code being transpiled in dev

* fix test (patch)
2020-08-02 14:26:53 -07:00
Brandon Bayer
e1e82cb630 Add to store example superjson for getStaticProps (#822)
(example)
2020-08-02 14:03:04 -07:00
dependabot[bot]
81c13df956 Bump elliptic from 6.5.2 to 6.5.3 in /examples/plain-js (#818)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Brandon Bayer <b@bayer.ws> (meta)
2020-08-02 13:26:44 -07:00
Brandon Bayer
65acdc971c Upgrade react-query to 2.5.11 (#820)
(patch)
2020-08-02 12:16:26 -07:00
Brandon Bayer
eb1c88ee1a Add example usage of superjson with getServerSideProps in store example (#819)
(example)
2020-08-02 12:16:15 -07:00
Brandon Bayer
d0fdb7b1f3 Add NotFoundError to Blitz and add default 404 page to new app template (#811)
(minor)
2020-08-02 11:53:01 -07:00
Brandon Bayer
724c6921da Upgrade Next.js to 9.5.1 (#812)
(minor)
2020-08-02 10:28:38 -07:00
Simon Knott
31ecd58857 Allow custom DB connection logic and add example for using DB clients other than Prisma (#792)
(minor)
2020-07-30 03:39:21 +07:00
Brandon Bayer
aee33f0354 Change new app template to use react-error-boundary instead of custom ErrorBoundary component (#807)
(patch)
2020-07-28 14:42:25 +07:00
Brandon Bayer
baf3fb9b4f Rename <Error> to <ErrorComponent> (#808)
(major)
2020-07-27 20:53:42 +07:00
Simon Edelmann
437ce18170 Remove delete data.id from Generated update mutations (#789)
Co-authored-by: Brandon Bayer <b@bayer.ws> (patch)
2020-07-27 18:17:37 +07:00
Simon Knott
167abce895 Add Node version check and warning to CLI startup routine (#804)
(patch)
2020-07-27 17:38:19 +07:00
Brandon Bayer
ed23307267 v0.16.5-canary.7 2020-07-25 18:50:11 +07:00
Brandon Bayer
436bd4e306 v0.16.5-canary.6 2020-07-25 18:43:56 +07:00
Brandon Bayer
8ee9df51fd 🎉 Add Passport.js authentication adapter! (#796)
(minor)
2020-07-25 18:31:56 +07:00
robertgrzonka
a421212e63 Add github orkflow for bundle size reporting (#799)
Co-authored-by: Brandon Bayer <b@bayer.ws> (meta)
2020-07-25 16:46:38 +07:00
allcontributors[bot]
10c3b248e9 docs: add robertgrzonka as a contributor (#802)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-07-25 13:43:44 +07:00
Brandon Bayer
b5da9c2822 Add bundle analyzer to auth example (#795)
(example)
2020-07-24 20:32:44 +07:00
Brandon Bayer
509110b1ea Fix regression from getConfig in session management file (#793)
* fix regression from getConfig in session management file

* bump CI (ignore)
2020-07-24 20:32:23 +07:00
Brandon Bayer
852fdc6016 Update README.md 2020-07-24 16:18:05 +07:00
Brandon Bayer
69449ca6b9 Fix cannot read property 'getSession' of undefined (#790)
(patch)
2020-07-24 15:31:38 +07:00
Brandon Bayer
35ff20bc78 Fully fix errors from useQuery during pre-rendering (#791)
(patch)
2020-07-24 15:31:15 +07:00
Brandon Bayer
000cf2d4bf Revert "Allow custom DB connection logic and add example for using DB clients other than Prisma (#739)"
This reverts commit 20f1d99e7c.
2020-07-23 20:29:05 +07:00
Simon Knott
20f1d99e7c Allow custom DB connection logic and add example for using DB clients other than Prisma (#739)
(minor)
2020-07-23 19:24:24 +07:00
Brandon Bayer
960e225f0c fix yarn.lock 2020-07-22 22:24:10 +07:00
Brandon Bayer
d8449d4458 v0.16.5-canary.5 2020-07-22 22:22:49 +07:00
Brandon Bayer
50e20b812c Fix global middleware not working in serverless builds (#787)
(patch)
2020-07-22 22:17:53 +07:00
Brandon Bayer
fa8616f8a3 Fix blitz db migrate stuck on first production deploy (#786)
(patch)
2020-07-22 18:23:12 +07:00
Brandon Bayer
362352379d Enable CI cache for windows (#785)
(meta)
2020-07-22 17:49:17 +07:00
Dylan Brookes
580e2724ff Remove GUI code - rework in progress (#781)
Co-authored-by: merelinguist <merelinguist@users.noreply.github.com> (meta)
2020-07-22 16:00:40 +07:00
allcontributors[bot]
19c3f13de9 docs: add rubenmoya as a contributor (#783)
Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> (meta)
2020-07-22 15:58:53 +07:00
Rubén Moya
53f3fbf7c7 Fix auth public-data-token localstorage key (#780)
(patch)
2020-07-22 15:58:15 +07:00
Adam Markon
7426fc5794 Add Blitz Recipe for Tailwind CSS (#776) 2020-07-21 09:32:59 -04:00
Brandon Bayer
089ca908ed Change auth example to use a shared <Form> component that abstracts the actual form library (#778)
(example)
2020-07-21 16:56:53 +07:00
Brandon Bayer
820c678533 v0.16.5-canary.4 2020-07-21 16:13:53 +07:00
Brandon Bayer
abd0bbd7cf Switch to url safe CSRF tokens (#777)
(patch)
2020-07-21 15:48:22 +07:00
Brandon Bayer
af68b9aa0a v0.16.5-canary.3 2020-07-21 10:18:46 +07:00
Adam Markon
4ce2161ec7 Improved API for defining Blitz Recipes (#770)
(minor)
2020-07-20 10:47:55 -04:00
810 changed files with 33075 additions and 18142 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,7 @@ module.exports = {
},
project: `./tsconfig.json`,
},
plugins: ["@typescript-eslint", "import", "unicorn"],
plugins: ["@typescript-eslint", "import", "unicorn", "simple-import-sort"],
extends: ["react-app"],
rules: {
"react/react-in-jsx-scope": "off", // React is always in scope with Blitz
@@ -24,11 +24,42 @@ module.exports = {
},
],
"@typescript-eslint/no-floating-promises": "error",
// note you must disable the base rule as it can report incorrect errors
"no-use-before-define": "off",
"@typescript-eslint/no-use-before-define": ["error"],
// note you must disable the base rule as it can report incorrect errors
"no-redeclare": "off",
"@typescript-eslint/no-redeclare": ["error"],
"simple-import-sort/imports": [
"warn",
{
groups: [
[
// Side effect imports.
"^\\u0000",
// Packages.
// Things that start with a letter (or digit or underscore), or `@` followed by a letter.
"^@?\\w",
// Absolute imports and other imports such as Vue-style `@/foo`.
// Anything that does not start with a dot.
"^[^.]",
// Relative imports.
// Anything that starts with a dot.
"^\\.",
],
],
},
],
},
ignorePatterns: ["packages/cli/", "packages/generator/templates"],
ignorePatterns: [
"packages/cli/",
"packages/generator/templates",
".eslintrc.js",
"recipes/*/templates",
],
overrides: [
{
files: ["examples/**", "packages/gui/**"],
files: ["examples/**", "packages/gui/**", "recipes/**"],
rules: {
"import/no-default-export": "off",
"unicorn/filename-case": "off",

11
.github/CODEOWNERS vendored
View File

@@ -1,11 +1,8 @@
# https://help.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners
* @flybayer
*.md @merelinguist
packages/server/**/* @ryardley
packages/file-pipeline/**/* @ryardley
packages/cli/**/* @aem
packages/generator/**/* @aem
packages/gui/**/* @merelinguist
packages/installer/**/* @aem
packages/cli/**/* @aem, @flybayer
packages/generator/**/* @aem @flybayer
packages/generator/templates**/* @flybayer
packages/installer/**/* @aem @flybayer

View File

@@ -1,5 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Question or Discussion
- name: Prisma issue?
url: https://github.com/prisma/prisma/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc
about: All Prisma issues should be opened in the Prisma Github
- name: Question, Discussion, Idea?
url: https://github.com/blitz-js/blitz/discussions/new
about: Ask questions and discuss with other community members

View File

@@ -4,7 +4,7 @@ Closes: ??
### Checklist
- [ ] Tests added for changes
- [ ] Changes covered by tests (tests added if needed)
- [ ] PR submitted to [blitzjs.com](https://github.com/blitz-js/blitzjs.com) for any user facing changes
<!-- IMPORTANT: Make sure to check the "Allow edits from maintainers" box below this window -->

26
.github/workflows/compressed.yml vendored Normal file
View File

@@ -0,0 +1,26 @@
name: CI
on:
pull_request:
branches: [master, canary]
jobs:
build:
name: Compressed Size
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Use Node and Yarn
uses: actions/setup-node@v2
with:
node-version: "14"
- name: Install dependencies
run: |
yarn && yarn build
env:
CI: true
- name: Count size
uses: preactjs/compressed-size-action@v2
with:
repo-token: "${{ secrets.GITHUB_TOKEN }}"

View File

@@ -1,4 +1,4 @@
name: Continuous Integration
name: CI
on:
push:
@@ -11,40 +11,30 @@ on:
- canary
jobs:
check_install_time:
name: Check install time
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Use Node.js
uses: actions/setup-node@v1
with:
node-version: "12.16.1"
- name: Test Install time
run: |
cd ../ && mkdir test && cd test
yarn add file:../blitz/packages/blitz --non-interactive | tee out.txt
cat out.txt | ../blitz/.github/checkInstallTime.js
lint:
name: Lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Use Node.js
uses: actions/setup-node@v1
uses: actions/setup-node@v2
with:
node-version: "12.16.1"
node-version: "14"
- name: Get yarn cache directory path
id: yarn-cache-dir-path
run: echo "::set-output name=dir::$(yarn cache dir)"
- name: Cache Node.js modules
- name: Cache node_modules
id: yarn-cache
uses: actions/cache@v1
uses: actions/cache@v2
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
path: |
${{ steps.yarn-cache-dir-path.outputs.dir }}
**/node_modules
/home/runner/.cache/Cypress
C:\Users\runneradmin\AppData\Local\Cypress\Cache
key: ${{ runner.os }}-${{ runner.node_version}}-yarn-v4-${{ hashFiles('yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
${{ runner.os }}-${{ runner.node_version}}-yarn-v4-
- name: Install dependencies
run: yarn install --frozen-lockfile --silent
env:
@@ -54,31 +44,32 @@ jobs:
env:
CI: true
build_and_test_pkgs:
name: Build & Test Packages
name: Packages Tests
strategy:
matrix:
os: [ubuntu-latest, windows-latest]
node_version: [12, 14]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v2
- name: Use Node.js
uses: actions/setup-node@v1
uses: actions/setup-node@v2
with:
node-version: "12.16.1"
node-version: ${{ matrix.node_version }}
- name: Get yarn cache directory path
id: yarn-cache-dir-path
run: echo "::set-output name=dir::$(yarn cache dir)"
- name: Cache Node.js modules
- name: Cache node_modules
id: yarn-cache
if: ${{ !startsWith(runner.os, 'windows') }}
uses: actions/cache@v2
with:
path: |
${{ steps.yarn-cache-dir-path.outputs.dir }}
**/node_modules
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
/home/runner/.cache/Cypress
C:\Users\runneradmin\AppData\Local\Cypress\Cache
key: ${{ runner.os }}-${{ runner.node_version}}-yarn-v4-${{ hashFiles('yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
${{ runner.os }}-${{ runner.node_version}}-yarn-v4-
- name: Install dependencies
run: yarn install --frozen-lockfile --silent
env:
@@ -95,31 +86,33 @@ jobs:
env:
CI: true
build_and_test_examples:
name: Build & Test Examples
timeout-minutes: 30
name: Example Apps Tests
strategy:
matrix:
os: [ubuntu-latest, windows-latest]
node_version: [12, 14]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v2
- name: Use Node.js
uses: actions/setup-node@v1
uses: actions/setup-node@v2
with:
node-version: "12.16.1"
node-version: ${{ matrix.node_version }}
- name: Get yarn cache directory path
id: yarn-cache-dir-path
run: echo "::set-output name=dir::$(yarn cache dir)"
- name: Cache Node.js modules
- name: Cache node_modules
id: yarn-cache
if: ${{ !startsWith(runner.os, 'windows') }}
uses: actions/cache@v2
with:
path: |
${{ steps.yarn-cache-dir-path.outputs.dir }}
# **/node_modules
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
/home/runner/.cache/Cypress
C:\Users\runneradmin\AppData\Local\Cypress\Cache
key: ${{ runner.os }}-${{ runner.node_version}}-yarn-v4-${{ hashFiles('yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
${{ runner.os }}-${{ runner.node_version}}-yarn-v4-
- name: Install dependencies
run: yarn install --frozen-lockfile --silent
env:

15
.gitignore vendored
View File

@@ -1,5 +1,6 @@
.log
.DS_Store
.idea
.jest-*
lib
node_modules
@@ -15,10 +16,14 @@ tsconfig.tsbuildinfo
dist
.now
# local env files
**/.envrc
**/.env
**/.env.local
**/.env.development.local
**/.env.test.local
**/.env.production.local
**/.env.*.local
**/.envrc
.blitz-*
.blitz-cli-cache
.vscode
.tsbuildinfo
.nvmrc
**/.test*
examples/auth2
.idea

5
.kodiak.toml Normal file
View File

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

1
.node-version Normal file
View File

@@ -0,0 +1 @@
12.20.0

View File

@@ -16,5 +16,6 @@ reports
tsconfig.tsbuildinfo
dist
bin
!packages/blitz/src/bin
packages/generator/templates/**
.github/ISSUE_TEMPLATE/bug_report.md

View File

@@ -1,104 +1 @@
# ❤️ Blitz Maintainers
Aside from the core team, there are two levels of maintainers, described below.
## Becoming a Maintainer
We always need more level 1 maintainers! The main requirement is that you can show empathy when communicating online. We'll train you as needed on the other specifics. **This is a great role if you have limited time, because you can spend just as much time as you have without any ongoing responsibilities (unlike level 2)**
Level 2 maintainers have a much higher responsibility, so usually you will spend time as a level 1 maintainer before moving to level 2.
Please DM a core team member (Brandon Bayer, Rudi Yardley, or Dylan Brookes) in Slack if you're interested in becoming an official maintainer!
## Level 1 Maintainers
Level 1 maintainers are critical for a healthy Blitz community and project. They take a lot of burden off the core team and level 2 maintainers so they can focus on higher level things with longer term impact.
The primary responsibilities of level 1 maintainers are:
- Being a friendly, welcoming voice for the Blitz community
- Issue triage
- Pull request triage
- Monitor and answer the `#-help` slack channel
- Community encouragement
- Community moderation
- Tracking and ensuring progress of key issues
## Level 2 Maintainers
Level 2 maintainers are the backbone of the project. They are watchdogs over the code, ensuring code quality, correctness, and security. They also facilitate a rapid pace of progress.
The primary responsibilities of level 2 maintainers are:
- Code ownership over specific parts of the project
- Maintaining and improving the architecture of what they own
- Final pull request reviews
- Merging pull requests
- Tracking and ensuring progress of open pull requests
## ⚠️ Fundamentals
Maintainers are the face of the project and the front-line touch point for the community. Therefore maintainers have the very important responsibility of making people feel welcome, valued, understood, and appreciated.
**Please take time to read and understand everything outlined in this [guide on building welcoming communities](https://opensource.guide/building-community)**
Some especially important points:
- **Gratitude:** immediately express gratitude when someone opens an issue or PR. This takes effort/time and we appreciate it
- **Responsiveness:** during issue/PR triage, even if we cant do a full review right away, leave a comment thanking them and saying well review it soon
- **Understanding:** it's critical to ensure you understand exactly what someone is saying before you respond. Ask plenty of questions if needed. It's very bad if someone has to reply to your response and say "actually I was asking about X"
- In fact, at least one question is almost always required before you can respond appropriately  — whether in Github or in Slack
## Slack
- All `#-*` channels are for Blitz users
- All `#dev-*` channels are for Blitz internal development
If someone that's not a maintainer post in the wrong area, that's fine. Don't tell them they posted in the wrong place. But as a maintainer, you should for sure post in the right channel :)
## Issue Triage
#### If a bug report:
- Does it have enough information? Versions? Logs? Some way to reproduce?
- Has this already been fixed in a previous release?
- Is there already an existing issue for this?
### If a feature/change request:
- Is it clear what the request is and what the benefit will be?
- Is this an obvious win for Blitz? Then accept it
- If not obvious, then pull in a core team member or level 2 maintainer for more review
### Actions
1. Add tags:
- Add a `kind/*` tag
- Add a `scope/*` tag
- Add a `status/*` tag
- Add a good first/second issue tag if appropriate
## Pull Request Triage
- Are the changes covered by tests?
- Do the changes look ok? Make sure there's no obvious issues
### Actions
1. Kindly request any changes if needed
2. Else add a Github approval so that level 2 maintainers know it's already had an initial review
## Final PR Review & Merging (Level 2 maintainers)
As a level 2 maintainer, it is your responsibility to make sure broken code and regressions never reach the canary branch.
1. Ensure the PR'ed code fully works as intended and that there are no regressions in related code
1. If not fully covered by automated tests, you need to pull down the code locally and manually verify everything (the Github CLI helps with this!)
2. During squash & merge:
1. Change the commit title to be public friendly - this exact text will go in the release notes
2. Add the commit type in the description, in parenthesis like `(patch)`. Commit types:
- `major` - major breaking change
- `minor` - minor feature addition
- `patch` - patches, bug fixes, perf improvements, etc
- `example` - change to an example app
- `meta` - internal meta change related to the Blitz repo/project
This document has moved here: https://blitzjs.com/docs/maintainers

View File

@@ -1,3 +1,20 @@
# 2020-08-17 Blitz Contributor Call
- Attending: Brandon Bayer, Adam Markon, Kellen Mace, Myron Davis, Dwight Watson
- Brandon:
- Auth out, set up by default in canary release
- Need to work on a potential CSRF bug
- Next major release will include auth by default and allow you to choose your form library
- Next auth features are email confirmation
- After that, logging and plugins are next
- Adam:
- Overhauled the recipe infrastructure. Now using jscodeshift instead of recast
- Added support for conditional JSX in templates
- Going to work on custom templates next
- Dwight
- Has been opening issues for problems
- Made a few PRs for some issues
# 2020-07-07 Blitz Contributor Call
- Attending: Brandon Bayer, Robert Rosenburg, Jeremy Liberman
@@ -8,12 +25,11 @@
- Benefits of our session managment vs rails
- Dont have to redirect to login page
- Using top level error component that catches authentication errors
- You can login from anywhere, during sign up
- You can login from anywhere, during sign up
- Robert:
- Waiting on Kirstinas website designs. Desktop design is finished, but she's working on mobile design
- Code snippet / sandbox of blitz code for the website
# 2020-06-23 Blitz Contributor Call
- Attending: Brandon Bayer, Robert Rosenberg, Justin Hall, Adam Markon
@@ -31,8 +47,6 @@
- Updated the tutorial
- Helped with various bug fixes
# 2020-06-17 Blitz Contributor Call
- Attending: Brandon Bayer, Fran Zekan, Sigurd Wahl

403
README.md
View File

@@ -2,11 +2,11 @@
<!-- prettier-ignore-start -->
<p align="center">
<a aria-label="Join our Slack Community" href="https://slack.blitzjs.com">
<a aria-label="Join our Discord Community" href="https://discord.blitzjs.com">
<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-80-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-209-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">
@@ -21,11 +21,12 @@
<h1 align="center">The Fullstack React Framework</h1>
<h3 align="center">Built on Next.js — Inspired by Ruby on Rails — New Fullstack Data Layer</h3>
<h5 align="center">"Zero-API" Data Layer — Built on Next.js — Inspired by Ruby on Rails</h3>
<h3 align="center">Makes you far more productive than you ever dreamed was possible 😉</h3>
<h3 align="center"><a href="https://blitzjs.com" target="_blank">Read the Documentation</a></h3>
<br>
New “no-API” data layer **lets you import server code into your React components** instead of having to fetch from an API.
“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.
Includes everything you need for production apps. **Everything end-to-end from the database to the frontend.**
@@ -39,17 +40,25 @@ You need Node.js 12 or newer
#### Install Blitz
Run `npm install -g blitz`
Run `npm install -g blitz` or `yarn global add blitz`
_You can alternatively use [`npx`](https://www.npmjs.com/package/npx)_
#### Create a New App
1. `blitz new myAppName`
2. `cd myAppName`
3. `blitz start`
3. `blitz dev`
4. View your baby app at http://localhost:3000
<br><br>
<a aria-label="Bytes Newsletter" href="https://ui.dev/bytes/?r=blitzjs">
<img alt="Bytes Newsletter" src="https://files-8wtskjofb.vercel.app/smarter-16x1.jpg">
</a>
<br><br>
![Architecture diagram](https://blitzjs.now.sh/img/architecture-diagram.png)
<br><br>
@@ -58,18 +67,18 @@ Run `npm install -g blitz`
⚡️ Built on Next.js<br>
⚡️ Don't have to build an API for client-side rendering<br>
⚡️ Client-side rendering, Server-side rendering, and fully static pages all in the same app<br>
⚡️ Full Typescript support with static, end-to-end typing (no code generation step needed like with GraphQL)<br>
⚡️ Full TypeScript support with static, end-to-end typing (no code generation step needed like with GraphQL)<br>
⚡️ React Concurrent Mode enabled<br>
⚡️ Database/ORM agnostic, but Prisma 2 is default<br>
⚡️ CLI with code scaffolding, Rails-style console REPL, etc<br>
⚡️ GraphQL Ready<br>
⚡️ Deploy serverless or serverful<br>
**Other key features coming:**<br>
⚡️ Highly secure authentication <br>
⚡️ Authorization you can use on both server and client<br>
⚡️ Recipes for easily adding libraries like Tailwind, CSS-in-JS, etc.<br>
**Other key features coming:**<br>
⚡️ Model validation you can use on both server and client<br>
⚡️ Plugins for easily adding libraries like Tailwind, CSS-in-JS, etc.<br>
⚡️ React native support<br>
⚡️ GUI so you don't have to use the CLI<br>
@@ -101,7 +110,7 @@ While we currently only support web, we are pursuing the dream of a single monol
The Blitz community is warm, safe, diverse, inclusive, and fun! LGBTQ+, women, and minorities are especially welcome. Please read our [Code of Conduct](https://blitzjs.com/docs/code-of-conduct).
[Join our Slack Community](https://slack.blitzjs.com) where we help each other build Blitz apps. It's also where we collaborate on building Blitz itself.
[Join our Discord Community](https://discord.blitzjs.com) where we help each other build Blitz apps. It's also where we collaborate on building Blitz itself.
For questions and longer form discussions, [post in our forum](https://github.com/blitz-js/blitz/discussions).
@@ -115,23 +124,40 @@ Your financial contributions help ensure Blitz continues to be developed and mai
👉 View options and contribute at [GitHub Sponsors](https://github.com/sponsors/blitz-js), [PayPal](https://paypal.me/thebayers), or [Open Collective](https://opencollective.com/blitzjs)
### 🌱 Seedling Sponsors
<a aria-label="React Bricks" href="https://reactbricks.com/?utm_source=blitzjs&utm_medium=sponsorship&utm_campaign=blitzjs_sponsorship">
<img alt="" src="https://reactbricks.com/reactbricks_icon.svg" width="30px"/>
</a>
<a aria-label="Andreas Asprou" href="https://andreas.fyi">
<img alt="" src="https://raw.githubusercontent.com/blitz-js/blitz/canary/assets/andreas.jpg" width="30px"/>
</a>
### 🥉 Bronze Sponsors
<a aria-label="Render.com" href="https://render.com?utm_source=BlitzJS&utm_medium=sponsorship&utm_campaign=BlitzJS_Sponsorship_2020">
<img alt="" src="https://raw.githubusercontent.com/blitz-js/blitz/canary/assets/render-logo-color2.png" width="110px">
</a>
### 🥈 Silver Sponsors
<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="175px">
<img alt="" src="https://raw.githubusercontent.com/blitz-js/blitz/canary/assets/Fauna_Logo_Blue.png" width="200px">
</a>
### 🏆 Gold Sponsors
<a aria-label="Your Company" href="#">
<img alt="" src="https://dummyimage.com/1000x330/efe8ff/000000.png&text=Your+Logo+Here" width="300px">
</a>
### 💎 Diamond Sponsors
<a aria-label="Your Company" href="#">
<img alt="" src="https://dummyimage.com/1000x330/efe8ff/000000.png&text=Your+Logo+Here" width="400px">
</a>
<br>
@@ -141,8 +167,6 @@ 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="https://medium.com/@ryardley"><img src="https://avatars0.githubusercontent.com/u/1256409?v=4" width="100px;" alt=""/><br /><sub><b>Rudi Yardley</b></sub></a><br />Node.js Wizard</td>
<td align="center"><a href="https://merelinguist.now.sh"><img src="https://avatars3.githubusercontent.com/u/24858006?v=4" width="100px;" alt=""/><br /><sub><b>Dylan Brookes</b></sub></a><br />Friendly Generalist</td>
</tr>
</table>
<!-- markdownlint-enable -->
@@ -161,6 +185,7 @@ _Code ownership, pull request approvals and merging, etc_ (see [MAINTAINERS.md](
<tr>
<td align="center"><a href="https://github.com/aem"><img src="https://avatars0.githubusercontent.com/u/1909883?v=4" width="100px;" alt=""/><br /><sub><b>Adam Markon</b></sub></a><br />CLI</td>
<td align="center"><a href="http://robdrosenberg.com"><img src="https://avatars0.githubusercontent.com/u/20813991?v=4" width="100px;" alt=""/><br /><sub><b>Robert Rosenberg</b></sub></a><br />Website/Docs</td>
<td align="center"><a href="http://simonknott.de"><img src="https://avatars1.githubusercontent.com/u/14912729?v=4" width="100px;" alt=""/><br /><sub><b>Simon Knott</b></sub></a><br />SuperJSON</td>
</tr>
</table>
<!-- markdownlint-enable -->
@@ -172,24 +197,24 @@ _Code ownership, pull request approvals and merging, etc_ (see [MAINTAINERS.md](
_Issue triage, pull request triage, community encouragement and moderation, etc_ (see [MAINTAINERS.md](./MAINTAINERS.md))
We need more woman & nonbinary level 1 maintainers. See [MAINTAINERS.md](./MAINTAINERS.md) for what this entails
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tr>
<td align="center"><a href="https://github.com/LoriKarikari"><img src="https://avatars1.githubusercontent.com/u/7902980?v=4" width="100px;" alt=""/><br /><sub><b>Lori Karikari</b></sub></a></td>
<td align="center"><a href="https://corey-brown.com"><img src="https://avatars1.githubusercontent.com/u/12791148?v=4" width="100px;" alt=""/><br /><sub><b>Corey Brown</b></sub></a></td>
<td align="center"><a href="http://simonknott.de"><img src="https://avatars1.githubusercontent.com/u/14912729?v=4" width="100px;" alt=""/><br /><sub><b>Simon Knott</b></sub></a></td>
<td align="center"><a href="https://twitter.com/GeggsElias"><img src="https://avatars3.githubusercontent.com/u/22719177?v=4" width="100px;" alt=""/><br /><sub><b>Elias Johansson</b></sub></a></td>
<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="http://jagascript.com"><img src="https://avatars0.githubusercontent.com/u/4562878?v=4" width="100px;" alt=""/><br /><sub><b>Jaga Santagostino</b></sub></a></td>
<td align="center"><a href="https://simonpeterdebbarma.com"><img src="https://avatars3.githubusercontent.com/u/31207418?v=4" width="100px;" alt=""/><br /><sub><b>Simon Debbarma</b></sub></a></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://twitter.com/sandulat"><img src="https://avatars2.githubusercontent.com/u/7345874?v=4" width="100px;" alt=""/><br /><sub><b>Alexandru Stratulat</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>
</tr>
<tr>
<td align="center"><a href="https://github.com/jclancy93"><img src="https://avatars2.githubusercontent.com/u/7850202?v=4" width="100px;" alt=""/><br /><sub><b>Jack Clancy</b></sub></a></td>
<td align="center"><a href="https://twitter.com/ivandevp"><img src="https://avatars3.githubusercontent.com/u/9284690?v=4" width="100px;" alt=""/><br /><sub><b>Ivan Medina</b></sub></a></td>
<td align="center"><a href="https://twitter.com/jdavenport97"><img src="https://avatars2.githubusercontent.com/u/1329874?v=4" width="100px;" alt=""/><br /><sub><b>Jamie Davenport</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://flavioander.com/"><img src="https://avatars2.githubusercontent.com/u/14948074?s=460&u=31d7ea58b5c5cd9f724d684ed578f68896c4af71&v=4" width="100px;" alt=""/><br /><sub><b>Flavio Andrade</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://github.com/malkomalko"><img src="https://avatars.githubusercontent.com/malkomalko" width="100px;" alt=""/><br /><sub><b>Robert Malko</b></sub></a></td>
</tr>
</table>
<!-- markdownlint-enable -->
@@ -207,113 +232,279 @@ Thanks to these wonderful people ([emoji key](https://allcontributors.org/docs/e
<!-- markdownlint-disable -->
<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 /><a href="https://github.com/blitz-js/blitz/commits?author=flybayer" title="Code">💻</a> <a href="#content-flybayer" title="Content">🖋</a> <a href="#ideas-flybayer" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/blitz-js/blitz/pulls?q=is%3Apr+reviewed-by%3Aflybayer" title="Reviewed Pull Requests">👀</a></td>
<td align="center"><a href="https://medium.com/@ryardley"><img src="https://avatars0.githubusercontent.com/u/1256409?v=4" width="100px;" alt=""/><br /><sub><b>Rudi Yardley</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=ryardley" title="Code">💻</a> <a href="#ideas-ryardley" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/blitz-js/blitz/pulls?q=is%3Apr+reviewed-by%3Aryardley" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/blitz-js/blitz/commits?author=ryardley" title="Tests">⚠️</a></td>
<td align="center"><a href="https://merelinguist.me"><img src="https://avatars3.githubusercontent.com/u/24858006?v=4" width="100px;" alt=""/><br /><sub><b>Dylan Brookes</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=merelinguist" title="Code">💻</a> <a href="#ideas-merelinguist" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/blitz-js/blitz/pulls?q=is%3Apr+reviewed-by%3Amerelinguist" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/blitz-js/blitz/commits?author=merelinguist" title="Tests">⚠️</a> <a href="https://github.com/blitz-js/blitz/commits?author=merelinguist" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/aem"><img src="https://avatars0.githubusercontent.com/u/1909883?v=4" width="100px;" alt=""/><br /><sub><b>Adam Markon</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=aem" title="Code">💻</a> <a href="#ideas-aem" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/blitz-js/blitz/pulls?q=is%3Apr+reviewed-by%3Aaem" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/blitz-js/blitz/commits?author=aem" title="Tests">⚠️</a> <a href="#maintenance-aem" title="Maintenance">🚧</a></td>
<td align="center"><a href="https://corey-brown.com"><img src="https://avatars1.githubusercontent.com/u/12791148?v=4" width="100px;" alt=""/><br /><sub><b>Corey Brown</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=coreybrown89" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/pulls?q=is%3Apr+reviewed-by%3Acoreybrown89" title="Reviewed Pull Requests">👀</a> <a href="#maintenance-coreybrown89" title="Maintenance">🚧</a></td>
<td align="center"><a href="https://github.com/LoriKarikari"><img src="https://avatars1.githubusercontent.com/u/7902980?v=4" width="100px;" alt=""/><br /><sub><b>Lori Karikari</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=LoriKarikari" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/pulls?q=is%3Apr+reviewed-by%3ALoriKarikari" title="Reviewed Pull Requests">👀</a> <a href="#maintenance-LoriKarikari" title="Maintenance">🚧</a> <a href="https://github.com/blitz-js/blitz/commits?author=LoriKarikari" title="Documentation">📖</a></td>
<td align="center"><a href="https://twitter.com/GeggsElias"><img src="https://avatars3.githubusercontent.com/u/22719177?v=4" width="100px;" alt=""/><br /><sub><b>Elias Johansson</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=eliasjohansson" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/pulls?q=is%3Apr+reviewed-by%3Aeliasjohansson" title="Reviewed Pull Requests">👀</a> <a href="#maintenance-eliasjohansson" title="Maintenance">🚧</a></td>
<td align="center"><a href="https://twitter.com/flybayer"><img src="https://avatars3.githubusercontent.com/u/8813276?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Brandon Bayer</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=flybayer" title="Code">💻</a> <a href="#content-flybayer" title="Content">🖋</a> <a href="#ideas-flybayer" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/blitz-js/blitz/pulls?q=is%3Apr+reviewed-by%3Aflybayer" title="Reviewed Pull Requests">👀</a></td>
<td align="center"><a href="https://medium.com/@ryardley"><img src="https://avatars0.githubusercontent.com/u/1256409?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Rudi Yardley</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=ryardley" title="Code">💻</a> <a href="#ideas-ryardley" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/blitz-js/blitz/pulls?q=is%3Apr+reviewed-by%3Aryardley" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/blitz-js/blitz/commits?author=ryardley" title="Tests">⚠️</a></td>
<td align="center"><a href="https://merelinguist.me"><img src="https://avatars3.githubusercontent.com/u/24858006?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dylan Brookes</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=merelinguist" title="Code">💻</a> <a href="#ideas-merelinguist" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/blitz-js/blitz/pulls?q=is%3Apr+reviewed-by%3Amerelinguist" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/blitz-js/blitz/commits?author=merelinguist" title="Tests">⚠️</a> <a href="https://github.com/blitz-js/blitz/commits?author=merelinguist" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/aem"><img src="https://avatars0.githubusercontent.com/u/1909883?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Adam Markon</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=aem" title="Code">💻</a> <a href="#ideas-aem" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/blitz-js/blitz/pulls?q=is%3Apr+reviewed-by%3Aaem" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/blitz-js/blitz/commits?author=aem" title="Tests">⚠️</a> <a href="#maintenance-aem" title="Maintenance">🚧</a></td>
<td align="center"><a href="https://corey-brown.com"><img src="https://avatars1.githubusercontent.com/u/12791148?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Corey Brown</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=coreybrown89" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/pulls?q=is%3Apr+reviewed-by%3Acoreybrown89" title="Reviewed Pull Requests">👀</a> <a href="#maintenance-coreybrown89" title="Maintenance">🚧</a></td>
<td align="center"><a href="https://github.com/LoriKarikari"><img src="https://avatars1.githubusercontent.com/u/7902980?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lori Karikari</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=LoriKarikari" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/pulls?q=is%3Apr+reviewed-by%3ALoriKarikari" title="Reviewed Pull Requests">👀</a> <a href="#maintenance-LoriKarikari" title="Maintenance">🚧</a> <a href="https://github.com/blitz-js/blitz/commits?author=LoriKarikari" title="Documentation">📖</a></td>
<td align="center"><a href="https://twitter.com/GeggsElias"><img src="https://avatars3.githubusercontent.com/u/22719177?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Elias Johansson</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=eliasjohansson" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/pulls?q=is%3Apr+reviewed-by%3Aeliasjohansson" title="Reviewed Pull Requests">👀</a> <a href="#maintenance-eliasjohansson" title="Maintenance">🚧</a></td>
</tr>
<tr>
<td align="center"><a href="https://fabulas.io"><img src="https://avatars1.githubusercontent.com/u/14793389?v=4" width="100px;" alt=""/><br /><sub><b>Michael Edelman </b></sub></a><br /><a href="#infra-medelman17" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/blitz-js/blitz/commits?author=medelman17" title="Code">💻</a></td>
<td align="center"><a href="http://www.geistinteractive.com"><img src="https://avatars2.githubusercontent.com/u/316792?v=4" width="100px;" alt=""/><br /><sub><b>Todd Geist</b></sub></a><br /><a href="#financial-toddgeist" title="Financial">💵</a></td>
<td align="center"><a href="http://robdrosenberg.com"><img src="https://avatars0.githubusercontent.com/u/20813991?v=4" width="100px;" alt=""/><br /><sub><b>Robert Rosenberg</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=robdrosenberg" title="Code">💻</a> <a href="#maintenance-robdrosenberg" title="Maintenance">🚧</a> <a href="https://github.com/blitz-js/blitz/commits?author=robdrosenberg" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/quirk0o"><img src="https://avatars3.githubusercontent.com/u/5123725?v=4" width="100px;" alt=""/><br /><sub><b>Beata Obrok</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=quirk0o" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/tsawan"><img src="https://avatars3.githubusercontent.com/u/3263082?v=4" width="100px;" alt=""/><br /><sub><b>Tahir Awan</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=tsawan" title="Code">💻</a></td>
<td align="center"><a href="https://raluce.com"><img src="https://avatars1.githubusercontent.com/u/2454632?v=4" width="100px;" alt=""/><br /><sub><b>Camilo Gonzalez</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=camilo86" title="Code">💻</a></td>
<td align="center"><a href="http://da.nielkempner.com"><img src="https://avatars3.githubusercontent.com/u/2532112?v=4" width="100px;" alt=""/><br /><sub><b>Daniel Kempner</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=dkempner" title="Code">💻</a></td>
<td align="center"><a href="https://fabulas.io"><img src="https://avatars1.githubusercontent.com/u/14793389?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Michael Edelman </b></sub></a><br /><a href="#infra-medelman17" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/blitz-js/blitz/commits?author=medelman17" title="Code">💻</a></td>
<td align="center"><a href="http://www.geistinteractive.com"><img src="https://avatars2.githubusercontent.com/u/316792?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Todd Geist</b></sub></a><br /><a href="#financial-toddgeist" title="Financial">💵</a> <a href="https://github.com/blitz-js/blitz/commits?author=toddgeist" title="Code">💻</a></td>
<td align="center"><a href="http://robdrosenberg.com"><img src="https://avatars0.githubusercontent.com/u/20813991?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Robert Rosenberg</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=robdrosenberg" title="Code">💻</a> <a href="#maintenance-robdrosenberg" title="Maintenance">🚧</a> <a href="https://github.com/blitz-js/blitz/commits?author=robdrosenberg" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/quirk0o"><img src="https://avatars3.githubusercontent.com/u/5123725?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Beata Obrok</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=quirk0o" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/tsawan"><img src="https://avatars3.githubusercontent.com/u/3263082?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tahir Awan</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=tsawan" title="Code">💻</a></td>
<td align="center"><a href="https://raluce.com"><img src="https://avatars1.githubusercontent.com/u/2454632?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Camilo Gonzalez</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=camilo86" title="Code">💻</a></td>
<td align="center"><a href="http://da.nielkempner.com"><img src="https://avatars3.githubusercontent.com/u/2532112?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Daniel Kempner</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=dkempner" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="http://gielcobben.com"><img src="https://avatars0.githubusercontent.com/u/2663212?v=4" width="100px;" alt=""/><br /><sub><b>Giel</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=gielcobben" title="Code">💻</a></td>
<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></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=MrLeebo" title="Code">💻</a> <a href="#maintenance-MrLeebo" title="Maintenance">🚧</a> <a href="https://github.com/blitz-js/blitz/commits?author=MrLeebo" title="Tests">⚠️</a></td>
<td align="center"><a href="https://jimthedev.com"><img src="https://avatars0.githubusercontent.com/u/108938?v=4" width="100px;" alt=""/><br /><sub><b>Jim Cummins</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=jimthedev" title="Code">💻</a></td>
<td align="center"><a href="http://kristinamatuska.com/"><img src="https://media-exp1.licdn.com/dms/image/C5603AQHVPAjV21gw9g/profile-displayphoto-shrink_200_200/0?e=1591228800&v=beta&t=0MlbmiYhNvGv1xjLD_fOhOFjVDZ7ltNwfGNeJ4DHedQ" width="100px;" alt=""/><br /><sub><b>Kristina Matuška</b></sub></a><br /><a href="#design" title="Design">🎨</a></td>
<td align="center"><a href="https://github.com/jasonblalock"><img src="https://avatars0.githubusercontent.com/u/5899929?v=4" width="100px;" alt=""/><br /><sub><b>Jason Blalock</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=jasonblalock" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/aej11a"><img src="https://avatars2.githubusercontent.com/u/10066422?v=4" width="100px;" alt=""/><br /><sub><b>aej11a</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=aej11a" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/marcoseoane"><img src="https://avatars0.githubusercontent.com/u/28088807?v=4" width="100px;" alt=""/><br /><sub><b>marcoseoane</b></sub></a><br /><a href="#ideas-marcoseoane" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center"><a href="http://gielcobben.com"><img src="https://avatars0.githubusercontent.com/u/2663212?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Giel</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=gielcobben" title="Code">💻</a></td>
<td align="center"><a href="http://jeremyliberman.com/"><img src="https://avatars3.githubusercontent.com/u/2754163?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jeremy Liberman</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=MrLeebo" title="Code">💻</a> <a href="#maintenance-MrLeebo" title="Maintenance">🚧</a> <a href="https://github.com/blitz-js/blitz/commits?author=MrLeebo" title="Tests">⚠️</a></td>
<td align="center"><a href="https://jimthedev.com"><img src="https://avatars0.githubusercontent.com/u/108938?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jim Cummins</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=jimthedev" title="Code">💻</a></td>
<td align="center"><a href="http://kristinamatuska.com/"><img src="https://media-exp1.licdn.com/dms/image/C5603AQHVPAjV21gw9g/profile-displayphoto-shrink_200_200/0?e=1591228800&v=beta&t=0MlbmiYhNvGv1xjLD_fOhOFjVDZ7ltNwfGNeJ4DHedQ?s=100" width="100px;" alt=""/><br /><sub><b>Kristina Matuška</b></sub></a><br /><a href="#design" title="Design">🎨</a></td>
<td align="center"><a href="https://github.com/jasonblalock"><img src="https://avatars0.githubusercontent.com/u/5899929?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jason Blalock</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=jasonblalock" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/aej11a"><img src="https://avatars2.githubusercontent.com/u/10066422?v=4?s=100" width="100px;" alt=""/><br /><sub><b>aej11a</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=aej11a" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/marcoseoane"><img src="https://avatars0.githubusercontent.com/u/28088807?v=4?s=100" width="100px;" alt=""/><br /><sub><b>marcoseoane</b></sub></a><br /><a href="#ideas-marcoseoane" title="Ideas, Planning, & Feedback">🤔</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/rishabhpoddar"><img src="https://avatars2.githubusercontent.com/u/2976287?v=4" width="100px;" alt=""/><br /><sub><b>Rishabh Poddar</b></sub></a><br /><a href="#ideas-rishabhpoddar" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center"><a href="https://github.com/lorenzorapetti"><img src="https://avatars1.githubusercontent.com/u/2632174?v=4" width="100px;" alt=""/><br /><sub><b>Lorenzo Rapetti</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=lorenzorapetti" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/wKovacs64"><img src="https://avatars1.githubusercontent.com/u/1288694?v=4" width="100px;" alt=""/><br /><sub><b>Justin Hall</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=wKovacs64" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=wKovacs64" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/sijad"><img src="https://avatars3.githubusercontent.com/u/7693001?v=4" width="100px;" alt=""/><br /><sub><b>Sajjad Hashemian</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=sijad" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/ETLopes"><img src="https://avatars3.githubusercontent.com/u/34959471?v=4" width="100px;" alt=""/><br /><sub><b>Eduardo Lopes</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=ETLopes" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/mattleff"><img src="https://avatars0.githubusercontent.com/u/120155?v=4" width="100px;" alt=""/><br /><sub><b>Matthew Leffler</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=mattleff" title="Documentation">📖</a></td>
<td align="center"><a href="https://hew.tools"><img src="https://avatars0.githubusercontent.com/u/3103241?v=4" width="100px;" alt=""/><br /><sub><b>Matt</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=hew" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/rishabhpoddar"><img src="https://avatars2.githubusercontent.com/u/2976287?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Rishabh Poddar</b></sub></a><br /><a href="#ideas-rishabhpoddar" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center"><a href="https://github.com/lorenzorapetti"><img src="https://avatars1.githubusercontent.com/u/2632174?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lorenzo Rapetti</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=lorenzorapetti" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/wKovacs64"><img src="https://avatars1.githubusercontent.com/u/1288694?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Justin Hall</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=wKovacs64" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=wKovacs64" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/sijad"><img src="https://avatars3.githubusercontent.com/u/7693001?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Sajjad Hashemian</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=sijad" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/ETLopes"><img src="https://avatars3.githubusercontent.com/u/34959471?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Eduardo Lopes</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=ETLopes" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/mattleff"><img src="https://avatars0.githubusercontent.com/u/120155?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matthew Leffler</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=mattleff" title="Documentation">📖</a></td>
<td align="center"><a href="https://hew.tools"><img src="https://avatars0.githubusercontent.com/u/3103241?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matt</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=hew" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/sonnypgs"><img src="https://avatars3.githubusercontent.com/u/1431300?v=4" 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" 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="http://twitter.com/JanBaykara"><img src="https://avatars2.githubusercontent.com/u/237556?v=4" 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" 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" 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>
<td align="center"><a href="https://github.com/jclancy93"><img src="https://avatars2.githubusercontent.com/u/7850202?v=4" width="100px;" alt=""/><br /><sub><b>Jack Clancy</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=jclancy93" title="Code">💻</a> <a href="#maintenance-jclancy93" title="Maintenance">🚧</a></td>
<td align="center"><a href="https://github.com/ntgussoni"><img src="https://avatars0.githubusercontent.com/u/10161067?v=4" width="100px;" alt=""/><br /><sub><b>Nicolas Torres</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=ntgussoni" title="Tests">⚠️</a> <a href="https://github.com/blitz-js/blitz/commits?author=ntgussoni" title="Code">💻</a></td>
<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="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>
<td align="center"><a href="https://github.com/jclancy93"><img src="https://avatars2.githubusercontent.com/u/7850202?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jack Clancy</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=jclancy93" title="Code">💻</a> <a href="#maintenance-jclancy93" title="Maintenance">🚧</a></td>
<td align="center"><a href="https://github.com/ntgussoni"><img src="https://avatars0.githubusercontent.com/u/10161067?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Nicolas Torres</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=ntgussoni" title="Tests">⚠️</a> <a href="https://github.com/blitz-js/blitz/commits?author=ntgussoni" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/pulls?q=is%3Apr+reviewed-by%3Antgussoni" title="Reviewed Pull Requests">👀</a></td>
</tr>
<tr>
<td align="center"><a href="http://simonknott.de"><img src="https://avatars1.githubusercontent.com/u/14912729?v=4" width="100px;" alt=""/><br /><sub><b>Simon Knott</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=skn0tt" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=skn0tt" title="Tests">⚠️</a> <a href="#maintenance-skn0tt" title="Maintenance">🚧</a></td>
<td align="center"><a href="http://jagascript.com"><img src="https://avatars0.githubusercontent.com/u/4562878?v=4" width="100px;" alt=""/><br /><sub><b>Jaga Santagostino</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=kandros" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=kandros" title="Documentation">📖</a> <a href="#maintenance-kandros" title="Maintenance">🚧</a></td>
<td align="center"><a href="http://www.joaoportela.com"><img src="https://avatars0.githubusercontent.com/u/1010018?v=4" width="100px;" alt=""/><br /><sub><b>João Portela</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=jportela" title="Code">💻</a></td>
<td align="center"><a href="http://dajin.dev"><img src="https://avatars0.githubusercontent.com/u/7122182?v=4" width="100px;" alt=""/><br /><sub><b>Da-Jin Chu</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=dajinchu" title="Code">💻</a></td>
<td align="center"><a href="https://shinyaigeek.dev/"><img src="https://avatars1.githubusercontent.com/u/42742053?v=4" width="100px;" alt=""/><br /><sub><b>Shinobu Hayashi</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=Shinyaigeek" title="Code">💻</a></td>
<td align="center"><a href="http://karankiri.com"><img src="https://avatars2.githubusercontent.com/u/19989161?v=4" width="100px;" alt=""/><br /><sub><b>Karan Kiri</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=karankiri" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/fullmetalengineer"><img src="https://avatars2.githubusercontent.com/u/5294903?v=4" width="100px;" alt=""/><br /><sub><b>Alan Long</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=fullmetalengineer" title="Documentation">📖</a></td>
<td align="center"><a href="http://simonknott.de"><img src="https://avatars1.githubusercontent.com/u/14912729?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Simon Knott</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=Skn0tt" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=Skn0tt" title="Tests">⚠️</a> <a href="#maintenance-Skn0tt" title="Maintenance">🚧</a></td>
<td align="center"><a href="http://jagascript.com"><img src="https://avatars0.githubusercontent.com/u/4562878?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jaga Santagostino</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=kandros" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=kandros" title="Documentation">📖</a> <a href="#maintenance-kandros" title="Maintenance">🚧</a></td>
<td align="center"><a href="http://www.joaoportela.com"><img src="https://avatars0.githubusercontent.com/u/1010018?v=4?s=100" width="100px;" alt=""/><br /><sub><b>João Portela</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=jportela" title="Code">💻</a></td>
<td align="center"><a href="http://dajin.dev"><img src="https://avatars0.githubusercontent.com/u/7122182?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Da-Jin Chu</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=dajinchu" title="Code">💻</a></td>
<td align="center"><a href="https://shinyaigeek.dev/"><img src="https://avatars1.githubusercontent.com/u/42742053?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Shinobu Hayashi</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=Shinyaigeek" title="Code">💻</a></td>
<td align="center"><a href="http://karankiri.com"><img src="https://avatars2.githubusercontent.com/u/19989161?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Karan Kiri</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=karankiri" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/fullmetalengineer"><img src="https://avatars2.githubusercontent.com/u/5294903?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alan Long</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=fullmetalengineer" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center"><a href="http://codingsh.xyz"><img src="https://avatars2.githubusercontent.com/u/57037080?v=4" width="100px;" alt=""/><br /><sub><b>codingsh</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=developerfred" title="Code">💻</a></td>
<td align="center"><a href="http://twitter.com/peaonunes"><img src="https://avatars0.githubusercontent.com/u/3356720?v=4" width="100px;" alt=""/><br /><sub><b>Rafael Nunes</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/pulls?q=is%3Apr+reviewed-by%3Apeaonunes" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/blitz-js/blitz/commits?author=peaonunes" title="Code">💻</a></td>
<td align="center"><a href="https://simonpeterdebbarma.com"><img src="https://avatars3.githubusercontent.com/u/31207418?v=4" width="100px;" alt=""/><br /><sub><b>Simon Debbarma</b></sub></a><br /><a href="#design-0ww" title="Design">🎨</a> <a href="#maintenance-0ww" title="Maintenance">🚧</a> <a href="https://github.com/blitz-js/blitz/commits?author=0ww" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/0xflotus"><img src="https://avatars3.githubusercontent.com/u/26602940?v=4" width="100px;" alt=""/><br /><sub><b>0xflotus</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=0xflotus" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=0xflotus" title="Documentation">📖</a></td>
<td align="center"><a href="https://dev.to/tmns"><img src="https://avatars3.githubusercontent.com/u/35785003?v=4" width="100px;" alt=""/><br /><sub><b>tmns</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=tmns" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=tmns" title="Documentation">📖</a></td>
<td align="center"><a href="http://jruharris.com"><img src="https://avatars1.githubusercontent.com/u/8636691?v=4" width="100px;" alt=""/><br /><sub><b>Jru Harris</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=harris1717" title="Documentation">📖</a></td>
<td align="center"><a href="https://twitter.com/ivandevp"><img src="https://avatars3.githubusercontent.com/u/9284690?v=4" width="100px;" alt=""/><br /><sub><b>Ivan Medina</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=ivandevp" title="Code">💻</a> <a href="#maintenance-ivandevp" title="Maintenance">🚧</a></td>
<td align="center"><a href="http://codingsh.xyz"><img src="https://avatars2.githubusercontent.com/u/57037080?v=4?s=100" width="100px;" alt=""/><br /><sub><b>codingsh</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=developerfred" title="Code">💻</a></td>
<td align="center"><a href="http://twitter.com/peaonunes"><img src="https://avatars0.githubusercontent.com/u/3356720?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Rafael Nunes</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/pulls?q=is%3Apr+reviewed-by%3Apeaonunes" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/blitz-js/blitz/commits?author=peaonunes" title="Code">💻</a></td>
<td align="center"><a href="https://simonpeterdebbarma.com"><img src="https://avatars3.githubusercontent.com/u/31207418?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Simon Debbarma</b></sub></a><br /><a href="#design-0ww" title="Design">🎨</a> <a href="#maintenance-0ww" title="Maintenance">🚧</a> <a href="https://github.com/blitz-js/blitz/commits?author=0ww" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/0xflotus"><img src="https://avatars3.githubusercontent.com/u/26602940?v=4?s=100" width="100px;" alt=""/><br /><sub><b>0xflotus</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=0xflotus" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=0xflotus" title="Documentation">📖</a></td>
<td align="center"><a href="https://dev.to/tmns"><img src="https://avatars3.githubusercontent.com/u/35785003?v=4?s=100" width="100px;" alt=""/><br /><sub><b>tmns</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=tmns" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=tmns" title="Documentation">📖</a></td>
<td align="center"><a href="http://jruharris.com"><img src="https://avatars1.githubusercontent.com/u/8636691?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jru Harris</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=harris1717" title="Documentation">📖</a></td>
<td align="center"><a href="https://twitter.com/ivandevp"><img src="https://avatars3.githubusercontent.com/u/9284690?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ivan Medina</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=ivandevp" title="Code">💻</a> <a href="#maintenance-ivandevp" title="Maintenance">🚧</a></td>
</tr>
<tr>
<td align="center"><a href="https://www.dwightwatson.com"><img src="https://avatars3.githubusercontent.com/u/1100408?v=4" width="100px;" alt=""/><br /><sub><b>Dwight Watson</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=dwightwatson" title="Code">💻</a></td>
<td align="center"><a href="http://is2ei.com/"><img src="https://avatars3.githubusercontent.com/u/3948353?v=4" width="100px;" alt=""/><br /><sub><b>Horie Issei</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=is2ei" title="Code">💻</a></td>
<td align="center"><a href="https://twitter.com/lednhatkhanh"><img src="https://avatars2.githubusercontent.com/u/9303093?v=4" width="100px;" alt=""/><br /><sub><b>Nhat Khanh</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=lednhatkhanh" title="Code">💻</a></td>
<td align="center"><a href="https://builtforfifty.com"><img src="https://avatars1.githubusercontent.com/u/19371989?v=4" width="100px;" alt=""/><br /><sub><b>Abu Uzayr</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=abuuzayr" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/nabi009"><img src="https://avatars0.githubusercontent.com/u/3170831?v=4" width="100px;" alt=""/><br /><sub><b>Nabiullah elham</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=nabi009" title="Code">💻</a></td>
<td align="center"><a href="https://lachlanjc.com"><img src="https://avatars1.githubusercontent.com/u/5074763?v=4" width="100px;" alt=""/><br /><sub><b>Lachlan Campbell</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=lachlanjc" title="Code">💻</a></td>
<td align="center"><a href="http://enzoferey.com"><img src="https://avatars1.githubusercontent.com/u/10673347?v=4" width="100px;" alt=""/><br /><sub><b>Enzo Ferey</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=enzoferey" title="Code">💻</a></td>
<td align="center"><a href="https://www.dwightwatson.com"><img src="https://avatars3.githubusercontent.com/u/1100408?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dwight Watson</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=dwightwatson" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=dwightwatson" title="Documentation">📖</a></td>
<td align="center"><a href="http://is2ei.com/"><img src="https://avatars3.githubusercontent.com/u/3948353?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Horie Issei</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=is2ei" title="Code">💻</a></td>
<td align="center"><a href="https://twitter.com/lednhatkhanh"><img src="https://avatars2.githubusercontent.com/u/9303093?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Nhat Khanh</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=lednhatkhanh" title="Code">💻</a></td>
<td align="center"><a href="https://builtforfifty.com"><img src="https://avatars1.githubusercontent.com/u/19371989?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Abu Uzayr</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=abuuzayr" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/nabi009"><img src="https://avatars0.githubusercontent.com/u/3170831?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Nabiullah elham</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=nabi009" title="Code">💻</a></td>
<td align="center"><a href="https://lachlanjc.com"><img src="https://avatars1.githubusercontent.com/u/5074763?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lachlan Campbell</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=lachlanjc" title="Code">💻</a></td>
<td align="center"><a href="http://enzoferey.com"><img src="https://avatars1.githubusercontent.com/u/10673347?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Enzo Ferey</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=enzoferey" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/pgrimaud"><img src="https://avatars1.githubusercontent.com/u/1866496?v=4" width="100px;" alt=""/><br /><sub><b>Pierre Grimaud</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=pgrimaud" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/jletey"><img src="https://avatars1.githubusercontent.com/u/62398724?v=4" width="100px;" alt=""/><br /><sub><b>John Letey</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=jletey" title="Code">💻</a></td>
<td align="center"><a href="https://pixelmord.github.io"><img src="https://avatars2.githubusercontent.com/u/224168?v=4" width="100px;" alt=""/><br /><sub><b>Andreas Adam</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=pixelmord" title="Code">💻</a></td>
<td align="center"><a href="https://kevo.dev"><img src="https://avatars3.githubusercontent.com/u/15717067?v=4" width="100px;" alt=""/><br /><sub><b>Kevin Tovar</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=kevotovar" title="Code">💻</a></td>
<td align="center"><a href="http://anteprimorac.com.hr"><img src="https://avatars0.githubusercontent.com/u/972083?v=4" 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" 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" 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></td>
<td align="center"><a href="https://github.com/pgrimaud"><img src="https://avatars1.githubusercontent.com/u/1866496?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Pierre Grimaud</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=pgrimaud" title="Code">💻</a></td>
<td align="center"><a href="https://pixelmord.github.io"><img src="https://avatars2.githubusercontent.com/u/224168?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Andreas Adam</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=pixelmord" title="Code">💻</a></td>
<td align="center"><a href="https://kevo.dev"><img src="https://avatars3.githubusercontent.com/u/15717067?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Kevin Tovar</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=kevotovar" title="Code">💻</a></td>
<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>
</tr>
<tr>
<td align="center"><a href="https://cloudnweb.dev/"><img src="https://avatars0.githubusercontent.com/u/17050715?v=4" 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="http://ramonmorcillo.com"><img src="https://avatars3.githubusercontent.com/u/31936665?v=4" 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>
<td align="center"><a href="https://www.linkedin.com/in/gregory-vasquez-96413b184/"><img src="https://avatars1.githubusercontent.com/u/36422346?v=4" width="100px;" alt=""/><br /><sub><b>gvasquez11</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=gvasquez11" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/josemiguelo"><img src="https://avatars1.githubusercontent.com/u/15330034?v=4" width="100px;" alt=""/><br /><sub><b> José Miguel Ochoa</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=josemiguelo" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/osirvent"><img src="https://avatars2.githubusercontent.com/u/5927133?v=4" width="100px;" alt=""/><br /><sub><b>Oscar Sirvent</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=osirvent" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=osirvent" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/donni106"><img src="https://avatars0.githubusercontent.com/u/1942953?v=4" width="100px;" alt=""/><br /><sub><b>Daniel Molnar</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=donni106" title="Documentation">📖</a> <a href="https://github.com/blitz-js/blitz/commits?author=donni106" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/exclipy"><img src="https://avatars1.githubusercontent.com/u/508799?v=4" width="100px;" alt=""/><br /><sub><b>Kevin Wu Won</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=exclipy" title="Documentation">📖</a></td>
<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>
<td align="center"><a href="https://www.linkedin.com/in/gregory-vasquez-96413b184/"><img src="https://avatars1.githubusercontent.com/u/36422346?v=4?s=100" width="100px;" alt=""/><br /><sub><b>gvasquez11</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=gvasquez11" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/josemiguelo"><img src="https://avatars1.githubusercontent.com/u/15330034?v=4?s=100" width="100px;" alt=""/><br /><sub><b> José Miguel Ochoa</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=josemiguelo" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/osirvent"><img src="https://avatars2.githubusercontent.com/u/5927133?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Oscar Sirvent</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=osirvent" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=osirvent" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/donni106"><img src="https://avatars0.githubusercontent.com/u/1942953?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Daniel Molnar</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=donni106" title="Documentation">📖</a> <a href="https://github.com/blitz-js/blitz/commits?author=donni106" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/exclipy"><img src="https://avatars1.githubusercontent.com/u/508799?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Kevin Wu Won</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=exclipy" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/tehnuge"><img src="https://avatars1.githubusercontent.com/u/1928236?v=4?s=100" width="100px;" alt=""/><br /><sub><b>John Duong</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=tehnuge" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/tehnuge"><img src="https://avatars1.githubusercontent.com/u/1928236?v=4" width="100px;" alt=""/><br /><sub><b>John Duong</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=tehnuge" title="Code">💻</a></td>
<td align="center"><a href="https://noahfleischmann.com"><img src="https://avatars0.githubusercontent.com/u/23707137?v=4" width="100px;" alt=""/><br /><sub><b>Noah Fleischmann</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=fnoah" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/toshi1127"><img src="https://avatars3.githubusercontent.com/u/32378535?v=4" width="100px;" alt=""/><br /><sub><b>Matsumoto Toshi</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=toshi1127" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=toshi1127" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/simonedelmann"><img src="https://avatars2.githubusercontent.com/u/2821076?v=4" width="100px;" alt=""/><br /><sub><b>Simon Edelmann</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=simonedelmann" title="Code">💻</a></td>
<td align="center"><a href="https://shaun.church"><img src="https://avatars3.githubusercontent.com/u/571764?v=4" width="100px;" alt=""/><br /><sub><b>Shaun Church</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=shaunchurch" title="Documentation">📖</a> <a href="https://github.com/blitz-js/blitz/commits?author=shaunchurch" title="Code">💻</a></td>
<td align="center"><a href="https://styfle.dev"><img src="https://avatars1.githubusercontent.com/u/229881?v=4" width="100px;" alt=""/><br /><sub><b>Steven</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=styfle" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/SigurdMW"><img src="https://avatars3.githubusercontent.com/u/6359003?v=4" width="100px;" alt=""/><br /><sub><b>Sigurd Moland Wahl</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=SigurdMW" title="Code">💻</a></td>
<td align="center"><a href="https://noahfleischmann.com"><img src="https://avatars0.githubusercontent.com/u/23707137?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Noah Fleischmann</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=fnoah" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/toshi1127"><img src="https://avatars3.githubusercontent.com/u/32378535?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matsumoto Toshi</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=toshi1127" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=toshi1127" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/simonedelmann"><img src="https://avatars2.githubusercontent.com/u/2821076?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Simon Edelmann</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=simonedelmann" title="Code">💻</a></td>
<td align="center"><a href="https://shaun.church"><img src="https://avatars3.githubusercontent.com/u/571764?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Shaun Church</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=shaunchurch" title="Documentation">📖</a> <a href="https://github.com/blitz-js/blitz/commits?author=shaunchurch" title="Code">💻</a></td>
<td align="center"><a href="https://styfle.dev"><img src="https://avatars1.githubusercontent.com/u/229881?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Steven</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=styfle" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/SigurdMW"><img src="https://avatars3.githubusercontent.com/u/6359003?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Sigurd Moland Wahl</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=SigurdMW" title="Code">💻</a></td>
<td align="center"><a href="https://brianandrews.dev/"><img src="https://avatars1.githubusercontent.com/u/6384100?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Brian Andrews</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=sbardian" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center"><a href="https://brianandrews.dev/"><img src="https://avatars1.githubusercontent.com/u/6384100?v=4" width="100px;" alt=""/><br /><sub><b>Brian Andrews</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=sbardian" title="Documentation">📖</a></td>
<td align="center"><a href="http://garrisonsnelling.com"><img src="https://avatars0.githubusercontent.com/u/5100597?v=4" width="100px;" alt=""/><br /><sub><b>Garrison Snelling</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=garrisons" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/tylangesmith"><img src="https://avatars1.githubusercontent.com/u/22609577?v=4" width="100px;" alt=""/><br /><sub><b>Ty Lange-Smith</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=tylangesmith" title="Code">💻</a></td>
<td align="center"><a href="http://garrisonsnelling.com"><img src="https://avatars0.githubusercontent.com/u/5100597?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Garrison Snelling</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=garrisons" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/tylangesmith"><img src="https://avatars1.githubusercontent.com/u/22609577?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ty Lange-Smith</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=tylangesmith" title="Code">💻</a></td>
<td align="center"><a href="https://rubenmoya.dev"><img src="https://avatars3.githubusercontent.com/u/905225?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Rubén Moya</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=rubenmoya" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=rubenmoya" title="Tests">⚠️</a></td>
<td align="center"><a href="https://github.com/robertgrzonka"><img src="https://avatars0.githubusercontent.com/u/35585466?v=4?s=100" width="100px;" alt=""/><br /><sub><b>robertgrzonka</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=robertgrzonka" title="Code">💻</a> <a href="#infra-robertgrzonka" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
<td align="center"><a href="https://github.com/agoxlea"><img src="https://avatars3.githubusercontent.com/u/1240841?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alex Orr</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=agoxlea" title="Code">💻</a></td>
<td align="center"><a href="https://christse.io"><img src="https://avatars1.githubusercontent.com/u/250450?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Chris Tse</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=chris-tse" title="Code">💻</a></td>
<td align="center"><a href="http://twitter.com/nettofarah"><img src="https://avatars1.githubusercontent.com/u/270688?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Netto Farah</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=nettofarah" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/rohanjulka19"><img src="https://avatars0.githubusercontent.com/u/19673968?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Rohan Julka</b></sub></a><br /><a href="#infra-rohanjulka19" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
<td align="center"><a href="https://www.ivansantos.me"><img src="https://avatars3.githubusercontent.com/u/301291?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ivan Santos</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=pragmaticivan" title="Code">💻</a></td>
<td align="center"><a href="https://able.bio"><img src="https://avatars0.githubusercontent.com/u/12991390?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Soumyajit Pathak</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=drenther" title="Code">💻</a></td>
<td align="center"><a href="http://www.sebastiankurpiel.com"><img src="https://avatars2.githubusercontent.com/u/16307737?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Sebastian Kurpiel</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=SebastianKurp" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/scisteffan"><img src="https://avatars2.githubusercontent.com/u/2676185?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Steffan</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=scisteffan" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=scisteffan" title="Documentation">📖</a> <a href="#financial-scisteffan" title="Financial">💵</a></td>
<td align="center"><a href="https://github.com/kripod"><img src="https://avatars3.githubusercontent.com/u/14854048?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Kristóf Poduszló</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=kripod" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/Weilbyte"><img src="https://avatars1.githubusercontent.com/u/43392677?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Weilbyte</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=Weilbyte" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=Weilbyte" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center"><a href="http://ricardotrejos.tech"><img src="https://avatars1.githubusercontent.com/u/8602086?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ricardo Trejos</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=cardotrejos" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=cardotrejos" title="Documentation">📖</a></td>
<td align="center"><a href="https://gkaragkiaouris.tech/"><img src="https://avatars0.githubusercontent.com/u/8822835?v=4?s=100" width="100px;" alt=""/><br /><sub><b>George Karagkiaouris</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=karaggeorge" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=karaggeorge" title="Documentation">📖</a></td>
<td align="center"><a href="https://www.linkedin.com/in/brady-pascoe-3bba6b13a/"><img src="https://avatars0.githubusercontent.com/u/18705892?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Brady Pascoe</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=bpas247" title="Code">💻</a></td>
<td align="center"><a href="https://www.yeahcoach.com"><img src="https://avatars1.githubusercontent.com/u/761766?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jirka Svoboda</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=svobik7" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/alan2207"><img src="https://avatars3.githubusercontent.com/u/12713315?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alan Alickovic</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=alan2207" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=alan2207" title="Documentation">📖</a></td>
<td align="center"><a href="https://yngve.hoiseth.net"><img src="https://avatars0.githubusercontent.com/u/8469540?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Yngve Høiseth</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=yhoiseth" title="Documentation">📖</a></td>
<td align="center"><a href="https://twitter.com/bruno_crosier"><img src="https://avatars1.githubusercontent.com/u/18399089?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Bruno Crosier</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=brunocrosier" title="Documentation">📖</a></td>
</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://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>
<td align="center"><a href="https://github.com/sirmyron"><img src="https://avatars2.githubusercontent.com/u/1430136?v=4?s=100" width="100px;" alt=""/><br /><sub><b>sirmyron</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=sirmyron" title="Documentation">📖</a> <a href="https://github.com/blitz-js/blitz/commits?author=sirmyron" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/engelkes-finstreet"><img src="https://avatars1.githubusercontent.com/u/36962022?v=4?s=100" width="100px;" alt=""/><br /><sub><b>engelkes-finstreet</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=engelkes-finstreet" title="Documentation">📖</a> <a href="https://github.com/blitz-js/blitz/commits?author=engelkes-finstreet" title="Code">💻</a> <a href="#maintenance-engelkes-finstreet" title="Maintenance">🚧</a></td>
</tr>
<tr>
<td align="center"><a href="http://twitter.com/pixelscommander"><img src="https://avatars2.githubusercontent.com/u/810671?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Denis Radin</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/pulls?q=is%3Apr+reviewed-by%3APixelsCommander" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/blitz-js/blitz/commits?author=PixelsCommander" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=PixelsCommander" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/xiaoyu-tamu"><img src="https://avatars3.githubusercontent.com/u/33362998?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Michael Li</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=xiaoyu-tamu" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/yuta0801"><img src="https://avatars2.githubusercontent.com/u/21266306?v=4?s=100" width="100px;" alt=""/><br /><sub><b>yuta0801</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=yuta0801" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/Obii-bit"><img src="https://avatars2.githubusercontent.com/u/67339820?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Obadja Ris</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=Obii-bit" title="Documentation">📖</a></td>
<td align="center"><a href="http://jfelix.info"><img src="https://avatars2.githubusercontent.com/u/21092519?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jose Felix </b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=JoseRFelix" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/johncantrell97"><img src="https://avatars3.githubusercontent.com/u/41305919?v=4?s=100" width="100px;" alt=""/><br /><sub><b>John Cantrell</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=johncantrell97" title="Code">💻</a></td>
<td align="center"><a href="http://kwuang.me"><img src="https://avatars1.githubusercontent.com/u/10319942?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Kwuang Tang</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=cktang88" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/johnletey"><img src="https://avatars1.githubusercontent.com/u/62398724?v=4?s=100" width="100px;" alt=""/><br /><sub><b>John Letey</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=johnletey" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/ditorojuan"><img src="https://avatars0.githubusercontent.com/u/22530892?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Juan Di Toro</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=ditorojuan" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/taylorcjohnson"><img src="https://avatars0.githubusercontent.com/u/10552296?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Taylor Johnson</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=taylorcjohnson" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=taylorcjohnson" title="Documentation">📖</a></td>
<td align="center"><a href="https://twitter.com/tsriram"><img src="https://avatars3.githubusercontent.com/u/450559?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Sriram Thiagarajan</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=tsriram" title="Documentation">📖</a></td>
<td align="center"><a href="https://sergiodxa.com"><img src="https://avatars2.githubusercontent.com/u/1312018?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Sergio Xalambrí</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=sergiodxa" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/doeixd"><img src="https://avatars3.githubusercontent.com/u/13461122?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Patrick G</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=doeixd" title="Code">💻</a></td>
<td align="center"><a href="http://avinash.com.np"><img src="https://avatars3.githubusercontent.com/u/513457?v=4?s=100" width="100px;" alt=""/><br /><sub><b>अभिनाश (Avinash)</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=hardfire" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="http://enricoschaaf.com"><img src="https://avatars1.githubusercontent.com/u/54645197?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Enrico Schaaf</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=enricoschaaf" title="Code">💻</a></td>
<td align="center"><a href="http://kitze.io"><img src="https://avatars0.githubusercontent.com/u/1160594?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Kitze</b></sub></a><br /><a href="#ideas-kitze" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center"><a href="https://github.com/drmas"><img src="https://avatars3.githubusercontent.com/u/644440?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mohamed Shaban</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=drmas" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/jorisre"><img src="https://avatars1.githubusercontent.com/u/7545547?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Joris</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=jorisre" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/Kamshak"><img src="https://avatars3.githubusercontent.com/u/337968?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Valentin Funk</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=Kamshak" title="Documentation">📖</a></td>
<td align="center"><a href="https://lukebennett.com"><img src="https://avatars1.githubusercontent.com/u/135390?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Luke Bennett</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=lukebennett" title="Code">💻</a></td>
<td align="center"><a href="https://haseebmajid.dev"><img src="https://avatars0.githubusercontent.com/u/998807?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Haseeb Majid</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=hmajid2301" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/phillippschmedt"><img src="https://avatars0.githubusercontent.com/u/16028406?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Phillipp Schmedt</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=phillippschmedt" title="Code">💻</a></td>
<td align="center"><a href="https://haspar.us"><img src="https://avatars0.githubusercontent.com/u/15332326?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Piotr Monwid-Olechnowicz</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=hasparus" title="Code">💻</a></td>
<td align="center"><a href="https://mizchi.dev"><img src="https://avatars2.githubusercontent.com/u/73962?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Kotaro Chikuba</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=mizchi" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=mizchi" title="Tests">⚠️</a></td>
<td align="center"><a href="https://github.com/konradkalemba"><img src="https://avatars0.githubusercontent.com/u/8682104?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Konrad Kalemba</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=konradkalemba" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/Alucard17"><img src="https://avatars1.githubusercontent.com/u/26205172?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alucard17</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=Alucard17" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/Dohxis"><img src="https://avatars2.githubusercontent.com/u/8768909?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Domantas Mauruča</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=Dohxis" title="Tests">⚠️</a> <a href="https://github.com/blitz-js/blitz/commits?author=Dohxis" title="Code">💻</a></td>
<td align="center"><a href="https://sandulat.com/"><img src="https://avatars0.githubusercontent.com/u/7345874?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Stratulat Alexandru</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=sandulat" title="Code">💻</a> <a href="#maintenance-sandulat" title="Maintenance">🚧</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/aericson"><img src="https://avatars3.githubusercontent.com/u/692542?v=4?s=100" width="100px;" alt=""/><br /><sub><b>André Ericson</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=aericson" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=aericson" title="Documentation">📖</a></td>
<td align="center"><a href="http://Cajotafer.com"><img src="https://avatars2.githubusercontent.com/u/41461969?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Carlos Fernández</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=cajotafer" title="Documentation">📖</a></td>
<td align="center"><a href="https://oesterkilde.dk/"><img src="https://avatars1.githubusercontent.com/u/6379824?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Kevin Østerkilde</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=Kosai106" title="Documentation">📖</a> <a href="https://github.com/blitz-js/blitz/commits?author=Kosai106" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/aaronfulkerson"><img src="https://avatars0.githubusercontent.com/u/31112737?v=4?s=100" width="100px;" alt=""/><br /><sub><b>aaronfulkerson</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=aaronfulkerson" title="Code">💻</a> <a href="#question-aaronfulkerson" title="Answering Questions">💬</a></td>
<td align="center"><a href="https://github.com/alexnaiman"><img src="https://avatars3.githubusercontent.com/u/25799714?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alexandru Naiman</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=alexnaiman" title="Code">💻</a></td>
<td align="center"><a href="https://davidlutta.github.io/portfolio/"><img src="https://avatars2.githubusercontent.com/u/14890315?v=4?s=100" width="100px;" alt=""/><br /><sub><b>David Ezekiel Lutta</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=davidlutta" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/wanjuntham"><img src="https://avatars1.githubusercontent.com/u/49380551?v=4?s=100" width="100px;" alt=""/><br /><sub><b>wanjuntham</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=wanjuntham" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="http://www.nahuelchaves.xyz"><img src="https://avatars3.githubusercontent.com/u/96837?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Victor Nahuel Chaves</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=nahue" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/peter50216"><img src="https://avatars3.githubusercontent.com/u/891109?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Peter Shih</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=peter50216" title="Code">💻</a></td>
<td align="center"><a href="http://seweryn.kale.mba"><img src="https://avatars3.githubusercontent.com/u/37031328?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Seweryn Kalemba</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=sewerynkalemba" title="Code">💻</a></td>
<td align="center"><a href="https://nksaraf.github.io"><img src="https://avatars2.githubusercontent.com/u/11255148?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Nikhil Saraf</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=nksaraf" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=nksaraf" title="Documentation">📖</a></td>
<td align="center"><a href="https://zane.sh"><img src="https://avatars0.githubusercontent.com/u/16865690?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Zane</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=zanedb" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/dulcehc"><img src="https://avatars1.githubusercontent.com/u/19391835?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dulce Hernández</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=dulcehc" title="Code">💻</a></td>
<td align="center"><a href="https://markhaehnel.de"><img src="https://avatars2.githubusercontent.com/u/1516205?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mark Hähnel</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=markhaehnel" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="http://stackoverflow.com/users/872395/nemesv"><img src="https://avatars0.githubusercontent.com/u/251330?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Viktor Nemes</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=nemesv" title="Code">💻</a></td>
<td align="center"><a href="http://gabeoleary.com"><img src="https://avatars1.githubusercontent.com/u/16123225?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Gabe O'Leary</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=goleary" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/machadolucasvp"><img src="https://avatars0.githubusercontent.com/u/44952113?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lucas Machado</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=machadolucasvp" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/maciekgrzybek"><img src="https://avatars2.githubusercontent.com/u/16546428?v=4?s=100" width="100px;" alt=""/><br /><sub><b>maciek_grzybek</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=maciekgrzybek" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/mweibel"><img src="https://avatars1.githubusercontent.com/u/307427?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Michael Weibel</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=mweibel" title="Code">💻</a></td>
<td align="center"><a href="https://isoppp.com"><img src="https://avatars0.githubusercontent.com/u/16318727?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Hiroki Isogai</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=isoppp" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/matamatanot"><img src="https://avatars2.githubusercontent.com/u/39780486?v=4?s=100" width="100px;" alt=""/><br /><sub><b>matamatanot</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=matamatanot" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/ericsakmar"><img src="https://avatars3.githubusercontent.com/u/5620709?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Eric Sakmar</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=ericsakmar" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/leggsimon"><img src="https://avatars2.githubusercontent.com/u/11544418?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Simon Legg</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=leggsimon" title="Documentation">📖</a></td>
<td align="center"><a href="https://robsoriano.com"><img src="https://avatars3.githubusercontent.com/u/13049130?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Robert Soriano</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=wobsoriano" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/benediktms"><img src="https://avatars2.githubusercontent.com/u/48836135?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Benedikt Schnatterbeck</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=benediktms" title="Code">💻</a></td>
<td align="center"><a href="http://taloranderson.com"><img src="https://avatars2.githubusercontent.com/u/11509865?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Talor Anderson</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=Talor-A" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/akirabaruah"><img src="https://avatars2.githubusercontent.com/u/6751517?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Akira Baruah</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=akirabaruah" title="Code">💻</a></td>
<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="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>
<td align="center"><a href="https://github.com/rayandrews"><img src="https://avatars1.githubusercontent.com/u/4437323?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ray Andrew</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=rayandrews" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=rayandrews" title="Documentation">📖</a></td>
<td align="center"><a href="http://Dal.Design"><img src="https://avatars3.githubusercontent.com/u/43112535?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Abdullah Mzaien</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=Mzaien" title="Code">💻</a></td>
<td align="center"><a href="http://kwao.io"><img src="https://avatars2.githubusercontent.com/u/8839514?v=4?s=100" width="100px;" alt=""/><br /><sub><b>William Kwao</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=williamkwao" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/sakulstra"><img src="https://avatars3.githubusercontent.com/u/4396533?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lukas Strassel</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=sakulstra" title="Code">💻</a></td>
<td align="center"><a href="https://thibpat.com"><img src="https://avatars3.githubusercontent.com/u/494686?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Thibaut Patel</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=tpatel" title="Code">💻</a></td>
<td align="center"><a href="http://jonstuebe.com"><img src="https://avatars0.githubusercontent.com/u/156722?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jon Stuebe</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=jonstuebe" title="Code">💻</a></td>
<td align="center"><a href="https://ugogo.dev"><img src="https://avatars2.githubusercontent.com/u/5040476?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ugo Onali</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=ugogo" title="Documentation">📖</a></td>
<td align="center"><a href="https://saintmalik.me"><img src="https://avatars1.githubusercontent.com/u/37118134?v=4?s=100" width="100px;" alt=""/><br /><sub><b>SaintMalik</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=saintmalik" title="Documentation">📖</a></td>
<td align="center"><a href="https://khaledgarbaya.net"><img src="https://avatars1.githubusercontent.com/u/1156093?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Khaled Garbaya</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=Khaledgarbaya" title="Code">💻</a></td>
<td align="center"><a href="https://tundera.dev"><img src="https://avatars0.githubusercontent.com/u/61833561?v=4?s=100" width="100px;" alt=""/><br /><sub><b>tundera</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=tundera" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/markylaing"><img src="https://avatars2.githubusercontent.com/u/41469221?v=4?s=100" width="100px;" alt=""/><br /><sub><b>markylaing</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=markylaing" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=markylaing" title="Documentation">📖</a></td>
<td align="center"><a href="https://akfm.dev/"><img src="https://avatars2.githubusercontent.com/u/25711332?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Akifumi Sato</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=AkifumiSato" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/beeplin"><img src="https://avatars3.githubusercontent.com/u/13058150?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Beep LIN</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=beeplin" title="Code">💻</a></td>
<td align="center"><a href="https://mattwood.tech/"><img src="https://avatars1.githubusercontent.com/u/22530815?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matt Wood</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=mattfwood" title="Code">💻</a></td>
<td align="center"><a href="http://joaquin.axai.mx"><img src="https://avatars1.githubusercontent.com/u/15214?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Joaquin Bravo Contreras</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=jackbravo" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/arjundubey-cr"><img src="https://avatars0.githubusercontent.com/u/40758425?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Arjun Dubey</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=arjundubey-cr" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/chanand"><img src="https://avatars0.githubusercontent.com/u/1317789?v=4?s=100" width="100px;" alt=""/><br /><sub><b>chanand</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=chanand" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/phillipkregg"><img src="https://avatars0.githubusercontent.com/u/1066044?v=4?s=100" width="100px;" alt=""/><br /><sub><b>phillipkregg</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=phillipkregg" title="Documentation">📖</a></td>
<td align="center"><a href="http://timothyreynolds.co.uk"><img src="https://avatars1.githubusercontent.com/u/168870?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tim Reynolds</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=timReynolds" title="Documentation">📖</a></td>
<td align="center"><a href="https://linbudu.top/"><img src="https://avatars0.githubusercontent.com/u/48507806?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Linbudu</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=linbudu599" title="Documentation">📖</a></td>
<td align="center"><a href="http://www.superservice-international.com"><img src="https://avatars0.githubusercontent.com/u/6090492?v=4?s=100" width="100px;" alt=""/><br /><sub><b>C Reimers</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=creimers" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/kyken"><img src="https://avatars2.githubusercontent.com/u/20137120?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tsuyoshi Osawa</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=kyken" title="Code">💻</a></td>
<td align="center"><a href="https://rembrandtreyes.com/"><img src="https://avatars1.githubusercontent.com/u/15057964?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Rembrandt Reyes</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=rembrandtreyes" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=rembrandtreyes" title="Documentation">📖</a> <a href="https://github.com/blitz-js/blitz/commits?author=rembrandtreyes" title="Tests">⚠️</a></td>
<td align="center"><a href="https://doi-t.net"><img src="https://avatars2.githubusercontent.com/u/5877477?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Toshiya Doi</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=doi-t" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center"><a href="https://www.koolii.net/"><img src="https://avatars1.githubusercontent.com/u/3866581?v=4?s=100" width="100px;" alt=""/><br /><sub><b>t.kuriyama</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=koolii" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/malkomalko"><img src="https://avatars3.githubusercontent.com/u/763?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Robert Malko</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=malkomalko" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/ranjan-purbey"><img src="https://avatars3.githubusercontent.com/u/6953187?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ranjan Purbey</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=ranjan-purbey" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/tarunama"><img src="https://avatars3.githubusercontent.com/u/6047881?v=4?s=100" width="100px;" alt=""/><br /><sub><b>tarunama</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=tarunama" title="Code">💻</a></td>
<td align="center"><a href="http://www.bacongravy.net/"><img src="https://avatars3.githubusercontent.com/u/16848768?v=4?s=100" width="100px;" alt=""/><br /><sub><b>David Kramer</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=bacongravy" title="Code">💻</a></td>
<td align="center"><a href="https://mikeesto.com"><img src="https://avatars1.githubusercontent.com/u/21051488?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Michael Esteban</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=mikeesto" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/marina-ki"><img src="https://avatars0.githubusercontent.com/u/54174518?v=4?s=100" width="100px;" alt=""/><br /><sub><b>marina</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=marina-ki" title="Documentation">📖</a> <a href="https://github.com/blitz-js/blitz/commits?author=marina-ki" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/jonasthiesen"><img src="https://avatars.githubusercontent.com/u/23408018?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jonas Thiesen</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=jonasthiesen" title="Documentation">📖</a></td>
<td align="center"><a href="https://thakkaryash94.github.io/"><img src="https://avatars.githubusercontent.com/u/7349778?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Yash Thakkar</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=thakkaryash94" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/rince"><img src="https://avatars.githubusercontent.com/u/933895?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Kazuma Suzuki</b></sub></a><br /><a href="#design-rince" title="Design">🎨</a> <a href="https://github.com/blitz-js/blitz/commits?author=rince" title="Code">💻</a></td>
<td align="center"><a href="http://queq1890.info"><img src="https://avatars.githubusercontent.com/u/32263803?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Yuji Matsumoto</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=queq1890" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/Gim3l"><img src="https://avatars.githubusercontent.com/u/46765702?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Gimel Dick</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=Gim3l" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/akbo"><img src="https://avatars.githubusercontent.com/u/1926271?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Andreas Bollig</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=akbo" title="Code">💻</a></td>
<td align="center"><a href="https://ajm.codes"><img src="https://avatars.githubusercontent.com/u/66390428?v=4?s=100" width="100px;" alt=""/><br /><sub><b>AJ Markow</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=ajmarkow" title="Tests">⚠️</a> <a href="https://github.com/blitz-js/blitz/commits?author=ajmarkow" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="https://wafuwafu13.hateblo.jp/"><img src="https://avatars.githubusercontent.com/u/50798936?v=4?s=100" width="100px;" alt=""/><br /><sub><b>TagawaHirotaka</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=wafuwafu13" title="Code">💻</a> <a href="https://github.com/blitz-js/blitz/commits?author=wafuwafu13" title="Tests">⚠️</a></td>
<td align="center"><a href="https://github.com/merodiro"><img src="https://avatars.githubusercontent.com/u/17033502?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Amr A.Mohammed</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=merodiro" title="Code">💻</a></td>
<td align="center"><a href="http://www.lucaswillems.com"><img src="https://avatars.githubusercontent.com/u/5437552?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lucas Willems</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=lcswillems" title="Documentation">📖</a> <a href="https://github.com/blitz-js/blitz/commits?author=lcswillems" title="Code">💻</a></td>
<td align="center"><a href="https://alistair.cloud"><img src="https://avatars.githubusercontent.com/u/25351731?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alistair Smith</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=alii" title="Code">💻</a></td>
<td align="center"><a href="https://rodrigoehlers.com"><img src="https://avatars.githubusercontent.com/u/19683042?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Rodrigo Ehlers</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=rodrigoehlers" title="Code">💻</a></td>
<td align="center"><a href="https://www.builtopen.com/"><img src="https://avatars.githubusercontent.com/u/1734057?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Michael Ford</b></sub></a><br /><a href="https://github.com/blitz-js/blitz/commits?author=mtford90" title="Code">💻</a></td>
</tr>
</table>
<!-- markdownlint-enable -->
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!

BIN
assets/andreas.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

@@ -1,11 +1,3 @@
module.exports = {
extends: ["react-app", "plugin:jsx-a11y/recommended"],
plugins: ["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
"jsx-a11y/label-has-associated-control": "off", //Doesn't play well with form libraries
},
extends: ["blitz"],
}

View File

@@ -53,3 +53,5 @@ lib-cov
# Stores VSCode versions used for testing VSCode extensions
.vscode-test
.vercel

View File

@@ -0,0 +1,2 @@
.blitz
*.sqlite

View File

@@ -14,13 +14,13 @@ model Project {
2. DB migrate
```
blitz db migrate
blitz prisma migrate dev --preview-feature
```
3. Start the dev server
```
blitz start
blitz dev
```
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.

View File

@@ -0,0 +1,143 @@
import {passportAuth, PublicData} from "blitz"
import db from "db"
import {Strategy as TwitterStrategy} from "passport-twitter"
import {Strategy as GitHubStrategy} from "passport-github2"
import {Strategy as Auth0Strategy} from "passport-auth0"
import {Role} from "types"
function assert(condition: any, message: string): asserts condition {
if (!condition) throw new Error(message)
}
// These aren't required, but this is a good practice to ensure you have the env vars you need
assert(process.env.TWITTER_CONSUMER_KEY, "You must provide the TWITTER_CONSUMER_KEY env variable")
assert(
process.env.TWITTER_CONSUMER_SECRET,
"You must provide the TWITTER_CONSUMER_SECRET env variable",
)
assert(process.env.GITHUB_CLIENT_ID, "You must provide the GITHUB_CLIENT_ID env variable")
assert(process.env.GITHUB_CLIENT_SECRET, "You must provide the GITHUB_CLIENT_SECRET env variable")
assert(process.env.AUTH0_DOMAIN, "You must provide the AUTH0_DOMAIN env variable")
assert(process.env.AUTH0_CLIENT_ID, "You must provide the AUTH0_CLIENT_ID env variable")
assert(process.env.AUTH0_CLIENT_SECRET, "You must provide the AUTH0_CLIENT_SECRET env variable")
export default passportAuth({
successRedirectUrl: "/",
strategies: [
{
strategy: new TwitterStrategy(
{
consumerKey: process.env.TWITTER_CONSUMER_KEY,
consumerSecret: process.env.TWITTER_CONSUMER_SECRET,
callbackURL:
process.env.NODE_ENV === "production"
? "https://auth-example-flybayer.blitzjs.vercel.app/api/auth/twitter/callback"
: "http://localhost:3000/api/auth/twitter/callback",
includeEmail: true,
},
async function (_token, _tokenSecret, profile, done) {
const email = profile.emails && profile.emails[0]?.value
if (!email) {
// This can happen if you haven't enabled email access in your twitter app permissions
return done(new Error("Twitter OAuth response doesn't have email."))
}
const user = await db.user.upsert({
where: {email},
create: {
email,
name: profile.displayName,
},
update: {email},
})
const publicData = {userId: user.id, roles: [user.role], source: "twitter"}
done(null, {publicData})
},
),
},
{
strategy: new GitHubStrategy(
{
clientID: process.env.GITHUB_CLIENT_ID,
clientSecret: process.env.GITHUB_CLIENT_SECRET,
callbackURL:
process.env.NODE_ENV === "production"
? "https://auth-example-flybayer.blitzjs.vercel.app/api/auth/github/callback"
: "http://localhost:3000/api/auth/github/callback",
},
async function (
_token: string,
_tokenSecret: string,
profile: any,
done: (err: Error | null, data?: {publicData: PublicData}) => void,
) {
const email = profile.emails && profile.emails[0]?.value
if (!email) {
// This can happen if you haven't enabled email access in your twitter app permissions
return done(new Error("Twitter OAuth response doesn't have email."))
}
const user = await db.user.upsert({
where: {email},
create: {
email,
name: profile.displayName,
},
update: {email},
})
const publicData = {
userId: user.id,
roles: [user.role as Role],
source: "github",
githubUsername: profile.username,
}
done(null, {publicData})
},
),
},
{
authenticateOptions: {scope: "openid email profile"},
strategy: new Auth0Strategy(
{
domain: process.env.AUTH0_DOMAIN,
clientID: process.env.AUTH0_CLIENT_ID,
clientSecret: process.env.AUTH0_CLIENT_SECRET,
callbackURL:
process.env.NODE_ENV === "production"
? "https://auth-example-flybayer.blitzjs.vercel.app/api/auth/auth0/callback"
: "http://localhost:3000/api/auth/auth0/callback",
},
async function (_token, _tokenSecret, _extraParams, profile, done) {
const email = profile.emails && profile.emails[0]?.value
if (!email) {
// This can happen if you haven't enabled email access in your twitter app permissions
return done(new Error("Auth0 response doesn't have email."))
}
const user = await db.user.upsert({
where: {email},
create: {
email,
name: profile.displayName,
},
update: {email},
})
const publicData = {
userId: user.id,
roles: [user.role],
source: "auth0",
githubUsername: profile.username,
}
done(undefined, {publicData})
},
),
},
],
})

View File

@@ -1,32 +1,30 @@
import React from "react"
import {LabeledTextField} from "app/components/LabeledTextField"
import {Form} from "react-final-form"
import {FORM_ERROR} from "final-form"
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
initialValues={{email: undefined, password: undefined}}
validate={(values) => {
const errors: {email?: string; password?: string} = {}
if (!values.email) errors.email = "Required"
if (!values.password) errors.password = "Required"
return errors
}}
submitText="Login"
schema={Login}
initialValues={{email: "", password: ""}}
onSubmit={async (values) => {
try {
await login({email: values.email, password: values.password})
props.onSuccess && props.onSuccess()
await loginMutation(values)
props.onSuccess?.()
} catch (error) {
if (error.name === "AuthenticationError") {
if (error instanceof AuthenticationError) {
return {[FORM_ERROR]: "Sorry, those credentials are invalid"}
} else {
return {
@@ -36,34 +34,19 @@ export const LoginForm = (props: LoginFormProps) => {
}
}
}}
render={({handleSubmit, submitting, submitError}) => (
<form onSubmit={handleSubmit} className="login-form">
<LabeledTextField name="email" label="Email" placeholder="Email" />
<LabeledTextField
name="password"
label="Password"
placeholder="Password"
type="password"
/>
>
<LabeledTextField name="email" label="Email" placeholder="Email" />
<LabeledTextField name="password" label="Password" placeholder="Password" type="password" />
<div>
<Link href="/forgot-password">
<a>Forgot your password?</a>
</Link>
</div>
</Form>
{submitError && (
<div role="alert" style={{color: "red"}}>
{submitError}
</div>
)}
<button type="submit" disabled={submitting}>
Log In
</button>
<style global jsx>{`
.login-form > * + * {
margin-top: 1rem;
}
`}</style>
</form>
)}
/>
<div style={{marginTop: "1rem"}}>
Or <Link href="/signup">Sign Up</Link>
</div>
</div>
)
}

View File

@@ -0,0 +1,44 @@
import React from "react"
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) {
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)
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("blitz", () => ({
...jest.requireActual("blitz")!,
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

@@ -1,23 +1,29 @@
import {SessionContext} from "blitz"
import {authenticateUser} from "app/auth"
import * as z from "zod"
import {resolver, SecurePassword, AuthenticationError} from "blitz"
import db from "db"
import {Login} from "../validations"
import {Role} from "types"
export const LoginInput = z.object({
email: z.string(),
password: z.string(),
})
export const authenticateUser = async (email: string, password: string) => {
const user = await db.user.findFirst({where: {email}})
if (!user) throw new AuthenticationError()
export default async function login(
input: z.infer<typeof LoginInput>,
ctx: {session?: SessionContext} = {},
) {
// This throws an error if input is invalid
const {email, password} = LoginInput.parse(input)
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, roles: [user.role]})
await ctx.session.$create({userId: user.id, roles: [user.role as Role]})
return user
}
})

View File

@@ -1,5 +1,5 @@
import {SessionContext} from "blitz"
import {Ctx} from "blitz"
export default async function logout(_ = null, ctx: {session?: SessionContext} = {}) {
return await ctx.session!.revoke()
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)
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

@@ -1,20 +1,15 @@
import {resolver, SecurePassword} from "blitz"
import db from "db"
import {SessionContext} from "blitz"
import {hashPassword} from "app/auth"
import * as z from "zod"
import {SignupInput} from "app/auth/validations"
import {Signup} from "app/auth/validations"
import {Role} from "types"
export default async function signup(
input: z.infer<typeof SignupInput>,
ctx: {session?: SessionContext} = {},
) {
// This throws an error if input is invalid
const {email, password} = SignupInput.parse(input)
const hashedPassword = await hashPassword(password)
const user = await db.user.create({data: {email, hashedPassword, role: "user"}})
await ctx.session!.create({userId: user.id, roles: [user.role]})
export default resolver.pipe(resolver.zod(Signup), async ({email, password}, ctx) => {
const hashedPassword = await SecurePassword.hash(password)
const user = await db.user.create({
data: {email: email.toLowerCase(), hashedPassword, role: "user"},
select: {id: true, name: true, email: true, role: true},
})
await ctx.session.$create({userId: user.id, roles: [user.role as Role]})
return user
}
})

View File

@@ -0,0 +1,47 @@
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) {
return {
[FORM_ERROR]: "Sorry, we had an unexpected error. Please try again.",
}
}
}}
>
<LabeledTextField name="email" label="Email" placeholder="Email" />
</Form>
)}
</div>
)
}
ForgotPasswordPage.getLayout = (page) => <Layout title="Forgot Your Password?">{page}</Layout>
export default ForgotPasswordPage

View File

@@ -1,22 +1,18 @@
import React from "react"
import {Head, useRouter, BlitzPage} from "blitz"
import {useRouter, BlitzPage} from "blitz"
import Layout from "app/core/layouts/Layout"
import {LoginForm} from "app/auth/components/LoginForm"
const SignupPage: BlitzPage = () => {
const LoginPage: BlitzPage = () => {
const router = useRouter()
return (
<>
<Head>
<title>Log In</title>
<link rel="icon" href="/favicon.ico" />
</Head>
<div>
<LoginForm onSuccess={() => router.push("/ssr")} />
</div>
</>
<div>
<LoginForm onSuccess={() => router.push("/")} />
</div>
)
}
export default SignupPage
LoginPage.getLayout = (page) => <Layout title="Log In">{page}</Layout>
export default LoginPage

View File

@@ -0,0 +1,58 @@
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"
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="/">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) {
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.getLayout = (page) => <Layout title="Reset Your Password">{page}</Layout>
export default ResetPasswordPage

View File

@@ -1,76 +1,19 @@
import React from "react"
import {Head, useRouter, BlitzPage} from "blitz"
import {LabeledTextField} from "app/components/LabeledTextField"
import {Form} from "react-final-form"
import {FORM_ERROR} from "final-form"
import signup from "app/auth/mutations/signup"
import {SignupInput} from "app/auth/validations"
import {Head, useRouter, BlitzPage, useMutation} from "blitz"
import Layout from "app/core/layouts/Layout"
import {Form, FORM_ERROR} from "app/core/components/Form"
import {LabeledTextField} from "app/core/components/LabeledTextField"
import {SignupForm} from "app/auth/components/SignupForm"
const SignupPage: BlitzPage = () => {
const router = useRouter()
return (
<>
<Head>
<title>Sign Up</title>
<link rel="icon" href="/favicon.ico" />
</Head>
<div>
<h1>Create an Account</h1>
<Form
validate={(values) => {
try {
SignupInput.parse(values)
} catch (error) {
return error.formErrors.fieldErrors
}
}}
onSubmit={async (values) => {
try {
await signup({email: values.email, password: values.password})
router.push("/")
} catch (error) {
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()}
}
}
}}
render={({handleSubmit, submitting, submitError}) => (
<form onSubmit={handleSubmit} className="signup-form">
<LabeledTextField name="email" label="Email" placeholder="Email" />
<LabeledTextField
name="password"
label="Password"
placeholder="Password"
type="password"
/>
{submitError && (
<div role="alert" style={{color: "red"}}>
{submitError}
</div>
)}
<button type="submit" disabled={submitting}>
Create Account
</button>
<style global jsx>{`
.signup-form > * + * {
margin-top: 1rem;
}
`}</style>
</form>
)}
/>
</div>
</>
<div>
<SignupForm onSuccess={() => router.push("/")} />
</div>
)
}
SignupPage.getLayout = (page) => <Layout title="Sign Up">{page}</Layout>
export default SignupPage

View File

@@ -1,6 +1,33 @@
import * as z from "zod"
export const SignupInput = z.object({
const password = z.string().min(10).max(100)
export const Signup = z.object({
email: z.string().email(),
password: z.string().min(10).max(100),
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

@@ -1,44 +0,0 @@
import React from "react"
import {Error as ErrorComponent} from "blitz"
import {queryCache} from "react-query"
import LoginForm from "app/auth/components/LoginForm"
export default class ErrorBoundary extends React.Component<{
fallback?: (error: any) => React.ReactNode
}> {
state = {
error: null as Error | null,
}
static getDerivedStateFromError(error: any) {
return {
error,
}
}
reset = () => {
this.setState({error: null})
queryCache.resetErrorBoundaries()
}
render() {
const {error} = this.state
if (error) {
if (error.name === "AuthenticationError") {
return <LoginForm onSuccess={this.reset} />
} else if (error.name === "AuthorizationError") {
return (
<ErrorComponent
statusCode={(error as any).statusCode}
title="Sorry, you are not authorized to access this"
/>
)
} else if (this.props.fallback) {
return this.props.fallback(error)
} else {
throw error
}
}
return this.props.children
}
}

View File

@@ -0,0 +1,65 @@
import React, {ReactNode, PropsWithoutRef} from "react"
import {Form as FinalForm, FormProps as FinalFormProps} from "react-final-form"
import * as z from "zod"
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={(values) => {
if (!schema) return
try {
schema.parse(values)
} catch (error) {
return error.formErrors.fieldErrors
}
}}
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>
)}
<style global jsx>{`
.form > * + * {
margin-top: 1rem;
}
`}</style>
</form>
)}
/>
)
}
export default Form

View File

@@ -0,0 +1,59 @@
import React, {PropsWithoutRef} from "react"
import {useField} 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"]>
}
export const LabeledTextField = React.forwardRef<HTMLInputElement, LabeledTextFieldProps>(
({name, label, outerProps, ...props}, ref) => {
const {
input,
meta: {touched, error, submitError, submitting},
} = useField(name, {
parse: props.type === "number" ? Number : undefined,
})
const normalizedError = Array.isArray(error) ? error.join(", ") : error || submitError
return (
<div {...outerProps}>
<label>
{label}
<input {...input} disabled={submitting} {...props} ref={ref} />
</label>
{touched && normalizedError && (
<div role="alert" style={{color: "red"}}>
{normalizedError}
</div>
)}
<style jsx>{`
label {
display: flex;
flex-direction: column;
align-items: start;
font-size: 1rem;
}
input {
font-size: 1rem;
padding: 0.25rem 0.5rem;
border-radius: 3px;
border: 1px solid purple;
appearance: none;
margin-top: 0.5rem;
}
`}</style>
</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,30 @@
import {useSession, useRouter, useMutation, Head} from "blitz"
import logout from "app/auth/mutations/logout"
export default function Layout({title, children}: {title?: string; children: React.ReactNode}) {
const session = useSession({suspense: false})
const router = useRouter()
const [logoutMutation] = useMutation(logout)
return (
<>
<Head>
<title>{title || "__name__"}</title>
<link rel="icon" href="/favicon.ico" />
</Head>
<div>
{session.userId && (
<button
onClick={async () => {
router.push("/")
await logoutMutation()
}}
>
Logout
</button>
)}
<div>{children}</div>
</div>
</>
)
}

View File

@@ -1,22 +0,0 @@
import {useSession, useRouter} from "blitz"
import logout from "app/auth/mutations/logout"
export default function Layout({children}: {children: React.ReactNode}) {
const session = useSession()
const router = useRouter()
return (
<div>
{session.userId && (
<button
onClick={async () => {
router.push("/")
await logout()
}}
>
Logout
</button>
)}
<div>{children}</div>
</div>
)
}

View File

@@ -0,0 +1,13 @@
import {resolver} from "blitz"
import db from "db"
import * as z from "zod"
const __Name__ = z
.object({
id: z.number(),
})
.nonstrict()
export default resolver.pipe(resolver.zod(__Name__), resolver.authorize(), async (input) => {
// Do your stuff :)
})

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

@@ -1,10 +1,48 @@
import {AppProps} from "blitz"
import ErrorBoundary from "app/components/ErrorBoundary"
import {
withBlitzAppRoot,
AppProps,
ErrorComponent,
useRouter,
AuthenticationError,
AuthorizationError,
ErrorFallbackProps,
} from "blitz"
import {ErrorBoundary} from "react-error-boundary"
import {queryCache} from "react-query"
import LoginForm from "app/auth/components/LoginForm"
export default function App({Component, pageProps}: AppProps) {
const getLayout = Component.getLayout || ((page) => page)
const router = useRouter()
export default function MyApp({Component, pageProps}: AppProps) {
return (
<ErrorBoundary>
<Component {...pageProps} />
<ErrorBoundary
FallbackComponent={RootErrorFallback}
resetKeys={[router.asPath]}
onReset={() => {
// This ensures the Blitz useQuery hooks will automatically refetch
// data any time you reset the error boundary
queryCache.resetErrorBoundaries()
}}
>
{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,27 @@
import {render} from "test/utils"
import Home from "./index"
jest.mock("blitz", () => ({
...jest.requireActual("blitz")!,
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

@@ -1,10 +1,21 @@
import {Head, Link, useSession} from "blitz"
import {Suspense} from "react"
import {Head, Link, useSession, useRouterQuery, useMutation, invoke, useQuery} from "blitz"
import getUser from "app/users/queries/getUser"
import trackView from "app/users/mutations/trackView"
import Layout from "app/layouts/Layout"
import Layout from "app/core/layouts/Layout"
const CurrentUserInfo = () => {
const session = useSession()
const [currentUser] = useQuery(getUser, {where: {id: session.userId!}})
return <pre>{JSON.stringify(currentUser, null, 2)}</pre>
}
const UserStuff = () => {
const session = useSession()
const query = useRouterQuery()
const [trackViewMutation] = useMutation(trackView)
return (
<div>
{!session.userId && (
@@ -13,18 +24,25 @@ const UserStuff = () => {
<Link href="/signup">Sign Up</Link>
</div>
<div>
<Link href="/login">Log In</Link>
<Link href="/login">Login</Link>
</div>
<a href="/api/auth/twitter" style={{display: "block"}}>
Login with Twitter
</a>
<a href="/api/auth/github" style={{display: "block"}}>
Login with Github
</a>
{query.authError && <div style={{color: "red"}}>{query.authError}</div>}
</>
)}
<pre>{JSON.stringify(session, null, 2)}</pre>
<Suspense fallback="Loading...">
<CurrentUserInfo />
</Suspense>
<button
onClick={async () => {
try {
const user = await getUser({where: {id: session.userId as number}})
const user = await invoke(getUser, {where: {id: session.userId as number}})
alert(JSON.stringify(user))
} catch (error) {
alert("error: " + JSON.stringify(error))
@@ -36,7 +54,7 @@ const UserStuff = () => {
<button
onClick={async () => {
try {
await trackView()
await trackViewMutation()
} catch (error) {
alert("error: " + error)
console.log(error)
@@ -62,7 +80,9 @@ const Home = () => (
<img src="/logo.png" alt="blitz.js" />
</div>
<UserStuff />
<Suspense fallback={"Loading..."}>
<UserStuff />
</Suspense>
</main>
<footer>

View File

@@ -0,0 +1,64 @@
import {Suspense} from "react"
import {Head, Link, useRouter, useQuery, useParam, BlitzPage, useMutation} from "blitz"
import Layout from "app/core/layouts/Layout"
import getProject from "app/projects/queries/getProject"
import deleteProject from "app/projects/mutations/deleteProject"
export const Project = () => {
const router = useRouter()
const projectId = useParam("projectId", "number")
const [deleteProjectMutation, {isSuccess}] = useMutation(deleteProject)
const [project] = useQuery(getProject, {id: projectId}, {enabled: !isSuccess})
if (!project) return null
return (
<>
<Head>
<title>Project {project.id}</title>
</Head>
<div>
<h1>Project {project.id}</h1>
<pre>{JSON.stringify(project, null, 2)}</pre>
<Link href={`/projects/${project.id}/edit`}>
<a>Edit</a>
</Link>
<button
type="button"
onClick={async () => {
if (window.confirm("This will be deleted")) {
await deleteProjectMutation({id: project.id})
router.push("/projects")
}
}}
style={{marginLeft: "0.5rem"}}
>
Delete
</button>
</div>
</>
)
}
const ShowProjectPage: BlitzPage = () => {
return (
<div>
<p>
<Link href="/projects">
<a>Projects</a>
</Link>
</p>
<Suspense fallback={<div>Loading...</div>}>
<Project />
</Suspense>
</div>
)
}
ShowProjectPage.getLayout = (page) => <Layout>{page}</Layout>
export default ShowProjectPage

View File

@@ -0,0 +1,70 @@
import {Suspense} from "react"
import {Head, Link, useRouter, useQuery, useMutation, useParam, BlitzPage} from "blitz"
import Layout from "app/core/layouts/Layout"
import getProject from "app/projects/queries/getProject"
import updateProject from "app/projects/mutations/updateProject"
import {ProjectForm, FORM_ERROR} from "app/projects/components/ProjectForm"
export const EditProject = () => {
const router = useRouter()
const projectId = useParam("projectId", "number")
const [project, {setQueryData}] = useQuery(getProject, {id: projectId})
const [updateProjectMutation] = useMutation(updateProject)
return (
<>
<Head>
<title>Edit Project {project.id}</title>
</Head>
<div>
<h1>Edit Project {project.id}</h1>
<pre>{JSON.stringify(project)}</pre>
<ProjectForm
submitText="Update Project"
// TODO use a zod schema for form validation
// - Tip: extract mutation's schema into a shared `validations.ts` file and
// then import and use it here
// schema={UpdateProject}
initialValues={project}
onSubmit={async (values) => {
try {
const updated = await updateProjectMutation({
id: project.id,
...values,
})
await setQueryData(updated)
router.push(`/projects/${updated.id}`)
} catch (error) {
console.error(error)
return {
[FORM_ERROR]: error.toString(),
}
}
}}
/>
</div>
</>
)
}
const EditProjectPage: BlitzPage = () => {
return (
<div>
<Suspense fallback={<div>Loading...</div>}>
<EditProject />
</Suspense>
<p>
<Link href="/projects">
<a>Projects</a>
</Link>
</p>
</div>
)
}
EditProjectPage.getLayout = (page) => <Layout>{page}</Layout>
export default EditProjectPage

View File

@@ -0,0 +1,66 @@
import {Suspense} from "react"
import {Head, Link, usePaginatedQuery, useRouter, BlitzPage} from "blitz"
import Layout from "app/core/layouts/Layout"
import getProjects from "app/projects/queries/getProjects"
const ITEMS_PER_PAGE = 100
export const ProjectsList = () => {
const router = useRouter()
const page = Number(router.query.page) || 0
const [{projects, hasMore}] = usePaginatedQuery(getProjects, {
orderBy: {id: "asc"},
skip: ITEMS_PER_PAGE * page,
take: ITEMS_PER_PAGE,
})
const goToPreviousPage = () => router.push({query: {page: page - 1}})
const goToNextPage = () => router.push({query: {page: page + 1}})
return (
<div>
<ul>
{projects.map((project) => (
<li key={project.id}>
<Link href={`/projects/${project.id}`}>
<a>{project.name}</a>
</Link>
</li>
))}
</ul>
<button disabled={page === 0} onClick={goToPreviousPage}>
Previous
</button>
<button disabled={!hasMore} onClick={goToNextPage}>
Next
</button>
</div>
)
}
const ProjectsPage: BlitzPage = () => {
return (
<>
<Head>
<title>Projects</title>
</Head>
<div>
<p>
<Link href="/projects/new">
<a>Create Project</a>
</Link>
</p>
<Suspense fallback={<div>Loading...</div>}>
<ProjectsList />
</Suspense>
</div>
</>
)
}
ProjectsPage.getLayout = (page) => <Layout>{page}</Layout>
export default ProjectsPage

View File

@@ -0,0 +1,45 @@
import {Link, useRouter, useMutation, BlitzPage} from "blitz"
import Layout from "app/core/layouts/Layout"
import createProject from "app/projects/mutations/createProject"
import {ProjectForm, FORM_ERROR} from "app/projects/components/ProjectForm"
const NewProjectPage: BlitzPage = () => {
const router = useRouter()
const [createProjectMutation] = useMutation(createProject)
return (
<div>
<h1>Create New Project</h1>
<ProjectForm
submitText="Create Project"
// TODO use a zod schema for form validation
// - Tip: extract mutation's schema into a shared `validations.ts` file and
// then import and use it here
// schema={CreateProject}
// initialValues={{}}
onSubmit={async (values) => {
try {
const project = await createProjectMutation(values)
router.push(`/projects/${project.id}`)
} catch (error) {
console.error(error)
return {
[FORM_ERROR]: error.toString(),
}
}
}}
/>
<p>
<Link href="/projects">
<a>Projects</a>
</Link>
</p>
</div>
)
}
NewProjectPage.getLayout = (page) => <Layout title={"Create New Project"}>{page}</Layout>
export default NewProjectPage

View File

@@ -1,8 +1,18 @@
import * as React from "react"
import {FC} from "react"
import {getSessionContext} from "@blitzjs/server"
import {ssrQuery, useRouter, GetServerSideProps, PromiseReturnType, Error as ErrorPage} from "blitz"
import {
invokeWithMiddleware,
useRouter,
GetServerSideProps,
PromiseReturnType,
ErrorComponent as ErrorPage,
useMutation,
AuthenticationError,
AuthorizationError,
} from "blitz"
import getUser from "app/users/queries/getUser"
import logout from "app/auth/mutations/logout"
import path from "path"
type PageProps = {
user?: PromiseReturnType<typeof getUser>
@@ -13,21 +23,31 @@ type PageProps = {
}
export const getServerSideProps: GetServerSideProps<PageProps> = async ({req, res}) => {
// Ensure these files are not eliminated by trace-based tree-shaking (like Vercel)
// https://github.com/blitz-js/blitz/issues/794
path.resolve("next.config.js")
path.resolve("blitz.config.js")
path.resolve(".next/blitz/db.js")
// End anti-tree-shaking
const session = await getSessionContext(req, res)
console.log("Session id:", session.userId)
try {
const user = await ssrQuery(
const user = await invokeWithMiddleware(
getUser,
{where: {id: Number(session.userId)}, select: {id: true}},
{where: {id: Number(session.userId)}},
{res, req},
)
return {props: {user}}
} catch (error) {
if (error.name === "AuthenticationError") {
res.writeHead(302, {location: "/login"})
if (error.name === "NotFoundError") {
res.statusCode = 404
res.end()
return {props: {}}
} else if (error.name === "AuthorizationError") {
} else if (error instanceof AuthenticationError) {
res.writeHead(302, {location: "/login"}).end()
return {props: {}}
} else if (error instanceof AuthorizationError) {
return {
props: {
error: {
@@ -42,8 +62,9 @@ export const getServerSideProps: GetServerSideProps<PageProps> = async ({req, re
}
}
const Test: React.FC<PageProps> = ({user, error}: PageProps) => {
const Test: FC<PageProps> = ({user, error}: PageProps) => {
const router = useRouter()
const [logoutMutation] = useMutation(logout)
if (error) {
return <ErrorPage statusCode={error.statusCode} title={error.message} />
@@ -54,7 +75,7 @@ const Test: React.FC<PageProps> = ({user, error}: PageProps) => {
<div>Logged in user id: {user?.id}</div>
<button
onClick={async () => {
await logout()
await logoutMutation()
router.push("/")
}}
>

View File

@@ -0,0 +1,12 @@
import {Form, FormProps} from "app/core/components/Form"
import {LabeledTextField} from "app/core/components/LabeledTextField"
import * as z from "zod"
export {FORM_ERROR} from "app/core/components/Form"
export function ProjectForm<S extends z.ZodType<any, any>>(props: FormProps<S>) {
return (
<Form<S> {...props}>
<LabeledTextField name="name" label="Name" placeholder="Name" />
</Form>
)
}

View File

@@ -0,0 +1,16 @@
import {resolver} from "blitz"
import db from "db"
import * as z from "zod"
const CreateProject = z
.object({
name: z.string(),
})
.nonstrict()
export default resolver.pipe(resolver.zod(CreateProject), resolver.authorize(), async (input) => {
// TODO: in multi-tenant app, you must add validation to ensure correct tenant
const project = await db.project.create({data: input})
return project
})

View File

@@ -0,0 +1,16 @@
import {resolver} from "blitz"
import db from "db"
import * as z from "zod"
const DeleteProject = z
.object({
id: z.number(),
})
.nonstrict()
export default resolver.pipe(resolver.zod(DeleteProject), resolver.authorize(), async ({id}) => {
// TODO: in multi-tenant app, you must add validation to ensure correct tenant
const project = await db.project.delete({where: {id}})
return project
})

View File

@@ -0,0 +1,21 @@
import {resolver} from "blitz"
import db from "db"
import * as z from "zod"
const UpdateProject = z
.object({
id: z.number(),
name: z.string(),
})
.nonstrict()
export default resolver.pipe(
resolver.zod(UpdateProject),
resolver.authorize(),
async ({id, ...data}) => {
// TODO: in multi-tenant app, you must add validation to ensure correct tenant
const project = await db.project.update({where: {id}, data})
return project
},
)

View File

@@ -0,0 +1,17 @@
import {resolver, NotFoundError} from "blitz"
import db from "db"
import * as z from "zod"
const GetProject = z.object({
// This accepts type of undefined, but is required at runtime
id: z.number().optional().refine(Boolean, "Required"),
})
export default resolver.pipe(resolver.zod(GetProject), resolver.authorize(), async ({id}) => {
// TODO: in multi-tenant app, you must add validation to ensure correct tenant
const project = await db.project.findFirst({where: {id}})
if (!project) throw new NotFoundError()
return project
})

View File

@@ -0,0 +1,25 @@
import {paginate, resolver} from "blitz"
import db, {Prisma} from "db"
interface GetProjectsInput
extends Pick<Prisma.ProjectFindManyArgs, "where" | "orderBy" | "skip" | "take"> {}
export default resolver.pipe(
resolver.authorize(),
async ({where, orderBy, skip = 0, take = 100}: GetProjectsInput) => {
// TODO: in multi-tenant app, you must add validation to ensure correct tenant
const {items: projects, hasMore, nextPage, count} = await paginate({
skip,
take,
count: () => db.project.count({where}),
query: (paginateArgs) => db.project.findMany({...paginateArgs, where, orderBy}),
})
return {
projects,
nextPage,
hasMore,
count,
}
},
)

View File

@@ -1,23 +0,0 @@
import React from "react"
type UserFormProps = {
initialValues: any
onSubmit: React.FormEventHandler<HTMLFormElement>
}
const UserForm = ({initialValues, onSubmit}: UserFormProps) => {
return (
<form
onSubmit={(event) => {
event.preventDefault()
onSubmit(event)
}}
>
<div>Put your form fields here. But for now, just click submit</div>
<div>{JSON.stringify(initialValues)}</div>
<button>Submit</button>
</form>
)
}
export default UserForm

View File

@@ -1,10 +0,0 @@
import db, {UserCreateArgs} from "db"
type CreateUserInput = {
data: UserCreateArgs["data"]
}
export default async function createUser({data}: CreateUserInput, ctx: Record<any, any> = {}) {
const user = await db.user.create({data})
return user
}

View File

@@ -1,11 +0,0 @@
import db, {UserDeleteArgs} from "db"
type DeleteUserInput = {
where: UserDeleteArgs["where"]
}
export default async function deleteUser({where}: DeleteUserInput, ctx: Record<any, any> = {}) {
const user = await db.user.delete({where})
return user
}

View File

@@ -1,9 +1,9 @@
import {SessionContext} from "blitz"
import {Ctx} from "blitz"
export default async function trackView(_ = null, ctx: {session?: SessionContext} = {}) {
const currentViews = ctx.session!.publicData.views || 0
await ctx.session!.setPublicData({views: currentViews + 1})
await ctx.session!.setPrivateData({views: currentViews + 1})
export default async function trackView(_: any, {session}: Ctx) {
const currentViews = session.views || 0
await session.$setPublicData({views: currentViews + 1})
await session.$setPrivateData({views: currentViews + 1})
return
}

View File

@@ -1,18 +0,0 @@
import db, {UserUpdateArgs} from "db"
type UpdateUserInput = {
where: UserUpdateArgs["where"]
data: UserUpdateArgs["data"]
}
export default async function updateUser(
{where, data}: UpdateUserInput,
ctx: Record<any, any> = {},
) {
// Don't allow updating
delete data.id
const user = await db.user.update({where, data})
return user
}

View File

@@ -1,62 +0,0 @@
import React, {Suspense} from "react"
import {Head, Link, useRouter, useQuery, useParam, BlitzPage} from "blitz"
import getUser from "app/users/queries/getUser"
import deleteUser from "app/users/mutations/deleteUser"
export const User = () => {
const router = useRouter()
const userId = useParam("userId", "number")
const [user] = useQuery(getUser, {where: {id: userId}})
return (
<div>
<h1>User {user.id}</h1>
<pre>{JSON.stringify(user, null, 2)}</pre>
{
<Link href="/users/[userId]/edit" as={`/users/${user.id}/edit`}>
<a>Edit</a>
</Link>
}
<button
type="button"
onClick={async () => {
if (window.confirm("This will be deleted")) {
await deleteUser({where: {id: user.id}})
router.push("/users")
}
}}
>
Delete
</button>
</div>
)
}
const ShowUserPage: BlitzPage = () => {
return (
<div>
<Head>
<title>User</title>
<link rel="icon" href="/favicon.ico" />
</Head>
<main>
<p>
{
<Link href="/users">
<a>Users</a>
</Link>
}
</p>
<Suspense fallback={<div>Loading...</div>}>
<User />
</Suspense>
</main>
</div>
)
}
export default ShowUserPage

View File

@@ -1,63 +0,0 @@
import React, {Suspense} from "react"
import {Head, Link, useRouter, useQuery, useParam, BlitzPage} from "blitz"
import getUser from "app/users/queries/getUser"
import updateUser from "app/users/mutations/updateUser"
import UserForm from "app/users/components/UserForm"
export const EditUser = () => {
const router = useRouter()
const userId = useParam("userId", "number")
const [user, {mutate}] = useQuery(getUser, {where: {id: userId}})
return (
<div>
<h1>Edit User {user.id}</h1>
<pre>{JSON.stringify(user)}</pre>
<UserForm
initialValues={user}
onSubmit={async () => {
try {
const updated = await updateUser({
where: {id: user.id},
data: {name: "MyNewName"},
})
mutate(updated)
alert("Success!" + JSON.stringify(updated))
router.push("/users/[userId]", `/users/${updated.id}`)
} catch (error) {
console.log(error)
alert("Error creating user " + JSON.stringify(error, null, 2))
}
}}
/>
</div>
)
}
const EditUserPage: BlitzPage = () => {
return (
<div>
<Head>
<title>Edit User</title>
<link rel="icon" href="/favicon.ico" />
</Head>
<main>
<Suspense fallback={<div>Loading...</div>}>
<EditUser />
</Suspense>
<p>
{
<Link href="/users">
<a>Users</a>
</Link>
}
</p>
</main>
</div>
)
}
export default EditUserPage

View File

@@ -1,49 +0,0 @@
import React, {Suspense} from "react"
import {Head, Link, useQuery, BlitzPage} from "blitz"
import getUsers from "app/users/queries/getUsers"
import Layout from "app/layouts/Layout"
export const UsersList = () => {
const [users] = useQuery(getUsers, {orderBy: {id: "desc"}})
return (
<ul>
{users?.map((user) => (
<li key={user.id}>
<Link href="/users/[userId]" as={`/users/${user.id}`}>
<a>{user.email}</a>
</Link>
</li>
))}
</ul>
)
}
const UsersPage: BlitzPage = () => {
return (
<Layout>
<Head>
<title>Users</title>
<link rel="icon" href="/favicon.ico" />
</Head>
<main>
<h1>Users</h1>
<p>
{
<Link href="/users/new">
<a>Create User</a>
</Link>
}
</p>
<Suspense fallback={<div>Loading...</div>}>
<UsersList />
</Suspense>
</main>
</Layout>
)
}
export default UsersPage

View File

@@ -1,44 +0,0 @@
import React from "react"
import {Head, Link, useRouter, BlitzPage} from "blitz"
import createUser from "app/users/mutations/createUser"
import UserForm from "app/users/components/UserForm"
const NewUserPage: BlitzPage = () => {
const router = useRouter()
return (
<div>
<Head>
<title>New User</title>
<link rel="icon" href="/favicon.ico" />
</Head>
<main>
<h1>Create New User </h1>
<UserForm
initialValues={{}}
onSubmit={async () => {
try {
const user = await createUser({data: {name: "MyName"}})
alert("Success!" + JSON.stringify(user))
router.push("/users/[userId]", `/users/${user.id}`)
} catch (error) {
alert("Error creating user " + JSON.stringify(error, null, 2))
}
}}
/>
<p>
{
<Link href="/users">
<a>Users</a>
</Link>
}
</p>
</main>
</div>
)
}
export default NewUserPage

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

@@ -1,30 +1,18 @@
import db, {FindOneUserArgs} from "db"
import {SessionContext} from "blitz"
import {Ctx, NotFoundError} from "blitz"
import db, {Prisma} from "db"
type GetUserInput = {
where: FindOneUserArgs["where"]
select?: FindOneUserArgs["select"]
// Only available if a model relationship exists
// include?: FindOneUserArgs['include']
where: Prisma.UserFindFirstArgs["where"]
}
export class NotFoundError extends Error {
statusCode = 404
constructor(message?: string) {
super(message)
this.name = "NotFoundError"
}
}
export default async function getUser(
{where, select}: GetUserInput,
ctx: {session?: SessionContext} = {},
) {
ctx.session?.authorize(["admin", "user"])
const user = await db.user.findOne({where, select})
if (!user) throw new NotFoundError(`User with id ${where.id} does not exist`)
return user
export default async function getUser({where}: GetUserInput, ctx: Ctx) {
if (!ctx.session.userId) return null
const user = await db.user.findFirst({where})
if (!user) throw new NotFoundError(`User with id ${where?.id} does not exist`)
const {hashedPassword, ...rest} = user
return rest
}

View File

@@ -1,29 +1,26 @@
import db, {FindManyUserArgs} from "db"
import {SessionContext} from "blitz"
import {Ctx} from "blitz"
import db, {Prisma} from "db"
type GetUsersInput = {
where?: FindManyUserArgs["where"]
orderBy?: FindManyUserArgs["orderBy"]
cursor?: FindManyUserArgs["cursor"]
take?: FindManyUserArgs["take"]
skip?: FindManyUserArgs["skip"]
// Only available if a model relationship exists
// include?: FindManyUserArgs['include']
}
type GetUsersInput = Pick<Prisma.UserFindManyArgs, "where" | "orderBy" | "skip" | "take">
export default async function getUsers(
{where, orderBy, cursor, take, skip}: GetUsersInput,
ctx: {session?: SessionContext} = {},
) {
ctx.session?.authorize(["admin"])
export default async function getUsers({where, orderBy, skip = 0, take}: GetUsersInput, ctx: Ctx) {
ctx.session.$authorize()
const users = await db.user.findMany({
where,
orderBy,
cursor,
take,
skip,
})
return users
const count = await db.user.count()
const hasMore = typeof take === "number" ? skip + take < count : false
const nextPage = hasMore ? {take, skip: skip + take!} : null
return {
users,
nextPage,
hasMore,
count,
}
}

View File

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

View File

@@ -1,11 +1,21 @@
const {sessionMiddleware, unstable_simpleRolesIsAuthorized} = require("@blitzjs/server")
const {sessionMiddleware, simpleRolesIsAuthorized} = require("@blitzjs/server")
const withBundleAnalyzer = require("@next/bundle-analyzer")({
enabled: process.env.ANALYZE === "true",
})
module.exports = {
module.exports = withBundleAnalyzer({
middleware: [
sessionMiddleware({
unstable_isAuthorized: unstable_simpleRolesIsAuthorized,
isAuthorized: simpleRolesIsAuthorized,
// sessionExpiryMinutes: 4,
}),
],
log: {
// level: "trace",
},
experimental: {
isomorphicResolverImports: false,
},
/*
webpack: (config, {buildId, dev, isServer, defaultLoaders, webpack}) => {
// Note: we provide webpack above so you should not `require` it
@@ -19,4 +29,4 @@ module.exports = {
return config
},
*/
}
})

View File

@@ -0,0 +1,6 @@
{
"baseUrl": "http://localhost:3099",
"defaultCommandTimeout": 10000,
"video": false,
"chromeWebSecurity": false
}

View File

@@ -0,0 +1,5 @@
{
"name": "Using fixtures to represent data",
"email": "hello@cypress.io",
"body": "Fixtures are a great way to mock data for responses to routes"
}

8
examples/auth/cypress/index.d.ts vendored Normal file
View File

@@ -0,0 +1,8 @@
/// <reference types="Cypress" />
/// <reference types="@cypress/skip-test" />
declare namespace Cypress {
interface Chainable {
signup(user: {email: string; password: string}): void
}
}

View File

@@ -0,0 +1,71 @@
import {createRandomUser} from "../support/helpers"
describe("index page", () => {
beforeEach(() => {
cy.visit("/")
})
it("goes to the signup page", () => {
cy.contains("a", "Sign Up").click()
cy.location("pathname").should("equal", "/signup")
})
it("goes to the login page", () => {
cy.contains("a", /login/i).click()
cy.location("pathname").should("equal", "/login")
})
it("allows the user to signup", () => {
const user = createRandomUser()
cy.signup(user)
cy.location("pathname").should("equal", "/")
cy.contains("button", "Logout")
})
it("allows the user to log in", () => {
const user = createRandomUser()
cy.signup(user)
cy.wait(500)
cy.contains("button", "Logout").click()
cy.contains("a", /login/i).click()
cy.contains("Email").find("input").type(user.email)
cy.contains("Password").find("input").type(user.password)
cy.contains("button", /login/i).click()
cy.location("pathname").should("equal", "/")
cy.wait(500)
cy.contains("button", "Logout")
})
it("allows the user to logout", () => {
const user = createRandomUser()
cy.signup(user)
cy.contains("button", "Logout").click()
cy.location("pathname").should("equal", "/")
cy.contains("a", /login/i)
})
it("tracks anonymous sessions", () => {
// TODO - why does this fail on windows??
cy.skipOn("windows")
const user = createRandomUser()
cy.contains("button", "Track view").click()
cy.contains("button", "Track view").click()
cy.contains('"views": 2')
cy.signup(user)
cy.contains('"views": 2')
})
})
export {}

View File

@@ -0,0 +1,22 @@
/// <reference types="cypress" />
// ***********************************************************
// This example plugins/index.js can be used to load plugins
//
// You can change the location of this file or turn off loading
// the plugins file with the 'pluginsFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/plugins-guide
// ***********************************************************
// This function is called when a project is opened or re-opened (e.g. due to
// the project's config changing)
/**
* @type {Cypress.PluginConfig}
*/
//@ts-ignore
module.exports = (on, config) => {
// `on` is used to hook into various events Cypress emits
// `config` is the resolved Cypress config
}

View File

@@ -0,0 +1,19 @@
// ***********************************************
// This example commands.js shows you how to
// create various custom commands and overwrite
// existing commands.
//
// For more comprehensive examples of custom
// commands please read more here:
// https://on.cypress.io/custom-commands
// ***********************************************
//
//
Cypress.Commands.add("signup", ({email, password}) => {
cy.contains("a", "Sign Up").click()
cy.contains("Email").find("input").type(email)
cy.contains("Password").find("input").type(password)
cy.contains("button", "Create Account").click()
})

View File

@@ -0,0 +1,7 @@
export const createRandomUser = () => {
const random = Math.round(Math.random() * 100000).toString()
const email = `test_${random}@example.com`
const password = `password_${random}`
return {email, password}
}

View File

@@ -0,0 +1,26 @@
// ***********************************************************
// 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.js using ES2015 syntax:
import "./commands"
// Alternatively you can use CommonJS syntax:
// require('./commands')
Cypress.Screenshot.defaults({
screenshotOnRunFailure: false,
})
require("@cypress/skip-test/support")

View File

@@ -0,0 +1,7 @@
{
"compilerOptions": {
"target": "es5",
"lib": ["dom", "es5"],
"types": ["cypress"]
}
}

View File

@@ -1,15 +1,7 @@
import {enhancePrisma} from "blitz"
import {PrismaClient} from "@prisma/client"
const EnhancedPrisma = enhancePrisma(PrismaClient)
export * from "@prisma/client"
let prisma: PrismaClient
if (process.env.NODE_ENV === "production") {
prisma = new PrismaClient()
} else {
// Ensure the prisma instance is re-used during hot-reloading
// Otherwise, a new client will be created on every reload
global["prisma"] = global["prisma"] || new PrismaClient()
prisma = global["prisma"]
}
export default prisma
export default new EnhancedPrisma()

View File

@@ -1,82 +0,0 @@
# Migration `20200704211726`
This migration has been generated by Brandon Bayer at 7/4/2020, 9:17:26 PM.
You can check out the [state of the schema](./schema.prisma) after the migration.
## Database Steps
```sql
PRAGMA foreign_keys=OFF;
CREATE TABLE "quaint"."User" (
"createdAt" DATE NOT NULL DEFAULT CURRENT_TIMESTAMP ,"email" TEXT NOT NULL ,"hashedPassword" TEXT NOT NULL ,"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"name" TEXT ,"role" TEXT NOT NULL ,"updatedAt" DATE NOT NULL )
CREATE TABLE "quaint"."Session" (
"antiCSRFToken" TEXT ,"createdAt" DATE NOT NULL DEFAULT CURRENT_TIMESTAMP ,"expiresAt" DATE ,"handle" TEXT NOT NULL ,"hashedSessionToken" TEXT ,"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"privateData" TEXT ,"publicData" TEXT ,"updatedAt" DATE NOT NULL ,"userId" INTEGER ,FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE)
CREATE UNIQUE INDEX "quaint"."User.email" ON "User"("email")
CREATE UNIQUE INDEX "quaint"."Session.handle" ON "Session"("handle")
PRAGMA "quaint".foreign_key_check;
PRAGMA foreign_keys=ON;
```
## Changes
```diff
diff --git schema.prisma schema.prisma
migration ..20200704211726
--- datamodel.dml
+++ datamodel.dml
@@ -1,0 +1,46 @@
+// This is your Prisma schema file,
+// learn more about it in the docs: https://pris.ly/d/prisma-schema
+
+datasource sqlite {
+ provider = "sqlite"
+ url = "***"
+}
+
+// SQLite is easy to start with, but if you use Postgres in production
+// you should also use it in development with the following:
+//datasource postgresql {
+// provider = "postgresql"
+// url = "***"
+//}
+
+generator client {
+ provider = "prisma-client-js"
+}
+
+
+// --------------------------------------
+
+model User {
+ id Int @default(autoincrement()) @id
+ createdAt DateTime @default(now())
+ updatedAt DateTime @updatedAt
+ name String?
+ email String @unique
+ hashedPassword String
+ role String
+ sessions Session[]
+}
+
+model Session {
+ id Int @default(autoincrement()) @id
+ createdAt DateTime @default(now())
+ updatedAt DateTime @updatedAt
+ expiresAt DateTime?
+ handle String @unique
+ user User? @relation(fields: [userId], references: [id])
+ userId Int?
+ hashedSessionToken String?
+ antiCSRFToken String?
+ publicData String?
+ privateData String?
+}
```

View File

@@ -1,46 +0,0 @@
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
datasource sqlite {
provider = "sqlite"
url = "***"
}
// SQLite is easy to start with, but if you use Postgres in production
// you should also use it in development with the following:
//datasource postgresql {
// provider = "postgresql"
// url = "***"
//}
generator client {
provider = "prisma-client-js"
}
// --------------------------------------
model User {
id Int @default(autoincrement()) @id
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
name String?
email String @unique
hashedPassword String
role String
sessions Session[]
}
model Session {
id Int @default(autoincrement()) @id
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
expiresAt DateTime?
handle String @unique
user User? @relation(fields: [userId], references: [id])
userId Int?
hashedSessionToken String?
antiCSRFToken String?
publicData String?
privateData String?
}

View File

@@ -1,373 +0,0 @@
{
"version": "0.3.14-fixed",
"steps": [
{
"tag": "CreateSource",
"source": "sqlite"
},
{
"tag": "CreateArgument",
"location": {
"tag": "Source",
"source": "sqlite"
},
"argument": "provider",
"value": "\"sqlite\""
},
{
"tag": "CreateArgument",
"location": {
"tag": "Source",
"source": "sqlite"
},
"argument": "url",
"value": "\"file:./db.sqlite\""
},
{
"tag": "CreateModel",
"model": "User"
},
{
"tag": "CreateField",
"model": "User",
"field": "id",
"type": "Int",
"arity": "Required"
},
{
"tag": "CreateDirective",
"location": {
"path": {
"tag": "Field",
"model": "User",
"field": "id"
},
"directive": "default"
}
},
{
"tag": "CreateArgument",
"location": {
"tag": "Directive",
"path": {
"tag": "Field",
"model": "User",
"field": "id"
},
"directive": "default"
},
"argument": "",
"value": "autoincrement()"
},
{
"tag": "CreateDirective",
"location": {
"path": {
"tag": "Field",
"model": "User",
"field": "id"
},
"directive": "id"
}
},
{
"tag": "CreateField",
"model": "User",
"field": "createdAt",
"type": "DateTime",
"arity": "Required"
},
{
"tag": "CreateDirective",
"location": {
"path": {
"tag": "Field",
"model": "User",
"field": "createdAt"
},
"directive": "default"
}
},
{
"tag": "CreateArgument",
"location": {
"tag": "Directive",
"path": {
"tag": "Field",
"model": "User",
"field": "createdAt"
},
"directive": "default"
},
"argument": "",
"value": "now()"
},
{
"tag": "CreateField",
"model": "User",
"field": "updatedAt",
"type": "DateTime",
"arity": "Required"
},
{
"tag": "CreateDirective",
"location": {
"path": {
"tag": "Field",
"model": "User",
"field": "updatedAt"
},
"directive": "updatedAt"
}
},
{
"tag": "CreateField",
"model": "User",
"field": "name",
"type": "String",
"arity": "Optional"
},
{
"tag": "CreateField",
"model": "User",
"field": "email",
"type": "String",
"arity": "Required"
},
{
"tag": "CreateDirective",
"location": {
"path": {
"tag": "Field",
"model": "User",
"field": "email"
},
"directive": "unique"
}
},
{
"tag": "CreateField",
"model": "User",
"field": "hashedPassword",
"type": "String",
"arity": "Required"
},
{
"tag": "CreateField",
"model": "User",
"field": "role",
"type": "String",
"arity": "Required"
},
{
"tag": "CreateField",
"model": "User",
"field": "sessions",
"type": "Session",
"arity": "List"
},
{
"tag": "CreateModel",
"model": "Session"
},
{
"tag": "CreateField",
"model": "Session",
"field": "id",
"type": "Int",
"arity": "Required"
},
{
"tag": "CreateDirective",
"location": {
"path": {
"tag": "Field",
"model": "Session",
"field": "id"
},
"directive": "default"
}
},
{
"tag": "CreateArgument",
"location": {
"tag": "Directive",
"path": {
"tag": "Field",
"model": "Session",
"field": "id"
},
"directive": "default"
},
"argument": "",
"value": "autoincrement()"
},
{
"tag": "CreateDirective",
"location": {
"path": {
"tag": "Field",
"model": "Session",
"field": "id"
},
"directive": "id"
}
},
{
"tag": "CreateField",
"model": "Session",
"field": "createdAt",
"type": "DateTime",
"arity": "Required"
},
{
"tag": "CreateDirective",
"location": {
"path": {
"tag": "Field",
"model": "Session",
"field": "createdAt"
},
"directive": "default"
}
},
{
"tag": "CreateArgument",
"location": {
"tag": "Directive",
"path": {
"tag": "Field",
"model": "Session",
"field": "createdAt"
},
"directive": "default"
},
"argument": "",
"value": "now()"
},
{
"tag": "CreateField",
"model": "Session",
"field": "updatedAt",
"type": "DateTime",
"arity": "Required"
},
{
"tag": "CreateDirective",
"location": {
"path": {
"tag": "Field",
"model": "Session",
"field": "updatedAt"
},
"directive": "updatedAt"
}
},
{
"tag": "CreateField",
"model": "Session",
"field": "expiresAt",
"type": "DateTime",
"arity": "Optional"
},
{
"tag": "CreateField",
"model": "Session",
"field": "handle",
"type": "String",
"arity": "Required"
},
{
"tag": "CreateDirective",
"location": {
"path": {
"tag": "Field",
"model": "Session",
"field": "handle"
},
"directive": "unique"
}
},
{
"tag": "CreateField",
"model": "Session",
"field": "user",
"type": "User",
"arity": "Optional"
},
{
"tag": "CreateDirective",
"location": {
"path": {
"tag": "Field",
"model": "Session",
"field": "user"
},
"directive": "relation"
}
},
{
"tag": "CreateArgument",
"location": {
"tag": "Directive",
"path": {
"tag": "Field",
"model": "Session",
"field": "user"
},
"directive": "relation"
},
"argument": "fields",
"value": "[userId]"
},
{
"tag": "CreateArgument",
"location": {
"tag": "Directive",
"path": {
"tag": "Field",
"model": "Session",
"field": "user"
},
"directive": "relation"
},
"argument": "references",
"value": "[id]"
},
{
"tag": "CreateField",
"model": "Session",
"field": "userId",
"type": "Int",
"arity": "Optional"
},
{
"tag": "CreateField",
"model": "Session",
"field": "hashedSessionToken",
"type": "String",
"arity": "Optional"
},
{
"tag": "CreateField",
"model": "Session",
"field": "antiCSRFToken",
"type": "String",
"arity": "Optional"
},
{
"tag": "CreateField",
"model": "Session",
"field": "publicData",
"type": "String",
"arity": "Optional"
},
{
"tag": "CreateField",
"model": "Session",
"field": "privateData",
"type": "String",
"arity": "Optional"
}
]
}

View File

@@ -0,0 +1,32 @@
-- 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,
"userId" INTEGER,
"hashedSessionToken" TEXT,
"antiCSRFToken" TEXT,
"publicData" TEXT,
"privateData" TEXT,
FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE
);
-- CreateIndex
CREATE UNIQUE INDEX "User.email_unique" ON "User"("email");
-- CreateIndex
CREATE UNIQUE INDEX "Session.handle_unique" ON "Session"("handle");

View File

@@ -0,0 +1,7 @@
-- CreateTable
CREATE TABLE "Project" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" DATETIME NOT NULL,
"name" TEXT NOT NULL
);

View File

@@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "Project" ADD COLUMN "dueDate" DATETIME;

View File

@@ -0,0 +1,15 @@
-- 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 "Token.hashedToken_type_unique" ON "Token"("hashedToken", "type");

View File

@@ -1,4 +0,0 @@
# Prisma Migrate lockfile v1
20200704211726
20200711145940

View File

@@ -0,0 +1,2 @@
# Please do not edit this file manually
provider = "sqlite"

View File

@@ -17,26 +17,27 @@ generator client {
provider = "prisma-client-js"
}
// --------------------------------------
model User {
id Int @default(autoincrement()) @id
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
name String?
email String @unique
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
name String?
email String @unique
hashedPassword String?
role String @default("user")
sessions Session[]
role String @default("user")
sessions Session[]
tokens Token[]
}
model Session {
id Int @default(autoincrement()) @id
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
expiresAt DateTime?
handle String @unique
handle String @unique
user User? @relation(fields: [userId], references: [id])
userId Int?
hashedSessionToken String?
@@ -44,3 +45,26 @@ model Session {
publicData String?
privateData String?
}
model Token {
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
hashedToken String
type String
expiresAt DateTime
sentTo String
user User @relation(fields: [userId], references: [id])
userId Int
@@unique([hashedToken, type])
}
model Project {
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
name String
dueDate DateTime?
}

View File

@@ -0,0 +1,6 @@
import db from "./index"
const seed = async () => {
const user = await db.user.create({data: {name: "FooBar", email: "hey@" + new Date().getTime()}})
console.log("Created user", user)
}
export default seed

View File

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

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.
*/
import previewEmail from "preview-email"
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
await previewEmail(msg)
}
},
}
}

View File

@@ -1,16 +1,26 @@
{
"name": "@examples/auth",
"version": "0.16.5-canary.2",
"version": "0.30.0-canary.7",
"scripts": {
"start": "blitz start",
"studio": "blitz db studio",
"dev": "blitz dev",
"build": "blitz build",
"start": "blitz start",
"studio": "blitz prisma studio",
"lint": "eslint --ignore-path .gitignore --ext .js,.ts,.tsx .",
"test": "blitz build"
"analyze": "cross-env ANALYZE=true blitz build",
"cy:open": "cypress open",
"cy:run": "cypress run || cypress run",
"test": "prisma generate && yarn test:jest && yarn test:e2e",
"test:jest": "jest",
"test:server": "cross-env NODE_ENV=test blitz prisma migrate deploy --preview-feature && blitz build && cross-env NODE_ENV=test blitz start -p 3099",
"test:e2e": "cross-env NODE_ENV=test start-server-and-test test:server http://localhost:3099 cy:run"
},
"browserslist": [
"defaults"
],
"prisma": {
"schema": "db/schema.prisma"
},
"prettier": {
"semi": false,
"printWidth": 100,
@@ -29,34 +39,39 @@
]
},
"dependencies": {
"@prisma/cli": "2.1.0",
"@prisma/client": "2.1.0",
"blitz": "0.16.5-canary.2",
"@prisma/client": "2.16.0",
"blitz": "0.30.0-canary.7",
"final-form": "4.20.1",
"react": "0.0.0-experimental-33c3af284",
"react-dom": "0.0.0-experimental-33c3af284",
"react-final-form": "6.5.1",
"secure-password": "4.0.0",
"zod": "1.10.0-alpha.2"
"passport-auth0": "1.4.0",
"passport-github2": "0.1.12",
"passport-twitter": "1.0.4",
"prisma": "2.16.0",
"react": "0.0.0-experimental-3310209d0",
"react-dom": "0.0.0-experimental-3310209d0",
"react-error-boundary": "3.1.0",
"react-final-form": "6.5.2",
"zod": "1.11.11"
},
"devDependencies": {
"@types/react": "16.9.38",
"@types/secure-password": "3.1.0",
"@typescript-eslint/eslint-plugin": "2.34.1-alpha.2",
"@typescript-eslint/parser": "2.34.1-alpha.2",
"babel-eslint": "10.1.0",
"eslint": "6.8.0",
"eslint-config-react-app": "5.2.1",
"eslint-plugin-flowtype": "4.7.0",
"eslint-plugin-import": "2.21.2",
"eslint-plugin-jsx-a11y": "6.3.1",
"eslint-plugin-react": "7.20.0",
"eslint-plugin-react-hooks": "3.0.0",
"husky": "4.2.5",
"lint-staged": "10.2.11",
"prettier": "2.0.5",
"pretty-quick": "2.0.1",
"typescript": "3.9.5"
"@cypress/skip-test": "2.6.0",
"@next/bundle-analyzer": "^10.0.6",
"@testing-library/react": "11.2.3",
"@testing-library/react-hooks": "4.0.1",
"@types/passport-auth0": "1.0.4",
"@types/passport-github2": "1.2.4",
"@types/passport-twitter": "1.0.36",
"@types/preview-email": "2.0.0",
"@types/react": "17.0.0",
"cross-env": "7.0.3",
"cypress": "6.2.1",
"eslint": "7.18.0",
"husky": "4.3.8",
"lint-staged": "10.5.3",
"prettier": "2.2.1",
"pretty-quick": "3.1.0",
"preview-email": "3.0.3",
"start-server-and-test": "1.11.7",
"typescript": "4.1.3"
},
"private": true
}

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