├── .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 | 3 | 4 | -------------------------------------------------------------------------------- /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 | --------------------------------------------------------------------------------