├── 02-request-page-data
├── .env
├── public
│ ├── favicon.ico
│ └── vercel.svg
├── pages
│ ├── _app.js
│ ├── index.js
│ └── recipes.js
├── styles
│ └── globals.css
├── package.json
├── README.md
└── package-lock.json
├── 03-request-block-data
├── .env
├── public
│ ├── favicon.ico
│ └── vercel.svg
├── pages
│ ├── _app.js
│ ├── index.js
│ ├── recipes.js
│ └── recipes
│ │ └── [id].js
├── styles
│ └── globals.css
├── package.json
└── README.md
├── 04-slugify-page-data
├── .env
├── public
│ ├── favicon.ico
│ └── vercel.svg
├── pages
│ ├── _app.js
│ ├── index.js
│ ├── recipes.js
│ └── recipes
│ │ └── [slug].js
├── styles
│ └── globals.css
├── package.json
└── README.md
├── 05-request-database-data
├── .env
├── public
│ ├── favicon.ico
│ └── vercel.svg
├── pages
│ ├── _app.js
│ ├── index.js
│ ├── recipes.js
│ ├── movies.js
│ └── recipes
│ │ └── [slug].js
├── styles
│ └── globals.css
├── package.json
└── README.md
├── 06-paginated-database-data
├── .env
├── public
│ ├── favicon.ico
│ └── vercel.svg
├── pages
│ ├── _app.js
│ ├── index.js
│ ├── recipes.js
│ ├── movies.js
│ └── recipes
│ │ └── [slug].js
├── styles
│ └── globals.css
├── package.json
└── README.md
├── 07-update-database-properties
├── .env
├── public
│ ├── favicon.ico
│ └── vercel.svg
├── pages
│ ├── _app.js
│ ├── index.js
│ ├── api
│ │ └── mark-as-watched.js
│ ├── recipes.js
│ ├── movies.js
│ └── recipes
│ │ └── [slug].js
├── styles
│ └── globals.css
├── package.json
└── README.md
├── 08-incremental-static-regeneration
├── .env
├── public
│ ├── favicon.ico
│ └── vercel.svg
├── pages
│ ├── _app.js
│ ├── index.js
│ ├── api
│ │ └── mark-as-watched.js
│ ├── recipes.js
│ ├── recipes
│ │ └── [slug].js
│ └── movies.js
├── styles
│ └── globals.css
├── package.json
└── README.md
├── 01-generate-static-pages
├── public
│ ├── favicon.ico
│ └── vercel.svg
├── pages
│ ├── _app.js
│ └── index.js
├── styles
│ └── globals.css
├── package.json
└── README.md
├── .gitignore
└── README.md
/02-request-page-data/.env:
--------------------------------------------------------------------------------
1 | NOTION_SECRET=your-notion-secret
2 | PAGE_ID=your-notion-page-id
3 |
--------------------------------------------------------------------------------
/03-request-block-data/.env:
--------------------------------------------------------------------------------
1 | NOTION_SECRET=your-notion-secret
2 | PAGE_ID=your-notion-page-id
3 |
--------------------------------------------------------------------------------
/04-slugify-page-data/.env:
--------------------------------------------------------------------------------
1 | NOTION_SECRET=your-notion-secret
2 | PAGE_ID=your-notion-page-id
3 |
--------------------------------------------------------------------------------
/05-request-database-data/.env:
--------------------------------------------------------------------------------
1 | NOTION_SECRET=your-notion-secret
2 | PAGE_ID=your-notion-page-id
3 | DATABASE_ID=your-notion-database-id
4 |
--------------------------------------------------------------------------------
/06-paginated-database-data/.env:
--------------------------------------------------------------------------------
1 | NOTION_SECRET=your-notion-secret
2 | PAGE_ID=your-notion-page-id
3 | DATABASE_ID=your-notion-database-id
4 |
--------------------------------------------------------------------------------
/07-update-database-properties/.env:
--------------------------------------------------------------------------------
1 | NOTION_SECRET=your-notion-secret
2 | PAGE_ID=your-notion-page-id
3 | DATABASE_ID=your-notion-database-id
4 |
--------------------------------------------------------------------------------
/08-incremental-static-regeneration/.env:
--------------------------------------------------------------------------------
1 | NOTION_SECRET=your-notion-secret
2 | PAGE_ID=your-notion-page-id
3 | DATABASE_ID=your-notion-database-id
4 |
--------------------------------------------------------------------------------
/02-request-page-data/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dijonmusters/notion-api-egghead-course/HEAD/02-request-page-data/public/favicon.ico
--------------------------------------------------------------------------------
/04-slugify-page-data/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dijonmusters/notion-api-egghead-course/HEAD/04-slugify-page-data/public/favicon.ico
--------------------------------------------------------------------------------
/03-request-block-data/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dijonmusters/notion-api-egghead-course/HEAD/03-request-block-data/public/favicon.ico
--------------------------------------------------------------------------------
/01-generate-static-pages/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dijonmusters/notion-api-egghead-course/HEAD/01-generate-static-pages/public/favicon.ico
--------------------------------------------------------------------------------
/05-request-database-data/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dijonmusters/notion-api-egghead-course/HEAD/05-request-database-data/public/favicon.ico
--------------------------------------------------------------------------------
/06-paginated-database-data/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dijonmusters/notion-api-egghead-course/HEAD/06-paginated-database-data/public/favicon.ico
--------------------------------------------------------------------------------
/07-update-database-properties/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dijonmusters/notion-api-egghead-course/HEAD/07-update-database-properties/public/favicon.ico
--------------------------------------------------------------------------------
/08-incremental-static-regeneration/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dijonmusters/notion-api-egghead-course/HEAD/08-incremental-static-regeneration/public/favicon.ico
--------------------------------------------------------------------------------
/01-generate-static-pages/pages/_app.js:
--------------------------------------------------------------------------------
1 | import '../styles/globals.css'
2 |
3 | function MyApp({ Component, pageProps }) {
4 | return
{JSON.stringify(quote)}
; 3 | }; 4 | 5 | export const getStaticProps = async () => { 6 | // fetch data 7 | // create static pages 8 | const quote = await fetch( 9 | "https://breaking-bad-quotes.herokuapp.com/v1/quotes" 10 | ).then((resp) => resp.json()); 11 | 12 | return { 13 | props: { 14 | quote, 15 | }, 16 | }; 17 | }; 18 | 19 | export default Home; 20 | -------------------------------------------------------------------------------- /03-request-block-data/pages/index.js: -------------------------------------------------------------------------------- 1 | const Home = ({ quote }) => { 2 | return{JSON.stringify(quote)}
; 3 | }; 4 | 5 | export const getStaticProps = async () => { 6 | // fetch data 7 | // create static pages 8 | const quote = await fetch( 9 | "https://breaking-bad-quotes.herokuapp.com/v1/quotes" 10 | ).then((resp) => resp.json()); 11 | 12 | return { 13 | props: { 14 | quote, 15 | }, 16 | }; 17 | }; 18 | 19 | export default Home; 20 | -------------------------------------------------------------------------------- /04-slugify-page-data/pages/index.js: -------------------------------------------------------------------------------- 1 | const Home = ({ quote }) => { 2 | return{JSON.stringify(quote)}
; 3 | }; 4 | 5 | export const getStaticProps = async () => { 6 | // fetch data 7 | // create static pages 8 | const quote = await fetch( 9 | "https://breaking-bad-quotes.herokuapp.com/v1/quotes" 10 | ).then((resp) => resp.json()); 11 | 12 | return { 13 | props: { 14 | quote, 15 | }, 16 | }; 17 | }; 18 | 19 | export default Home; 20 | -------------------------------------------------------------------------------- /01-generate-static-pages/pages/index.js: -------------------------------------------------------------------------------- 1 | const Home = ({ quote }) => { 2 | return{JSON.stringify(quote)}
; 3 | }; 4 | 5 | export const getStaticProps = async () => { 6 | // fetch data 7 | // create static pages 8 | const quote = await fetch( 9 | "https://breaking-bad-quotes.herokuapp.com/v1/quotes" 10 | ).then((resp) => resp.json()); 11 | 12 | return { 13 | props: { 14 | quote, 15 | }, 16 | }; 17 | }; 18 | 19 | export default Home; 20 | -------------------------------------------------------------------------------- /05-request-database-data/pages/index.js: -------------------------------------------------------------------------------- 1 | const Home = ({ quote }) => { 2 | return{JSON.stringify(quote)}
; 3 | }; 4 | 5 | export const getStaticProps = async () => { 6 | // fetch data 7 | // create static pages 8 | const quote = await fetch( 9 | "https://breaking-bad-quotes.herokuapp.com/v1/quotes" 10 | ).then((resp) => resp.json()); 11 | 12 | return { 13 | props: { 14 | quote, 15 | }, 16 | }; 17 | }; 18 | 19 | export default Home; 20 | -------------------------------------------------------------------------------- /06-paginated-database-data/pages/index.js: -------------------------------------------------------------------------------- 1 | const Home = ({ quote }) => { 2 | return{JSON.stringify(quote)}
; 3 | }; 4 | 5 | export const getStaticProps = async () => { 6 | // fetch data 7 | // create static pages 8 | const quote = await fetch( 9 | "https://breaking-bad-quotes.herokuapp.com/v1/quotes" 10 | ).then((resp) => resp.json()); 11 | 12 | return { 13 | props: { 14 | quote, 15 | }, 16 | }; 17 | }; 18 | 19 | export default Home; 20 | -------------------------------------------------------------------------------- /07-update-database-properties/pages/index.js: -------------------------------------------------------------------------------- 1 | const Home = ({ quote }) => { 2 | return{JSON.stringify(quote)}
; 3 | }; 4 | 5 | export const getStaticProps = async () => { 6 | // fetch data 7 | // create static pages 8 | const quote = await fetch( 9 | "https://breaking-bad-quotes.herokuapp.com/v1/quotes" 10 | ).then((resp) => resp.json()); 11 | 12 | return { 13 | props: { 14 | quote, 15 | }, 16 | }; 17 | }; 18 | 19 | export default Home; 20 | -------------------------------------------------------------------------------- /08-incremental-static-regeneration/pages/index.js: -------------------------------------------------------------------------------- 1 | const Home = ({ quote }) => { 2 | return{JSON.stringify(quote)}
; 3 | }; 4 | 5 | export const getStaticProps = async () => { 6 | // fetch data 7 | // create static pages 8 | // const quote = await fetch( 9 | // "https://breaking-bad-quotes.herokuapp.com/v1/quotes" 10 | // ).then((resp) => resp.json()); 11 | 12 | return { 13 | props: { 14 | quote: "none", 15 | }, 16 | }; 17 | }; 18 | 19 | export default Home; 20 | -------------------------------------------------------------------------------- /07-update-database-properties/pages/api/mark-as-watched.js: -------------------------------------------------------------------------------- 1 | import { Client } from "@notionhq/client"; 2 | 3 | const handler = async (req, res) => { 4 | const { id, isWatched } = req.body; 5 | 6 | const notion = new Client({ 7 | auth: process.env.NOTION_SECRET, 8 | }); 9 | 10 | const data = await notion.pages.update({ 11 | page_id: id, 12 | properties: { 13 | Watched: { 14 | checkbox: isWatched, 15 | }, 16 | }, 17 | }); 18 | 19 | res.send(data); 20 | }; 21 | 22 | export default handler; 23 | -------------------------------------------------------------------------------- /08-incremental-static-regeneration/pages/api/mark-as-watched.js: -------------------------------------------------------------------------------- 1 | import { Client } from "@notionhq/client"; 2 | 3 | const handler = async (req, res) => { 4 | const { id, isWatched } = req.body; 5 | 6 | const notion = new Client({ 7 | auth: process.env.NOTION_SECRET, 8 | }); 9 | 10 | const data = await notion.pages.update({ 11 | page_id: id, 12 | properties: { 13 | Watched: { 14 | checkbox: isWatched, 15 | }, 16 | }, 17 | }); 18 | 19 | res.send(data); 20 | }; 21 | 22 | export default handler; 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env.local 29 | .env.development.local 30 | .env.test.local 31 | .env.production.local 32 | 33 | # vercel 34 | .vercel 35 | -------------------------------------------------------------------------------- /02-request-page-data/pages/recipes.js: -------------------------------------------------------------------------------- 1 | import { Client } from "@notionhq/client"; 2 | 3 | const RecipePage = ({ recipes }) => { 4 | return recipes.map((recipe) =>{recipe}
); 5 | }; 6 | 7 | export const getStaticProps = async () => { 8 | const notion = new Client({ 9 | auth: process.env.NOTION_SECRET, 10 | }); 11 | 12 | const data = await notion.blocks.children.list({ 13 | block_id: process.env.PAGE_ID, 14 | }); 15 | 16 | const recipes = []; 17 | 18 | data.results.forEach((result) => { 19 | if (result.type === "child_page") { 20 | recipes.push(result.child_page.title); 21 | } 22 | }); 23 | 24 | return { 25 | props: { 26 | recipes, 27 | }, 28 | }; 29 | }; 30 | 31 | export default RecipePage; 32 | -------------------------------------------------------------------------------- /04-slugify-page-data/pages/recipes.js: -------------------------------------------------------------------------------- 1 | import { Client } from "@notionhq/client"; 2 | import Link from "next/link"; 3 | import slugify from "slugify"; 4 | 5 | const RecipePage = ({ recipes }) => { 6 | return recipes.map((recipe) => ( 7 |8 | 9 | {recipe} 10 | 11 |
12 | )); 13 | }; 14 | 15 | export const getStaticProps = async () => { 16 | const notion = new Client({ 17 | auth: process.env.NOTION_SECRET, 18 | }); 19 | 20 | const data = await notion.blocks.children.list({ 21 | block_id: process.env.PAGE_ID, 22 | }); 23 | 24 | const recipes = []; 25 | 26 | data.results.forEach((result) => { 27 | if (result.type === "child_page") { 28 | recipes.push(result.child_page.title); 29 | } 30 | }); 31 | 32 | return { 33 | props: { 34 | recipes, 35 | }, 36 | }; 37 | }; 38 | 39 | export default RecipePage; 40 | -------------------------------------------------------------------------------- /05-request-database-data/pages/recipes.js: -------------------------------------------------------------------------------- 1 | import { Client } from "@notionhq/client"; 2 | import Link from "next/link"; 3 | import slugify from "slugify"; 4 | 5 | const RecipePage = ({ recipes }) => { 6 | return recipes.map((recipe) => ( 7 |8 | 9 | {recipe} 10 | 11 |
12 | )); 13 | }; 14 | 15 | export const getStaticProps = async () => { 16 | const notion = new Client({ 17 | auth: process.env.NOTION_SECRET, 18 | }); 19 | 20 | const data = await notion.blocks.children.list({ 21 | block_id: process.env.PAGE_ID, 22 | }); 23 | 24 | const recipes = []; 25 | 26 | data.results.forEach((result) => { 27 | if (result.type === "child_page") { 28 | recipes.push(result.child_page.title); 29 | } 30 | }); 31 | 32 | return { 33 | props: { 34 | recipes, 35 | }, 36 | }; 37 | }; 38 | 39 | export default RecipePage; 40 | -------------------------------------------------------------------------------- /06-paginated-database-data/pages/recipes.js: -------------------------------------------------------------------------------- 1 | import { Client } from "@notionhq/client"; 2 | import Link from "next/link"; 3 | import slugify from "slugify"; 4 | 5 | const RecipePage = ({ recipes }) => { 6 | return recipes.map((recipe) => ( 7 |8 | 9 | {recipe} 10 | 11 |
12 | )); 13 | }; 14 | 15 | export const getStaticProps = async () => { 16 | const notion = new Client({ 17 | auth: process.env.NOTION_SECRET, 18 | }); 19 | 20 | const data = await notion.blocks.children.list({ 21 | block_id: process.env.PAGE_ID, 22 | }); 23 | 24 | const recipes = []; 25 | 26 | data.results.forEach((result) => { 27 | if (result.type === "child_page") { 28 | recipes.push(result.child_page.title); 29 | } 30 | }); 31 | 32 | return { 33 | props: { 34 | recipes, 35 | }, 36 | }; 37 | }; 38 | 39 | export default RecipePage; 40 | -------------------------------------------------------------------------------- /07-update-database-properties/pages/recipes.js: -------------------------------------------------------------------------------- 1 | import { Client } from "@notionhq/client"; 2 | import Link from "next/link"; 3 | import slugify from "slugify"; 4 | 5 | const RecipePage = ({ recipes }) => { 6 | return recipes.map((recipe) => ( 7 |8 | 9 | {recipe} 10 | 11 |
12 | )); 13 | }; 14 | 15 | export const getStaticProps = async () => { 16 | const notion = new Client({ 17 | auth: process.env.NOTION_SECRET, 18 | }); 19 | 20 | const data = await notion.blocks.children.list({ 21 | block_id: process.env.PAGE_ID, 22 | }); 23 | 24 | const recipes = []; 25 | 26 | data.results.forEach((result) => { 27 | if (result.type === "child_page") { 28 | recipes.push(result.child_page.title); 29 | } 30 | }); 31 | 32 | return { 33 | props: { 34 | recipes, 35 | }, 36 | }; 37 | }; 38 | 39 | export default RecipePage; 40 | -------------------------------------------------------------------------------- /03-request-block-data/pages/recipes.js: -------------------------------------------------------------------------------- 1 | import { Client } from "@notionhq/client"; 2 | import Link from "next/link"; 3 | 4 | const RecipePage = ({ recipes }) => { 5 | return recipes.map((recipe) => ( 6 |7 | 8 | {recipe.title} 9 | 10 |
11 | )); 12 | }; 13 | 14 | export const getStaticProps = async () => { 15 | const notion = new Client({ 16 | auth: process.env.NOTION_SECRET, 17 | }); 18 | 19 | const data = await notion.blocks.children.list({ 20 | block_id: process.env.PAGE_ID, 21 | }); 22 | 23 | const recipes = []; 24 | 25 | data.results.forEach((result) => { 26 | if (result.type === "child_page") { 27 | recipes.push({ 28 | id: result.id, 29 | title: result.child_page.title, 30 | }); 31 | } 32 | }); 33 | 34 | return { 35 | props: { 36 | recipes, 37 | }, 38 | }; 39 | }; 40 | 41 | export default RecipePage; 42 | -------------------------------------------------------------------------------- /08-incremental-static-regeneration/pages/recipes.js: -------------------------------------------------------------------------------- 1 | import { Client } from "@notionhq/client"; 2 | import Link from "next/link"; 3 | import slugify from "slugify"; 4 | 5 | const RecipePage = ({ recipes }) => { 6 | return recipes.map((recipe) => ( 7 |8 | 9 | {recipe} 10 | 11 |
12 | )); 13 | }; 14 | 15 | export const getStaticProps = async () => { 16 | const notion = new Client({ 17 | auth: process.env.NOTION_SECRET, 18 | }); 19 | 20 | const data = await notion.blocks.children.list({ 21 | block_id: process.env.PAGE_ID, 22 | }); 23 | 24 | const recipes = []; 25 | 26 | data.results.forEach((result) => { 27 | if (result.type === "child_page") { 28 | recipes.push(result.child_page.title); 29 | } 30 | }); 31 | 32 | return { 33 | props: { 34 | recipes, 35 | }, 36 | }; 37 | }; 38 | 39 | export default RecipePage; 40 | -------------------------------------------------------------------------------- /01-generate-static-pages/README.md: -------------------------------------------------------------------------------- 1 | # Pre-Generate Static Pages with Next.js 2 | 3 | **[📹 Video](https://egghead.io/lessons/next-js-pre-generate-static-pages-with-next-js)** 4 | 5 | In this lesson we will learn how to generate static pages at build time using the getStaticProps function in Next.js. This ensures that, in production, load times will stay fast as the data is already present on the page when a user navigates there. 6 | 7 | We will build a Breaking Bad quote generator and learn the differences between running in development mode and production. The main difference being Next.js will re-build the page for you in development every time you visit it where a page only gets built once in production. This can lead to slightly different behaviors in dev vs production that you need to keep in mind. 8 | 9 | [👉 Next lesson](/02-request-page-data) 10 | 11 | --- 12 | 13 | Enjoyed the course? Check out some others at [jonmeyers.io](https://jonmeyers.io/courses), follow on [Twitter](https://twitter.com/_dijonmusters) and subscribe to [YouTube channel](https://www.youtube.com/channel/UCPitAIwktfCfcMR4kDWebDQ). 14 | -------------------------------------------------------------------------------- /02-request-page-data/public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /03-request-block-data/public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /04-slugify-page-data/public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /01-generate-static-pages/public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /05-request-database-data/public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /06-paginated-database-data/public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /07-update-database-properties/public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /08-incremental-static-regeneration/public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /03-request-block-data/README.md: -------------------------------------------------------------------------------- 1 | # Use the Notion API to request block data in Next.js 2 | 3 | **[📹 Video](https://egghead.io/lessons/egghead-use-the-notion-api-to-request-block-data-in-next-js-8a40dd6a)** 4 | 5 | In this video we will learn how to use Notion's client library to request block data and display the details of each of our recipes. 6 | 7 | We will be pre-generating these static pages at build-time by using Next.js' `getStaticProps` function, however, because our recipe IDs can be a nearly infinite number of options, we need to explicitly tell Next.js every possible option we would like to create a static page for. 8 | 9 | In order to do this, we use Next.js' `getStaticPaths` function. This allows us to make a request to the Notion API for all of our recipes, and provide Next.js with a finite collection of possible paths. 10 | 11 | [👉 Next lesson](/04-slugify-page-data) 12 | 13 | --- 14 | 15 | Enjoyed the course? Check out some others at [jonmeyers.io](https://jonmeyers.io/courses), follow on [Twitter](https://twitter.com/_dijonmusters) and subscribe to [YouTube channel](https://www.youtube.com/channel/UCPitAIwktfCfcMR4kDWebDQ). 16 | -------------------------------------------------------------------------------- /06-paginated-database-data/README.md: -------------------------------------------------------------------------------- 1 | # Request paginated data from Notion API with Next.js 2 | 3 | **[📹 Video](https://egghead.io/lessons/next-js-request-paginated-data-from-notion-api-with-next-js)** 4 | 5 | In this video, we learn how to implement cursor-based pagination in our Next.js application, to request all movies from the Notion Database. 6 | 7 | By default, Notion will return 100 results per request to the API. Therefore, we need to continue fetching results until we have the full set. This can be done using a `while` loop that checks the `has_more` field, returned by Notion's API, to determine whether we have fetched every movie. 8 | 9 | If the `has_more` property is true, Notion will also provide a cursor value to fetch the next 100 results. When the `has_more` field is set to false, we have retrieved all movies from the Database, and can stop looping. 10 | 11 | [👉 Next lesson](/07-update-database-properties) 12 | 13 | --- 14 | 15 | Enjoyed the course? Check out some others at [jonmeyers.io](https://jonmeyers.io/courses), follow on [Twitter](https://twitter.com/_dijonmusters) and subscribe to [YouTube channel](https://www.youtube.com/channel/UCPitAIwktfCfcMR4kDWebDQ). 16 | -------------------------------------------------------------------------------- /02-request-page-data/README.md: -------------------------------------------------------------------------------- 1 | # Request page data for Next.js from the Notion API 2 | 3 | **[📹 Video](https://egghead.io/lessons/next-js-request-page-data-for-next-js-from-the-notion-api)** 4 | 5 | We will learn how to fetch page data from the Notion API, and build a static recipe website. We start with a page containing a list of recipes - each a link to its own recipe page - and use Next.js to create a pre-generated page listing our recipe titles. 6 | 7 | In order to request data from our Notion API, we create a new integration and share the data from with page with it. We also learn about how to manage secret environment variables in our Next.js application, and how to conveniently pretty print the results from the `getStaticProps` function. 8 | 9 | Lastly, we take the raw Notion data and transform it into a convenient array structure, that we can iterate over in our page component, and display in the browser. 10 | 11 | [👉 Next lesson](/03-request-block-data) 12 | 13 | --- 14 | 15 | Enjoyed the course? Check out some others at [jonmeyers.io](https://jonmeyers.io/courses), follow on [Twitter](https://twitter.com/_dijonmusters) and subscribe to [YouTube channel](https://www.youtube.com/channel/UCPitAIwktfCfcMR4kDWebDQ). 16 | -------------------------------------------------------------------------------- /04-slugify-page-data/README.md: -------------------------------------------------------------------------------- 1 | # Use slugified titles for URL in Next.js with the Notion API 2 | 3 | **[📹 Video](https://egghead.io/lessons/egghead-use-slugified-titles-for-url-in-next-js-with-the-notion-api-ac659e22)** 4 | 5 | In this video we refactor the structure of our recipe details URL to use its slugified title, rather than its ID. In order to accomplish this, we use an npm library called `slugify`. This is a function that allows us to pass in a string in sentence form, and get back a hyphenated version that we can safely use in our URL. 6 | 7 | Since our recipe details page is using the recipe's ID to request data from Notion's API, this requires us to make some additional requests and manually work out which recipe correlates to the URL's slug. 8 | 9 | This gives us a much prettier URL to send to people and, since the URL now contains the title of our recipe, it communicates much more clearly what to expect when the link is clicked. 10 | 11 | [👉 Next lesson](/05-request-database-data) 12 | 13 | --- 14 | 15 | Enjoyed the course? Check out some others at [jonmeyers.io](https://jonmeyers.io/courses), follow on [Twitter](https://twitter.com/_dijonmusters) and subscribe to [YouTube channel](https://www.youtube.com/channel/UCPitAIwktfCfcMR4kDWebDQ). 16 | -------------------------------------------------------------------------------- /05-request-database-data/pages/movies.js: -------------------------------------------------------------------------------- 1 | import { Client } from "@notionhq/client"; 2 | import { useState } from "react"; 3 | 4 | const Movies = ({ movies }) => { 5 | const [movie, setMovie] = useState(null); 6 | 7 | const chooseMovie = () => { 8 | const randomNumber = Math.floor(Math.random() * movies.length); 9 | setMovie(movies[randomNumber]); 10 | }; 11 | 12 | return ( 13 | <> 14 | 15 | {movie &&{JSON.stringify(movie, null, 2)}}
16 | >
17 | );
18 | };
19 |
20 | export const getStaticProps = async () => {
21 | const notion = new Client({
22 | auth: process.env.NOTION_SECRET,
23 | });
24 |
25 | const data = await notion.databases.query({
26 | database_id: process.env.DATABASE_ID,
27 | filter: {
28 | property: "Watched",
29 | checkbox: {
30 | equals: false,
31 | },
32 | },
33 | });
34 |
35 | const movies = data.results.map((movie) => ({
36 | id: movie.id,
37 | title: movie.properties.Title.title[0].plain_text,
38 | categories: movie.properties.Categories.multi_select.map(
39 | (category) => category.name
40 | ),
41 | }));
42 |
43 | return {
44 | props: {
45 | movies,
46 | },
47 | };
48 | };
49 |
50 | export default Movies;
51 |
--------------------------------------------------------------------------------
/05-request-database-data/README.md:
--------------------------------------------------------------------------------
1 | # Request Notion database data from the API with Next.js
2 |
3 | **[📹 Video](https://egghead.io/lessons/next-js-request-notion-database-data-from-the-api-with-next-js)**
4 |
5 | In this video we learn how to use Notion's client library to request data from a Database, and display the results in our Next.js application.
6 |
7 | We will be adding a new page to our application that will help select a random movie for us to watch, using data from our Notion Database. To authorize access to this Database we must add it as an integration, and create a client using the Notion Secret value. Again, we will be pre-rendering this static page at build-time, using Next.js' getStaticProps function.
8 |
9 | Additionally, we will learn how to filter and transform our data on the server-side, so we are only passing our component the necessary data for it to render our movies. Lastly, we implement a `chooseMovie` function that can choose a random value between the bounds of the lowest and highest index of our movies array.
10 |
11 | [👉 Next lesson](/06-paginated-database-data)
12 |
13 | ---
14 |
15 | Enjoyed the course? Check out some others at [jonmeyers.io](https://jonmeyers.io/courses), follow on [Twitter](https://twitter.com/_dijonmusters) and subscribe to [YouTube channel](https://www.youtube.com/channel/UCPitAIwktfCfcMR4kDWebDQ).
16 |
--------------------------------------------------------------------------------
/08-incremental-static-regeneration/README.md:
--------------------------------------------------------------------------------
1 | # Use Next.js Incremental Static Regeneration to pregenerate Notion API pages on-demand
2 |
3 | **[📹 Video](https://egghead.io/lessons/next-js-use-next-js-incremental-static-regeneration-to-pregenerate-notion-api-pages-on-demand)**
4 |
5 | In this video, we learn how to use Next.js' `Incremental Static Regeneration` to dynamically create new static assets per route.
6 |
7 | Incremental Static Regeneration (ISR) is a great compromise between the performance benefits of static sites/pre-rendered pages and serving up fresh content.
8 |
9 | Each time a user visits a particular route, they are served a static page. This is the case for anytime you declare a `getStaticProps` function, however with ISR, Next.js runs the `getStaticProps` function again in the background and creates a new static page for that route. The next person to visit the route will see the newly generated page. We can specify a timeout period to avoid this happening too frequently.
10 |
11 | ISR is a complicated concept, but is super easy to implement in Next.js. Simply return `revalidate: 60` from the `getStaticProps` function, and enjoy the magic!
12 |
13 | ---
14 |
15 | Enjoyed the course? Check out some others at [jonmeyers.io](https://jonmeyers.io/courses), follow on [Twitter](https://twitter.com/_dijonmusters) and subscribe to [YouTube channel](https://www.youtube.com/channel/UCPitAIwktfCfcMR4kDWebDQ).
16 |
--------------------------------------------------------------------------------
/07-update-database-properties/README.md:
--------------------------------------------------------------------------------
1 | # Mutate database fields with Next.js using the Notion API
2 |
3 | **[📹 Video](https://egghead.io/lessons/next-js-mutate-database-fields-with-next-js-using-the-notion-api)**
4 |
5 | In this video, we learn how to perform mutations with the Notion API, and update properties in our Notion Database.
6 |
7 | By adding a button to our Next.js application, users can now mark a movie as watched - which will permanently update this value in our Notion Database. Since this action is based off user input, we need to make sure we don't expose our API secrets on the client.
8 |
9 | We can keep this value secure by implementing a serverless function to perform the mutation, and calling this URL endpoint from the client, when the user clicks the button.
10 |
11 | This is surprisingly easy to do in Next.js using API routes. Simply create a `pages/api` folder and any JS files within it will automatically be turned into serverless functions. Variables such as the movie's `id` and `is_watched` - can be passed to the serverless function, via the request's body.
12 |
13 | Additionally, we use the `axios` package to perform the `HTTP` request, as its API is slightly nicer to work with than the built-in `fetch` library.
14 |
15 | [👉 Next lesson](/08-incremental-static-regeneration)
16 |
17 | ---
18 |
19 | Enjoyed the course? Check out some others at [jonmeyers.io](https://jonmeyers.io/courses), follow on [Twitter](https://twitter.com/_dijonmusters) and subscribe to [YouTube channel](https://www.youtube.com/channel/UCPitAIwktfCfcMR4kDWebDQ).
20 |
--------------------------------------------------------------------------------
/03-request-block-data/pages/recipes/[id].js:
--------------------------------------------------------------------------------
1 | import { Client } from "@notionhq/client";
2 |
3 | const Recipe = ({ recipe }) => {
4 | return {JSON.stringify(recipe, null, 2)};
5 | };
6 |
7 | export const getStaticPaths = async () => {
8 | const notion = new Client({
9 | auth: process.env.NOTION_SECRET,
10 | });
11 |
12 | const data = await notion.blocks.children.list({
13 | block_id: process.env.PAGE_ID,
14 | });
15 |
16 | const paths = [];
17 |
18 | data.results.forEach((result) => {
19 | if (result.type === "child_page") {
20 | paths.push({
21 | params: {
22 | id: result.id,
23 | },
24 | });
25 | }
26 | });
27 |
28 | return {
29 | paths,
30 | fallback: false,
31 | };
32 | };
33 |
34 | export const getStaticProps = async ({ params: { id } }) => {
35 | // fetch details for recipe
36 | const notion = new Client({
37 | auth: process.env.NOTION_SECRET,
38 | });
39 |
40 | const page = await notion.pages.retrieve({
41 | page_id: id,
42 | });
43 |
44 | const blocks = await notion.blocks.children.list({
45 | block_id: id,
46 | });
47 |
48 | const title = page.properties.title.title[0].plain_text;
49 | const ingredients = [];
50 | const method = [];
51 |
52 | blocks.results.forEach((block) => {
53 | if (block.type === "bulleted_list_item") {
54 | ingredients.push(block.bulleted_list_item.text[0].plain_text);
55 | }
56 |
57 | if (block.type === "numbered_list_item") {
58 | method.push(block.numbered_list_item.text[0].plain_text);
59 | }
60 | });
61 |
62 | return {
63 | props: {
64 | recipe: {
65 | title,
66 | ingredients,
67 | method,
68 | },
69 | },
70 | };
71 | };
72 |
73 | export default Recipe;
74 |
--------------------------------------------------------------------------------
/06-paginated-database-data/pages/movies.js:
--------------------------------------------------------------------------------
1 | import { Client } from "@notionhq/client";
2 | import { useState } from "react";
3 |
4 | const Movies = ({ movies }) => {
5 | console.log(movies.length);
6 | const [movie, setMovie] = useState(null);
7 |
8 | const chooseMovie = () => {
9 | const randomNumber = Math.floor(Math.random() * movies.length);
10 | setMovie(movies[randomNumber]);
11 | };
12 |
13 | return (
14 | <>
15 |
16 | {movie && {JSON.stringify(movie, null, 2)}}
17 | >
18 | );
19 | };
20 |
21 | export const getStaticProps = async () => {
22 | const notion = new Client({
23 | auth: process.env.NOTION_SECRET,
24 | });
25 |
26 | let results = [];
27 |
28 | let data = await notion.databases.query({
29 | database_id: process.env.DATABASE_ID,
30 | filter: {
31 | property: "Watched",
32 | checkbox: {
33 | equals: false,
34 | },
35 | },
36 | });
37 |
38 | results = [...data.results];
39 |
40 | while (data.has_more) {
41 | data = await notion.databases.query({
42 | database_id: process.env.DATABASE_ID,
43 | filter: {
44 | property: "Watched",
45 | checkbox: {
46 | equals: false,
47 | },
48 | },
49 | start_cursor: data.next_cursor,
50 | });
51 |
52 | results = [...results, ...data.results];
53 | }
54 |
55 | const movies = results.map((movie) => ({
56 | id: movie.id,
57 | title: movie.properties.Title.title[0].plain_text,
58 | categories: movie.properties.Categories.multi_select.map(
59 | (category) => category.name
60 | ),
61 | }));
62 |
63 | return {
64 | props: {
65 | movies,
66 | },
67 | };
68 | };
69 |
70 | export default Movies;
71 |
--------------------------------------------------------------------------------
/07-update-database-properties/pages/movies.js:
--------------------------------------------------------------------------------
1 | import { Client } from "@notionhq/client";
2 | import { useState } from "react";
3 | import axios from "axios";
4 |
5 | const Movies = ({ movies }) => {
6 | const [movie, setMovie] = useState(null);
7 |
8 | const chooseMovie = () => {
9 | const randomNumber = Math.floor(Math.random() * movies.length);
10 | setMovie(movies[randomNumber]);
11 | };
12 |
13 | const handleUpdate = async () => {
14 | const { data } = await axios.post("/api/mark-as-watched", {
15 | id: movie.id,
16 | isWatched: true,
17 | });
18 |
19 | console.log(data);
20 | };
21 |
22 | return (
23 | <>
24 |
25 | {movie && (
26 | <>
27 | {JSON.stringify(movie, null, 2)}
28 |
29 | >
30 | )}
31 | >
32 | );
33 | };
34 |
35 | export const getStaticProps = async () => {
36 | const notion = new Client({
37 | auth: process.env.NOTION_SECRET,
38 | });
39 |
40 | let results = [];
41 |
42 | let data = await notion.databases.query({
43 | database_id: process.env.DATABASE_ID,
44 | filter: {
45 | property: "Watched",
46 | checkbox: {
47 | equals: false,
48 | },
49 | },
50 | });
51 |
52 | results = [...data.results];
53 |
54 | while (data.has_more) {
55 | data = await notion.databases.query({
56 | database_id: process.env.DATABASE_ID,
57 | filter: {
58 | property: "Watched",
59 | checkbox: {
60 | equals: false,
61 | },
62 | },
63 | start_cursor: data.next_cursor,
64 | });
65 |
66 | results = [...results, ...data.results];
67 | }
68 |
69 | const movies = results.map((movie) => ({
70 | id: movie.id,
71 | title: movie.properties.Title.title[0].plain_text,
72 | categories: movie.properties.Categories.multi_select.map(
73 | (category) => category.name
74 | ),
75 | }));
76 |
77 | return {
78 | props: {
79 | movies,
80 | },
81 | };
82 | };
83 |
84 | export default Movies;
85 |
--------------------------------------------------------------------------------
/04-slugify-page-data/pages/recipes/[slug].js:
--------------------------------------------------------------------------------
1 | import { Client } from "@notionhq/client";
2 | import slugify from "slugify";
3 |
4 | const Recipe = ({ recipe }) => {
5 | return {JSON.stringify(recipe, null, 2)};
6 | };
7 |
8 | export const getStaticPaths = async () => {
9 | const notion = new Client({
10 | auth: process.env.NOTION_SECRET,
11 | });
12 |
13 | const data = await notion.blocks.children.list({
14 | block_id: process.env.PAGE_ID,
15 | });
16 |
17 | const paths = [];
18 |
19 | data.results.forEach((result) => {
20 | if (result.type === "child_page") {
21 | paths.push({
22 | params: {
23 | slug: slugify(result.child_page.title).toLowerCase(),
24 | },
25 | });
26 | }
27 | });
28 |
29 | return {
30 | paths,
31 | fallback: false,
32 | };
33 | };
34 |
35 | export const getStaticProps = async ({ params: { slug } }) => {
36 | // fetch details for recipe
37 | const notion = new Client({
38 | auth: process.env.NOTION_SECRET,
39 | });
40 |
41 | const data = await notion.blocks.children.list({
42 | block_id: process.env.PAGE_ID,
43 | });
44 |
45 | const page = data.results.find((result) => {
46 | if (result.type === "child_page") {
47 | const { title } = result.child_page;
48 | const resultSlug = slugify(title).toLowerCase();
49 | return resultSlug === slug;
50 | }
51 | return false;
52 | });
53 |
54 | const blocks = await notion.blocks.children.list({
55 | block_id: page.id,
56 | });
57 |
58 | const title = page.child_page.title;
59 | const ingredients = [];
60 | const method = [];
61 |
62 | blocks.results.forEach((block) => {
63 | if (block.type === "bulleted_list_item") {
64 | ingredients.push(block.bulleted_list_item.text[0].plain_text);
65 | }
66 |
67 | if (block.type === "numbered_list_item") {
68 | method.push(block.numbered_list_item.text[0].plain_text);
69 | }
70 | });
71 |
72 | return {
73 | props: {
74 | recipe: {
75 | title,
76 | ingredients,
77 | method,
78 | },
79 | },
80 | };
81 | };
82 |
83 | export default Recipe;
84 |
--------------------------------------------------------------------------------
/05-request-database-data/pages/recipes/[slug].js:
--------------------------------------------------------------------------------
1 | import { Client } from "@notionhq/client";
2 | import slugify from "slugify";
3 |
4 | const Recipe = ({ recipe }) => {
5 | return {JSON.stringify(recipe, null, 2)};
6 | };
7 |
8 | export const getStaticPaths = async () => {
9 | const notion = new Client({
10 | auth: process.env.NOTION_SECRET,
11 | });
12 |
13 | const data = await notion.blocks.children.list({
14 | block_id: process.env.PAGE_ID,
15 | });
16 |
17 | const paths = [];
18 |
19 | data.results.forEach((result) => {
20 | if (result.type === "child_page") {
21 | paths.push({
22 | params: {
23 | slug: slugify(result.child_page.title).toLowerCase(),
24 | },
25 | });
26 | }
27 | });
28 |
29 | return {
30 | paths,
31 | fallback: false,
32 | };
33 | };
34 |
35 | export const getStaticProps = async ({ params: { slug } }) => {
36 | // fetch details for recipe
37 | const notion = new Client({
38 | auth: process.env.NOTION_SECRET,
39 | });
40 |
41 | const data = await notion.blocks.children.list({
42 | block_id: process.env.PAGE_ID,
43 | });
44 |
45 | const page = data.results.find((result) => {
46 | if (result.type === "child_page") {
47 | const { title } = result.child_page;
48 | const resultSlug = slugify(title).toLowerCase();
49 | return resultSlug === slug;
50 | }
51 | return false;
52 | });
53 |
54 | const blocks = await notion.blocks.children.list({
55 | block_id: page.id,
56 | });
57 |
58 | const title = page.child_page.title;
59 | const ingredients = [];
60 | const method = [];
61 |
62 | blocks.results.forEach((block) => {
63 | if (block.type === "bulleted_list_item") {
64 | ingredients.push(block.bulleted_list_item.text[0].plain_text);
65 | }
66 |
67 | if (block.type === "numbered_list_item") {
68 | method.push(block.numbered_list_item.text[0].plain_text);
69 | }
70 | });
71 |
72 | return {
73 | props: {
74 | recipe: {
75 | title,
76 | ingredients,
77 | method,
78 | },
79 | },
80 | };
81 | };
82 |
83 | export default Recipe;
84 |
--------------------------------------------------------------------------------
/06-paginated-database-data/pages/recipes/[slug].js:
--------------------------------------------------------------------------------
1 | import { Client } from "@notionhq/client";
2 | import slugify from "slugify";
3 |
4 | const Recipe = ({ recipe }) => {
5 | return {JSON.stringify(recipe, null, 2)};
6 | };
7 |
8 | export const getStaticPaths = async () => {
9 | const notion = new Client({
10 | auth: process.env.NOTION_SECRET,
11 | });
12 |
13 | const data = await notion.blocks.children.list({
14 | block_id: process.env.PAGE_ID,
15 | });
16 |
17 | const paths = [];
18 |
19 | data.results.forEach((result) => {
20 | if (result.type === "child_page") {
21 | paths.push({
22 | params: {
23 | slug: slugify(result.child_page.title).toLowerCase(),
24 | },
25 | });
26 | }
27 | });
28 |
29 | return {
30 | paths,
31 | fallback: false,
32 | };
33 | };
34 |
35 | export const getStaticProps = async ({ params: { slug } }) => {
36 | // fetch details for recipe
37 | const notion = new Client({
38 | auth: process.env.NOTION_SECRET,
39 | });
40 |
41 | const data = await notion.blocks.children.list({
42 | block_id: process.env.PAGE_ID,
43 | });
44 |
45 | const page = data.results.find((result) => {
46 | if (result.type === "child_page") {
47 | const { title } = result.child_page;
48 | const resultSlug = slugify(title).toLowerCase();
49 | return resultSlug === slug;
50 | }
51 | return false;
52 | });
53 |
54 | const blocks = await notion.blocks.children.list({
55 | block_id: page.id,
56 | });
57 |
58 | const title = page.child_page.title;
59 | const ingredients = [];
60 | const method = [];
61 |
62 | blocks.results.forEach((block) => {
63 | if (block.type === "bulleted_list_item") {
64 | ingredients.push(block.bulleted_list_item.text[0].plain_text);
65 | }
66 |
67 | if (block.type === "numbered_list_item") {
68 | method.push(block.numbered_list_item.text[0].plain_text);
69 | }
70 | });
71 |
72 | return {
73 | props: {
74 | recipe: {
75 | title,
76 | ingredients,
77 | method,
78 | },
79 | },
80 | };
81 | };
82 |
83 | export default Recipe;
84 |
--------------------------------------------------------------------------------
/07-update-database-properties/pages/recipes/[slug].js:
--------------------------------------------------------------------------------
1 | import { Client } from "@notionhq/client";
2 | import slugify from "slugify";
3 |
4 | const Recipe = ({ recipe }) => {
5 | return {JSON.stringify(recipe, null, 2)};
6 | };
7 |
8 | export const getStaticPaths = async () => {
9 | const notion = new Client({
10 | auth: process.env.NOTION_SECRET,
11 | });
12 |
13 | const data = await notion.blocks.children.list({
14 | block_id: process.env.PAGE_ID,
15 | });
16 |
17 | const paths = [];
18 |
19 | data.results.forEach((result) => {
20 | if (result.type === "child_page") {
21 | paths.push({
22 | params: {
23 | slug: slugify(result.child_page.title).toLowerCase(),
24 | },
25 | });
26 | }
27 | });
28 |
29 | return {
30 | paths,
31 | fallback: false,
32 | };
33 | };
34 |
35 | export const getStaticProps = async ({ params: { slug } }) => {
36 | // fetch details for recipe
37 | const notion = new Client({
38 | auth: process.env.NOTION_SECRET,
39 | });
40 |
41 | const data = await notion.blocks.children.list({
42 | block_id: process.env.PAGE_ID,
43 | });
44 |
45 | const page = data.results.find((result) => {
46 | if (result.type === "child_page") {
47 | const { title } = result.child_page;
48 | const resultSlug = slugify(title).toLowerCase();
49 | return resultSlug === slug;
50 | }
51 | return false;
52 | });
53 |
54 | const blocks = await notion.blocks.children.list({
55 | block_id: page.id,
56 | });
57 |
58 | const title = page.child_page.title;
59 | const ingredients = [];
60 | const method = [];
61 |
62 | blocks.results.forEach((block) => {
63 | if (block.type === "bulleted_list_item") {
64 | ingredients.push(block.bulleted_list_item.text[0].plain_text);
65 | }
66 |
67 | if (block.type === "numbered_list_item") {
68 | method.push(block.numbered_list_item.text[0].plain_text);
69 | }
70 | });
71 |
72 | return {
73 | props: {
74 | recipe: {
75 | title,
76 | ingredients,
77 | method,
78 | },
79 | },
80 | };
81 | };
82 |
83 | export default Recipe;
84 |
--------------------------------------------------------------------------------
/08-incremental-static-regeneration/pages/recipes/[slug].js:
--------------------------------------------------------------------------------
1 | import { Client } from "@notionhq/client";
2 | import slugify from "slugify";
3 |
4 | const Recipe = ({ recipe }) => {
5 | return {JSON.stringify(recipe, null, 2)};
6 | };
7 |
8 | export const getStaticPaths = async () => {
9 | const notion = new Client({
10 | auth: process.env.NOTION_SECRET,
11 | });
12 |
13 | const data = await notion.blocks.children.list({
14 | block_id: process.env.PAGE_ID,
15 | });
16 |
17 | const paths = [];
18 |
19 | data.results.forEach((result) => {
20 | if (result.type === "child_page") {
21 | paths.push({
22 | params: {
23 | slug: slugify(result.child_page.title).toLowerCase(),
24 | },
25 | });
26 | }
27 | });
28 |
29 | return {
30 | paths,
31 | fallback: false,
32 | };
33 | };
34 |
35 | export const getStaticProps = async ({ params: { slug } }) => {
36 | // fetch details for recipe
37 | const notion = new Client({
38 | auth: process.env.NOTION_SECRET,
39 | });
40 |
41 | const data = await notion.blocks.children.list({
42 | block_id: process.env.PAGE_ID,
43 | });
44 |
45 | const page = data.results.find((result) => {
46 | if (result.type === "child_page") {
47 | const { title } = result.child_page;
48 | const resultSlug = slugify(title).toLowerCase();
49 | return resultSlug === slug;
50 | }
51 | return false;
52 | });
53 |
54 | const blocks = await notion.blocks.children.list({
55 | block_id: page.id,
56 | });
57 |
58 | const title = page.child_page.title;
59 | const ingredients = [];
60 | const method = [];
61 |
62 | blocks.results.forEach((block) => {
63 | if (block.type === "bulleted_list_item") {
64 | ingredients.push(block.bulleted_list_item.text[0].plain_text);
65 | }
66 |
67 | if (block.type === "numbered_list_item") {
68 | method.push(block.numbered_list_item.text[0].plain_text);
69 | }
70 | });
71 |
72 | return {
73 | props: {
74 | recipe: {
75 | title,
76 | ingredients,
77 | method,
78 | },
79 | },
80 | };
81 | };
82 |
83 | export default Recipe;
84 |
--------------------------------------------------------------------------------
/08-incremental-static-regeneration/pages/movies.js:
--------------------------------------------------------------------------------
1 | import { Client } from "@notionhq/client";
2 | import { useState } from "react";
3 | import axios from "axios";
4 |
5 | const Movies = ({ movies }) => {
6 | const [movie, setMovie] = useState(null);
7 |
8 | const chooseMovie = () => {
9 | const randomNumber = Math.floor(Math.random() * movies.length);
10 | setMovie(movies[randomNumber]);
11 | };
12 |
13 | const handleUpdate = async () => {
14 | const { data } = await axios.post("/api/mark-as-watched", {
15 | id: movie.id,
16 | isWatched: true,
17 | });
18 |
19 | console.log(data);
20 | };
21 |
22 | return (
23 | <>
24 |
25 | {movie && (
26 | <>
27 | {JSON.stringify(movie, null, 2)}
28 |
29 | >
30 | )}
31 | {movies.map((m) => (
32 | {m.title}
33 | ))} 34 | > 35 | ); 36 | }; 37 | 38 | export const getStaticProps = async () => { 39 | const notion = new Client({ 40 | auth: process.env.NOTION_SECRET, 41 | }); 42 | 43 | let results = []; 44 | 45 | let data = await notion.databases.query({ 46 | database_id: process.env.DATABASE_ID, 47 | filter: { 48 | property: "Watched", 49 | checkbox: { 50 | equals: false, 51 | }, 52 | }, 53 | sort: { 54 | timestamp: "created_time", 55 | }, 56 | }); 57 | 58 | results = [...data.results]; 59 | 60 | while (data.has_more) { 61 | data = await notion.databases.query({ 62 | database_id: process.env.DATABASE_ID, 63 | filter: { 64 | property: "Watched", 65 | checkbox: { 66 | equals: false, 67 | }, 68 | }, 69 | sort: { 70 | timestamp: "created_time", 71 | }, 72 | start_cursor: data.next_cursor, 73 | }); 74 | 75 | results = [...results, ...data.results]; 76 | } 77 | 78 | const movies = results.map((movie) => ({ 79 | id: movie.id, 80 | title: movie.properties.Title.title[0].plain_text, 81 | categories: movie.properties.Categories.multi_select.map( 82 | (category) => category.name 83 | ), 84 | })); 85 | 86 | return { 87 | props: { 88 | movies, 89 | }, 90 | revalidate: 60, 91 | }; 92 | }; 93 | 94 | export default Movies; 95 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Build a recipe website and movie picker with the Notion API and Next.js 2 | 3 | > This repo accompanies a free community collection of videos on egghead. 4 | 5 | ## 🔍 About 6 | 7 | In this course, we look at building apps with the Notion API and Next.js. We start by learning about generating static pages with pre-rendering in Next.js, and the performance benefits this unlocks. 8 | 9 | We build two examples to cover the concepts in this course. The first is a recipe website backed by a collection of nested Notion pages. This demonstrates how to create an integration and share data with it. Additionally, we cover how to parse the structure of the response data, and transform it into something that makes sense for our React components. 10 | 11 | We learn about the different types of data that exist in Notion's page and block types, and when we need to use each. Lastly, we cover using slugified URLs instead of recipe IDs, making our links much more pleasant and trustworthy. 12 | 13 | The second example we build is a movie picker. This fetches data from a Notion Database and helps to suggest a movie we can watch. This module covers requesting data from a Database, iterating over cursor-based pagination to fetch all results from a large dataset, performing mutations on properties in a Database and Next.js' Incremental Static Regeneration. 14 | 15 | This course is a great introduction to the Notion API, but also covers the foundational Next.js features that make it so powerful! 16 | 17 | ## 🎓 Instructor 18 | 19 | [Jon Meyers](https://jonmeyers.io) is a Software Engineer, Educator and Hip Hop Producer from Melbourne, Australia. He's passionate about web development and enabling others to build amazing things! 20 | 21 | [Jon's courses at egghead.](https://egghead.io/instructors/jon-meyers) 22 | 23 | Enjoyed the course? Check out some others at [jonmeyers.io](https://jonmeyers.io/courses), follow on [Twitter](https://twitter.com/_dijonmusters) and subscribe to [YouTube channel](https://www.youtube.com/channel/UCPitAIwktfCfcMR4kDWebDQ). 24 | 25 | ## 🗺 Table of Contents 26 | 27 | 1. [Pregenerate Static Pages with Next.js](/01-generate-static-pages) 28 | 2. [Request page data for Next.js from the Notion API](/02-request-page-data) 29 | 3. [Use the Notion API to Request block data in Next.js](/03-request-block-data) 30 | 4. [Use slugified titles for URL in Next.js with the Notion API](/04-slugify-page-data) 31 | 5. [Request Notion database data from the API with Next.js](/05-request-database-data) 32 | 6. [Request paginated data from Notion API with Next.js](/06-paginated-database-data) 33 | 7. [Update database with Next.js using the Notion API](/07-update-database-properties) 34 | 8. [Use Next.js Incremental Static Regeneration to pregenerate Notion API pages on-demand](/08-incremental-static-regeneration) 35 | -------------------------------------------------------------------------------- /02-request-page-data/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "notion-api", 3 | "version": "0.1.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.12.11", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", 10 | "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", 11 | "requires": { 12 | "@babel/highlight": "^7.10.4" 13 | } 14 | }, 15 | "@babel/helper-validator-identifier": { 16 | "version": "7.14.5", 17 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", 18 | "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==" 19 | }, 20 | "@babel/highlight": { 21 | "version": "7.14.5", 22 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", 23 | "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", 24 | "requires": { 25 | "@babel/helper-validator-identifier": "^7.14.5", 26 | "chalk": "^2.0.0", 27 | "js-tokens": "^4.0.0" 28 | } 29 | }, 30 | "@babel/runtime": { 31 | "version": "7.12.5", 32 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", 33 | "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", 34 | "requires": { 35 | "regenerator-runtime": "^0.13.4" 36 | } 37 | }, 38 | "@babel/types": { 39 | "version": "7.8.3", 40 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", 41 | "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", 42 | "requires": { 43 | "esutils": "^2.0.2", 44 | "lodash": "^4.17.13", 45 | "to-fast-properties": "^2.0.0" 46 | } 47 | }, 48 | "@hapi/accept": { 49 | "version": "5.0.2", 50 | "resolved": "https://registry.npmjs.org/@hapi/accept/-/accept-5.0.2.tgz", 51 | "integrity": "sha512-CmzBx/bXUR8451fnZRuZAJRlzgm0Jgu5dltTX/bszmR2lheb9BpyN47Q1RbaGTsvFzn0PXAEs+lXDKfshccYZw==", 52 | "requires": { 53 | "@hapi/boom": "9.x.x", 54 | "@hapi/hoek": "9.x.x" 55 | } 56 | }, 57 | "@hapi/boom": { 58 | "version": "9.1.2", 59 | "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.2.tgz", 60 | "integrity": "sha512-uJEJtiNHzKw80JpngDGBCGAmWjBtzxDCz17A9NO2zCi8LLBlb5Frpq4pXwyN+2JQMod4pKz5BALwyneCgDg89Q==", 61 | "requires": { 62 | "@hapi/hoek": "9.x.x" 63 | } 64 | }, 65 | "@hapi/hoek": { 66 | "version": "9.2.0", 67 | "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.0.tgz", 68 | "integrity": "sha512-sqKVVVOe5ivCaXDWivIJYVSaEgdQK9ul7a4Kity5Iw7u9+wBAPbX1RMSnLLmp7O4Vzj0WOWwMAJsTL00xwaNug==" 69 | }, 70 | "@next/env": { 71 | "version": "11.0.1", 72 | "resolved": "https://registry.npmjs.org/@next/env/-/env-11.0.1.tgz", 73 | "integrity": "sha512-yZfKh2U6R9tEYyNUrs2V3SBvCMufkJ07xMH5uWy8wqcl5gAXoEw6A/1LDqwX3j7pUutF9d1ZxpdGDA3Uag+aQQ==" 74 | }, 75 | "@next/polyfill-module": { 76 | "version": "11.0.1", 77 | "resolved": "https://registry.npmjs.org/@next/polyfill-module/-/polyfill-module-11.0.1.tgz", 78 | "integrity": "sha512-Cjs7rrKCg4CF4Jhri8PCKlBXhszTfOQNl9AjzdNy4K5jXFyxyoSzuX2rK4IuoyE+yGp5A3XJCBEmOQ4xbUp9Mg==" 79 | }, 80 | "@next/react-dev-overlay": { 81 | "version": "11.0.1", 82 | "resolved": "https://registry.npmjs.org/@next/react-dev-overlay/-/react-dev-overlay-11.0.1.tgz", 83 | "integrity": "sha512-lvUjMVpLsgzADs9Q8wtC5LNqvfdN+M0BDMSrqr04EDWAyyX0vURHC9hkvLbyEYWyh+WW32pwjKBXdkMnJhoqMg==", 84 | "requires": { 85 | "@babel/code-frame": "7.12.11", 86 | "anser": "1.4.9", 87 | "chalk": "4.0.0", 88 | "classnames": "2.2.6", 89 | "css.escape": "1.5.1", 90 | "data-uri-to-buffer": "3.0.1", 91 | "platform": "1.3.6", 92 | "shell-quote": "1.7.2", 93 | "source-map": "0.8.0-beta.0", 94 | "stacktrace-parser": "0.1.10", 95 | "strip-ansi": "6.0.0" 96 | }, 97 | "dependencies": { 98 | "ansi-styles": { 99 | "version": "4.3.0", 100 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 101 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 102 | "requires": { 103 | "color-convert": "^2.0.1" 104 | } 105 | }, 106 | "chalk": { 107 | "version": "4.0.0", 108 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", 109 | "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", 110 | "requires": { 111 | "ansi-styles": "^4.1.0", 112 | "supports-color": "^7.1.0" 113 | } 114 | }, 115 | "color-convert": { 116 | "version": "2.0.1", 117 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 118 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 119 | "requires": { 120 | "color-name": "~1.1.4" 121 | } 122 | }, 123 | "color-name": { 124 | "version": "1.1.4", 125 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 126 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 127 | }, 128 | "has-flag": { 129 | "version": "4.0.0", 130 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 131 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 132 | }, 133 | "supports-color": { 134 | "version": "7.2.0", 135 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 136 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 137 | "requires": { 138 | "has-flag": "^4.0.0" 139 | } 140 | } 141 | } 142 | }, 143 | "@next/react-refresh-utils": { 144 | "version": "11.0.1", 145 | "resolved": "https://registry.npmjs.org/@next/react-refresh-utils/-/react-refresh-utils-11.0.1.tgz", 146 | "integrity": "sha512-K347DM6Z7gBSE+TfUaTTceWvbj0B6iNAsFZXbFZOlfg3uyz2sbKpzPYYFocCc27yjLaS8OfR8DEdS2mZXi8Saw==" 147 | }, 148 | "@notionhq/client": { 149 | "version": "0.2.2", 150 | "resolved": "https://registry.npmjs.org/@notionhq/client/-/client-0.2.2.tgz", 151 | "integrity": "sha512-xklQeq/NwOPhixsa5Mj02B+od0+FhsGnBYLYrGmA4GLIeiPciSxuUaBVtGyKjzVbmbF8wTGq3Nx3Y23BglBqSQ==", 152 | "requires": { 153 | "@types/node-fetch": "^2.5.10", 154 | "node-fetch": "^2.6.1" 155 | } 156 | }, 157 | "@types/node": { 158 | "version": "15.12.4", 159 | "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.4.tgz", 160 | "integrity": "sha512-zrNj1+yqYF4WskCMOHwN+w9iuD12+dGm0rQ35HLl9/Ouuq52cEtd0CH9qMgrdNmi5ejC1/V7vKEXYubB+65DkA==" 161 | }, 162 | "@types/node-fetch": { 163 | "version": "2.5.11", 164 | "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.11.tgz", 165 | "integrity": "sha512-2upCKaqVZETDRb8A2VTaRymqFBEgH8u6yr96b/u3+1uQEPDRo3mJLEiPk7vdXBHRtjwkjqzFYMJXrt0Z9QsYjQ==", 166 | "requires": { 167 | "@types/node": "*", 168 | "form-data": "^3.0.0" 169 | } 170 | }, 171 | "anser": { 172 | "version": "1.4.9", 173 | "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.9.tgz", 174 | "integrity": "sha512-AI+BjTeGt2+WFk4eWcqbQ7snZpDBt8SaLlj0RT2h5xfdWaiy51OjYvqwMrNzJLGy8iOAL6nKDITWO+rd4MkYEA==" 175 | }, 176 | "ansi-regex": { 177 | "version": "5.0.0", 178 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 179 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" 180 | }, 181 | "ansi-styles": { 182 | "version": "3.2.1", 183 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 184 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 185 | "requires": { 186 | "color-convert": "^1.9.0" 187 | } 188 | }, 189 | "anymatch": { 190 | "version": "3.1.2", 191 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 192 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 193 | "requires": { 194 | "normalize-path": "^3.0.0", 195 | "picomatch": "^2.0.4" 196 | } 197 | }, 198 | "asn1.js": { 199 | "version": "5.4.1", 200 | "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", 201 | "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", 202 | "requires": { 203 | "bn.js": "^4.0.0", 204 | "inherits": "^2.0.1", 205 | "minimalistic-assert": "^1.0.0", 206 | "safer-buffer": "^2.1.0" 207 | }, 208 | "dependencies": { 209 | "bn.js": { 210 | "version": "4.12.0", 211 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 212 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" 213 | } 214 | } 215 | }, 216 | "assert": { 217 | "version": "2.0.0", 218 | "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", 219 | "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", 220 | "requires": { 221 | "es6-object-assign": "^1.1.0", 222 | "is-nan": "^1.2.1", 223 | "object-is": "^1.0.1", 224 | "util": "^0.12.0" 225 | } 226 | }, 227 | "ast-types": { 228 | "version": "0.13.2", 229 | "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.2.tgz", 230 | "integrity": "sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA==" 231 | }, 232 | "asynckit": { 233 | "version": "0.4.0", 234 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 235 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 236 | }, 237 | "available-typed-arrays": { 238 | "version": "1.0.4", 239 | "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.4.tgz", 240 | "integrity": "sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==" 241 | }, 242 | "babel-plugin-syntax-jsx": { 243 | "version": "6.18.0", 244 | "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", 245 | "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" 246 | }, 247 | "base64-js": { 248 | "version": "1.5.1", 249 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 250 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 251 | }, 252 | "big.js": { 253 | "version": "5.2.2", 254 | "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", 255 | "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" 256 | }, 257 | "binary-extensions": { 258 | "version": "2.2.0", 259 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 260 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" 261 | }, 262 | "bn.js": { 263 | "version": "5.2.0", 264 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", 265 | "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" 266 | }, 267 | "braces": { 268 | "version": "3.0.2", 269 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 270 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 271 | "requires": { 272 | "fill-range": "^7.0.1" 273 | } 274 | }, 275 | "brorand": { 276 | "version": "1.1.0", 277 | "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", 278 | "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" 279 | }, 280 | "browserify-aes": { 281 | "version": "1.2.0", 282 | "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", 283 | "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", 284 | "requires": { 285 | "buffer-xor": "^1.0.3", 286 | "cipher-base": "^1.0.0", 287 | "create-hash": "^1.1.0", 288 | "evp_bytestokey": "^1.0.3", 289 | "inherits": "^2.0.1", 290 | "safe-buffer": "^5.0.1" 291 | } 292 | }, 293 | "browserify-cipher": { 294 | "version": "1.0.1", 295 | "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", 296 | "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", 297 | "requires": { 298 | "browserify-aes": "^1.0.4", 299 | "browserify-des": "^1.0.0", 300 | "evp_bytestokey": "^1.0.0" 301 | } 302 | }, 303 | "browserify-des": { 304 | "version": "1.0.2", 305 | "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", 306 | "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", 307 | "requires": { 308 | "cipher-base": "^1.0.1", 309 | "des.js": "^1.0.0", 310 | "inherits": "^2.0.1", 311 | "safe-buffer": "^5.1.2" 312 | } 313 | }, 314 | "browserify-rsa": { 315 | "version": "4.1.0", 316 | "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", 317 | "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", 318 | "requires": { 319 | "bn.js": "^5.0.0", 320 | "randombytes": "^2.0.1" 321 | } 322 | }, 323 | "browserify-sign": { 324 | "version": "4.2.1", 325 | "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", 326 | "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", 327 | "requires": { 328 | "bn.js": "^5.1.1", 329 | "browserify-rsa": "^4.0.1", 330 | "create-hash": "^1.2.0", 331 | "create-hmac": "^1.1.7", 332 | "elliptic": "^6.5.3", 333 | "inherits": "^2.0.4", 334 | "parse-asn1": "^5.1.5", 335 | "readable-stream": "^3.6.0", 336 | "safe-buffer": "^5.2.0" 337 | } 338 | }, 339 | "browserify-zlib": { 340 | "version": "0.2.0", 341 | "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", 342 | "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", 343 | "requires": { 344 | "pako": "~1.0.5" 345 | } 346 | }, 347 | "browserslist": { 348 | "version": "4.16.6", 349 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", 350 | "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", 351 | "requires": { 352 | "caniuse-lite": "^1.0.30001219", 353 | "colorette": "^1.2.2", 354 | "electron-to-chromium": "^1.3.723", 355 | "escalade": "^3.1.1", 356 | "node-releases": "^1.1.71" 357 | } 358 | }, 359 | "buffer": { 360 | "version": "5.6.0", 361 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", 362 | "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", 363 | "requires": { 364 | "base64-js": "^1.0.2", 365 | "ieee754": "^1.1.4" 366 | } 367 | }, 368 | "buffer-xor": { 369 | "version": "1.0.3", 370 | "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", 371 | "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" 372 | }, 373 | "builtin-status-codes": { 374 | "version": "3.0.0", 375 | "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", 376 | "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" 377 | }, 378 | "bytes": { 379 | "version": "3.1.0", 380 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 381 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 382 | }, 383 | "call-bind": { 384 | "version": "1.0.2", 385 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 386 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 387 | "requires": { 388 | "function-bind": "^1.1.1", 389 | "get-intrinsic": "^1.0.2" 390 | } 391 | }, 392 | "caniuse-lite": { 393 | "version": "1.0.30001239", 394 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001239.tgz", 395 | "integrity": "sha512-cyBkXJDMeI4wthy8xJ2FvDU6+0dtcZSJW3voUF8+e9f1bBeuvyZfc3PNbkOETyhbR+dGCPzn9E7MA3iwzusOhQ==" 396 | }, 397 | "chalk": { 398 | "version": "2.4.2", 399 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 400 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 401 | "requires": { 402 | "ansi-styles": "^3.2.1", 403 | "escape-string-regexp": "^1.0.5", 404 | "supports-color": "^5.3.0" 405 | } 406 | }, 407 | "chokidar": { 408 | "version": "3.5.1", 409 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", 410 | "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", 411 | "requires": { 412 | "anymatch": "~3.1.1", 413 | "braces": "~3.0.2", 414 | "fsevents": "~2.3.1", 415 | "glob-parent": "~5.1.0", 416 | "is-binary-path": "~2.1.0", 417 | "is-glob": "~4.0.1", 418 | "normalize-path": "~3.0.0", 419 | "readdirp": "~3.5.0" 420 | } 421 | }, 422 | "cipher-base": { 423 | "version": "1.0.4", 424 | "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", 425 | "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", 426 | "requires": { 427 | "inherits": "^2.0.1", 428 | "safe-buffer": "^5.0.1" 429 | } 430 | }, 431 | "classnames": { 432 | "version": "2.2.6", 433 | "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", 434 | "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" 435 | }, 436 | "color-convert": { 437 | "version": "1.9.3", 438 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 439 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 440 | "requires": { 441 | "color-name": "1.1.3" 442 | } 443 | }, 444 | "color-name": { 445 | "version": "1.1.3", 446 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 447 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 448 | }, 449 | "colorette": { 450 | "version": "1.2.2", 451 | "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", 452 | "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" 453 | }, 454 | "combined-stream": { 455 | "version": "1.0.8", 456 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 457 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 458 | "requires": { 459 | "delayed-stream": "~1.0.0" 460 | } 461 | }, 462 | "commondir": { 463 | "version": "1.0.1", 464 | "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", 465 | "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" 466 | }, 467 | "console-browserify": { 468 | "version": "1.2.0", 469 | "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", 470 | "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" 471 | }, 472 | "constants-browserify": { 473 | "version": "1.0.0", 474 | "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", 475 | "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" 476 | }, 477 | "convert-source-map": { 478 | "version": "1.7.0", 479 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", 480 | "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", 481 | "requires": { 482 | "safe-buffer": "~5.1.1" 483 | }, 484 | "dependencies": { 485 | "safe-buffer": { 486 | "version": "5.1.2", 487 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 488 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 489 | } 490 | } 491 | }, 492 | "core-util-is": { 493 | "version": "1.0.2", 494 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 495 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 496 | }, 497 | "create-ecdh": { 498 | "version": "4.0.4", 499 | "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", 500 | "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", 501 | "requires": { 502 | "bn.js": "^4.1.0", 503 | "elliptic": "^6.5.3" 504 | }, 505 | "dependencies": { 506 | "bn.js": { 507 | "version": "4.12.0", 508 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 509 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" 510 | } 511 | } 512 | }, 513 | "create-hash": { 514 | "version": "1.2.0", 515 | "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", 516 | "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", 517 | "requires": { 518 | "cipher-base": "^1.0.1", 519 | "inherits": "^2.0.1", 520 | "md5.js": "^1.3.4", 521 | "ripemd160": "^2.0.1", 522 | "sha.js": "^2.4.0" 523 | } 524 | }, 525 | "create-hmac": { 526 | "version": "1.1.7", 527 | "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", 528 | "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", 529 | "requires": { 530 | "cipher-base": "^1.0.3", 531 | "create-hash": "^1.1.0", 532 | "inherits": "^2.0.1", 533 | "ripemd160": "^2.0.0", 534 | "safe-buffer": "^5.0.1", 535 | "sha.js": "^2.4.8" 536 | } 537 | }, 538 | "crypto-browserify": { 539 | "version": "3.12.0", 540 | "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", 541 | "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", 542 | "requires": { 543 | "browserify-cipher": "^1.0.0", 544 | "browserify-sign": "^4.0.0", 545 | "create-ecdh": "^4.0.0", 546 | "create-hash": "^1.1.0", 547 | "create-hmac": "^1.1.0", 548 | "diffie-hellman": "^5.0.0", 549 | "inherits": "^2.0.1", 550 | "pbkdf2": "^3.0.3", 551 | "public-encrypt": "^4.0.0", 552 | "randombytes": "^2.0.0", 553 | "randomfill": "^1.0.3" 554 | } 555 | }, 556 | "css.escape": { 557 | "version": "1.5.1", 558 | "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", 559 | "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=" 560 | }, 561 | "cssnano-preset-simple": { 562 | "version": "2.0.0", 563 | "resolved": "https://registry.npmjs.org/cssnano-preset-simple/-/cssnano-preset-simple-2.0.0.tgz", 564 | "integrity": "sha512-HkufSLkaBJbKBFx/7aj5HmCK9Ni/JedRQm0mT2qBzMG/dEuJOLnMt2lK6K1rwOOyV4j9aSY+knbW9WoS7BYpzg==", 565 | "requires": { 566 | "caniuse-lite": "^1.0.30001202" 567 | } 568 | }, 569 | "cssnano-simple": { 570 | "version": "2.0.0", 571 | "resolved": "https://registry.npmjs.org/cssnano-simple/-/cssnano-simple-2.0.0.tgz", 572 | "integrity": "sha512-0G3TXaFxlh/szPEG/o3VcmCwl0N3E60XNb9YZZijew5eIs6fLjJuOPxQd9yEBaX2p/YfJtt49i4vYi38iH6/6w==", 573 | "requires": { 574 | "cssnano-preset-simple": "^2.0.0" 575 | } 576 | }, 577 | "data-uri-to-buffer": { 578 | "version": "3.0.1", 579 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", 580 | "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==" 581 | }, 582 | "debug": { 583 | "version": "2.6.9", 584 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 585 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 586 | "requires": { 587 | "ms": "2.0.0" 588 | } 589 | }, 590 | "define-properties": { 591 | "version": "1.1.3", 592 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 593 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 594 | "requires": { 595 | "object-keys": "^1.0.12" 596 | } 597 | }, 598 | "delayed-stream": { 599 | "version": "1.0.0", 600 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 601 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 602 | }, 603 | "depd": { 604 | "version": "1.1.2", 605 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 606 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 607 | }, 608 | "des.js": { 609 | "version": "1.0.1", 610 | "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", 611 | "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", 612 | "requires": { 613 | "inherits": "^2.0.1", 614 | "minimalistic-assert": "^1.0.0" 615 | } 616 | }, 617 | "diffie-hellman": { 618 | "version": "5.0.3", 619 | "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", 620 | "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", 621 | "requires": { 622 | "bn.js": "^4.1.0", 623 | "miller-rabin": "^4.0.0", 624 | "randombytes": "^2.0.0" 625 | }, 626 | "dependencies": { 627 | "bn.js": { 628 | "version": "4.12.0", 629 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 630 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" 631 | } 632 | } 633 | }, 634 | "domain-browser": { 635 | "version": "4.19.0", 636 | "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.19.0.tgz", 637 | "integrity": "sha512-fRA+BaAWOR/yr/t7T9E9GJztHPeFjj8U35ajyAjCDtAAnTn1Rc1f6W6VGPJrO1tkQv9zWu+JRof7z6oQtiYVFQ==" 638 | }, 639 | "electron-to-chromium": { 640 | "version": "1.3.756", 641 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.756.tgz", 642 | "integrity": "sha512-WsmJym1TMeHVndjPjczTFbnRR/c4sbzg8fBFtuhlb2Sru3i/S1VGpzDSrv/It8ctMU2bj8G7g7/O3FzYMGw6eA==" 643 | }, 644 | "elliptic": { 645 | "version": "6.5.4", 646 | "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", 647 | "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", 648 | "requires": { 649 | "bn.js": "^4.11.9", 650 | "brorand": "^1.1.0", 651 | "hash.js": "^1.0.0", 652 | "hmac-drbg": "^1.0.1", 653 | "inherits": "^2.0.4", 654 | "minimalistic-assert": "^1.0.1", 655 | "minimalistic-crypto-utils": "^1.0.1" 656 | }, 657 | "dependencies": { 658 | "bn.js": { 659 | "version": "4.12.0", 660 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 661 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" 662 | } 663 | } 664 | }, 665 | "emojis-list": { 666 | "version": "2.1.0", 667 | "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", 668 | "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" 669 | }, 670 | "encoding": { 671 | "version": "0.1.13", 672 | "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", 673 | "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", 674 | "requires": { 675 | "iconv-lite": "^0.6.2" 676 | } 677 | }, 678 | "es-abstract": { 679 | "version": "1.18.3", 680 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", 681 | "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", 682 | "requires": { 683 | "call-bind": "^1.0.2", 684 | "es-to-primitive": "^1.2.1", 685 | "function-bind": "^1.1.1", 686 | "get-intrinsic": "^1.1.1", 687 | "has": "^1.0.3", 688 | "has-symbols": "^1.0.2", 689 | "is-callable": "^1.2.3", 690 | "is-negative-zero": "^2.0.1", 691 | "is-regex": "^1.1.3", 692 | "is-string": "^1.0.6", 693 | "object-inspect": "^1.10.3", 694 | "object-keys": "^1.1.1", 695 | "object.assign": "^4.1.2", 696 | "string.prototype.trimend": "^1.0.4", 697 | "string.prototype.trimstart": "^1.0.4", 698 | "unbox-primitive": "^1.0.1" 699 | } 700 | }, 701 | "es-to-primitive": { 702 | "version": "1.2.1", 703 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 704 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 705 | "requires": { 706 | "is-callable": "^1.1.4", 707 | "is-date-object": "^1.0.1", 708 | "is-symbol": "^1.0.2" 709 | } 710 | }, 711 | "es6-object-assign": { 712 | "version": "1.1.0", 713 | "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", 714 | "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=" 715 | }, 716 | "escalade": { 717 | "version": "3.1.1", 718 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 719 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" 720 | }, 721 | "escape-string-regexp": { 722 | "version": "1.0.5", 723 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 724 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 725 | }, 726 | "esutils": { 727 | "version": "2.0.3", 728 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 729 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" 730 | }, 731 | "etag": { 732 | "version": "1.8.1", 733 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 734 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 735 | }, 736 | "events": { 737 | "version": "3.3.0", 738 | "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", 739 | "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" 740 | }, 741 | "evp_bytestokey": { 742 | "version": "1.0.3", 743 | "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", 744 | "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", 745 | "requires": { 746 | "md5.js": "^1.3.4", 747 | "safe-buffer": "^5.1.1" 748 | } 749 | }, 750 | "fill-range": { 751 | "version": "7.0.1", 752 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 753 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 754 | "requires": { 755 | "to-regex-range": "^5.0.1" 756 | } 757 | }, 758 | "find-cache-dir": { 759 | "version": "3.3.1", 760 | "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", 761 | "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", 762 | "requires": { 763 | "commondir": "^1.0.1", 764 | "make-dir": "^3.0.2", 765 | "pkg-dir": "^4.1.0" 766 | } 767 | }, 768 | "find-up": { 769 | "version": "4.1.0", 770 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 771 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 772 | "requires": { 773 | "locate-path": "^5.0.0", 774 | "path-exists": "^4.0.0" 775 | } 776 | }, 777 | "foreach": { 778 | "version": "2.0.5", 779 | "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", 780 | "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" 781 | }, 782 | "form-data": { 783 | "version": "3.0.1", 784 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", 785 | "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", 786 | "requires": { 787 | "asynckit": "^0.4.0", 788 | "combined-stream": "^1.0.8", 789 | "mime-types": "^2.1.12" 790 | } 791 | }, 792 | "fsevents": { 793 | "version": "2.3.2", 794 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 795 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 796 | "optional": true 797 | }, 798 | "function-bind": { 799 | "version": "1.1.1", 800 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 801 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 802 | }, 803 | "get-intrinsic": { 804 | "version": "1.1.1", 805 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", 806 | "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", 807 | "requires": { 808 | "function-bind": "^1.1.1", 809 | "has": "^1.0.3", 810 | "has-symbols": "^1.0.1" 811 | } 812 | }, 813 | "get-orientation": { 814 | "version": "1.1.2", 815 | "resolved": "https://registry.npmjs.org/get-orientation/-/get-orientation-1.1.2.tgz", 816 | "integrity": "sha512-/pViTfifW+gBbh/RnlFYHINvELT9Znt+SYyDKAUL6uV6By019AK/s+i9XP4jSwq7lwP38Fd8HVeTxym3+hkwmQ==", 817 | "requires": { 818 | "stream-parser": "^0.3.1" 819 | } 820 | }, 821 | "glob-parent": { 822 | "version": "5.1.2", 823 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 824 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 825 | "requires": { 826 | "is-glob": "^4.0.1" 827 | } 828 | }, 829 | "glob-to-regexp": { 830 | "version": "0.4.1", 831 | "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", 832 | "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" 833 | }, 834 | "graceful-fs": { 835 | "version": "4.2.6", 836 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", 837 | "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" 838 | }, 839 | "has": { 840 | "version": "1.0.3", 841 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 842 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 843 | "requires": { 844 | "function-bind": "^1.1.1" 845 | } 846 | }, 847 | "has-bigints": { 848 | "version": "1.0.1", 849 | "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", 850 | "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" 851 | }, 852 | "has-flag": { 853 | "version": "3.0.0", 854 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 855 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 856 | }, 857 | "has-symbols": { 858 | "version": "1.0.2", 859 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", 860 | "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" 861 | }, 862 | "hash-base": { 863 | "version": "3.1.0", 864 | "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", 865 | "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", 866 | "requires": { 867 | "inherits": "^2.0.4", 868 | "readable-stream": "^3.6.0", 869 | "safe-buffer": "^5.2.0" 870 | } 871 | }, 872 | "hash.js": { 873 | "version": "1.1.7", 874 | "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", 875 | "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", 876 | "requires": { 877 | "inherits": "^2.0.3", 878 | "minimalistic-assert": "^1.0.1" 879 | } 880 | }, 881 | "he": { 882 | "version": "1.2.0", 883 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 884 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" 885 | }, 886 | "hmac-drbg": { 887 | "version": "1.0.1", 888 | "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", 889 | "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", 890 | "requires": { 891 | "hash.js": "^1.0.3", 892 | "minimalistic-assert": "^1.0.0", 893 | "minimalistic-crypto-utils": "^1.0.1" 894 | } 895 | }, 896 | "http-errors": { 897 | "version": "1.7.3", 898 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", 899 | "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", 900 | "requires": { 901 | "depd": "~1.1.2", 902 | "inherits": "2.0.4", 903 | "setprototypeof": "1.1.1", 904 | "statuses": ">= 1.5.0 < 2", 905 | "toidentifier": "1.0.0" 906 | } 907 | }, 908 | "https-browserify": { 909 | "version": "1.0.0", 910 | "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", 911 | "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" 912 | }, 913 | "iconv-lite": { 914 | "version": "0.6.3", 915 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 916 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 917 | "requires": { 918 | "safer-buffer": ">= 2.1.2 < 3.0.0" 919 | } 920 | }, 921 | "ieee754": { 922 | "version": "1.2.1", 923 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 924 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" 925 | }, 926 | "image-size": { 927 | "version": "1.0.0", 928 | "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.0.tgz", 929 | "integrity": "sha512-JLJ6OwBfO1KcA+TvJT+v8gbE6iWbj24LyDNFgFEN0lzegn6cC6a/p3NIDaepMsJjQjlUWqIC7wJv8lBFxPNjcw==", 930 | "requires": { 931 | "queue": "6.0.2" 932 | } 933 | }, 934 | "inherits": { 935 | "version": "2.0.4", 936 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 937 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 938 | }, 939 | "is-arguments": { 940 | "version": "1.1.0", 941 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", 942 | "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", 943 | "requires": { 944 | "call-bind": "^1.0.0" 945 | } 946 | }, 947 | "is-bigint": { 948 | "version": "1.0.2", 949 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", 950 | "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==" 951 | }, 952 | "is-binary-path": { 953 | "version": "2.1.0", 954 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 955 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 956 | "requires": { 957 | "binary-extensions": "^2.0.0" 958 | } 959 | }, 960 | "is-boolean-object": { 961 | "version": "1.1.1", 962 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", 963 | "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", 964 | "requires": { 965 | "call-bind": "^1.0.2" 966 | } 967 | }, 968 | "is-callable": { 969 | "version": "1.2.3", 970 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", 971 | "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==" 972 | }, 973 | "is-date-object": { 974 | "version": "1.0.4", 975 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", 976 | "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==" 977 | }, 978 | "is-extglob": { 979 | "version": "2.1.1", 980 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 981 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" 982 | }, 983 | "is-generator-function": { 984 | "version": "1.0.9", 985 | "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.9.tgz", 986 | "integrity": "sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A==" 987 | }, 988 | "is-glob": { 989 | "version": "4.0.1", 990 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 991 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 992 | "requires": { 993 | "is-extglob": "^2.1.1" 994 | } 995 | }, 996 | "is-nan": { 997 | "version": "1.3.2", 998 | "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", 999 | "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", 1000 | "requires": { 1001 | "call-bind": "^1.0.0", 1002 | "define-properties": "^1.1.3" 1003 | } 1004 | }, 1005 | "is-negative-zero": { 1006 | "version": "2.0.1", 1007 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", 1008 | "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" 1009 | }, 1010 | "is-number": { 1011 | "version": "7.0.0", 1012 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1013 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 1014 | }, 1015 | "is-number-object": { 1016 | "version": "1.0.5", 1017 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", 1018 | "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==" 1019 | }, 1020 | "is-regex": { 1021 | "version": "1.1.3", 1022 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", 1023 | "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", 1024 | "requires": { 1025 | "call-bind": "^1.0.2", 1026 | "has-symbols": "^1.0.2" 1027 | } 1028 | }, 1029 | "is-string": { 1030 | "version": "1.0.6", 1031 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", 1032 | "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==" 1033 | }, 1034 | "is-symbol": { 1035 | "version": "1.0.4", 1036 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", 1037 | "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", 1038 | "requires": { 1039 | "has-symbols": "^1.0.2" 1040 | } 1041 | }, 1042 | "is-typed-array": { 1043 | "version": "1.1.5", 1044 | "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.5.tgz", 1045 | "integrity": "sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==", 1046 | "requires": { 1047 | "available-typed-arrays": "^1.0.2", 1048 | "call-bind": "^1.0.2", 1049 | "es-abstract": "^1.18.0-next.2", 1050 | "foreach": "^2.0.5", 1051 | "has-symbols": "^1.0.1" 1052 | } 1053 | }, 1054 | "isarray": { 1055 | "version": "1.0.0", 1056 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1057 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1058 | }, 1059 | "jest-worker": { 1060 | "version": "27.0.0-next.5", 1061 | "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.0-next.5.tgz", 1062 | "integrity": "sha512-mk0umAQ5lT+CaOJ+Qp01N6kz48sJG2kr2n1rX0koqKf6FIygQV0qLOdN9SCYID4IVeSigDOcPeGLozdMLYfb5g==", 1063 | "requires": { 1064 | "@types/node": "*", 1065 | "merge-stream": "^2.0.0", 1066 | "supports-color": "^8.0.0" 1067 | }, 1068 | "dependencies": { 1069 | "has-flag": { 1070 | "version": "4.0.0", 1071 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1072 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 1073 | }, 1074 | "supports-color": { 1075 | "version": "8.1.1", 1076 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 1077 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 1078 | "requires": { 1079 | "has-flag": "^4.0.0" 1080 | } 1081 | } 1082 | } 1083 | }, 1084 | "js-tokens": { 1085 | "version": "4.0.0", 1086 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1087 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 1088 | }, 1089 | "json5": { 1090 | "version": "1.0.1", 1091 | "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", 1092 | "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", 1093 | "requires": { 1094 | "minimist": "^1.2.0" 1095 | } 1096 | }, 1097 | "loader-utils": { 1098 | "version": "1.2.3", 1099 | "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", 1100 | "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", 1101 | "requires": { 1102 | "big.js": "^5.2.2", 1103 | "emojis-list": "^2.0.0", 1104 | "json5": "^1.0.1" 1105 | } 1106 | }, 1107 | "locate-path": { 1108 | "version": "5.0.0", 1109 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 1110 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 1111 | "requires": { 1112 | "p-locate": "^4.1.0" 1113 | } 1114 | }, 1115 | "lodash": { 1116 | "version": "4.17.21", 1117 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1118 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 1119 | }, 1120 | "lodash.sortby": { 1121 | "version": "4.7.0", 1122 | "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", 1123 | "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" 1124 | }, 1125 | "loose-envify": { 1126 | "version": "1.4.0", 1127 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 1128 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 1129 | "requires": { 1130 | "js-tokens": "^3.0.0 || ^4.0.0" 1131 | } 1132 | }, 1133 | "make-dir": { 1134 | "version": "3.1.0", 1135 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 1136 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 1137 | "requires": { 1138 | "semver": "^6.0.0" 1139 | } 1140 | }, 1141 | "md5.js": { 1142 | "version": "1.3.5", 1143 | "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", 1144 | "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", 1145 | "requires": { 1146 | "hash-base": "^3.0.0", 1147 | "inherits": "^2.0.1", 1148 | "safe-buffer": "^5.1.2" 1149 | } 1150 | }, 1151 | "merge-stream": { 1152 | "version": "2.0.0", 1153 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 1154 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" 1155 | }, 1156 | "miller-rabin": { 1157 | "version": "4.0.1", 1158 | "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", 1159 | "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", 1160 | "requires": { 1161 | "bn.js": "^4.0.0", 1162 | "brorand": "^1.0.1" 1163 | }, 1164 | "dependencies": { 1165 | "bn.js": { 1166 | "version": "4.12.0", 1167 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 1168 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" 1169 | } 1170 | } 1171 | }, 1172 | "mime-db": { 1173 | "version": "1.48.0", 1174 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", 1175 | "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==" 1176 | }, 1177 | "mime-types": { 1178 | "version": "2.1.31", 1179 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", 1180 | "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", 1181 | "requires": { 1182 | "mime-db": "1.48.0" 1183 | } 1184 | }, 1185 | "minimalistic-assert": { 1186 | "version": "1.0.1", 1187 | "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", 1188 | "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" 1189 | }, 1190 | "minimalistic-crypto-utils": { 1191 | "version": "1.0.1", 1192 | "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", 1193 | "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" 1194 | }, 1195 | "minimist": { 1196 | "version": "1.2.5", 1197 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1198 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 1199 | }, 1200 | "ms": { 1201 | "version": "2.0.0", 1202 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1203 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1204 | }, 1205 | "nanoid": { 1206 | "version": "3.1.23", 1207 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", 1208 | "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==" 1209 | }, 1210 | "native-url": { 1211 | "version": "0.3.4", 1212 | "resolved": "https://registry.npmjs.org/native-url/-/native-url-0.3.4.tgz", 1213 | "integrity": "sha512-6iM8R99ze45ivyH8vybJ7X0yekIcPf5GgLV5K0ENCbmRcaRIDoj37BC8iLEmaaBfqqb8enuZ5p0uhY+lVAbAcA==", 1214 | "requires": { 1215 | "querystring": "^0.2.0" 1216 | } 1217 | }, 1218 | "next": { 1219 | "version": "11.0.1", 1220 | "resolved": "https://registry.npmjs.org/next/-/next-11.0.1.tgz", 1221 | "integrity": "sha512-yR7be7asNbvpVNpi6xxEg28wZ7Gqmj1nOt0sABH9qORmF3+pms2KZ7Cng33oK5nqPIzEEFJD0pp2PCe3/ueMIg==", 1222 | "requires": { 1223 | "@babel/runtime": "7.12.5", 1224 | "@hapi/accept": "5.0.2", 1225 | "@next/env": "11.0.1", 1226 | "@next/polyfill-module": "11.0.1", 1227 | "@next/react-dev-overlay": "11.0.1", 1228 | "@next/react-refresh-utils": "11.0.1", 1229 | "assert": "2.0.0", 1230 | "ast-types": "0.13.2", 1231 | "browserify-zlib": "0.2.0", 1232 | "browserslist": "4.16.6", 1233 | "buffer": "5.6.0", 1234 | "caniuse-lite": "^1.0.30001228", 1235 | "chalk": "2.4.2", 1236 | "chokidar": "3.5.1", 1237 | "constants-browserify": "1.0.0", 1238 | "crypto-browserify": "3.12.0", 1239 | "cssnano-simple": "2.0.0", 1240 | "domain-browser": "4.19.0", 1241 | "encoding": "0.1.13", 1242 | "etag": "1.8.1", 1243 | "find-cache-dir": "3.3.1", 1244 | "get-orientation": "1.1.2", 1245 | "https-browserify": "1.0.0", 1246 | "image-size": "1.0.0", 1247 | "jest-worker": "27.0.0-next.5", 1248 | "native-url": "0.3.4", 1249 | "node-fetch": "2.6.1", 1250 | "node-html-parser": "1.4.9", 1251 | "node-libs-browser": "^2.2.1", 1252 | "os-browserify": "0.3.0", 1253 | "p-limit": "3.1.0", 1254 | "path-browserify": "1.0.1", 1255 | "pnp-webpack-plugin": "1.6.4", 1256 | "postcss": "8.2.13", 1257 | "process": "0.11.10", 1258 | "prop-types": "15.7.2", 1259 | "querystring-es3": "0.2.1", 1260 | "raw-body": "2.4.1", 1261 | "react-is": "17.0.2", 1262 | "react-refresh": "0.8.3", 1263 | "stream-browserify": "3.0.0", 1264 | "stream-http": "3.1.1", 1265 | "string_decoder": "1.3.0", 1266 | "styled-jsx": "3.3.2", 1267 | "timers-browserify": "2.0.12", 1268 | "tty-browserify": "0.0.1", 1269 | "use-subscription": "1.5.1", 1270 | "util": "0.12.3", 1271 | "vm-browserify": "1.1.2", 1272 | "watchpack": "2.1.1" 1273 | } 1274 | }, 1275 | "node-fetch": { 1276 | "version": "2.6.1", 1277 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 1278 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" 1279 | }, 1280 | "node-html-parser": { 1281 | "version": "1.4.9", 1282 | "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-1.4.9.tgz", 1283 | "integrity": "sha512-UVcirFD1Bn0O+TSmloHeHqZZCxHjvtIeGdVdGMhyZ8/PWlEiZaZ5iJzR189yKZr8p0FXN58BUeC7RHRkf/KYGw==", 1284 | "requires": { 1285 | "he": "1.2.0" 1286 | } 1287 | }, 1288 | "node-libs-browser": { 1289 | "version": "2.2.1", 1290 | "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", 1291 | "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", 1292 | "requires": { 1293 | "assert": "^1.1.1", 1294 | "browserify-zlib": "^0.2.0", 1295 | "buffer": "^4.3.0", 1296 | "console-browserify": "^1.1.0", 1297 | "constants-browserify": "^1.0.0", 1298 | "crypto-browserify": "^3.11.0", 1299 | "domain-browser": "^1.1.1", 1300 | "events": "^3.0.0", 1301 | "https-browserify": "^1.0.0", 1302 | "os-browserify": "^0.3.0", 1303 | "path-browserify": "0.0.1", 1304 | "process": "^0.11.10", 1305 | "punycode": "^1.2.4", 1306 | "querystring-es3": "^0.2.0", 1307 | "readable-stream": "^2.3.3", 1308 | "stream-browserify": "^2.0.1", 1309 | "stream-http": "^2.7.2", 1310 | "string_decoder": "^1.0.0", 1311 | "timers-browserify": "^2.0.4", 1312 | "tty-browserify": "0.0.0", 1313 | "url": "^0.11.0", 1314 | "util": "^0.11.0", 1315 | "vm-browserify": "^1.0.1" 1316 | }, 1317 | "dependencies": { 1318 | "assert": { 1319 | "version": "1.5.0", 1320 | "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", 1321 | "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", 1322 | "requires": { 1323 | "object-assign": "^4.1.1", 1324 | "util": "0.10.3" 1325 | }, 1326 | "dependencies": { 1327 | "inherits": { 1328 | "version": "2.0.1", 1329 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", 1330 | "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" 1331 | }, 1332 | "util": { 1333 | "version": "0.10.3", 1334 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", 1335 | "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", 1336 | "requires": { 1337 | "inherits": "2.0.1" 1338 | } 1339 | } 1340 | } 1341 | }, 1342 | "buffer": { 1343 | "version": "4.9.2", 1344 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", 1345 | "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", 1346 | "requires": { 1347 | "base64-js": "^1.0.2", 1348 | "ieee754": "^1.1.4", 1349 | "isarray": "^1.0.0" 1350 | } 1351 | }, 1352 | "domain-browser": { 1353 | "version": "1.2.0", 1354 | "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", 1355 | "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" 1356 | }, 1357 | "inherits": { 1358 | "version": "2.0.3", 1359 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1360 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 1361 | }, 1362 | "path-browserify": { 1363 | "version": "0.0.1", 1364 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", 1365 | "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" 1366 | }, 1367 | "readable-stream": { 1368 | "version": "2.3.7", 1369 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1370 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1371 | "requires": { 1372 | "core-util-is": "~1.0.0", 1373 | "inherits": "~2.0.3", 1374 | "isarray": "~1.0.0", 1375 | "process-nextick-args": "~2.0.0", 1376 | "safe-buffer": "~5.1.1", 1377 | "string_decoder": "~1.1.1", 1378 | "util-deprecate": "~1.0.1" 1379 | } 1380 | }, 1381 | "safe-buffer": { 1382 | "version": "5.1.2", 1383 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1384 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1385 | }, 1386 | "stream-browserify": { 1387 | "version": "2.0.2", 1388 | "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", 1389 | "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", 1390 | "requires": { 1391 | "inherits": "~2.0.1", 1392 | "readable-stream": "^2.0.2" 1393 | } 1394 | }, 1395 | "stream-http": { 1396 | "version": "2.8.3", 1397 | "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", 1398 | "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", 1399 | "requires": { 1400 | "builtin-status-codes": "^3.0.0", 1401 | "inherits": "^2.0.1", 1402 | "readable-stream": "^2.3.6", 1403 | "to-arraybuffer": "^1.0.0", 1404 | "xtend": "^4.0.0" 1405 | } 1406 | }, 1407 | "string_decoder": { 1408 | "version": "1.1.1", 1409 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1410 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1411 | "requires": { 1412 | "safe-buffer": "~5.1.0" 1413 | } 1414 | }, 1415 | "tty-browserify": { 1416 | "version": "0.0.0", 1417 | "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", 1418 | "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" 1419 | }, 1420 | "util": { 1421 | "version": "0.11.1", 1422 | "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", 1423 | "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", 1424 | "requires": { 1425 | "inherits": "2.0.3" 1426 | } 1427 | } 1428 | } 1429 | }, 1430 | "node-releases": { 1431 | "version": "1.1.73", 1432 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", 1433 | "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==" 1434 | }, 1435 | "normalize-path": { 1436 | "version": "3.0.0", 1437 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1438 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" 1439 | }, 1440 | "object-assign": { 1441 | "version": "4.1.1", 1442 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1443 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 1444 | }, 1445 | "object-inspect": { 1446 | "version": "1.10.3", 1447 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", 1448 | "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==" 1449 | }, 1450 | "object-is": { 1451 | "version": "1.1.5", 1452 | "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", 1453 | "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", 1454 | "requires": { 1455 | "call-bind": "^1.0.2", 1456 | "define-properties": "^1.1.3" 1457 | } 1458 | }, 1459 | "object-keys": { 1460 | "version": "1.1.1", 1461 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1462 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" 1463 | }, 1464 | "object.assign": { 1465 | "version": "4.1.2", 1466 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", 1467 | "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", 1468 | "requires": { 1469 | "call-bind": "^1.0.0", 1470 | "define-properties": "^1.1.3", 1471 | "has-symbols": "^1.0.1", 1472 | "object-keys": "^1.1.1" 1473 | } 1474 | }, 1475 | "os-browserify": { 1476 | "version": "0.3.0", 1477 | "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", 1478 | "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" 1479 | }, 1480 | "p-limit": { 1481 | "version": "3.1.0", 1482 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1483 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1484 | "requires": { 1485 | "yocto-queue": "^0.1.0" 1486 | } 1487 | }, 1488 | "p-locate": { 1489 | "version": "4.1.0", 1490 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 1491 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 1492 | "requires": { 1493 | "p-limit": "^2.2.0" 1494 | }, 1495 | "dependencies": { 1496 | "p-limit": { 1497 | "version": "2.3.0", 1498 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 1499 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 1500 | "requires": { 1501 | "p-try": "^2.0.0" 1502 | } 1503 | } 1504 | } 1505 | }, 1506 | "p-try": { 1507 | "version": "2.2.0", 1508 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 1509 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" 1510 | }, 1511 | "pako": { 1512 | "version": "1.0.11", 1513 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 1514 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" 1515 | }, 1516 | "parse-asn1": { 1517 | "version": "5.1.6", 1518 | "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", 1519 | "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", 1520 | "requires": { 1521 | "asn1.js": "^5.2.0", 1522 | "browserify-aes": "^1.0.0", 1523 | "evp_bytestokey": "^1.0.0", 1524 | "pbkdf2": "^3.0.3", 1525 | "safe-buffer": "^5.1.1" 1526 | } 1527 | }, 1528 | "path-browserify": { 1529 | "version": "1.0.1", 1530 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", 1531 | "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" 1532 | }, 1533 | "path-exists": { 1534 | "version": "4.0.0", 1535 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1536 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" 1537 | }, 1538 | "pbkdf2": { 1539 | "version": "3.1.2", 1540 | "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", 1541 | "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", 1542 | "requires": { 1543 | "create-hash": "^1.1.2", 1544 | "create-hmac": "^1.1.4", 1545 | "ripemd160": "^2.0.1", 1546 | "safe-buffer": "^5.0.1", 1547 | "sha.js": "^2.4.8" 1548 | } 1549 | }, 1550 | "picomatch": { 1551 | "version": "2.3.0", 1552 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", 1553 | "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" 1554 | }, 1555 | "pkg-dir": { 1556 | "version": "4.2.0", 1557 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", 1558 | "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", 1559 | "requires": { 1560 | "find-up": "^4.0.0" 1561 | } 1562 | }, 1563 | "platform": { 1564 | "version": "1.3.6", 1565 | "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", 1566 | "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" 1567 | }, 1568 | "pnp-webpack-plugin": { 1569 | "version": "1.6.4", 1570 | "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", 1571 | "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", 1572 | "requires": { 1573 | "ts-pnp": "^1.1.6" 1574 | } 1575 | }, 1576 | "postcss": { 1577 | "version": "8.2.13", 1578 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.13.tgz", 1579 | "integrity": "sha512-FCE5xLH+hjbzRdpbRb1IMCvPv9yZx2QnDarBEYSN0N0HYk+TcXsEhwdFcFb+SRWOKzKGErhIEbBK2ogyLdTtfQ==", 1580 | "requires": { 1581 | "colorette": "^1.2.2", 1582 | "nanoid": "^3.1.22", 1583 | "source-map": "^0.6.1" 1584 | }, 1585 | "dependencies": { 1586 | "source-map": { 1587 | "version": "0.6.1", 1588 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1589 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 1590 | } 1591 | } 1592 | }, 1593 | "process": { 1594 | "version": "0.11.10", 1595 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 1596 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" 1597 | }, 1598 | "process-nextick-args": { 1599 | "version": "2.0.1", 1600 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1601 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 1602 | }, 1603 | "prop-types": { 1604 | "version": "15.7.2", 1605 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", 1606 | "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", 1607 | "requires": { 1608 | "loose-envify": "^1.4.0", 1609 | "object-assign": "^4.1.1", 1610 | "react-is": "^16.8.1" 1611 | }, 1612 | "dependencies": { 1613 | "react-is": { 1614 | "version": "16.13.1", 1615 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 1616 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" 1617 | } 1618 | } 1619 | }, 1620 | "public-encrypt": { 1621 | "version": "4.0.3", 1622 | "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", 1623 | "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", 1624 | "requires": { 1625 | "bn.js": "^4.1.0", 1626 | "browserify-rsa": "^4.0.0", 1627 | "create-hash": "^1.1.0", 1628 | "parse-asn1": "^5.0.0", 1629 | "randombytes": "^2.0.1", 1630 | "safe-buffer": "^5.1.2" 1631 | }, 1632 | "dependencies": { 1633 | "bn.js": { 1634 | "version": "4.12.0", 1635 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 1636 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" 1637 | } 1638 | } 1639 | }, 1640 | "punycode": { 1641 | "version": "1.4.1", 1642 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 1643 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 1644 | }, 1645 | "querystring": { 1646 | "version": "0.2.1", 1647 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", 1648 | "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==" 1649 | }, 1650 | "querystring-es3": { 1651 | "version": "0.2.1", 1652 | "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", 1653 | "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" 1654 | }, 1655 | "queue": { 1656 | "version": "6.0.2", 1657 | "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", 1658 | "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", 1659 | "requires": { 1660 | "inherits": "~2.0.3" 1661 | } 1662 | }, 1663 | "randombytes": { 1664 | "version": "2.1.0", 1665 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 1666 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 1667 | "requires": { 1668 | "safe-buffer": "^5.1.0" 1669 | } 1670 | }, 1671 | "randomfill": { 1672 | "version": "1.0.4", 1673 | "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", 1674 | "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", 1675 | "requires": { 1676 | "randombytes": "^2.0.5", 1677 | "safe-buffer": "^5.1.0" 1678 | } 1679 | }, 1680 | "raw-body": { 1681 | "version": "2.4.1", 1682 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", 1683 | "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", 1684 | "requires": { 1685 | "bytes": "3.1.0", 1686 | "http-errors": "1.7.3", 1687 | "iconv-lite": "0.4.24", 1688 | "unpipe": "1.0.0" 1689 | }, 1690 | "dependencies": { 1691 | "iconv-lite": { 1692 | "version": "0.4.24", 1693 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1694 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1695 | "requires": { 1696 | "safer-buffer": ">= 2.1.2 < 3" 1697 | } 1698 | } 1699 | } 1700 | }, 1701 | "react": { 1702 | "version": "17.0.2", 1703 | "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", 1704 | "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", 1705 | "requires": { 1706 | "loose-envify": "^1.1.0", 1707 | "object-assign": "^4.1.1" 1708 | } 1709 | }, 1710 | "react-dom": { 1711 | "version": "17.0.2", 1712 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", 1713 | "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", 1714 | "requires": { 1715 | "loose-envify": "^1.1.0", 1716 | "object-assign": "^4.1.1", 1717 | "scheduler": "^0.20.2" 1718 | } 1719 | }, 1720 | "react-is": { 1721 | "version": "17.0.2", 1722 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", 1723 | "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" 1724 | }, 1725 | "react-refresh": { 1726 | "version": "0.8.3", 1727 | "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz", 1728 | "integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==" 1729 | }, 1730 | "readable-stream": { 1731 | "version": "3.6.0", 1732 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1733 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1734 | "requires": { 1735 | "inherits": "^2.0.3", 1736 | "string_decoder": "^1.1.1", 1737 | "util-deprecate": "^1.0.1" 1738 | } 1739 | }, 1740 | "readdirp": { 1741 | "version": "3.5.0", 1742 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", 1743 | "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", 1744 | "requires": { 1745 | "picomatch": "^2.2.1" 1746 | } 1747 | }, 1748 | "regenerator-runtime": { 1749 | "version": "0.13.7", 1750 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", 1751 | "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" 1752 | }, 1753 | "ripemd160": { 1754 | "version": "2.0.2", 1755 | "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", 1756 | "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", 1757 | "requires": { 1758 | "hash-base": "^3.0.0", 1759 | "inherits": "^2.0.1" 1760 | } 1761 | }, 1762 | "safe-buffer": { 1763 | "version": "5.2.1", 1764 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1765 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1766 | }, 1767 | "safer-buffer": { 1768 | "version": "2.1.2", 1769 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1770 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1771 | }, 1772 | "scheduler": { 1773 | "version": "0.20.2", 1774 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", 1775 | "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", 1776 | "requires": { 1777 | "loose-envify": "^1.1.0", 1778 | "object-assign": "^4.1.1" 1779 | } 1780 | }, 1781 | "semver": { 1782 | "version": "6.3.0", 1783 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1784 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 1785 | }, 1786 | "setimmediate": { 1787 | "version": "1.0.5", 1788 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 1789 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" 1790 | }, 1791 | "setprototypeof": { 1792 | "version": "1.1.1", 1793 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 1794 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 1795 | }, 1796 | "sha.js": { 1797 | "version": "2.4.11", 1798 | "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", 1799 | "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", 1800 | "requires": { 1801 | "inherits": "^2.0.1", 1802 | "safe-buffer": "^5.0.1" 1803 | } 1804 | }, 1805 | "shell-quote": { 1806 | "version": "1.7.2", 1807 | "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", 1808 | "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" 1809 | }, 1810 | "source-map": { 1811 | "version": "0.8.0-beta.0", 1812 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", 1813 | "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", 1814 | "requires": { 1815 | "whatwg-url": "^7.0.0" 1816 | } 1817 | }, 1818 | "stacktrace-parser": { 1819 | "version": "0.1.10", 1820 | "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", 1821 | "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", 1822 | "requires": { 1823 | "type-fest": "^0.7.1" 1824 | } 1825 | }, 1826 | "statuses": { 1827 | "version": "1.5.0", 1828 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1829 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 1830 | }, 1831 | "stream-browserify": { 1832 | "version": "3.0.0", 1833 | "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", 1834 | "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", 1835 | "requires": { 1836 | "inherits": "~2.0.4", 1837 | "readable-stream": "^3.5.0" 1838 | } 1839 | }, 1840 | "stream-http": { 1841 | "version": "3.1.1", 1842 | "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.1.tgz", 1843 | "integrity": "sha512-S7OqaYu0EkFpgeGFb/NPOoPLxFko7TPqtEeFg5DXPB4v/KETHG0Ln6fRFrNezoelpaDKmycEmmZ81cC9DAwgYg==", 1844 | "requires": { 1845 | "builtin-status-codes": "^3.0.0", 1846 | "inherits": "^2.0.4", 1847 | "readable-stream": "^3.6.0", 1848 | "xtend": "^4.0.2" 1849 | } 1850 | }, 1851 | "stream-parser": { 1852 | "version": "0.3.1", 1853 | "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", 1854 | "integrity": "sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M=", 1855 | "requires": { 1856 | "debug": "2" 1857 | } 1858 | }, 1859 | "string-hash": { 1860 | "version": "1.1.3", 1861 | "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", 1862 | "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=" 1863 | }, 1864 | "string.prototype.trimend": { 1865 | "version": "1.0.4", 1866 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", 1867 | "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", 1868 | "requires": { 1869 | "call-bind": "^1.0.2", 1870 | "define-properties": "^1.1.3" 1871 | } 1872 | }, 1873 | "string.prototype.trimstart": { 1874 | "version": "1.0.4", 1875 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", 1876 | "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", 1877 | "requires": { 1878 | "call-bind": "^1.0.2", 1879 | "define-properties": "^1.1.3" 1880 | } 1881 | }, 1882 | "string_decoder": { 1883 | "version": "1.3.0", 1884 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1885 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1886 | "requires": { 1887 | "safe-buffer": "~5.2.0" 1888 | } 1889 | }, 1890 | "strip-ansi": { 1891 | "version": "6.0.0", 1892 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 1893 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 1894 | "requires": { 1895 | "ansi-regex": "^5.0.0" 1896 | } 1897 | }, 1898 | "styled-jsx": { 1899 | "version": "3.3.2", 1900 | "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-3.3.2.tgz", 1901 | "integrity": "sha512-daAkGd5mqhbBhLd6jYAjYBa9LpxYCzsgo/f6qzPdFxVB8yoGbhxvzQgkC0pfmCVvW3JuAEBn0UzFLBfkHVZG1g==", 1902 | "requires": { 1903 | "@babel/types": "7.8.3", 1904 | "babel-plugin-syntax-jsx": "6.18.0", 1905 | "convert-source-map": "1.7.0", 1906 | "loader-utils": "1.2.3", 1907 | "source-map": "0.7.3", 1908 | "string-hash": "1.1.3", 1909 | "stylis": "3.5.4", 1910 | "stylis-rule-sheet": "0.0.10" 1911 | }, 1912 | "dependencies": { 1913 | "source-map": { 1914 | "version": "0.7.3", 1915 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", 1916 | "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" 1917 | } 1918 | } 1919 | }, 1920 | "stylis": { 1921 | "version": "3.5.4", 1922 | "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz", 1923 | "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==" 1924 | }, 1925 | "stylis-rule-sheet": { 1926 | "version": "0.0.10", 1927 | "resolved": "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz", 1928 | "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==" 1929 | }, 1930 | "supports-color": { 1931 | "version": "5.5.0", 1932 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1933 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1934 | "requires": { 1935 | "has-flag": "^3.0.0" 1936 | } 1937 | }, 1938 | "timers-browserify": { 1939 | "version": "2.0.12", 1940 | "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", 1941 | "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", 1942 | "requires": { 1943 | "setimmediate": "^1.0.4" 1944 | } 1945 | }, 1946 | "to-arraybuffer": { 1947 | "version": "1.0.1", 1948 | "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", 1949 | "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" 1950 | }, 1951 | "to-fast-properties": { 1952 | "version": "2.0.0", 1953 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 1954 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" 1955 | }, 1956 | "to-regex-range": { 1957 | "version": "5.0.1", 1958 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1959 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1960 | "requires": { 1961 | "is-number": "^7.0.0" 1962 | } 1963 | }, 1964 | "toidentifier": { 1965 | "version": "1.0.0", 1966 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 1967 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 1968 | }, 1969 | "tr46": { 1970 | "version": "1.0.1", 1971 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", 1972 | "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", 1973 | "requires": { 1974 | "punycode": "^2.1.0" 1975 | }, 1976 | "dependencies": { 1977 | "punycode": { 1978 | "version": "2.1.1", 1979 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1980 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 1981 | } 1982 | } 1983 | }, 1984 | "ts-pnp": { 1985 | "version": "1.2.0", 1986 | "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", 1987 | "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==" 1988 | }, 1989 | "tty-browserify": { 1990 | "version": "0.0.1", 1991 | "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", 1992 | "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" 1993 | }, 1994 | "type-fest": { 1995 | "version": "0.7.1", 1996 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", 1997 | "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==" 1998 | }, 1999 | "unbox-primitive": { 2000 | "version": "1.0.1", 2001 | "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", 2002 | "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", 2003 | "requires": { 2004 | "function-bind": "^1.1.1", 2005 | "has-bigints": "^1.0.1", 2006 | "has-symbols": "^1.0.2", 2007 | "which-boxed-primitive": "^1.0.2" 2008 | } 2009 | }, 2010 | "unpipe": { 2011 | "version": "1.0.0", 2012 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 2013 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 2014 | }, 2015 | "url": { 2016 | "version": "0.11.0", 2017 | "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", 2018 | "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", 2019 | "requires": { 2020 | "punycode": "1.3.2", 2021 | "querystring": "0.2.0" 2022 | }, 2023 | "dependencies": { 2024 | "punycode": { 2025 | "version": "1.3.2", 2026 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 2027 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" 2028 | }, 2029 | "querystring": { 2030 | "version": "0.2.0", 2031 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 2032 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" 2033 | } 2034 | } 2035 | }, 2036 | "use-subscription": { 2037 | "version": "1.5.1", 2038 | "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz", 2039 | "integrity": "sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==", 2040 | "requires": { 2041 | "object-assign": "^4.1.1" 2042 | } 2043 | }, 2044 | "util": { 2045 | "version": "0.12.3", 2046 | "resolved": "https://registry.npmjs.org/util/-/util-0.12.3.tgz", 2047 | "integrity": "sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog==", 2048 | "requires": { 2049 | "inherits": "^2.0.3", 2050 | "is-arguments": "^1.0.4", 2051 | "is-generator-function": "^1.0.7", 2052 | "is-typed-array": "^1.1.3", 2053 | "safe-buffer": "^5.1.2", 2054 | "which-typed-array": "^1.1.2" 2055 | } 2056 | }, 2057 | "util-deprecate": { 2058 | "version": "1.0.2", 2059 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2060 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 2061 | }, 2062 | "vm-browserify": { 2063 | "version": "1.1.2", 2064 | "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", 2065 | "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" 2066 | }, 2067 | "watchpack": { 2068 | "version": "2.1.1", 2069 | "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.1.tgz", 2070 | "integrity": "sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw==", 2071 | "requires": { 2072 | "glob-to-regexp": "^0.4.1", 2073 | "graceful-fs": "^4.1.2" 2074 | } 2075 | }, 2076 | "webidl-conversions": { 2077 | "version": "4.0.2", 2078 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", 2079 | "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" 2080 | }, 2081 | "whatwg-url": { 2082 | "version": "7.1.0", 2083 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", 2084 | "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", 2085 | "requires": { 2086 | "lodash.sortby": "^4.7.0", 2087 | "tr46": "^1.0.1", 2088 | "webidl-conversions": "^4.0.2" 2089 | } 2090 | }, 2091 | "which-boxed-primitive": { 2092 | "version": "1.0.2", 2093 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", 2094 | "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", 2095 | "requires": { 2096 | "is-bigint": "^1.0.1", 2097 | "is-boolean-object": "^1.1.0", 2098 | "is-number-object": "^1.0.4", 2099 | "is-string": "^1.0.5", 2100 | "is-symbol": "^1.0.3" 2101 | } 2102 | }, 2103 | "which-typed-array": { 2104 | "version": "1.1.4", 2105 | "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz", 2106 | "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==", 2107 | "requires": { 2108 | "available-typed-arrays": "^1.0.2", 2109 | "call-bind": "^1.0.0", 2110 | "es-abstract": "^1.18.0-next.1", 2111 | "foreach": "^2.0.5", 2112 | "function-bind": "^1.1.1", 2113 | "has-symbols": "^1.0.1", 2114 | "is-typed-array": "^1.1.3" 2115 | } 2116 | }, 2117 | "xtend": { 2118 | "version": "4.0.2", 2119 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 2120 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 2121 | }, 2122 | "yocto-queue": { 2123 | "version": "0.1.0", 2124 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 2125 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" 2126 | } 2127 | } 2128 | } 2129 | --------------------------------------------------------------------------------