├── .gitignore
├── README.md
├── components
├── Feature.js
├── Grid.js
├── Page.js
└── Teaser.js
├── package.json
├── pages
├── [...slug].js
├── _app.js
├── api
│ ├── exit-preview.js
│ └── preview.js
└── index.js
├── public
├── favicon.ico
└── vercel.svg
├── styles
├── Home.module.css
└── globals.css
└── yarn.lock
/.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 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Next.js Storyblok Boilerplate
2 |
3 | This repository is a Next.js [Storyblok](https://www.storyblok.com) starter template used in following [5 minute tutorial](https://www.storyblok.com/tp/add-a-headless-cms-to-next-js-in-5-minutes).
4 |
5 | ## Requirements
6 |
7 | To use this project you have to have a Storyblok account. If you don't have one yet you can register at [Storyblok](https://www.storyblok.com), it's free.
8 |
9 | ## How to get started?
10 |
11 | Read the [Next.js tutorial](https://www.storyblok.com/tp/add-a-headless-cms-to-next-js-in-5-minutes) about connecting Storyblok and Next.js
12 |
13 | ### 1. Clone the repo
14 |
15 | ```sh
16 | $ git clone https://github.com/storyblok/react-next-boilerplate.git
17 | ```
18 |
19 | ### 2. Install all dependecies
20 | ```sh
21 | $ yarn # or npm install
22 | ```
23 |
24 | ### 3. Adding the Access token
25 | Create a new empty Space and exchange the preview token with your own in ```pages/_app.js```.
26 |
27 | ```js
28 | // in pages/_app.js
29 | storyblokInit({
30 | accessToken: "your-preview-token",
31 | use: [apiPlugin],
32 | components,
33 | });
34 | ```
35 |
36 | ### 4. Run your project
37 | Set the preview domain in Storyblok to `http://localhost:3000/`
38 |
39 | ```sh
40 | # to run in developer mode
41 | $ yarn dev # or npm run dev
42 | ```
43 |
44 | ```sh
45 | # to build your project
46 | $ yarn build # or npm run build
47 | ```
48 |
49 |
50 |
51 | ## Resources
52 |
53 | - [Next.js docs](https://nextjs.org/docs/#setup)
54 | - [Storyblok Tutorial](https://www.storyblok.com/tp/add-a-headless-cms-to-next-js-in-5-minutes)
55 | - [Preview Mode](https://nextjs.org/docs/advanced-features/preview-mode)
56 |
57 |
58 |
--------------------------------------------------------------------------------
/components/Feature.js:
--------------------------------------------------------------------------------
1 | import { storyblokEditable } from "@storyblok/react";
2 |
3 | const Feature = ({ blok }) => (
4 |
5 | {blok.name}
6 |
7 | );
8 |
9 | export default Feature;
10 |
--------------------------------------------------------------------------------
/components/Grid.js:
--------------------------------------------------------------------------------
1 | import { storyblokEditable, StoryblokComponent } from "@storyblok/react";
2 |
3 | const Grid = ({ blok }) => {
4 | return (
5 |
6 | {blok.columns.map((nestedBlok) => (
7 |
8 | ))}
9 |
10 | );
11 | };
12 |
13 | export default Grid;
14 |
--------------------------------------------------------------------------------
/components/Page.js:
--------------------------------------------------------------------------------
1 | import { storyblokEditable, StoryblokComponent } from "@storyblok/react";
2 |
3 | const Page = ({ blok }) => (
4 |
5 | {blok.body.map((nestedBlok) => (
6 |
7 | ))}
8 |
9 | );
10 |
11 | export default Page;
12 |
--------------------------------------------------------------------------------
/components/Teaser.js:
--------------------------------------------------------------------------------
1 | import { storyblokEditable } from "@storyblok/react";
2 |
3 | const Teaser = ({ blok }) => {
4 | return {blok.headline}
;
5 | };
6 |
7 | export default Teaser;
8 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "react-next-storyblok-boilerplate",
3 | "version": "1.0.0",
4 | "description": "Next.js Storyblok Boilerplate",
5 | "main": "index.js",
6 | "private": true,
7 | "scripts": {
8 | "dev": "next dev",
9 | "build": "next build",
10 | "start": "next start"
11 | },
12 | "dependencies": {
13 | "@storyblok/react": "^1.0.3",
14 | "next": "^12.1.0",
15 | "react": "17.0.2",
16 | "react-dom": "17.0.2"
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/pages/[...slug].js:
--------------------------------------------------------------------------------
1 | import Head from "next/head";
2 | import styles from "../styles/Home.module.css";
3 |
4 | import {
5 | useStoryblokState,
6 | getStoryblokApi,
7 | StoryblokComponent,
8 | } from "@storyblok/react";
9 |
10 | export default function Page({ story }) {
11 | story = useStoryblokState(story);
12 |
13 | return (
14 |
15 |
16 |
{story ? story.name : "My Site"}
17 |
18 |
19 |
20 |
21 | {story ? story.name : "My Site"}
22 |
23 |
24 |
25 |
26 | );
27 | }
28 |
29 | export async function getStaticProps({ params }) {
30 | let slug = params.slug ? params.slug.join("/") : "home";
31 |
32 | let sbParams = {
33 | version: "draft", // or 'published'
34 | };
35 |
36 | const storyblokApi = getStoryblokApi();
37 | let { data } = await storyblokApi.get(`cdn/stories/${slug}`, sbParams);
38 |
39 | return {
40 | props: {
41 | story: data ? data.story : false,
42 | key: data ? data.story.id : false,
43 | },
44 | revalidate: 3600,
45 | };
46 | }
47 |
48 | export async function getStaticPaths() {
49 | const storyblokApi = getStoryblokApi();
50 | let { data } = await storyblokApi.get("cdn/links/");
51 |
52 | let paths = [];
53 | Object.keys(data.links).forEach((linkKey) => {
54 | if (data.links[linkKey].is_folder || data.links[linkKey].slug === "home") {
55 | return;
56 | }
57 |
58 | const slug = data.links[linkKey].slug;
59 | let splittedSlug = slug.split("/");
60 |
61 | paths.push({ params: { slug: splittedSlug } });
62 | });
63 |
64 | return {
65 | paths: paths,
66 | fallback: false,
67 | };
68 | }
69 |
--------------------------------------------------------------------------------
/pages/_app.js:
--------------------------------------------------------------------------------
1 | import "../styles/globals.css";
2 | import { storyblokInit, apiPlugin } from "@storyblok/react";
3 | import Feature from "../components/Feature";
4 | import Grid from "../components/Grid";
5 | import Page from "../components/Page";
6 | import Teaser from "../components/Teaser";
7 |
8 | const components = {
9 | feature: Feature,
10 | grid: Grid,
11 | teaser: Teaser,
12 | page: Page,
13 | };
14 |
15 | storyblokInit({
16 | accessToken: "your-preview-token",
17 | use: [apiPlugin],
18 | components,
19 | });
20 |
21 | function MyApp({ Component, pageProps }) {
22 | return ;
23 | }
24 |
25 | export default MyApp;
26 |
--------------------------------------------------------------------------------
/pages/api/exit-preview.js:
--------------------------------------------------------------------------------
1 | export default async function exit(req, res) {
2 | const { slug = "" } = req.query;
3 | // Exit the current user from "Preview Mode". This function accepts no args.
4 | res.clearPreviewData();
5 |
6 | // set the cookies to None
7 | const cookies = res.getHeader("Set-Cookie");
8 | res.setHeader(
9 | "Set-Cookie",
10 | cookies.map((cookie) =>
11 | cookie.replace("SameSite=Lax", "SameSite=None;Secure")
12 | )
13 | );
14 |
15 | // Redirect the user back to the index page.
16 | res.redirect(`/${slug}`);
17 | }
18 |
--------------------------------------------------------------------------------
/pages/api/preview.js:
--------------------------------------------------------------------------------
1 | export default async function preview(req, res) {
2 | const { slug = "" } = req.query;
3 | // get the storyblok params for the bridge to work
4 | const params = req.url.split("?");
5 |
6 | // Check the secret and next parameters
7 | // This secret should only be known to this API route and the CMS
8 | if (req.query.secret !== "MY_SECRET_TOKEN") {
9 | return res.status(401).json({ message: "Invalid token" });
10 | }
11 |
12 | // Enable Preview Mode by setting the cookies
13 | res.setPreviewData({});
14 |
15 | // Set cookie to None, so it can be read in the Storyblok iframe
16 | const cookies = res.getHeader("Set-Cookie");
17 | res.setHeader(
18 | "Set-Cookie",
19 | cookies.map((cookie) =>
20 | cookie.replace("SameSite=Lax", "SameSite=None;Secure")
21 | )
22 | );
23 |
24 | // Redirect to the path from entry
25 | res.redirect(`/${slug}?${params[1]}`);
26 | }
27 |
--------------------------------------------------------------------------------
/pages/index.js:
--------------------------------------------------------------------------------
1 | import Head from "next/head";
2 | import styles from "../styles/Home.module.css";
3 |
4 | import {
5 | useStoryblokState,
6 | getStoryblokApi,
7 | StoryblokComponent,
8 | } from "@storyblok/react";
9 |
10 | export default function Home({ story }) {
11 | story = useStoryblokState(story);
12 |
13 | return (
14 |
15 |
16 |
Create Next App
17 |
18 |
19 |
20 |
21 | {story ? story.name : "My Site"}
22 |
23 |
24 |
25 |
26 | );
27 | }
28 |
29 | export async function getStaticProps() {
30 | let slug = "home";
31 |
32 | let sbParams = {
33 | version: "draft", // or 'published'
34 | };
35 |
36 | const storyblokApi = getStoryblokApi();
37 | let { data } = await storyblokApi.get(`cdn/stories/${slug}`, sbParams);
38 |
39 | return {
40 | props: {
41 | story: data ? data.story : false,
42 | key: data ? data.story.id : false,
43 | },
44 | revalidate: 3600,
45 | };
46 | }
47 |
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/storyblok/react-next-boilerplate/ff43f178f2861b3c49550b557d02e4ca3f3ffa43/public/favicon.ico
--------------------------------------------------------------------------------
/public/vercel.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/styles/Home.module.css:
--------------------------------------------------------------------------------
1 | .container {
2 | min-height: 100vh;
3 | padding: 0 0.5rem;
4 | display: flex;
5 | flex-direction: column;
6 | justify-content: center;
7 | align-items: center;
8 | height: 100vh;
9 | }
10 |
11 | .main {
12 | padding: 5rem 0;
13 | flex: 1;
14 | display: flex;
15 | flex-direction: column;
16 | justify-content: center;
17 | align-items: center;
18 | }
19 |
20 | .footer {
21 | width: 100%;
22 | height: 100px;
23 | border-top: 1px solid #eaeaea;
24 | display: flex;
25 | justify-content: center;
26 | align-items: center;
27 | }
28 |
29 | .footer a {
30 | display: flex;
31 | justify-content: center;
32 | align-items: center;
33 | flex-grow: 1;
34 | }
35 |
36 | .title a {
37 | color: #0070f3;
38 | text-decoration: none;
39 | }
40 |
41 | .title a:hover,
42 | .title a:focus,
43 | .title a:active {
44 | text-decoration: underline;
45 | }
46 |
47 | .title {
48 | margin: 0;
49 | line-height: 1.15;
50 | font-size: 4rem;
51 | }
52 |
53 | .title,
54 | .description {
55 | text-align: center;
56 | }
57 |
58 | .description {
59 | line-height: 1.5;
60 | font-size: 1.5rem;
61 | }
62 |
63 | .code {
64 | background: #fafafa;
65 | border-radius: 5px;
66 | padding: 0.75rem;
67 | font-size: 1.1rem;
68 | font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono,
69 | Bitstream Vera Sans Mono, Courier New, monospace;
70 | }
71 |
72 | .grid {
73 | display: flex;
74 | align-items: center;
75 | justify-content: center;
76 | flex-wrap: wrap;
77 | max-width: 800px;
78 | margin-top: 3rem;
79 | }
80 |
81 | .card {
82 | margin: 1rem;
83 | padding: 1.5rem;
84 | text-align: left;
85 | color: inherit;
86 | text-decoration: none;
87 | border: 1px solid #eaeaea;
88 | border-radius: 10px;
89 | transition: color 0.15s ease, border-color 0.15s ease;
90 | width: 45%;
91 | }
92 |
93 | .card:hover,
94 | .card:focus,
95 | .card:active {
96 | color: #0070f3;
97 | border-color: #0070f3;
98 | }
99 |
100 | .card h2 {
101 | margin: 0 0 1rem 0;
102 | font-size: 1.5rem;
103 | }
104 |
105 | .card p {
106 | margin: 0;
107 | font-size: 1.25rem;
108 | line-height: 1.5;
109 | }
110 |
111 | .logo {
112 | height: 1em;
113 | margin-left: 0.5rem;
114 | }
115 |
116 | @media (max-width: 600px) {
117 | .grid {
118 | width: 100%;
119 | flex-direction: column;
120 | }
121 | }
122 |
--------------------------------------------------------------------------------
/styles/globals.css:
--------------------------------------------------------------------------------
1 | html,
2 | body {
3 | padding: 0;
4 | margin: 0;
5 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen,
6 | Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;
7 | }
8 |
9 | a {
10 | color: inherit;
11 | text-decoration: none;
12 | }
13 |
14 | * {
15 | box-sizing: border-box;
16 | }
17 |
--------------------------------------------------------------------------------
/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 | "@next/env@12.1.0":
6 | "integrity" "sha512-nrIgY6t17FQ9xxwH3jj0a6EOiQ/WDHUos35Hghtr+SWN/ntHIQ7UpuvSi0vaLzZVHQWaDupKI+liO5vANcDeTQ=="
7 | "resolved" "https://registry.npmjs.org/@next/env/-/env-12.1.0.tgz"
8 | "version" "12.1.0"
9 |
10 | "@next/swc-darwin-x64@12.1.0":
11 | "integrity" "sha512-ieAz0/J0PhmbZBB8+EA/JGdhRHBogF8BWaeqR7hwveb6SYEIJaDNQy0I+ZN8gF8hLj63bEDxJAs/cEhdnTq+ug=="
12 | "resolved" "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.1.0.tgz"
13 | "version" "12.1.0"
14 |
15 | "@storyblok/js@^1.0.4":
16 | "integrity" "sha512-ydcQ7FhTs95nY1NQI3V4pGS/gf2uWPG0pRvJRXwoRqTAISCX//1/GochPEXAgWkZU5KafmBppNp3tqhi8F1fHA=="
17 | "resolved" "https://registry.npmjs.org/@storyblok/js/-/js-1.0.4.tgz"
18 | "version" "1.0.4"
19 | dependencies:
20 | "storyblok-js-client" "^4.2.0"
21 |
22 | "@storyblok/react@^1.0.3":
23 | "integrity" "sha512-40dA9joHaebifjeBr9kwCxMpb27JLH32pMo3IqLqpsnHOn1qzJV6sOS2OjqqaQZeQYxI0mFZecdMdciqvvWwgQ=="
24 | "resolved" "https://registry.npmjs.org/@storyblok/react/-/react-1.0.3.tgz"
25 | "version" "1.0.3"
26 | dependencies:
27 | "@storyblok/js" "^1.0.4"
28 |
29 | "axios@^0.21.1":
30 | "integrity" "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg=="
31 | "resolved" "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz"
32 | "version" "0.21.4"
33 | dependencies:
34 | "follow-redirects" "^1.14.0"
35 |
36 | "caniuse-lite@^1.0.30001283":
37 | "integrity" "sha512-xjlIAFHucBRSMUo1kb5D4LYgcN1M45qdKP++lhqowDpwJwGkpIRTt5qQqnhxjj1vHcI7nrJxWhCC1ATrCEBTcw=="
38 | "resolved" "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001319.tgz"
39 | "version" "1.0.30001319"
40 |
41 | "follow-redirects@^1.14.0":
42 | "integrity" "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w=="
43 | "resolved" "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz"
44 | "version" "1.14.9"
45 |
46 | "js-tokens@^3.0.0 || ^4.0.0":
47 | "integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
48 | "resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
49 | "version" "4.0.0"
50 |
51 | "loose-envify@^1.1.0":
52 | "integrity" "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="
53 | "resolved" "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz"
54 | "version" "1.4.0"
55 | dependencies:
56 | "js-tokens" "^3.0.0 || ^4.0.0"
57 |
58 | "nanoid@^3.1.30":
59 | "integrity" "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw=="
60 | "resolved" "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz"
61 | "version" "3.3.1"
62 |
63 | "next@^12.1.0":
64 | "integrity" "sha512-s885kWvnIlxsUFHq9UGyIyLiuD0G3BUC/xrH0CEnH5lHEWkwQcHOORgbDF0hbrW9vr/7am4ETfX4A7M6DjrE7Q=="
65 | "resolved" "https://registry.npmjs.org/next/-/next-12.1.0.tgz"
66 | "version" "12.1.0"
67 | dependencies:
68 | "@next/env" "12.1.0"
69 | "caniuse-lite" "^1.0.30001283"
70 | "postcss" "8.4.5"
71 | "styled-jsx" "5.0.0"
72 | "use-subscription" "1.5.1"
73 | optionalDependencies:
74 | "@next/swc-android-arm64" "12.1.0"
75 | "@next/swc-darwin-arm64" "12.1.0"
76 | "@next/swc-darwin-x64" "12.1.0"
77 | "@next/swc-linux-arm-gnueabihf" "12.1.0"
78 | "@next/swc-linux-arm64-gnu" "12.1.0"
79 | "@next/swc-linux-arm64-musl" "12.1.0"
80 | "@next/swc-linux-x64-gnu" "12.1.0"
81 | "@next/swc-linux-x64-musl" "12.1.0"
82 | "@next/swc-win32-arm64-msvc" "12.1.0"
83 | "@next/swc-win32-ia32-msvc" "12.1.0"
84 | "@next/swc-win32-x64-msvc" "12.1.0"
85 |
86 | "object-assign@^4.1.1":
87 | "integrity" "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
88 | "resolved" "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
89 | "version" "4.1.1"
90 |
91 | "picocolors@^1.0.0":
92 | "integrity" "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
93 | "resolved" "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz"
94 | "version" "1.0.0"
95 |
96 | "postcss@8.4.5":
97 | "integrity" "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg=="
98 | "resolved" "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz"
99 | "version" "8.4.5"
100 | dependencies:
101 | "nanoid" "^3.1.30"
102 | "picocolors" "^1.0.0"
103 | "source-map-js" "^1.0.1"
104 |
105 | "react-dom@^17.0.2 || ^18.0.0-0", "react-dom@17.0.2":
106 | "integrity" "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA=="
107 | "resolved" "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz"
108 | "version" "17.0.2"
109 | dependencies:
110 | "loose-envify" "^1.1.0"
111 | "object-assign" "^4.1.1"
112 | "scheduler" "^0.20.2"
113 |
114 | "react@^16.8.0 || ^17.0.0", "react@^17.0.2 || ^18.0.0-0", "react@>= 16.8.0 || 17.x.x || 18.x.x", "react@17.0.2":
115 | "integrity" "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA=="
116 | "resolved" "https://registry.npmjs.org/react/-/react-17.0.2.tgz"
117 | "version" "17.0.2"
118 | dependencies:
119 | "loose-envify" "^1.1.0"
120 | "object-assign" "^4.1.1"
121 |
122 | "rollup-plugin-mjs-entry@^0.1.1":
123 | "integrity" "sha512-uii0Txyrn4YCgP++fypLqsT3LgO3Fx0gAZLZlWRSwKCuZ+bdSzAzdVbJFATmCHcBNlO61i65EgemOVdVQYONHA=="
124 | "resolved" "https://registry.npmjs.org/rollup-plugin-mjs-entry/-/rollup-plugin-mjs-entry-0.1.1.tgz"
125 | "version" "0.1.1"
126 |
127 | "scheduler@^0.20.2":
128 | "integrity" "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ=="
129 | "resolved" "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz"
130 | "version" "0.20.2"
131 | dependencies:
132 | "loose-envify" "^1.1.0"
133 | "object-assign" "^4.1.1"
134 |
135 | "source-map-js@^1.0.1":
136 | "integrity" "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="
137 | "resolved" "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz"
138 | "version" "1.0.2"
139 |
140 | "storyblok-js-client@^4.2.0":
141 | "integrity" "sha512-AqR+Uu2sB5B5UVKa4GGoZxxDICjH25X/pzOn3tZSS/dsDi0C2vq2mDKeJK5lIMAhnJcOGn4q9fyj4x4qCRkFqQ=="
142 | "resolved" "https://registry.npmjs.org/storyblok-js-client/-/storyblok-js-client-4.3.0.tgz"
143 | "version" "4.3.0"
144 | dependencies:
145 | "rollup-plugin-mjs-entry" "^0.1.1"
146 |
147 | "styled-jsx@5.0.0":
148 | "integrity" "sha512-qUqsWoBquEdERe10EW8vLp3jT25s/ssG1/qX5gZ4wu15OZpmSMFI2v+fWlRhLfykA5rFtlJ1ME8A8pm/peV4WA=="
149 | "resolved" "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.0.tgz"
150 | "version" "5.0.0"
151 |
152 | "use-subscription@1.5.1":
153 | "integrity" "sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA=="
154 | "resolved" "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz"
155 | "version" "1.5.1"
156 | dependencies:
157 | "object-assign" "^4.1.1"
158 |
--------------------------------------------------------------------------------