From de09b7006697719c9d5e1b5e16b661e37e100550 Mon Sep 17 00:00:00 2001 From: Rob Stanford Date: Wed, 4 Jan 2023 16:32:16 +0000 Subject: [PATCH] chore: validate user input for tv maze urls --- demos/default/pages/api/shows/[...params].js | 2 +- demos/default/pages/api/shows/[id].js | 2 +- .../default/pages/getServerSideProps/[id].js | 2 +- .../getServerSideProps/all/[[...slug]].js | 2 +- demos/default/pages/getStaticProps/[id].js | 2 +- .../getStaticProps/withFallback/[...slug].js | 2 +- .../pages/getStaticProps/withFallback/[id].js | 2 +- .../withFallbackBlocking/[id].js | 2 +- .../getStaticProps/withRevalidate/[id].js | 2 +- .../withRevalidate/withFallback/[id].js | 2 +- .../withFallbackBlocking/[id].js | 2 +- demos/default/pages/shows/[...params].js | 2 +- demos/default/pages/shows/[id].js | 2 +- demos/middleware/pages/shows/[id].js | 2 +- demos/middleware/pages/shows/static/[id].js | 2 +- package-lock.json | 273 ++++++++++++++++++ 16 files changed, 288 insertions(+), 15 deletions(-) diff --git a/demos/default/pages/api/shows/[...params].js b/demos/default/pages/api/shows/[...params].js index 05a9873ba2..891b273602 100644 --- a/demos/default/pages/api/shows/[...params].js +++ b/demos/default/pages/api/shows/[...params].js @@ -10,7 +10,7 @@ export default async (req, res) => { const id = params[0] // Get the data - const fetchRes = await fetch(`https://tvproxy.netlify.app/shows/${id}`) + const fetchRes = await fetch(`https://tvproxy.netlify.app/shows/${Number(id)}`) const data = await fetchRes.json() // If show was found, return it diff --git a/demos/default/pages/api/shows/[id].js b/demos/default/pages/api/shows/[id].js index ab5b76be8c..e0d1d088f1 100644 --- a/demos/default/pages/api/shows/[id].js +++ b/demos/default/pages/api/shows/[id].js @@ -7,7 +7,7 @@ export default async (req, res) => { const { id } = query // Get the data - const fetchRes = await fetch(`https://tvproxy.netlify.app/shows/${id}`) + const fetchRes = await fetch(`https://tvproxy.netlify.app/shows/${Number(id)}`) const data = await fetchRes.json() // If show was found, return it diff --git a/demos/default/pages/getServerSideProps/[id].js b/demos/default/pages/getServerSideProps/[id].js index 4f6a6d2dae..561b6a4170 100644 --- a/demos/default/pages/getServerSideProps/[id].js +++ b/demos/default/pages/getServerSideProps/[id].js @@ -34,7 +34,7 @@ export const getServerSideProps = async ({ params }) => { // The ID to render const { id } = params - const res = await fetch(`https://tvproxy.netlify.app/shows/${id}`) + const res = await fetch(`https://tvproxy.netlify.app/shows/${Number(id)}`) const data = await res.json() // Set error code if show item could not be found diff --git a/demos/default/pages/getServerSideProps/all/[[...slug]].js b/demos/default/pages/getServerSideProps/all/[[...slug]].js index 4820b4bcf3..0f0a2ff9a4 100644 --- a/demos/default/pages/getServerSideProps/all/[[...slug]].js +++ b/demos/default/pages/getServerSideProps/all/[[...slug]].js @@ -34,7 +34,7 @@ export const getServerSideProps = async ({ params }) => { // The ID to render const { slug } = params - const res = await fetch(`https://tvproxy.netlify.app/shows/${slug[0]}`) + const res = await fetch(`https://tvproxy.netlify.app/shows/${Number(slug[0])}`) const data = await res.json() // Set error code if show item could not be found diff --git a/demos/default/pages/getStaticProps/[id].js b/demos/default/pages/getStaticProps/[id].js index 21671ff5a8..34b454d43f 100644 --- a/demos/default/pages/getStaticProps/[id].js +++ b/demos/default/pages/getStaticProps/[id].js @@ -28,7 +28,7 @@ export async function getStaticProps({ params }) { // The ID to render const { id } = params - const res = await fetch(`https://tvproxy.netlify.app/shows/${id}`) + const res = await fetch(`https://tvproxy.netlify.app/shows/${Number(id)}`) const data = await res.json() const time = new Date().toLocaleTimeString() diff --git a/demos/default/pages/getStaticProps/withFallback/[...slug].js b/demos/default/pages/getStaticProps/withFallback/[...slug].js index 14d60cd65e..38e108716a 100644 --- a/demos/default/pages/getStaticProps/withFallback/[...slug].js +++ b/demos/default/pages/getStaticProps/withFallback/[...slug].js @@ -42,7 +42,7 @@ export async function getStaticProps({ params }) { const { slug } = params const id = slug[slug.length - 1] - const res = await fetch(`https://tvproxy.netlify.app/shows/${id}`) + const res = await fetch(`https://tvproxy.netlify.app/shows/${Number(id)}`) const data = await res.json() const time = new Date().toLocaleTimeString() diff --git a/demos/default/pages/getStaticProps/withFallback/[id].js b/demos/default/pages/getStaticProps/withFallback/[id].js index 86f019ab5c..ba7b753628 100644 --- a/demos/default/pages/getStaticProps/withFallback/[id].js +++ b/demos/default/pages/getStaticProps/withFallback/[id].js @@ -41,7 +41,7 @@ export async function getStaticProps({ params }) { // The ID to render const { id } = params - const res = await fetch(`https://tvproxy.netlify.app/shows/${id}`) + const res = await fetch(`https://tvproxy.netlify.app/shows/${Number(id)}`) const data = await res.json() const time = new Date().toLocaleTimeString() diff --git a/demos/default/pages/getStaticProps/withFallbackBlocking/[id].js b/demos/default/pages/getStaticProps/withFallbackBlocking/[id].js index 825fd4376c..2688cc4aee 100644 --- a/demos/default/pages/getStaticProps/withFallbackBlocking/[id].js +++ b/demos/default/pages/getStaticProps/withFallbackBlocking/[id].js @@ -30,7 +30,7 @@ export async function getStaticProps({ params }) { // The ID to render const { id } = params - const res = await fetch(`https://tvproxy.netlify.app/shows/${id}`) + const res = await fetch(`https://tvproxy.netlify.app/shows/${Number(id)}`) const data = await res.json() const time = new Date().toLocaleTimeString() diff --git a/demos/default/pages/getStaticProps/withRevalidate/[id].js b/demos/default/pages/getStaticProps/withRevalidate/[id].js index 95a8f24923..32c213d104 100644 --- a/demos/default/pages/getStaticProps/withRevalidate/[id].js +++ b/demos/default/pages/getStaticProps/withRevalidate/[id].js @@ -29,7 +29,7 @@ export async function getStaticProps({ params }) { // The ID to render const { id } = params - const res = await fetch(`https://tvproxy.netlify.app/shows/${id}`) + const res = await fetch(`https://tvproxy.netlify.app/shows/${Number(id)}`) const data = await res.json() const time = new Date().toLocaleTimeString() diff --git a/demos/default/pages/getStaticProps/withRevalidate/withFallback/[id].js b/demos/default/pages/getStaticProps/withRevalidate/withFallback/[id].js index fa5520d515..9f6abc0783 100644 --- a/demos/default/pages/getStaticProps/withRevalidate/withFallback/[id].js +++ b/demos/default/pages/getStaticProps/withRevalidate/withFallback/[id].js @@ -42,7 +42,7 @@ export async function getStaticProps({ params }) { // The ID to render const { id } = params - const res = await fetch(`https://tvproxy.netlify.app/shows/${id}`) + const res = await fetch(`https://tvproxy.netlify.app/shows/${Number(id)}`) const data = await res.json() const time = new Date().toLocaleTimeString() diff --git a/demos/default/pages/getStaticProps/withRevalidate/withFallbackBlocking/[id].js b/demos/default/pages/getStaticProps/withRevalidate/withFallbackBlocking/[id].js index ec2bec5aba..dd3868417d 100644 --- a/demos/default/pages/getStaticProps/withRevalidate/withFallbackBlocking/[id].js +++ b/demos/default/pages/getStaticProps/withRevalidate/withFallbackBlocking/[id].js @@ -29,7 +29,7 @@ export async function getStaticProps({ params }) { // The ID to render const { id } = params - const res = await fetch(`https://tvproxy.netlify.app/shows/${id}`) + const res = await fetch(`https://tvproxy.netlify.app/shows/${Number(id)}`) const data = await res.json() const time = new Date().toLocaleTimeString() diff --git a/demos/default/pages/shows/[...params].js b/demos/default/pages/shows/[...params].js index 0c53886299..dd86b0b7bf 100644 --- a/demos/default/pages/shows/[...params].js +++ b/demos/default/pages/shows/[...params].js @@ -47,7 +47,7 @@ CatchAll.getInitialProps = async ({ res: req, query }) => { const id = params[0] // Get the data - const res = await fetch(`https://tvproxy.netlify.app/shows/${id}`) + const res = await fetch(`https://tvproxy.netlify.app/shows/${Number(id)}`) const data = await res.json() // Set error code if show item could not be found diff --git a/demos/default/pages/shows/[id].js b/demos/default/pages/shows/[id].js index b812bb41be..93633a2039 100644 --- a/demos/default/pages/shows/[id].js +++ b/demos/default/pages/shows/[id].js @@ -35,7 +35,7 @@ Show.getInitialProps = async ({ res: req, query }) => { const { id } = query // Get the data - const res = await fetch(`https://tvproxy.netlify.app/shows/${id}`) + const res = await fetch(`https://tvproxy.netlify.app/shows/${Number(id)}`) const data = await res.json() // Set error code if show item could not be found diff --git a/demos/middleware/pages/shows/[id].js b/demos/middleware/pages/shows/[id].js index 999ed21887..6fb655fb09 100644 --- a/demos/middleware/pages/shows/[id].js +++ b/demos/middleware/pages/shows/[id].js @@ -33,7 +33,7 @@ export const getServerSideProps = async ({ params, req }) => { // The ID to render const { id } = params console.log(req.headers) - const res = await fetch(`https://tvproxy.netlify.app/shows/${id}`) + const res = await fetch(`https://tvproxy.netlify.app/shows/${Number(id)}`) const data = await res.json() // Set error code if show item could not be found diff --git a/demos/middleware/pages/shows/static/[id].js b/demos/middleware/pages/shows/static/[id].js index 8272a19293..08a74a2d3c 100644 --- a/demos/middleware/pages/shows/static/[id].js +++ b/demos/middleware/pages/shows/static/[id].js @@ -40,7 +40,7 @@ export async function getStaticProps({ params }) { // The ID to render const { id } = params - const res = await fetch(`https://tvproxy.netlify.app/shows/${id}`) + const res = await fetch(`https://tvproxy.netlify.app/shows/${Number(id)}`) const data = await res.json() return { diff --git a/package-lock.json b/package-lock.json index fc94a11fba..b978466021 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24528,6 +24528,201 @@ "engines": { "node": ">=10" } + }, + "node_modules/@next/swc-android-arm-eabi": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.0.7.tgz", + "integrity": "sha512-QTEamOK/LCwBf05GZ261rULMbZEpE3TYdjHlXfznV+nXwTztzkBNFXwP67gv2wW44BROzgi/vrR9H8oP+J5jxg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-android-arm64": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-13.0.7.tgz", + "integrity": "sha512-wcy2H0Tl9ME8vKy2GnJZ7Mybwys+43F/Eh2Pvph7mSDpMbYBJ6iA0zeY62iYYXxlZhnAID3+h79FUqUEakkClw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.0.7.tgz", + "integrity": "sha512-F/mU7csN1/J2cqXJPMgTQ6MwAbc1pJ6sp6W+X0z5JEY4IFDzxKd3wRc3pCiNF7j8xW381JlNpWxhjCctnNmfaw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.0.7.tgz", + "integrity": "sha512-636AuRQynCPnIPRVzcCk5B7OMq9XjaYam2T0HeWUCE6y7EqEO3kxiuZ4QmN81T7A6Ydb+JnivYrLelHXmgdj6A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-freebsd-x64": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.0.7.tgz", + "integrity": "sha512-92XAMzNgQazowZ9t7uZmHRA5VdBl/SwEdrf5UybdfRovsxB4r3+yJWEvFaqYpSEp0gwndbwLokJdpz7OwFdL3Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm-gnueabihf": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.0.7.tgz", + "integrity": "sha512-3r1CWl5P6I5n5Yxip8EXv/Rfu2Cp6wVmIOpvmczyUR82j+bcMkwPAcUjNkG/vMCagS4xV7NElrcdGb39iFmfLg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.0.7.tgz", + "integrity": "sha512-RXo8tt6ppiwyS6hpDw3JdAjKcdVewsefxnxk9xOH4mRhMyq9V2lQx0e24X/dRiZqkx3jnWReR2WRrUlgN1UkSQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.0.7.tgz", + "integrity": "sha512-RWpnW+bmfXyxyY7iARbueYDGuIF+BEp3etLeYh/RUNHb9PhOHLDgJOG8haGSykud3a6CcyBI8hEjqOhoObaDpw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.0.7.tgz", + "integrity": "sha512-/ygUIiMMTYnbKlFs5Ba9J5k/tNxFWy8eI1bBF8UuMTvV8QJHl/aLDiA5dwsei2kk99/cu3eay62JnJXkSk3RSQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.0.7.tgz", + "integrity": "sha512-dLzr6AL77USJN0ejgx5AS8O8SbFlbYTzs0XwAWag4oQpUG2p3ARvxwQgYQ0Z+6EP0zIRZ/XfLkN/mhsyi3m4PA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.0.7.tgz", + "integrity": "sha512-+vFIVa82AwqFkpFClKT+n73fGxrhAZ2u1u3mDYEBdxO6c9U4Pj3S5tZFsGFK9kLT/bFvf/eeVOICSLCC7MSgJQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.0.7.tgz", + "integrity": "sha512-RNLXIhp+assD39dQY9oHhDxw+/qSJRARKhOFsHfOtf8yEfCHqcKkn3X/L+ih60ntaEqK294y1WkMk6ylotsxwA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.0.7.tgz", + "integrity": "sha512-kvdnlLcrnEq72ZP0lqe2Z5NqvB9N5uSCvtXJ0PhKvNncWWd0fEG9Ec9erXgwCmVlM2ytw41k9/uuQ+SVw4Pihw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } } }, "dependencies": { @@ -42733,6 +42928,84 @@ "compress-commons": "^4.1.0", "readable-stream": "^3.6.0" } + }, + "@next/swc-android-arm-eabi": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.0.7.tgz", + "integrity": "sha512-QTEamOK/LCwBf05GZ261rULMbZEpE3TYdjHlXfznV+nXwTztzkBNFXwP67gv2wW44BROzgi/vrR9H8oP+J5jxg==", + "optional": true + }, + "@next/swc-android-arm64": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-13.0.7.tgz", + "integrity": "sha512-wcy2H0Tl9ME8vKy2GnJZ7Mybwys+43F/Eh2Pvph7mSDpMbYBJ6iA0zeY62iYYXxlZhnAID3+h79FUqUEakkClw==", + "optional": true + }, + "@next/swc-darwin-arm64": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.0.7.tgz", + "integrity": "sha512-F/mU7csN1/J2cqXJPMgTQ6MwAbc1pJ6sp6W+X0z5JEY4IFDzxKd3wRc3pCiNF7j8xW381JlNpWxhjCctnNmfaw==", + "optional": true + }, + "@next/swc-darwin-x64": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.0.7.tgz", + "integrity": "sha512-636AuRQynCPnIPRVzcCk5B7OMq9XjaYam2T0HeWUCE6y7EqEO3kxiuZ4QmN81T7A6Ydb+JnivYrLelHXmgdj6A==", + "optional": true + }, + "@next/swc-freebsd-x64": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.0.7.tgz", + "integrity": "sha512-92XAMzNgQazowZ9t7uZmHRA5VdBl/SwEdrf5UybdfRovsxB4r3+yJWEvFaqYpSEp0gwndbwLokJdpz7OwFdL3Q==", + "optional": true + }, + "@next/swc-linux-arm-gnueabihf": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.0.7.tgz", + "integrity": "sha512-3r1CWl5P6I5n5Yxip8EXv/Rfu2Cp6wVmIOpvmczyUR82j+bcMkwPAcUjNkG/vMCagS4xV7NElrcdGb39iFmfLg==", + "optional": true + }, + "@next/swc-linux-arm64-gnu": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.0.7.tgz", + "integrity": "sha512-RXo8tt6ppiwyS6hpDw3JdAjKcdVewsefxnxk9xOH4mRhMyq9V2lQx0e24X/dRiZqkx3jnWReR2WRrUlgN1UkSQ==", + "optional": true + }, + "@next/swc-linux-arm64-musl": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.0.7.tgz", + "integrity": "sha512-RWpnW+bmfXyxyY7iARbueYDGuIF+BEp3etLeYh/RUNHb9PhOHLDgJOG8haGSykud3a6CcyBI8hEjqOhoObaDpw==", + "optional": true + }, + "@next/swc-linux-x64-gnu": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.0.7.tgz", + "integrity": "sha512-/ygUIiMMTYnbKlFs5Ba9J5k/tNxFWy8eI1bBF8UuMTvV8QJHl/aLDiA5dwsei2kk99/cu3eay62JnJXkSk3RSQ==", + "optional": true + }, + "@next/swc-linux-x64-musl": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.0.7.tgz", + "integrity": "sha512-dLzr6AL77USJN0ejgx5AS8O8SbFlbYTzs0XwAWag4oQpUG2p3ARvxwQgYQ0Z+6EP0zIRZ/XfLkN/mhsyi3m4PA==", + "optional": true + }, + "@next/swc-win32-arm64-msvc": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.0.7.tgz", + "integrity": "sha512-+vFIVa82AwqFkpFClKT+n73fGxrhAZ2u1u3mDYEBdxO6c9U4Pj3S5tZFsGFK9kLT/bFvf/eeVOICSLCC7MSgJQ==", + "optional": true + }, + "@next/swc-win32-ia32-msvc": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.0.7.tgz", + "integrity": "sha512-RNLXIhp+assD39dQY9oHhDxw+/qSJRARKhOFsHfOtf8yEfCHqcKkn3X/L+ih60ntaEqK294y1WkMk6ylotsxwA==", + "optional": true + }, + "@next/swc-win32-x64-msvc": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.0.7.tgz", + "integrity": "sha512-kvdnlLcrnEq72ZP0lqe2Z5NqvB9N5uSCvtXJ0PhKvNncWWd0fEG9Ec9erXgwCmVlM2ytw41k9/uuQ+SVw4Pihw==", + "optional": true } } }