From 9dbe987e75a182085176ab0e46161c5c010d7c17 Mon Sep 17 00:00:00 2001
From: Bart van den Aardweg
Date: Thu, 9 Dec 2021 21:18:14 +0100
Subject: [PATCH 1/5] feat: add next middleware, separate passwordcheck handler
---
README.md | 60 +-
{example => examples/hoc}/.commitlintrc.js | 0
{example => examples/hoc}/.cz-config.js | 0
{example => examples/hoc}/.env.example | 0
{example => examples/hoc}/.eslintignore | 0
{example => examples/hoc}/.gitignore | 0
{example => examples/hoc}/.prettierignore | 0
{example => examples/hoc}/README.md | 0
{example => examples/hoc}/custom.d.ts | 0
{example => examples/hoc}/jest.config.js | 0
{example => examples/hoc}/jest.setup.js | 0
{example => examples/hoc}/next-env.d.ts | 0
{example => examples/hoc}/next.config.js | 0
{example => examples/hoc}/package.json | 2 +-
{example => examples/hoc}/public/favicon.ico | Bin
.../public/static/fonts/DomaineDisp-Bold.woff | Bin
.../static/fonts/DomaineDisp-Bold.woff2 | Bin
.../hoc}/public/static/fonts/Inter-Bold.woff | Bin
.../hoc}/public/static/fonts/Inter-Bold.woff2 | Bin
.../public/static/fonts/Inter-BoldItalic.woff | Bin
.../static/fonts/Inter-BoldItalic.woff2 | Bin
.../public/static/fonts/Inter-Italic.woff | Bin
.../public/static/fonts/Inter-Italic.woff2 | Bin
.../public/static/fonts/Inter-Medium.woff | Bin
.../public/static/fonts/Inter-Medium.woff2 | Bin
.../static/fonts/Inter-MediumItalic.woff | Bin
.../static/fonts/Inter-MediumItalic.woff2 | Bin
.../public/static/fonts/Inter-Regular.woff | Bin
.../public/static/fonts/Inter-Regular.woff2 | Bin
.../hoc}/public/static/fonts/stylesheet.css | 0
{example => examples/hoc}/src/config/index.ts | 0
{example => examples/hoc}/src/config/seo.ts | 0
{example => examples/hoc}/src/globals.d.ts | 0
{example => examples/hoc}/src/lib/index.ts | 0
.../hoc}/src/lib/test-utils.ts | 0
{example => examples/hoc}/src/pages/_app.tsx | 2 +-
.../hoc}/src/pages/_document.tsx | 0
.../hoc}/src/pages/_error.tsx | 0
.../hoc}/src/pages/api/login.ts | 0
.../hoc}/src/pages/api/logout.ts | 0
.../hoc}/src/pages/api/passwordCheck.ts | 0
{example => examples/hoc}/src/pages/index.tsx | 0
.../hoc}/src/styles/styled.d.ts | 0
{example => examples/hoc}/src/styles/theme.ts | 0
{example => examples/hoc}/tsconfig.json | 0
{example => examples/hoc}/yarn.lock | 9 +-
examples/middleware/.commitlintrc.js | 1 +
examples/middleware/.cz-config.js | 69 +
examples/middleware/.env.example | 2 +
examples/middleware/.eslintignore | 7 +
examples/middleware/.gitignore | 26 +
examples/middleware/.prettierignore | 7 +
examples/middleware/README.md | 10 +
examples/middleware/custom.d.ts | 19 +
examples/middleware/jest.config.js | 19 +
examples/middleware/jest.setup.js | 1 +
examples/middleware/next-env.d.ts | 6 +
examples/middleware/next.config.js | 35 +
examples/middleware/package.json | 109 +
examples/middleware/public/favicon.ico | Bin 0 -> 15086 bytes
.../public/static/fonts/DomaineDisp-Bold.woff | Bin 0 -> 32120 bytes
.../static/fonts/DomaineDisp-Bold.woff2 | Bin 0 -> 22876 bytes
.../public/static/fonts/Inter-Bold.woff | Bin 0 -> 141936 bytes
.../public/static/fonts/Inter-Bold.woff2 | Bin 0 -> 96616 bytes
.../public/static/fonts/Inter-BoldItalic.woff | Bin 0 -> 149860 bytes
.../static/fonts/Inter-BoldItalic.woff2 | Bin 0 -> 101520 bytes
.../public/static/fonts/Inter-Italic.woff | Bin 0 -> 143256 bytes
.../public/static/fonts/Inter-Italic.woff2 | Bin 0 -> 96072 bytes
.../public/static/fonts/Inter-Medium.woff | Bin 0 -> 141064 bytes
.../public/static/fonts/Inter-Medium.woff2 | Bin 0 -> 96236 bytes
.../static/fonts/Inter-MediumItalic.woff | Bin 0 -> 149688 bytes
.../static/fonts/Inter-MediumItalic.woff2 | Bin 0 -> 101688 bytes
.../public/static/fonts/Inter-Regular.woff | Bin 0 -> 132992 bytes
.../public/static/fonts/Inter-Regular.woff2 | Bin 0 -> 89196 bytes
.../public/static/fonts/stylesheet.css | 56 +
examples/middleware/src/config/index.ts | 1 +
examples/middleware/src/config/seo.ts | 21 +
examples/middleware/src/globals.d.ts | 1 +
examples/middleware/src/lib/index.ts | 1 +
examples/middleware/src/lib/test-utils.ts | 9 +
examples/middleware/src/pages/_app.tsx | 29 +
examples/middleware/src/pages/_document.tsx | 30 +
examples/middleware/src/pages/_error.tsx | 37 +
examples/middleware/src/pages/_middleware.ts | 12 +
examples/middleware/src/pages/api/login.ts | 5 +
examples/middleware/src/pages/api/logout.ts | 5 +
examples/middleware/src/pages/index.tsx | 27 +
examples/middleware/src/styles/styled.d.ts | 13 +
examples/middleware/src/styles/theme.ts | 123 +
examples/middleware/tsconfig.json | 26 +
examples/middleware/yarn.lock | 13721 ++++++++++++++++
package.json | 2 +-
rollup.config.js | 2 +-
src/api/PasswordChecker.ts | 53 +
src/api/index.ts | 3 +-
src/api/passwordCheckHandler.ts | 56 +-
.../Login.tsx} | 8 +-
src/components/__tests__/Login.test.tsx | 136 +
src/components/index.ts | 1 +
src/constants.ts | 1 +
src/hoc/withPasswordProtect.tsx | 7 +-
src/index.ts | 1 +
src/middleware/index.tsx | 1 +
src/middleware/middleware.ts | 63 +
tsconfig.build.json | 6 +-
tsconfig.json | 2 +-
yarn.lock | 423 +-
107 files changed, 14916 insertions(+), 350 deletions(-)
rename {example => examples/hoc}/.commitlintrc.js (100%)
rename {example => examples/hoc}/.cz-config.js (100%)
rename {example => examples/hoc}/.env.example (100%)
rename {example => examples/hoc}/.eslintignore (100%)
rename {example => examples/hoc}/.gitignore (100%)
rename {example => examples/hoc}/.prettierignore (100%)
rename {example => examples/hoc}/README.md (100%)
rename {example => examples/hoc}/custom.d.ts (100%)
rename {example => examples/hoc}/jest.config.js (100%)
rename {example => examples/hoc}/jest.setup.js (100%)
rename {example => examples/hoc}/next-env.d.ts (100%)
rename {example => examples/hoc}/next.config.js (100%)
rename {example => examples/hoc}/package.json (98%)
rename {example => examples/hoc}/public/favicon.ico (100%)
rename {example => examples/hoc}/public/static/fonts/DomaineDisp-Bold.woff (100%)
rename {example => examples/hoc}/public/static/fonts/DomaineDisp-Bold.woff2 (100%)
rename {example => examples/hoc}/public/static/fonts/Inter-Bold.woff (100%)
rename {example => examples/hoc}/public/static/fonts/Inter-Bold.woff2 (100%)
rename {example => examples/hoc}/public/static/fonts/Inter-BoldItalic.woff (100%)
rename {example => examples/hoc}/public/static/fonts/Inter-BoldItalic.woff2 (100%)
rename {example => examples/hoc}/public/static/fonts/Inter-Italic.woff (100%)
rename {example => examples/hoc}/public/static/fonts/Inter-Italic.woff2 (100%)
rename {example => examples/hoc}/public/static/fonts/Inter-Medium.woff (100%)
rename {example => examples/hoc}/public/static/fonts/Inter-Medium.woff2 (100%)
rename {example => examples/hoc}/public/static/fonts/Inter-MediumItalic.woff (100%)
rename {example => examples/hoc}/public/static/fonts/Inter-MediumItalic.woff2 (100%)
rename {example => examples/hoc}/public/static/fonts/Inter-Regular.woff (100%)
rename {example => examples/hoc}/public/static/fonts/Inter-Regular.woff2 (100%)
rename {example => examples/hoc}/public/static/fonts/stylesheet.css (100%)
rename {example => examples/hoc}/src/config/index.ts (100%)
rename {example => examples/hoc}/src/config/seo.ts (100%)
rename {example => examples/hoc}/src/globals.d.ts (100%)
rename {example => examples/hoc}/src/lib/index.ts (100%)
rename {example => examples/hoc}/src/lib/test-utils.ts (100%)
rename {example => examples/hoc}/src/pages/_app.tsx (94%)
rename {example => examples/hoc}/src/pages/_document.tsx (100%)
rename {example => examples/hoc}/src/pages/_error.tsx (100%)
rename {example => examples/hoc}/src/pages/api/login.ts (100%)
rename {example => examples/hoc}/src/pages/api/logout.ts (100%)
rename {example => examples/hoc}/src/pages/api/passwordCheck.ts (100%)
rename {example => examples/hoc}/src/pages/index.tsx (100%)
rename {example => examples/hoc}/src/styles/styled.d.ts (100%)
rename {example => examples/hoc}/src/styles/theme.ts (100%)
rename {example => examples/hoc}/tsconfig.json (100%)
rename {example => examples/hoc}/yarn.lock (99%)
create mode 100644 examples/middleware/.commitlintrc.js
create mode 100644 examples/middleware/.cz-config.js
create mode 100644 examples/middleware/.env.example
create mode 100644 examples/middleware/.eslintignore
create mode 100644 examples/middleware/.gitignore
create mode 100644 examples/middleware/.prettierignore
create mode 100644 examples/middleware/README.md
create mode 100644 examples/middleware/custom.d.ts
create mode 100644 examples/middleware/jest.config.js
create mode 100644 examples/middleware/jest.setup.js
create mode 100644 examples/middleware/next-env.d.ts
create mode 100644 examples/middleware/next.config.js
create mode 100644 examples/middleware/package.json
create mode 100644 examples/middleware/public/favicon.ico
create mode 100644 examples/middleware/public/static/fonts/DomaineDisp-Bold.woff
create mode 100644 examples/middleware/public/static/fonts/DomaineDisp-Bold.woff2
create mode 100644 examples/middleware/public/static/fonts/Inter-Bold.woff
create mode 100644 examples/middleware/public/static/fonts/Inter-Bold.woff2
create mode 100644 examples/middleware/public/static/fonts/Inter-BoldItalic.woff
create mode 100644 examples/middleware/public/static/fonts/Inter-BoldItalic.woff2
create mode 100644 examples/middleware/public/static/fonts/Inter-Italic.woff
create mode 100644 examples/middleware/public/static/fonts/Inter-Italic.woff2
create mode 100644 examples/middleware/public/static/fonts/Inter-Medium.woff
create mode 100644 examples/middleware/public/static/fonts/Inter-Medium.woff2
create mode 100644 examples/middleware/public/static/fonts/Inter-MediumItalic.woff
create mode 100644 examples/middleware/public/static/fonts/Inter-MediumItalic.woff2
create mode 100644 examples/middleware/public/static/fonts/Inter-Regular.woff
create mode 100644 examples/middleware/public/static/fonts/Inter-Regular.woff2
create mode 100644 examples/middleware/public/static/fonts/stylesheet.css
create mode 100644 examples/middleware/src/config/index.ts
create mode 100644 examples/middleware/src/config/seo.ts
create mode 100644 examples/middleware/src/globals.d.ts
create mode 100644 examples/middleware/src/lib/index.ts
create mode 100644 examples/middleware/src/lib/test-utils.ts
create mode 100644 examples/middleware/src/pages/_app.tsx
create mode 100644 examples/middleware/src/pages/_document.tsx
create mode 100644 examples/middleware/src/pages/_error.tsx
create mode 100644 examples/middleware/src/pages/_middleware.ts
create mode 100644 examples/middleware/src/pages/api/login.ts
create mode 100644 examples/middleware/src/pages/api/logout.ts
create mode 100644 examples/middleware/src/pages/index.tsx
create mode 100644 examples/middleware/src/styles/styled.d.ts
create mode 100644 examples/middleware/src/styles/theme.ts
create mode 100644 examples/middleware/tsconfig.json
create mode 100644 examples/middleware/yarn.lock
create mode 100644 src/api/PasswordChecker.ts
rename src/{hoc/LoginComponent.tsx => components/Login.tsx} (98%)
create mode 100644 src/components/__tests__/Login.test.tsx
create mode 100644 src/components/index.ts
create mode 100644 src/constants.ts
create mode 100644 src/middleware/index.tsx
create mode 100644 src/middleware/middleware.ts
diff --git a/README.md b/README.md
index e67eeb3..97cce84 100644
--- a/README.md
+++ b/README.md
@@ -27,6 +27,7 @@
## How it works
This library adds a password prompt to your Next.js deployment. It consists of two main parts:
+
1. Two serverless API routes:
- A login route that checks if a password is correct and sets a cookie with a JWT in case it is.
- A check route that validates if you have the authorization cookie with a valid JWT.
@@ -93,9 +94,9 @@ import { withPasswordProtect } from "@storyofams/next-password-protect";
// Before: export default App;
export default process.env.PASSWORD_PROTECT
? withPasswordProtect(App, {
- // Options go here (optional)
- loginApiUrl: "/login",
- })
+ // Options go here (optional)
+ loginApiUrl: "/login",
+ })
: App;
```
@@ -104,53 +105,54 @@ export default process.env.PASSWORD_PROTECT
## API
### API routes handlers
-```loginHandler(password: string, options)```
+
+`loginHandler(password: string, options)`
The options object can contain any of the following options:
-Option | Description | Default value
------- | ----------- | -------------
-`cookieMaxAge`| Cookie Max-Age attribute | `undefined`
-`cookieName`| The name of the authorization cookie | `'next-password-protect'`
-`cookieSameSite`| SameSite cookie attribute | `false`
-`cookieSecure`| Secure flag on the cookie | `process.env.NODE_ENV === 'production'`
+| Option | Description | Default value |
+| ---------------- | ------------------------------------ | --------------------------------------- |
+| `cookieMaxAge` | Cookie Max-Age attribute | `undefined` |
+| `cookieName` | The name of the authorization cookie | `'next-password-protect'` |
+| `cookieSameSite` | SameSite cookie attribute | `false` |
+| `cookieSecure` | Secure flag on the cookie | `process.env.NODE_ENV === 'production'` |
-```passwordCheckHandler(password: string, options)```
+`passwordCheckHandler(password: string, options)`
The options object can contain any of the following options:
-Option | Description | Default value
------- | ----------- | -------------
-`cookieName`| The name of the authorization cookie | `'next-password-protect'`
-
+| Option | Description | Default value |
+| ------------ | ------------------------------------ | ------------------------- |
+| `cookieName` | The name of the authorization cookie | `'next-password-protect'` |
### Next App HOC
-```withPasswordProtect(App: NextApp, options)```
+
+`withPasswordProtect(App: NextApp, options)`
The options object can contain any of the following options:
-Option | Description | Default value
------- | ----------- | -------------
-`checkApiUrl`| Relative path of the api route handled by `passwordCheckHandler` | `'/api/passwordCheck'`
-`loginApiUrl`| Relative path of the api route handled by `loginHandler` | `'/api/login'`
-`loginComponent`| Supply your own React component to show as login prompt | `LoginComponent`
-`loginComponentProps`| Properties object to customize the login prompt, without overriding the entire component (see below) | `{}`
+| Option | Description | Default value |
+| --------------------- | ---------------------------------------------------------------------------------------------------- | ---------------------- |
+| `checkApiUrl` | Relative path of the api route handled by `passwordCheckHandler` | `'/api/passwordCheck'` |
+| `loginApiUrl` | Relative path of the api route handled by `loginHandler` | `'/api/login'` |
+| `loginComponent` | Supply your own React component to show as login prompt | `LoginComponent` |
+| `loginComponentProps` | Properties object to customize the login prompt, without overriding the entire component (see below) | `{}` |
The `loginComponentProps` object can contain any of the following options:
-Option | Description | Default value
------- | ----------- | -------------
-`backUrl`| Show a link with this URL to go back to main website | `undefined`
-`buttonBackgroundColor`| Login button background color | `'#01EDBC'`
-`buttonColor`| Login button color | `'#111'`
-`logo` | Show a logo above the prompt (img src) | `undefined`
+| Option | Description | Default value |
+| ----------------------- | ---------------------------------------------------- | ------------- |
+| `backUrl` | Show a link with this URL to go back to main website | `undefined` |
+| `buttonBackgroundColor` | Login button background color | `'#01EDBC'` |
+| `buttonColor` | Login button color | `'#111'` |
+| `logo` | Show a logo above the prompt (img src) | `undefined` |
## Advanced
### Custom login component
To change the default login component, a React component can be supplied to the `withPasswordProtect` HOC. In order for the library to function properly, make sure your login component has password input that is validated by the the api route.
-You can use `src/hoc/LoginComponent.tsx` as a starting point.
+You can use `src/components/Login.tsx` as a starting point.
## Caveats
diff --git a/example/.commitlintrc.js b/examples/hoc/.commitlintrc.js
similarity index 100%
rename from example/.commitlintrc.js
rename to examples/hoc/.commitlintrc.js
diff --git a/example/.cz-config.js b/examples/hoc/.cz-config.js
similarity index 100%
rename from example/.cz-config.js
rename to examples/hoc/.cz-config.js
diff --git a/example/.env.example b/examples/hoc/.env.example
similarity index 100%
rename from example/.env.example
rename to examples/hoc/.env.example
diff --git a/example/.eslintignore b/examples/hoc/.eslintignore
similarity index 100%
rename from example/.eslintignore
rename to examples/hoc/.eslintignore
diff --git a/example/.gitignore b/examples/hoc/.gitignore
similarity index 100%
rename from example/.gitignore
rename to examples/hoc/.gitignore
diff --git a/example/.prettierignore b/examples/hoc/.prettierignore
similarity index 100%
rename from example/.prettierignore
rename to examples/hoc/.prettierignore
diff --git a/example/README.md b/examples/hoc/README.md
similarity index 100%
rename from example/README.md
rename to examples/hoc/README.md
diff --git a/example/custom.d.ts b/examples/hoc/custom.d.ts
similarity index 100%
rename from example/custom.d.ts
rename to examples/hoc/custom.d.ts
diff --git a/example/jest.config.js b/examples/hoc/jest.config.js
similarity index 100%
rename from example/jest.config.js
rename to examples/hoc/jest.config.js
diff --git a/example/jest.setup.js b/examples/hoc/jest.setup.js
similarity index 100%
rename from example/jest.setup.js
rename to examples/hoc/jest.setup.js
diff --git a/example/next-env.d.ts b/examples/hoc/next-env.d.ts
similarity index 100%
rename from example/next-env.d.ts
rename to examples/hoc/next-env.d.ts
diff --git a/example/next.config.js b/examples/hoc/next.config.js
similarity index 100%
rename from example/next.config.js
rename to examples/hoc/next.config.js
diff --git a/example/package.json b/examples/hoc/package.json
similarity index 98%
rename from example/package.json
rename to examples/hoc/package.json
index 97570d8..e3c7cce 100644
--- a/example/package.json
+++ b/examples/hoc/package.json
@@ -15,7 +15,7 @@
"dependencies": {
"@reach/alert": "^0.7.4",
"@storyofams/react-helpers": "0.3.6",
- "@storyofams/next-password-protect": "link:..",
+ "@storyofams/next-password-protect": "link:../..",
"@styled-system/css": "^5.1.4",
"@styled-system/props": "^5.1.4",
"@svgr/webpack": "^5.0.1",
diff --git a/example/public/favicon.ico b/examples/hoc/public/favicon.ico
similarity index 100%
rename from example/public/favicon.ico
rename to examples/hoc/public/favicon.ico
diff --git a/example/public/static/fonts/DomaineDisp-Bold.woff b/examples/hoc/public/static/fonts/DomaineDisp-Bold.woff
similarity index 100%
rename from example/public/static/fonts/DomaineDisp-Bold.woff
rename to examples/hoc/public/static/fonts/DomaineDisp-Bold.woff
diff --git a/example/public/static/fonts/DomaineDisp-Bold.woff2 b/examples/hoc/public/static/fonts/DomaineDisp-Bold.woff2
similarity index 100%
rename from example/public/static/fonts/DomaineDisp-Bold.woff2
rename to examples/hoc/public/static/fonts/DomaineDisp-Bold.woff2
diff --git a/example/public/static/fonts/Inter-Bold.woff b/examples/hoc/public/static/fonts/Inter-Bold.woff
similarity index 100%
rename from example/public/static/fonts/Inter-Bold.woff
rename to examples/hoc/public/static/fonts/Inter-Bold.woff
diff --git a/example/public/static/fonts/Inter-Bold.woff2 b/examples/hoc/public/static/fonts/Inter-Bold.woff2
similarity index 100%
rename from example/public/static/fonts/Inter-Bold.woff2
rename to examples/hoc/public/static/fonts/Inter-Bold.woff2
diff --git a/example/public/static/fonts/Inter-BoldItalic.woff b/examples/hoc/public/static/fonts/Inter-BoldItalic.woff
similarity index 100%
rename from example/public/static/fonts/Inter-BoldItalic.woff
rename to examples/hoc/public/static/fonts/Inter-BoldItalic.woff
diff --git a/example/public/static/fonts/Inter-BoldItalic.woff2 b/examples/hoc/public/static/fonts/Inter-BoldItalic.woff2
similarity index 100%
rename from example/public/static/fonts/Inter-BoldItalic.woff2
rename to examples/hoc/public/static/fonts/Inter-BoldItalic.woff2
diff --git a/example/public/static/fonts/Inter-Italic.woff b/examples/hoc/public/static/fonts/Inter-Italic.woff
similarity index 100%
rename from example/public/static/fonts/Inter-Italic.woff
rename to examples/hoc/public/static/fonts/Inter-Italic.woff
diff --git a/example/public/static/fonts/Inter-Italic.woff2 b/examples/hoc/public/static/fonts/Inter-Italic.woff2
similarity index 100%
rename from example/public/static/fonts/Inter-Italic.woff2
rename to examples/hoc/public/static/fonts/Inter-Italic.woff2
diff --git a/example/public/static/fonts/Inter-Medium.woff b/examples/hoc/public/static/fonts/Inter-Medium.woff
similarity index 100%
rename from example/public/static/fonts/Inter-Medium.woff
rename to examples/hoc/public/static/fonts/Inter-Medium.woff
diff --git a/example/public/static/fonts/Inter-Medium.woff2 b/examples/hoc/public/static/fonts/Inter-Medium.woff2
similarity index 100%
rename from example/public/static/fonts/Inter-Medium.woff2
rename to examples/hoc/public/static/fonts/Inter-Medium.woff2
diff --git a/example/public/static/fonts/Inter-MediumItalic.woff b/examples/hoc/public/static/fonts/Inter-MediumItalic.woff
similarity index 100%
rename from example/public/static/fonts/Inter-MediumItalic.woff
rename to examples/hoc/public/static/fonts/Inter-MediumItalic.woff
diff --git a/example/public/static/fonts/Inter-MediumItalic.woff2 b/examples/hoc/public/static/fonts/Inter-MediumItalic.woff2
similarity index 100%
rename from example/public/static/fonts/Inter-MediumItalic.woff2
rename to examples/hoc/public/static/fonts/Inter-MediumItalic.woff2
diff --git a/example/public/static/fonts/Inter-Regular.woff b/examples/hoc/public/static/fonts/Inter-Regular.woff
similarity index 100%
rename from example/public/static/fonts/Inter-Regular.woff
rename to examples/hoc/public/static/fonts/Inter-Regular.woff
diff --git a/example/public/static/fonts/Inter-Regular.woff2 b/examples/hoc/public/static/fonts/Inter-Regular.woff2
similarity index 100%
rename from example/public/static/fonts/Inter-Regular.woff2
rename to examples/hoc/public/static/fonts/Inter-Regular.woff2
diff --git a/example/public/static/fonts/stylesheet.css b/examples/hoc/public/static/fonts/stylesheet.css
similarity index 100%
rename from example/public/static/fonts/stylesheet.css
rename to examples/hoc/public/static/fonts/stylesheet.css
diff --git a/example/src/config/index.ts b/examples/hoc/src/config/index.ts
similarity index 100%
rename from example/src/config/index.ts
rename to examples/hoc/src/config/index.ts
diff --git a/example/src/config/seo.ts b/examples/hoc/src/config/seo.ts
similarity index 100%
rename from example/src/config/seo.ts
rename to examples/hoc/src/config/seo.ts
diff --git a/example/src/globals.d.ts b/examples/hoc/src/globals.d.ts
similarity index 100%
rename from example/src/globals.d.ts
rename to examples/hoc/src/globals.d.ts
diff --git a/example/src/lib/index.ts b/examples/hoc/src/lib/index.ts
similarity index 100%
rename from example/src/lib/index.ts
rename to examples/hoc/src/lib/index.ts
diff --git a/example/src/lib/test-utils.ts b/examples/hoc/src/lib/test-utils.ts
similarity index 100%
rename from example/src/lib/test-utils.ts
rename to examples/hoc/src/lib/test-utils.ts
diff --git a/example/src/pages/_app.tsx b/examples/hoc/src/pages/_app.tsx
similarity index 94%
rename from example/src/pages/_app.tsx
rename to examples/hoc/src/pages/_app.tsx
index ab66752..4905710 100644
--- a/example/src/pages/_app.tsx
+++ b/examples/hoc/src/pages/_app.tsx
@@ -8,7 +8,7 @@ import { seo } from '~/config';
import theme from '~/styles/theme';
import '../../public/static/fonts/stylesheet.css';
-import { withPasswordProtect } from '../../../src';
+import { withPasswordProtect } from '../../../../src';
class MyApp extends App {
componentDidMount() {
diff --git a/example/src/pages/_document.tsx b/examples/hoc/src/pages/_document.tsx
similarity index 100%
rename from example/src/pages/_document.tsx
rename to examples/hoc/src/pages/_document.tsx
diff --git a/example/src/pages/_error.tsx b/examples/hoc/src/pages/_error.tsx
similarity index 100%
rename from example/src/pages/_error.tsx
rename to examples/hoc/src/pages/_error.tsx
diff --git a/example/src/pages/api/login.ts b/examples/hoc/src/pages/api/login.ts
similarity index 100%
rename from example/src/pages/api/login.ts
rename to examples/hoc/src/pages/api/login.ts
diff --git a/example/src/pages/api/logout.ts b/examples/hoc/src/pages/api/logout.ts
similarity index 100%
rename from example/src/pages/api/logout.ts
rename to examples/hoc/src/pages/api/logout.ts
diff --git a/example/src/pages/api/passwordCheck.ts b/examples/hoc/src/pages/api/passwordCheck.ts
similarity index 100%
rename from example/src/pages/api/passwordCheck.ts
rename to examples/hoc/src/pages/api/passwordCheck.ts
diff --git a/example/src/pages/index.tsx b/examples/hoc/src/pages/index.tsx
similarity index 100%
rename from example/src/pages/index.tsx
rename to examples/hoc/src/pages/index.tsx
diff --git a/example/src/styles/styled.d.ts b/examples/hoc/src/styles/styled.d.ts
similarity index 100%
rename from example/src/styles/styled.d.ts
rename to examples/hoc/src/styles/styled.d.ts
diff --git a/example/src/styles/theme.ts b/examples/hoc/src/styles/theme.ts
similarity index 100%
rename from example/src/styles/theme.ts
rename to examples/hoc/src/styles/theme.ts
diff --git a/example/tsconfig.json b/examples/hoc/tsconfig.json
similarity index 100%
rename from example/tsconfig.json
rename to examples/hoc/tsconfig.json
diff --git a/example/yarn.lock b/examples/hoc/yarn.lock
similarity index 99%
rename from example/yarn.lock
rename to examples/hoc/yarn.lock
index 9c952f2..7659cea 100644
--- a/example/yarn.lock
+++ b/examples/hoc/yarn.lock
@@ -2154,12 +2154,9 @@
telejson "^3.2.0"
util-deprecate "^1.0.2"
-"@storyofams/next-password-protect@link:..":
- version "0.0.0-development"
- dependencies:
- cookie "^0.4.1"
- jsonwebtoken "^8.5.1"
- safe-compare "^1.1.4"
+"@storyofams/next-password-protect@link:../..":
+ version "0.0.0"
+ uid ""
"@storyofams/react-helpers@0.3.6":
version "0.3.6"
diff --git a/examples/middleware/.commitlintrc.js b/examples/middleware/.commitlintrc.js
new file mode 100644
index 0000000..5073c20
--- /dev/null
+++ b/examples/middleware/.commitlintrc.js
@@ -0,0 +1 @@
+module.exports = { extends: ["@commitlint/config-conventional"] };
diff --git a/examples/middleware/.cz-config.js b/examples/middleware/.cz-config.js
new file mode 100644
index 0000000..cb98a5a
--- /dev/null
+++ b/examples/middleware/.cz-config.js
@@ -0,0 +1,69 @@
+module.exports = {
+ // add additional standard scopes here
+ scopes: [{ name: "accounts" }, { name: "admin" }],
+ // use this to permanently skip any questions by listing the message key as a string
+ skipQuestions: [],
+
+ /* DEFAULT CONFIG */
+ messages: {
+ type: "What type of changes are you committing:",
+ scope: "\nEnlighten us with the scope (optional):",
+ customScope: "Add the scope of your liking:",
+ subject: "Write a short and simple description of the change:\n",
+ body:
+ 'Provide a LONGER description of the change (optional). Use "|" to break new line:\n',
+ breaking: "List any BREAKING CHANGES (optional):\n",
+ footer:
+ "List any ISSUES CLOSED by this change (optional). E.g.: #31, #34:\n",
+ confirmCommit: "Are you sure you the above looks right?",
+ },
+ types: [
+ {
+ value: "fix",
+ name: "🐛 fix: Changes that fix a bug",
+ emoji: "🐛",
+ },
+ {
+ value: "feat",
+ name: " 🚀 feat: Changes that introduce a new feature",
+ emoji: "🚀",
+ },
+ {
+ value: "refactor",
+ name:
+ "🔍 refactor: Changes that neither fixes a bug nor adds a feature",
+ emoji: "🔍",
+ },
+ {
+ value: "test",
+ name: "💡 test: Adding missing tests",
+ emoji: "💡",
+ },
+ {
+ value: "style",
+ name:
+ "💅 style: Changes that do not impact the code base \n (white-space, formatting, missing semi-colons, etc)",
+ emoji: "💅",
+ },
+ {
+ value: "docs",
+ name: "📝 docs: Changes to the docs",
+ emoji: "📝",
+ },
+ {
+ value: "chore",
+ name:
+ "🤖 chore: Changes to the build process or auxiliary tools\n and or libraries such as auto doc generation",
+ emoji: "🤖",
+ },
+ ],
+ allowTicketNumber: false,
+ isTicketNumberRequired: false,
+ ticketNumberPrefix: "#",
+ ticketNumberRegExp: "\\d{1,5}",
+ allowCustomScopes: true,
+ allowBreakingChanges: ["feat", "fix", "chore"],
+ breakingPrefix: "🚧 BREAKING CHANGES 🚧",
+ footerPrefix: "CLOSES ISSUE:",
+ subjectLimit: 100,
+};
diff --git a/examples/middleware/.env.example b/examples/middleware/.env.example
new file mode 100644
index 0000000..c82b46b
--- /dev/null
+++ b/examples/middleware/.env.example
@@ -0,0 +1,2 @@
+ENVIRONMENT=staging
+STAGING_PASSWORD=secret
diff --git a/examples/middleware/.eslintignore b/examples/middleware/.eslintignore
new file mode 100644
index 0000000..2846c60
--- /dev/null
+++ b/examples/middleware/.eslintignore
@@ -0,0 +1,7 @@
+node_modules/*
+node_modules
+public/*
+storybook-static/*
+dist
+.next
+.next/*
\ No newline at end of file
diff --git a/examples/middleware/.gitignore b/examples/middleware/.gitignore
new file mode 100644
index 0000000..de055b0
--- /dev/null
+++ b/examples/middleware/.gitignore
@@ -0,0 +1,26 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+
+# testing
+/coverage
+
+# next.js
+/.next/
+/out/
+
+# production
+/build
+
+# misc
+.DS_Store
+.env*
+!.env.example
+
+# debug
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
diff --git a/examples/middleware/.prettierignore b/examples/middleware/.prettierignore
new file mode 100644
index 0000000..55d187a
--- /dev/null
+++ b/examples/middleware/.prettierignore
@@ -0,0 +1,7 @@
+node_modules/*
+public/*
+.next
+.next/*
+dist
+coverage
+storybook-static/*
\ No newline at end of file
diff --git a/examples/middleware/README.md b/examples/middleware/README.md
new file mode 100644
index 0000000..fe8ea4c
--- /dev/null
+++ b/examples/middleware/README.md
@@ -0,0 +1,10 @@
+
+
+
+
+
@storyofams/next-password-protect example
+
+
+## Setup
+
+Rename `.env.example` to `.env.local`
diff --git a/examples/middleware/custom.d.ts b/examples/middleware/custom.d.ts
new file mode 100644
index 0000000..228eb63
--- /dev/null
+++ b/examples/middleware/custom.d.ts
@@ -0,0 +1,19 @@
+import { SxStyleProp } from 'rebass';
+import * as StyledComponents from 'styled-components';
+import * as StyledSystem from 'styled-system';
+
+declare module 'rebass' {
+ type ThemedSxStyleProps =
+ | SxStyleProp
+ | StyledSystem.SpaceProps
+ | StyledSystem.TypographyProps
+ | StyledSystem.FlexboxProps
+ | StyledSystem.GridProps
+ | StyledSystem.LayoutProps
+ | StyledSystem.ColorProps;
+
+ export interface SxProps {
+ maatje?: boolean;
+ sx?: ThemedSxStyleProps;
+ }
+}
diff --git a/examples/middleware/jest.config.js b/examples/middleware/jest.config.js
new file mode 100644
index 0000000..240d345
--- /dev/null
+++ b/examples/middleware/jest.config.js
@@ -0,0 +1,19 @@
+module.exports = {
+ testEnvironment: 'jsdom',
+ roots: ['/src'],
+ transform: {
+ '^.+\\.tsx?$': 'babel-jest',
+ },
+ moduleNameMapper: {
+ '^~/(.*)$': '/src/$1',
+ },
+ moduleDirectories: [
+ 'node_modules',
+ 'src/lib', // a utility folder
+ __dirname, // the root directory
+ ],
+ setupFilesAfterEnv: [
+ '@testing-library/jest-dom/extend-expect',
+ './jest.setup.js',
+ ],
+};
diff --git a/examples/middleware/jest.setup.js b/examples/middleware/jest.setup.js
new file mode 100644
index 0000000..13fa383
--- /dev/null
+++ b/examples/middleware/jest.setup.js
@@ -0,0 +1 @@
+jest.mock('./src/components/common/Icon/req');
diff --git a/examples/middleware/next-env.d.ts b/examples/middleware/next-env.d.ts
new file mode 100644
index 0000000..9bc3dd4
--- /dev/null
+++ b/examples/middleware/next-env.d.ts
@@ -0,0 +1,6 @@
+///
+///
+///
+
+// NOTE: This file should not be edited
+// see https://nextjs.org/docs/basic-features/typescript for more information.
diff --git a/examples/middleware/next.config.js b/examples/middleware/next.config.js
new file mode 100644
index 0000000..69ff791
--- /dev/null
+++ b/examples/middleware/next.config.js
@@ -0,0 +1,35 @@
+const path = require('path');
+const { TsconfigPathsPlugin } = require('tsconfig-paths-webpack-plugin');
+
+module.exports = {
+ env: {
+ PASSWORD_PROTECT: process.env.ENVIRONMENT === 'staging',
+ },
+ eslint: {
+ // Warning: This allows production builds to successfully complete even if
+ // your project has ESLint errors.
+ ignoreDuringBuilds: true,
+ },
+ experimental: {
+ externalDir: true,
+ },
+ webpack(config, options) {
+ config.module.rules.push({
+ test: /\.svg$/,
+ use: [{ loader: '@svgr/webpack', options: { icon: true, svgo: false } }],
+ });
+
+ config.resolve.plugins = [
+ new TsconfigPathsPlugin({ extensions: config.resolve.extensions }),
+ ];
+
+ config.resolve.alias = {
+ ...config.resolve.alias,
+ next: path.resolve('./node_modules/next'),
+ react: path.resolve('./node_modules/react'),
+ 'react-dom': path.resolve('./node_modules/react-dom'),
+ };
+
+ return config;
+ },
+};
diff --git a/examples/middleware/package.json b/examples/middleware/package.json
new file mode 100644
index 0000000..e3c7cce
--- /dev/null
+++ b/examples/middleware/package.json
@@ -0,0 +1,109 @@
+{
+ "name": "next-password-protect-example",
+ "version": "0.1.0",
+ "private": true,
+ "scripts": {
+ "dev": "next dev",
+ "build": "next build",
+ "start": "next start",
+ "commit": "./node_modules/cz-customizable/standalone.js",
+ "test": "jest --coverage",
+ "test:watch": "jest --watch",
+ "lint": "eslint --ext .ts --ext .tsx ./src",
+ "prettier": "prettier \"**/*.+(js|jsx|json|yml|yaml|css|ts|tsx|md|mdx)\""
+ },
+ "dependencies": {
+ "@reach/alert": "^0.7.4",
+ "@storyofams/react-helpers": "0.3.6",
+ "@storyofams/next-password-protect": "link:../..",
+ "@styled-system/css": "^5.1.4",
+ "@styled-system/props": "^5.1.4",
+ "@svgr/webpack": "^5.0.1",
+ "axios": "^0.21.2",
+ "fontfaceobserver": "^2.1.0",
+ "next": "12.x.x",
+ "next-seo": "^3.3.0",
+ "object-fit-images": "^3.2.4",
+ "react": "^17.0.1",
+ "react-dom": "^17.0.1",
+ "react-hook-form": "6.14.1",
+ "react-lazyload": "^2.6.5",
+ "react-select": "^3.0.8",
+ "rebass": "^4.0.7",
+ "styled-components": "^5.1.1",
+ "styled-system": "^5.1.5",
+ "swr": "^0.1.16",
+ "yup": "^0.28.0"
+ },
+ "devDependencies": {
+ "@babel/core": "^7.7.7",
+ "@babel/runtime-corejs2": "^7.9.2",
+ "@commitlint/cli": "^8.3.4",
+ "@commitlint/config-conventional": "^8.3.4",
+ "@storybook/addon-actions": "^5.2.8",
+ "@storybook/addon-links": "^5.2.8",
+ "@storybook/addons": "^5.2.8",
+ "@storybook/preset-typescript": "^1.2.0",
+ "@storybook/react": "^5.2.8",
+ "@testing-library/jest-dom": "^5.0.2",
+ "@testing-library/react": "^9.4.0",
+ "@types/jest": "^24.9.1",
+ "@types/node": "^13.1.6",
+ "@types/react": "^16.9.17",
+ "@types/react-dom": "^16.9.4",
+ "@types/react-select": "^3.0.10",
+ "@types/rebass": "4.0.7",
+ "@types/styled-components": "^5.1.1",
+ "@types/styled-system": "^5.1.9",
+ "@types/yup": "^0.26.27",
+ "@typescript-eslint/eslint-plugin": "^2.15.0",
+ "@typescript-eslint/parser": "^2.15.0",
+ "awesome-typescript-loader": "^5.2.1",
+ "babel-eslint": "^10.1.0",
+ "babel-loader": "^8.0.6",
+ "babel-plugin-styled-components": "^1.10.6",
+ "babel-preset-react-app": "^9.1.0",
+ "cz-customizable": "git+https://github.com/storyofams/cz-customizable.git",
+ "eslint": "^7.6.0",
+ "eslint-config-ams": "git+https://github.com/storyofams/eslint-config-ams.git",
+ "eslint-config-prettier": "^6.11.0",
+ "eslint-import-resolver-alias": "^1.1.2",
+ "eslint-plugin-import": "^2.22.0",
+ "eslint-plugin-jsx-a11y": "^6.3.1",
+ "eslint-plugin-prettier": "^3.1.4",
+ "eslint-plugin-react": "^7.20.5",
+ "eslint-plugin-react-hooks": "^4.0.8",
+ "fork-ts-checker-webpack-plugin": "^3.1.1",
+ "husky": "^4.0.6",
+ "jest": "^24.3.0",
+ "lint-staged": "^9.5.0",
+ "prettier": "^2.0.5",
+ "react-docgen-typescript-loader": "^3.6.0",
+ "react-select-event": "^4.1.2",
+ "ts-jest": "^25.0.0",
+ "ts-loader": "^6.2.1",
+ "typescript": "4.3.2"
+ },
+ "eslintConfig": {
+ "extends": [
+ "ams/web"
+ ]
+ },
+ "config": {
+ "commitizen": {
+ "path": "node_modules/cz-customizable"
+ }
+ },
+ "husky": {
+ "hooks": {
+ "pre-commit": "lint-staged",
+ "commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
+ }
+ },
+ "lint-staged": {
+ "**/*.+(js|jsx|ts|tsx)": [
+ "yarn lint --fix",
+ "git add"
+ ]
+ }
+}
diff --git a/examples/middleware/public/favicon.ico b/examples/middleware/public/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..4965832f2c9b0605eaa189b7c7fb11124d24e48a
GIT binary patch
literal 15086
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
literal 0
HcmV?d00001
diff --git a/examples/middleware/public/static/fonts/DomaineDisp-Bold.woff2 b/examples/middleware/public/static/fonts/DomaineDisp-Bold.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..5d7b85f0300b8a229a978c46e0a16aa16ae699b1
GIT binary patch
literal 22876
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