├── .github └── FUNDING.yml ├── .gitignore ├── LICENSE ├── README.md ├── components └── ResourceList.js ├── next.config.js ├── package-lock.json ├── package.json ├── pages ├── _app.js ├── annotatedLayout.js ├── editProducts.js └── index.js ├── server.js └── server └── getSubscriptionUrl.js /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: jaayperez # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # Next.js build output 79 | .next 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # Serverless directories 95 | .serverless/ 96 | 97 | # FuseBox cache 98 | .fusebox/ 99 | 100 | # DynamoDB Local files 101 | .dynamodb/ 102 | 103 | # TernJS port file 104 | .tern-port 105 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Justin Perez 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Shopify App with Node.js and React 2 | 3 | This Shopify App creates discounts, reads product data, writes new price changes when discounts are applied and charges merchant fees with Shopify's Billing API. The functional app runs in the development environment and enables several frameworks, tools, and libraries with webhooks, which listens for relevant events that happen on the development store. 4 | 5 | ## Technologies 6 | **Built with** 7 | - [Node.js](https://nodejs.org/en) 8 | - [React](https://reactjs.org) 9 | - [Next.js](https://nextjs.org) 10 | - [GraphQL](https://graphql.org) 11 | - [Apollo](https://www.apollographql.com) 12 | - [Polaris UI](https://polaris.shopify.com) 13 | - [Billing API](https://shopify.dev/docs/admin-api/rest/reference/billing) 14 | 15 | ## License 16 | [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://github.com/jaayperez/shopify-app-node-react/blob/master/LICENSE) 17 | 18 | This work by [Justin Perez](https://justinperez.com) is licensed under a MIT License Copyright © 2020. 19 | -------------------------------------------------------------------------------- /components/ResourceList.js: -------------------------------------------------------------------------------- 1 | import gql from 'graphql-tag'; 2 | import { Query } from 'react-apollo'; 3 | import { 4 | Card, 5 | ResourceList, 6 | Stack, 7 | TextStyle, 8 | Thumbnail, 9 | } from '@shopify/polaris'; 10 | import store from 'store-js'; 11 | import { Redirect } from '@shopify/app-bridge/actions'; 12 | import { Context } from '@shopify/app-bridge-react'; 13 | 14 | const GET_PRODUCTS_BY_ID = gql` 15 | query getProducts($ids: [ID!]!) { 16 | nodes(ids: $ids) { 17 | ... on Product { 18 | title 19 | handle 20 | descriptionHtml 21 | id 22 | images(first: 1) { 23 | edges { 24 | node { 25 | originalSrc 26 | altText 27 | } 28 | } 29 | } 30 | variants(first: 1) { 31 | edges { 32 | node { 33 | price 34 | id 35 | } 36 | } 37 | } 38 | } 39 | } 40 | } 41 | `; 42 | 43 | class ResourceListWithProducts extends React.Component { 44 | 45 | static contextType = Context; 46 | 47 | render() { 48 | const app = this.context; 49 | const redirectToProduct = () => { 50 | const redirect = Redirect.create(app); 51 | redirect.dispatch( 52 | Redirect.Action.APP, 53 | '/edit-products', 54 | ); 55 | }; 56 | 57 | const twoWeeksFromNow = new Date(Date.now() + 12096e5).toDateString(); 58 | 59 | return ( 60 | 61 | {({ data, loading, error }) => { 62 | if (loading) return
Loading…
; 63 | if (error) return
{error.message}
; 64 | console.log(data); 65 | return ( 66 | 67 | { 72 | const media = ( 73 | 85 | ); 86 | const price = item.variants.edges[0].node.price; 87 | return ( 88 | { 93 | store.set('item', item); 94 | redirectToProduct(); 95 | }} 96 | > 97 | 98 | 99 |

100 | 101 | {item.title} 102 | 103 |

104 |
105 | 106 |

${price}

107 |
108 | 109 |

Expires on {twoWeeksFromNow}

110 |
111 |
112 |
113 | ); 114 | }} 115 | /> 116 |
117 | ); 118 | }} 119 |
120 | ); 121 | } 122 | } 123 | 124 | export default ResourceListWithProducts; 125 | -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | require("dotenv").config(); 2 | const withCSS = require('@zeit/next-css'); 3 | const webpack = require('webpack'); 4 | 5 | const apiKey = JSON.stringify(process.env.SHOPIFY_API_KEY); 6 | 7 | module.exports = withCSS({ 8 | webpack: (config) => { 9 | const env = { API_KEY: apiKey }; 10 | config.plugins.push(new webpack.DefinePlugin(env)); 11 | return config; 12 | }, 13 | }); 14 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "shopify-app-node-react", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@apollo/react-common": { 8 | "version": "3.1.4", 9 | "resolved": "https://registry.npmjs.org/@apollo/react-common/-/react-common-3.1.4.tgz", 10 | "integrity": "sha512-X5Kyro73bthWSCBJUC5XYQqMnG0dLWuDZmVkzog9dynovhfiVCV4kPSdgSIkqnb++cwCzOVuQ4rDKVwo2XRzQA==", 11 | "requires": { 12 | "ts-invariant": "^0.4.4", 13 | "tslib": "^1.10.0" 14 | } 15 | }, 16 | "@apollo/react-components": { 17 | "version": "3.1.5", 18 | "resolved": "https://registry.npmjs.org/@apollo/react-components/-/react-components-3.1.5.tgz", 19 | "integrity": "sha512-c82VyUuE9VBnJB7bnX+3dmwpIPMhyjMwyoSLyQWPHxz8jK4ak30XszJtqFf4eC4hwvvLYa+Ou6X73Q8V8e2/jg==", 20 | "requires": { 21 | "@apollo/react-common": "^3.1.4", 22 | "@apollo/react-hooks": "^3.1.5", 23 | "prop-types": "^15.7.2", 24 | "ts-invariant": "^0.4.4", 25 | "tslib": "^1.10.0" 26 | } 27 | }, 28 | "@apollo/react-hoc": { 29 | "version": "3.1.5", 30 | "resolved": "https://registry.npmjs.org/@apollo/react-hoc/-/react-hoc-3.1.5.tgz", 31 | "integrity": "sha512-jlZ2pvEnRevLa54H563BU0/xrYSgWQ72GksarxUzCHQW85nmn9wQln0kLBX7Ua7SBt9WgiuYQXQVechaaCulfQ==", 32 | "requires": { 33 | "@apollo/react-common": "^3.1.4", 34 | "@apollo/react-components": "^3.1.5", 35 | "hoist-non-react-statics": "^3.3.0", 36 | "ts-invariant": "^0.4.4", 37 | "tslib": "^1.10.0" 38 | } 39 | }, 40 | "@apollo/react-hooks": { 41 | "version": "3.1.5", 42 | "resolved": "https://registry.npmjs.org/@apollo/react-hooks/-/react-hooks-3.1.5.tgz", 43 | "integrity": "sha512-y0CJ393DLxIIkksRup4nt+vSjxalbZBXnnXxYbviq/woj+zKa431zy0yT4LqyRKpFy9ahMIwxBnBwfwIoupqLQ==", 44 | "requires": { 45 | "@apollo/react-common": "^3.1.4", 46 | "@wry/equality": "^0.1.9", 47 | "ts-invariant": "^0.4.4", 48 | "tslib": "^1.10.0" 49 | } 50 | }, 51 | "@apollo/react-ssr": { 52 | "version": "3.1.5", 53 | "resolved": "https://registry.npmjs.org/@apollo/react-ssr/-/react-ssr-3.1.5.tgz", 54 | "integrity": "sha512-wuLPkKlctNn3u8EU8rlECyktpOUCeekFfb0KhIKknpGY6Lza2Qu0bThx7D9MIbVEzhKadNNrzLcpk0Y8/5UuWg==", 55 | "requires": { 56 | "@apollo/react-common": "^3.1.4", 57 | "@apollo/react-hooks": "^3.1.5", 58 | "tslib": "^1.10.0" 59 | } 60 | }, 61 | "@babel/runtime": { 62 | "version": "7.12.1", 63 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", 64 | "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", 65 | "requires": { 66 | "regenerator-runtime": "^0.13.4" 67 | } 68 | }, 69 | "@next/env": { 70 | "version": "12.1.0", 71 | "resolved": "https://registry.npmjs.org/@next/env/-/env-12.1.0.tgz", 72 | "integrity": "sha512-nrIgY6t17FQ9xxwH3jj0a6EOiQ/WDHUos35Hghtr+SWN/ntHIQ7UpuvSi0vaLzZVHQWaDupKI+liO5vANcDeTQ==" 73 | }, 74 | "@next/swc-android-arm64": { 75 | "version": "12.1.0", 76 | "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.1.0.tgz", 77 | "integrity": "sha512-/280MLdZe0W03stA69iL+v6I+J1ascrQ6FrXBlXGCsGzrfMaGr7fskMa0T5AhQIVQD4nA/46QQWxG//DYuFBcA==", 78 | "optional": true 79 | }, 80 | "@next/swc-darwin-arm64": { 81 | "version": "12.1.0", 82 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.1.0.tgz", 83 | "integrity": "sha512-R8vcXE2/iONJ1Unf5Ptqjk6LRW3bggH+8drNkkzH4FLEQkHtELhvcmJwkXcuipyQCsIakldAXhRbZmm3YN1vXg==", 84 | "optional": true 85 | }, 86 | "@next/swc-darwin-x64": { 87 | "version": "12.1.0", 88 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.1.0.tgz", 89 | "integrity": "sha512-ieAz0/J0PhmbZBB8+EA/JGdhRHBogF8BWaeqR7hwveb6SYEIJaDNQy0I+ZN8gF8hLj63bEDxJAs/cEhdnTq+ug==", 90 | "optional": true 91 | }, 92 | "@next/swc-linux-arm-gnueabihf": { 93 | "version": "12.1.0", 94 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.1.0.tgz", 95 | "integrity": "sha512-njUd9hpl6o6A5d08dC0cKAgXKCzm5fFtgGe6i0eko8IAdtAPbtHxtpre3VeSxdZvuGFh+hb0REySQP9T1ttkog==", 96 | "optional": true 97 | }, 98 | "@next/swc-linux-arm64-gnu": { 99 | "version": "12.1.0", 100 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.1.0.tgz", 101 | "integrity": "sha512-OqangJLkRxVxMhDtcb7Qn1xjzFA3s50EIxY7mljbSCLybU+sByPaWAHY4px97ieOlr2y4S0xdPKkQ3BCAwyo6Q==", 102 | "optional": true 103 | }, 104 | "@next/swc-linux-arm64-musl": { 105 | "version": "12.1.0", 106 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.1.0.tgz", 107 | "integrity": "sha512-hB8cLSt4GdmOpcwRe2UzI5UWn6HHO/vLkr5OTuNvCJ5xGDwpPXelVkYW/0+C3g5axbDW2Tym4S+MQCkkH9QfWA==", 108 | "optional": true 109 | }, 110 | "@next/swc-linux-x64-gnu": { 111 | "version": "12.1.0", 112 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.1.0.tgz", 113 | "integrity": "sha512-OKO4R/digvrVuweSw/uBM4nSdyzsBV5EwkUeeG4KVpkIZEe64ZwRpnFB65bC6hGwxIBnTv5NMSnJ+0K/WmG78A==", 114 | "optional": true 115 | }, 116 | "@next/swc-linux-x64-musl": { 117 | "version": "12.1.0", 118 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.1.0.tgz", 119 | "integrity": "sha512-JohhgAHZvOD3rQY7tlp7NlmvtvYHBYgY0x5ZCecUT6eCCcl9lv6iV3nfu82ErkxNk1H893fqH0FUpznZ/H3pSw==", 120 | "optional": true 121 | }, 122 | "@next/swc-win32-arm64-msvc": { 123 | "version": "12.1.0", 124 | "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.1.0.tgz", 125 | "integrity": "sha512-T/3gIE6QEfKIJ4dmJk75v9hhNiYZhQYAoYm4iVo1TgcsuaKLFa+zMPh4056AHiG6n9tn2UQ1CFE8EoybEsqsSw==", 126 | "optional": true 127 | }, 128 | "@next/swc-win32-ia32-msvc": { 129 | "version": "12.1.0", 130 | "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.1.0.tgz", 131 | "integrity": "sha512-iwnKgHJdqhIW19H9PRPM9j55V6RdcOo6rX+5imx832BCWzkDbyomWnlzBfr6ByUYfhohb8QuH4hSGEikpPqI0Q==", 132 | "optional": true 133 | }, 134 | "@next/swc-win32-x64-msvc": { 135 | "version": "12.1.0", 136 | "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.1.0.tgz", 137 | "integrity": "sha512-aBvcbMwuanDH4EMrL2TthNJy+4nP59Bimn8egqv6GHMVj0a44cU6Au4PjOhLNqEh9l+IpRGBqMTzec94UdC5xg==", 138 | "optional": true 139 | }, 140 | "@shopify/app-bridge": { 141 | "version": "1.21.4", 142 | "resolved": "https://registry.npmjs.org/@shopify/app-bridge/-/app-bridge-1.21.4.tgz", 143 | "integrity": "sha512-F6ypuKZA2/B4wsREVaSUGc7x7Ba4cbZLDubG21SX1ACVMORNzg9aEafTEgCPYHD4ki7FM2ShHNqZ4l1FOOjpzg==" 144 | }, 145 | "@shopify/app-bridge-react": { 146 | "version": "1.28.0", 147 | "resolved": "https://registry.npmjs.org/@shopify/app-bridge-react/-/app-bridge-react-1.28.0.tgz", 148 | "integrity": "sha512-p/Gr1n9+IgECWcK6m5AVrfzZ2BoEouLE/Cc2UYr53iNTgDM2mug9t5nK65znk+5QoL4uGo9DzVqW2ixg92dS8Q==", 149 | "requires": { 150 | "@shopify/app-bridge": "^1.28.0" 151 | }, 152 | "dependencies": { 153 | "@shopify/app-bridge": { 154 | "version": "1.28.0", 155 | "resolved": "https://registry.npmjs.org/@shopify/app-bridge/-/app-bridge-1.28.0.tgz", 156 | "integrity": "sha512-EAvOAddypfRVSaHO5un9jRiJUcLGfDxdd8s3FAa1yTXVrLD/3RAFEjwYFePuQsJxt9ieaUL17naE3iHK1HywgA==" 157 | } 158 | } 159 | }, 160 | "@shopify/koa-shopify-auth": { 161 | "version": "3.1.63", 162 | "resolved": "https://registry.npmjs.org/@shopify/koa-shopify-auth/-/koa-shopify-auth-3.1.63.tgz", 163 | "integrity": "sha512-+QBeDspAZVyP9qQRr4Yg42eeaVhQInV467eev7+qnhw4TY2vwHtpqGqWNvoDQSXfXYMEQyW8MJ3FlYgUhcdKtA==", 164 | "requires": { 165 | "@shopify/network": "^1.4.7", 166 | "koa-compose": ">=3.0.0 <4.0.0", 167 | "nonce": "^1.0.4", 168 | "safe-compare": "^1.1.2", 169 | "tslib": "^1.9.3" 170 | } 171 | }, 172 | "@shopify/koa-shopify-graphql-proxy": { 173 | "version": "4.0.4", 174 | "resolved": "https://registry.npmjs.org/@shopify/koa-shopify-graphql-proxy/-/koa-shopify-graphql-proxy-4.0.4.tgz", 175 | "integrity": "sha512-SgrtFgnH92fY+4u8aYJWLDQULaj6L+o2H849Fd1WDGaP2VCF8JAFOebpWEwmKlTpf78tfbSBcSIk4K2f0vBMlw==", 176 | "requires": { 177 | "@types/koa": "^2.0.0", 178 | "koa-better-http-proxy": "^0.2.4", 179 | "tslib": "^1.14.1" 180 | }, 181 | "dependencies": { 182 | "tslib": { 183 | "version": "1.14.1", 184 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 185 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 186 | } 187 | } 188 | }, 189 | "@shopify/koa-shopify-webhooks": { 190 | "version": "2.4.2", 191 | "resolved": "https://registry.npmjs.org/@shopify/koa-shopify-webhooks/-/koa-shopify-webhooks-2.4.2.tgz", 192 | "integrity": "sha512-2PtY3o2oZeogh8KXrG6Lq9BYVf0dgM4NUGGVpfR9wPvHVgLyVXits5DuMBpSgs1vEnruPCbQXFznqtbmmXpzlA==", 193 | "requires": { 194 | "@shopify/network": "^1.4.7", 195 | "@types/koa": "^2.0.0", 196 | "koa-bodyparser": "^4.2.1", 197 | "koa-compose": ">=3.0.0 <4.0.0", 198 | "koa-mount": "^4.0.0", 199 | "safe-compare": "^1.1.3" 200 | } 201 | }, 202 | "@shopify/network": { 203 | "version": "1.4.7", 204 | "resolved": "https://registry.npmjs.org/@shopify/network/-/network-1.4.7.tgz", 205 | "integrity": "sha512-BT8f5Z+0KudbGW1XdBsTQXqNu3dU6FaEMftDjY1dBsYdDegSVBJguoj9YLLfu2qJ3zTVMwlSrfefyYjH6pp7UA==", 206 | "requires": { 207 | "tslib": "^1.9.3" 208 | } 209 | }, 210 | "@shopify/polaris": { 211 | "version": "5.10.1", 212 | "resolved": "https://registry.npmjs.org/@shopify/polaris/-/polaris-5.10.1.tgz", 213 | "integrity": "sha512-p1iwNU/Q0kqE1Rj7Cnv4dwn+9oMq3QKXYjWszJ7qJF560Wsh8H4WTfGQKC6+IsmCEu4GDRE4VbkBxW9L8pGViw==", 214 | "requires": { 215 | "@shopify/polaris-icons": "^4.1.0", 216 | "@shopify/polaris-tokens": "^2.15.0", 217 | "@types/react": "^16.9.12", 218 | "@types/react-dom": "^16.9.4", 219 | "@types/react-transition-group": "^4.4.0", 220 | "lodash": "^4.17.4", 221 | "react-transition-group": "^4.4.1" 222 | } 223 | }, 224 | "@shopify/polaris-icons": { 225 | "version": "4.1.0", 226 | "resolved": "https://registry.npmjs.org/@shopify/polaris-icons/-/polaris-icons-4.1.0.tgz", 227 | "integrity": "sha512-U5ODhOJtfYHJskYUknceIjpF+EhHdMQJ54HSWsjuHAapCWbmA8ROVonAnDEM+cWeEVinpPZzQd2nE/DVJUmKkw==" 228 | }, 229 | "@shopify/polaris-tokens": { 230 | "version": "2.16.0", 231 | "resolved": "https://registry.npmjs.org/@shopify/polaris-tokens/-/polaris-tokens-2.16.0.tgz", 232 | "integrity": "sha512-uhwu//NpS9OEBIVvX04TMHwsePpRb+KmvDvTUDYpqafK0PqBvldWjyrDEs+/lZCcCBNQMZhnwX27DgQkywkW0Q==", 233 | "requires": { 234 | "hsluv": "^0.1.0", 235 | "tslib": "^1.10.0" 236 | } 237 | }, 238 | "@types/accepts": { 239 | "version": "1.3.5", 240 | "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", 241 | "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==", 242 | "requires": { 243 | "@types/node": "*" 244 | } 245 | }, 246 | "@types/body-parser": { 247 | "version": "1.19.0", 248 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", 249 | "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", 250 | "requires": { 251 | "@types/connect": "*", 252 | "@types/node": "*" 253 | } 254 | }, 255 | "@types/connect": { 256 | "version": "3.4.33", 257 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", 258 | "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", 259 | "requires": { 260 | "@types/node": "*" 261 | } 262 | }, 263 | "@types/content-disposition": { 264 | "version": "0.5.3", 265 | "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.3.tgz", 266 | "integrity": "sha512-P1bffQfhD3O4LW0ioENXUhZ9OIa0Zn+P7M+pWgkCKaT53wVLSq0mrKksCID/FGHpFhRSxRGhgrQmfhRuzwtKdg==" 267 | }, 268 | "@types/cookies": { 269 | "version": "0.7.4", 270 | "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.4.tgz", 271 | "integrity": "sha512-oTGtMzZZAVuEjTwCjIh8T8FrC8n/uwy+PG0yTvQcdZ7etoel7C7/3MSd7qrukENTgQtotG7gvBlBojuVs7X5rw==", 272 | "requires": { 273 | "@types/connect": "*", 274 | "@types/express": "*", 275 | "@types/keygrip": "*", 276 | "@types/node": "*" 277 | } 278 | }, 279 | "@types/express": { 280 | "version": "4.17.6", 281 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.6.tgz", 282 | "integrity": "sha512-n/mr9tZI83kd4azlPG5y997C/M4DNABK9yErhFM6hKdym4kkmd9j0vtsJyjFIwfRBxtrxZtAfGZCNRIBMFLK5w==", 283 | "requires": { 284 | "@types/body-parser": "*", 285 | "@types/express-serve-static-core": "*", 286 | "@types/qs": "*", 287 | "@types/serve-static": "*" 288 | } 289 | }, 290 | "@types/express-serve-static-core": { 291 | "version": "4.17.7", 292 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.7.tgz", 293 | "integrity": "sha512-EMgTj/DF9qpgLXyc+Btimg+XoH7A2liE8uKul8qSmMTHCeNYzydDKFdsJskDvw42UsesCnhO63dO0Grbj8J4Dw==", 294 | "requires": { 295 | "@types/node": "*", 296 | "@types/qs": "*", 297 | "@types/range-parser": "*" 298 | } 299 | }, 300 | "@types/http-assert": { 301 | "version": "1.5.1", 302 | "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.1.tgz", 303 | "integrity": "sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ==" 304 | }, 305 | "@types/keygrip": { 306 | "version": "1.0.2", 307 | "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz", 308 | "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==" 309 | }, 310 | "@types/koa": { 311 | "version": "2.11.3", 312 | "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.11.3.tgz", 313 | "integrity": "sha512-ABxVkrNWa4O/Jp24EYI/hRNqEVRlhB9g09p48neQp4m3xL1TJtdWk2NyNQSMCU45ejeELMQZBYyfstyVvO2H3Q==", 314 | "requires": { 315 | "@types/accepts": "*", 316 | "@types/content-disposition": "*", 317 | "@types/cookies": "*", 318 | "@types/http-assert": "*", 319 | "@types/keygrip": "*", 320 | "@types/koa-compose": "*", 321 | "@types/node": "*" 322 | } 323 | }, 324 | "@types/koa-compose": { 325 | "version": "3.2.5", 326 | "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz", 327 | "integrity": "sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==", 328 | "requires": { 329 | "@types/koa": "*" 330 | } 331 | }, 332 | "@types/mime": { 333 | "version": "2.0.2", 334 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.2.tgz", 335 | "integrity": "sha512-4kPlzbljFcsttWEq6aBW0OZe6BDajAmyvr2xknBG92tejQnvdGtT9+kXSZ580DqpxY9qG2xeQVF9Dq0ymUTo5Q==" 336 | }, 337 | "@types/node": { 338 | "version": "14.0.1", 339 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.1.tgz", 340 | "integrity": "sha512-FAYBGwC+W6F9+huFIDtn43cpy7+SzG+atzRiTfdp3inUKL2hXnd4rG8hylJLIh4+hqrQy1P17kvJByE/z825hA==" 341 | }, 342 | "@types/prop-types": { 343 | "version": "15.7.3", 344 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", 345 | "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" 346 | }, 347 | "@types/qs": { 348 | "version": "6.9.2", 349 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.2.tgz", 350 | "integrity": "sha512-a9bDi4Z3zCZf4Lv1X/vwnvbbDYSNz59h3i3KdyuYYN+YrLjSeJD0dnphdULDfySvUv6Exy/O0K6wX/kQpnPQ+A==" 351 | }, 352 | "@types/range-parser": { 353 | "version": "1.2.3", 354 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", 355 | "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" 356 | }, 357 | "@types/react": { 358 | "version": "16.14.2", 359 | "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.2.tgz", 360 | "integrity": "sha512-BzzcAlyDxXl2nANlabtT4thtvbbnhee8hMmH/CcJrISDBVcJS1iOsP1f0OAgSdGE0MsY9tqcrb9YoZcOFv9dbQ==", 361 | "requires": { 362 | "@types/prop-types": "*", 363 | "csstype": "^3.0.2" 364 | } 365 | }, 366 | "@types/react-dom": { 367 | "version": "16.9.10", 368 | "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.10.tgz", 369 | "integrity": "sha512-ItatOrnXDMAYpv6G8UCk2VhbYVTjZT9aorLtA/OzDN9XJ2GKcfam68jutoAcILdRjsRUO8qb7AmyObF77Q8QFw==", 370 | "requires": { 371 | "@types/react": "^16" 372 | } 373 | }, 374 | "@types/react-transition-group": { 375 | "version": "4.4.0", 376 | "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.0.tgz", 377 | "integrity": "sha512-/QfLHGpu+2fQOqQaXh8MG9q03bFENooTb/it4jr5kKaZlDQfWvjqWZg48AwzPVMBHlRuTRAY7hRHCEOXz5kV6w==", 378 | "requires": { 379 | "@types/react": "*" 380 | } 381 | }, 382 | "@types/serve-static": { 383 | "version": "1.13.3", 384 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.3.tgz", 385 | "integrity": "sha512-oprSwp094zOglVrXdlo/4bAHtKTAxX6VT8FOZlBKrmyLbNvE1zxZyJ6yikMVtHIvwP45+ZQGJn+FdXGKTozq0g==", 386 | "requires": { 387 | "@types/express-serve-static-core": "*", 388 | "@types/mime": "*" 389 | } 390 | }, 391 | "@types/zen-observable": { 392 | "version": "0.8.0", 393 | "resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.0.tgz", 394 | "integrity": "sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg==" 395 | }, 396 | "@wry/context": { 397 | "version": "0.4.4", 398 | "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.4.4.tgz", 399 | "integrity": "sha512-LrKVLove/zw6h2Md/KZyWxIkFM6AoyKp71OqpH9Hiip1csjPVoD3tPxlbQUNxEnHENks3UGgNpSBCAfq9KWuag==", 400 | "requires": { 401 | "@types/node": ">=6", 402 | "tslib": "^1.9.3" 403 | } 404 | }, 405 | "@wry/equality": { 406 | "version": "0.1.11", 407 | "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.1.11.tgz", 408 | "integrity": "sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA==", 409 | "requires": { 410 | "tslib": "^1.9.3" 411 | } 412 | }, 413 | "@zeit/next-css": { 414 | "version": "1.0.1", 415 | "resolved": "https://registry.npmjs.org/@zeit/next-css/-/next-css-1.0.1.tgz", 416 | "integrity": "sha512-yfHPRy/ne/5SddVClsoy+fpU7e0Cs1gkWA67/wm2uIu+9rznF45yQLxHEt5dPGF3h6IiIh7ZtIgA8VV8YKq87A==", 417 | "requires": { 418 | "css-loader": "1.0.0", 419 | "extracted-loader": "1.0.4", 420 | "find-up": "2.1.0", 421 | "ignore-loader": "0.1.2", 422 | "mini-css-extract-plugin": "0.4.3", 423 | "postcss-loader": "3.0.0" 424 | }, 425 | "dependencies": { 426 | "css-loader": { 427 | "version": "1.0.0", 428 | "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.0.tgz", 429 | "integrity": "sha512-tMXlTYf3mIMt3b0dDCOQFJiVvxbocJ5Ho577WiGPYPZcqVEO218L2iU22pDXzkTZCLDE+9AmGSUkWxeh/nZReA==", 430 | "requires": { 431 | "babel-code-frame": "^6.26.0", 432 | "css-selector-tokenizer": "^0.7.0", 433 | "icss-utils": "^2.1.0", 434 | "loader-utils": "^1.0.2", 435 | "lodash.camelcase": "^4.3.0", 436 | "postcss": "^6.0.23", 437 | "postcss-modules-extract-imports": "^1.2.0", 438 | "postcss-modules-local-by-default": "^1.2.0", 439 | "postcss-modules-scope": "^1.1.0", 440 | "postcss-modules-values": "^1.3.0", 441 | "postcss-value-parser": "^3.3.0", 442 | "source-list-map": "^2.0.0" 443 | } 444 | }, 445 | "find-up": { 446 | "version": "2.1.0", 447 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 448 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 449 | "requires": { 450 | "locate-path": "^2.0.0" 451 | } 452 | }, 453 | "icss-utils": { 454 | "version": "2.1.0", 455 | "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", 456 | "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", 457 | "requires": { 458 | "postcss": "^6.0.1" 459 | } 460 | }, 461 | "mini-css-extract-plugin": { 462 | "version": "0.4.3", 463 | "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.3.tgz", 464 | "integrity": "sha512-Mxs0nxzF1kxPv4TRi2NimewgXlJqh0rGE30vviCU2WHrpbta6wklnUV9dr9FUtoAHmB3p3LeXEC+ZjgHvB0Dzg==", 465 | "requires": { 466 | "loader-utils": "^1.1.0", 467 | "schema-utils": "^1.0.0", 468 | "webpack-sources": "^1.1.0" 469 | } 470 | }, 471 | "postcss": { 472 | "version": "6.0.23", 473 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", 474 | "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", 475 | "requires": { 476 | "chalk": "^2.4.1", 477 | "source-map": "^0.6.1", 478 | "supports-color": "^5.4.0" 479 | } 480 | }, 481 | "postcss-modules-extract-imports": { 482 | "version": "1.2.1", 483 | "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", 484 | "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", 485 | "requires": { 486 | "postcss": "^6.0.1" 487 | } 488 | }, 489 | "postcss-modules-local-by-default": { 490 | "version": "1.2.0", 491 | "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", 492 | "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", 493 | "requires": { 494 | "css-selector-tokenizer": "^0.7.0", 495 | "postcss": "^6.0.1" 496 | } 497 | }, 498 | "postcss-modules-scope": { 499 | "version": "1.1.0", 500 | "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", 501 | "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", 502 | "requires": { 503 | "css-selector-tokenizer": "^0.7.0", 504 | "postcss": "^6.0.1" 505 | } 506 | }, 507 | "postcss-modules-values": { 508 | "version": "1.3.0", 509 | "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", 510 | "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", 511 | "requires": { 512 | "icss-replace-symbols": "^1.1.0", 513 | "postcss": "^6.0.1" 514 | } 515 | }, 516 | "postcss-value-parser": { 517 | "version": "3.3.1", 518 | "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", 519 | "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" 520 | }, 521 | "schema-utils": { 522 | "version": "1.0.0", 523 | "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", 524 | "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", 525 | "requires": { 526 | "ajv": "^6.1.0", 527 | "ajv-errors": "^1.0.0", 528 | "ajv-keywords": "^3.1.0" 529 | } 530 | } 531 | } 532 | }, 533 | "accepts": { 534 | "version": "1.3.7", 535 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 536 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 537 | "requires": { 538 | "mime-types": "~2.1.24", 539 | "negotiator": "0.6.2" 540 | } 541 | }, 542 | "ajv": { 543 | "version": "6.12.6", 544 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 545 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 546 | "requires": { 547 | "fast-deep-equal": "^3.1.1", 548 | "fast-json-stable-stringify": "^2.0.0", 549 | "json-schema-traverse": "^0.4.1", 550 | "uri-js": "^4.2.2" 551 | } 552 | }, 553 | "ajv-errors": { 554 | "version": "1.0.1", 555 | "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", 556 | "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" 557 | }, 558 | "ajv-keywords": { 559 | "version": "3.4.1", 560 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", 561 | "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" 562 | }, 563 | "ansi-regex": { 564 | "version": "2.1.1", 565 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 566 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 567 | }, 568 | "ansi-styles": { 569 | "version": "3.2.1", 570 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 571 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 572 | "requires": { 573 | "color-convert": "^1.9.0" 574 | } 575 | }, 576 | "any-promise": { 577 | "version": "1.3.0", 578 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 579 | "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" 580 | }, 581 | "apollo-boost": { 582 | "version": "0.4.9", 583 | "resolved": "https://registry.npmjs.org/apollo-boost/-/apollo-boost-0.4.9.tgz", 584 | "integrity": "sha512-05y5BKcDaa8w47f8d81UVwKqrAjn8uKLv6QM9fNdldoNzQ+rnOHgFlnrySUZRz9QIT3vPftQkEz2UEASp1Mi5g==", 585 | "requires": { 586 | "apollo-cache": "^1.3.5", 587 | "apollo-cache-inmemory": "^1.6.6", 588 | "apollo-client": "^2.6.10", 589 | "apollo-link": "^1.0.6", 590 | "apollo-link-error": "^1.0.3", 591 | "apollo-link-http": "^1.3.1", 592 | "graphql-tag": "^2.4.2", 593 | "ts-invariant": "^0.4.0", 594 | "tslib": "^1.10.0" 595 | } 596 | }, 597 | "apollo-cache": { 598 | "version": "1.3.5", 599 | "resolved": "https://registry.npmjs.org/apollo-cache/-/apollo-cache-1.3.5.tgz", 600 | "integrity": "sha512-1XoDy8kJnyWY/i/+gLTEbYLnoiVtS8y7ikBr/IfmML4Qb+CM7dEEbIUOjnY716WqmZ/UpXIxTfJsY7rMcqiCXA==", 601 | "requires": { 602 | "apollo-utilities": "^1.3.4", 603 | "tslib": "^1.10.0" 604 | } 605 | }, 606 | "apollo-cache-inmemory": { 607 | "version": "1.6.6", 608 | "resolved": "https://registry.npmjs.org/apollo-cache-inmemory/-/apollo-cache-inmemory-1.6.6.tgz", 609 | "integrity": "sha512-L8pToTW/+Xru2FFAhkZ1OA9q4V4nuvfoPecBM34DecAugUZEBhI2Hmpgnzq2hTKZ60LAMrlqiASm0aqAY6F8/A==", 610 | "requires": { 611 | "apollo-cache": "^1.3.5", 612 | "apollo-utilities": "^1.3.4", 613 | "optimism": "^0.10.0", 614 | "ts-invariant": "^0.4.0", 615 | "tslib": "^1.10.0" 616 | } 617 | }, 618 | "apollo-client": { 619 | "version": "2.6.10", 620 | "resolved": "https://registry.npmjs.org/apollo-client/-/apollo-client-2.6.10.tgz", 621 | "integrity": "sha512-jiPlMTN6/5CjZpJOkGeUV0mb4zxx33uXWdj/xQCfAMkuNAC3HN7CvYDyMHHEzmcQ5GV12LszWoQ/VlxET24CtA==", 622 | "requires": { 623 | "@types/zen-observable": "^0.8.0", 624 | "apollo-cache": "1.3.5", 625 | "apollo-link": "^1.0.0", 626 | "apollo-utilities": "1.3.4", 627 | "symbol-observable": "^1.0.2", 628 | "ts-invariant": "^0.4.0", 629 | "tslib": "^1.10.0", 630 | "zen-observable": "^0.8.0" 631 | } 632 | }, 633 | "apollo-link": { 634 | "version": "1.2.14", 635 | "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.14.tgz", 636 | "integrity": "sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg==", 637 | "requires": { 638 | "apollo-utilities": "^1.3.0", 639 | "ts-invariant": "^0.4.0", 640 | "tslib": "^1.9.3", 641 | "zen-observable-ts": "^0.8.21" 642 | } 643 | }, 644 | "apollo-link-error": { 645 | "version": "1.1.13", 646 | "resolved": "https://registry.npmjs.org/apollo-link-error/-/apollo-link-error-1.1.13.tgz", 647 | "integrity": "sha512-jAZOOahJU6bwSqb2ZyskEK1XdgUY9nkmeclCrW7Gddh1uasHVqmoYc4CKdb0/H0Y1J9lvaXKle2Wsw/Zx1AyUg==", 648 | "requires": { 649 | "apollo-link": "^1.2.14", 650 | "apollo-link-http-common": "^0.2.16", 651 | "tslib": "^1.9.3" 652 | } 653 | }, 654 | "apollo-link-http": { 655 | "version": "1.5.17", 656 | "resolved": "https://registry.npmjs.org/apollo-link-http/-/apollo-link-http-1.5.17.tgz", 657 | "integrity": "sha512-uWcqAotbwDEU/9+Dm9e1/clO7hTB2kQ/94JYcGouBVLjoKmTeJTUPQKcJGpPwUjZcSqgYicbFqQSoJIW0yrFvg==", 658 | "requires": { 659 | "apollo-link": "^1.2.14", 660 | "apollo-link-http-common": "^0.2.16", 661 | "tslib": "^1.9.3" 662 | } 663 | }, 664 | "apollo-link-http-common": { 665 | "version": "0.2.16", 666 | "resolved": "https://registry.npmjs.org/apollo-link-http-common/-/apollo-link-http-common-0.2.16.tgz", 667 | "integrity": "sha512-2tIhOIrnaF4UbQHf7kjeQA/EmSorB7+HyJIIrUjJOKBgnXwuexi8aMecRlqTIDWcyVXCeqLhUnztMa6bOH/jTg==", 668 | "requires": { 669 | "apollo-link": "^1.2.14", 670 | "ts-invariant": "^0.4.0", 671 | "tslib": "^1.9.3" 672 | } 673 | }, 674 | "apollo-utilities": { 675 | "version": "1.3.4", 676 | "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.4.tgz", 677 | "integrity": "sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig==", 678 | "requires": { 679 | "@wry/equality": "^0.1.2", 680 | "fast-json-stable-stringify": "^2.0.0", 681 | "ts-invariant": "^0.4.0", 682 | "tslib": "^1.10.0" 683 | } 684 | }, 685 | "argparse": { 686 | "version": "1.0.10", 687 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 688 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 689 | "requires": { 690 | "sprintf-js": "~1.0.2" 691 | } 692 | }, 693 | "async": { 694 | "version": "1.0.0", 695 | "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", 696 | "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=" 697 | }, 698 | "babel-code-frame": { 699 | "version": "6.26.0", 700 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 701 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", 702 | "requires": { 703 | "chalk": "^1.1.3", 704 | "esutils": "^2.0.2", 705 | "js-tokens": "^3.0.2" 706 | }, 707 | "dependencies": { 708 | "ansi-styles": { 709 | "version": "2.2.1", 710 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 711 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" 712 | }, 713 | "chalk": { 714 | "version": "1.1.3", 715 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 716 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 717 | "requires": { 718 | "ansi-styles": "^2.2.1", 719 | "escape-string-regexp": "^1.0.2", 720 | "has-ansi": "^2.0.0", 721 | "strip-ansi": "^3.0.0", 722 | "supports-color": "^2.0.0" 723 | } 724 | }, 725 | "escape-string-regexp": { 726 | "version": "1.0.5", 727 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 728 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 729 | }, 730 | "js-tokens": { 731 | "version": "3.0.2", 732 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 733 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" 734 | }, 735 | "strip-ansi": { 736 | "version": "3.0.1", 737 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 738 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 739 | "requires": { 740 | "ansi-regex": "^2.0.0" 741 | } 742 | }, 743 | "supports-color": { 744 | "version": "2.0.0", 745 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 746 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" 747 | } 748 | } 749 | }, 750 | "base64-js": { 751 | "version": "1.3.1", 752 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", 753 | "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" 754 | }, 755 | "big.js": { 756 | "version": "5.2.2", 757 | "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", 758 | "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" 759 | }, 760 | "buffer": { 761 | "version": "5.6.0", 762 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", 763 | "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", 764 | "requires": { 765 | "base64-js": "^1.0.2", 766 | "ieee754": "^1.1.4" 767 | } 768 | }, 769 | "buffer-alloc": { 770 | "version": "1.2.0", 771 | "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", 772 | "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", 773 | "requires": { 774 | "buffer-alloc-unsafe": "^1.1.0", 775 | "buffer-fill": "^1.0.0" 776 | } 777 | }, 778 | "buffer-alloc-unsafe": { 779 | "version": "1.1.0", 780 | "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", 781 | "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" 782 | }, 783 | "buffer-fill": { 784 | "version": "1.0.0", 785 | "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", 786 | "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" 787 | }, 788 | "bytes": { 789 | "version": "3.1.0", 790 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 791 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 792 | }, 793 | "cache-content-type": { 794 | "version": "1.0.1", 795 | "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", 796 | "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", 797 | "requires": { 798 | "mime-types": "^2.1.18", 799 | "ylru": "^1.2.0" 800 | } 801 | }, 802 | "caller-callsite": { 803 | "version": "2.0.0", 804 | "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", 805 | "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", 806 | "requires": { 807 | "callsites": "^2.0.0" 808 | } 809 | }, 810 | "caller-path": { 811 | "version": "2.0.0", 812 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", 813 | "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", 814 | "requires": { 815 | "caller-callsite": "^2.0.0" 816 | } 817 | }, 818 | "callsites": { 819 | "version": "2.0.0", 820 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", 821 | "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" 822 | }, 823 | "caniuse-lite": { 824 | "version": "1.0.30001342", 825 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001342.tgz", 826 | "integrity": "sha512-bn6sOCu7L7jcbBbyNhLg0qzXdJ/PMbybZTH/BA6Roet9wxYRm6Tr9D0s0uhLkOZ6MSG+QU6txUgdpr3MXIVqjA==" 827 | }, 828 | "chalk": { 829 | "version": "2.4.2", 830 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 831 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 832 | "requires": { 833 | "ansi-styles": "^3.2.1", 834 | "escape-string-regexp": "^1.0.5", 835 | "supports-color": "^5.3.0" 836 | }, 837 | "dependencies": { 838 | "escape-string-regexp": { 839 | "version": "1.0.5", 840 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 841 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 842 | } 843 | } 844 | }, 845 | "co": { 846 | "version": "4.6.0", 847 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 848 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" 849 | }, 850 | "co-body": { 851 | "version": "6.0.0", 852 | "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.0.0.tgz", 853 | "integrity": "sha512-9ZIcixguuuKIptnY8yemEOuhb71L/lLf+Rl5JfJEUiDNJk0e02MBt7BPxR2GEh5mw8dPthQYR4jPI/BnS1MQgw==", 854 | "requires": { 855 | "inflation": "^2.0.0", 856 | "qs": "^6.5.2", 857 | "raw-body": "^2.3.3", 858 | "type-is": "^1.6.16" 859 | } 860 | }, 861 | "color-convert": { 862 | "version": "1.9.3", 863 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 864 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 865 | "requires": { 866 | "color-name": "1.1.3" 867 | } 868 | }, 869 | "color-name": { 870 | "version": "1.1.3", 871 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 872 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 873 | }, 874 | "colors": { 875 | "version": "1.0.3", 876 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", 877 | "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" 878 | }, 879 | "content-disposition": { 880 | "version": "0.5.3", 881 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 882 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 883 | "requires": { 884 | "safe-buffer": "5.1.2" 885 | } 886 | }, 887 | "content-type": { 888 | "version": "1.0.4", 889 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 890 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 891 | }, 892 | "cookies": { 893 | "version": "0.8.0", 894 | "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", 895 | "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", 896 | "requires": { 897 | "depd": "~2.0.0", 898 | "keygrip": "~1.1.0" 899 | }, 900 | "dependencies": { 901 | "depd": { 902 | "version": "2.0.0", 903 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 904 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 905 | } 906 | } 907 | }, 908 | "copy-to": { 909 | "version": "2.0.1", 910 | "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", 911 | "integrity": "sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU=" 912 | }, 913 | "core-util-is": { 914 | "version": "1.0.2", 915 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 916 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 917 | }, 918 | "cosmiconfig": { 919 | "version": "5.2.1", 920 | "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", 921 | "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", 922 | "requires": { 923 | "import-fresh": "^2.0.0", 924 | "is-directory": "^0.3.1", 925 | "js-yaml": "^3.13.1", 926 | "parse-json": "^4.0.0" 927 | }, 928 | "dependencies": { 929 | "parse-json": { 930 | "version": "4.0.0", 931 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", 932 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", 933 | "requires": { 934 | "error-ex": "^1.3.1", 935 | "json-parse-better-errors": "^1.0.1" 936 | } 937 | } 938 | } 939 | }, 940 | "crc": { 941 | "version": "3.8.0", 942 | "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", 943 | "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", 944 | "requires": { 945 | "buffer": "^5.1.0" 946 | } 947 | }, 948 | "css-selector-tokenizer": { 949 | "version": "0.7.2", 950 | "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz", 951 | "integrity": "sha512-yj856NGuAymN6r8bn8/Jl46pR+OC3eEvAhfGYDUe7YPtTPAYrSSw4oAniZ9Y8T5B92hjhwTBLUen0/vKPxf6pw==", 952 | "requires": { 953 | "cssesc": "^3.0.0", 954 | "fastparse": "^1.1.2", 955 | "regexpu-core": "^4.6.0" 956 | } 957 | }, 958 | "cssesc": { 959 | "version": "3.0.0", 960 | "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", 961 | "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" 962 | }, 963 | "csstype": { 964 | "version": "3.0.5", 965 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.5.tgz", 966 | "integrity": "sha512-uVDi8LpBUKQj6sdxNaTetL6FpeCqTjOvAQuQUa/qAqq8oOd4ivkbhgnqayl0dnPal8Tb/yB1tF+gOvCBiicaiQ==" 967 | }, 968 | "cycle": { 969 | "version": "1.0.3", 970 | "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", 971 | "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=" 972 | }, 973 | "debug": { 974 | "version": "4.1.1", 975 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 976 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 977 | "requires": { 978 | "ms": "^2.1.1" 979 | } 980 | }, 981 | "deep-equal": { 982 | "version": "1.0.1", 983 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 984 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" 985 | }, 986 | "delegates": { 987 | "version": "1.0.0", 988 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 989 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" 990 | }, 991 | "depd": { 992 | "version": "1.1.2", 993 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 994 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 995 | }, 996 | "destroy": { 997 | "version": "1.0.4", 998 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 999 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 1000 | }, 1001 | "dom-helpers": { 1002 | "version": "5.2.0", 1003 | "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.0.tgz", 1004 | "integrity": "sha512-Ru5o9+V8CpunKnz5LGgWXkmrH/20cGKwcHwS4m73zIvs54CN9epEmT/HLqFJW3kXpakAFkEdzgy1hzlJe3E4OQ==", 1005 | "requires": { 1006 | "@babel/runtime": "^7.8.7", 1007 | "csstype": "^3.0.2" 1008 | } 1009 | }, 1010 | "dotenv": { 1011 | "version": "8.2.0", 1012 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", 1013 | "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" 1014 | }, 1015 | "ee-first": { 1016 | "version": "1.1.1", 1017 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 1018 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 1019 | }, 1020 | "emojis-list": { 1021 | "version": "2.1.0", 1022 | "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", 1023 | "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" 1024 | }, 1025 | "encodeurl": { 1026 | "version": "1.0.2", 1027 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 1028 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 1029 | }, 1030 | "error-ex": { 1031 | "version": "1.3.2", 1032 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 1033 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 1034 | "requires": { 1035 | "is-arrayish": "^0.2.1" 1036 | } 1037 | }, 1038 | "es6-promise": { 1039 | "version": "3.3.1", 1040 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", 1041 | "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=" 1042 | }, 1043 | "escape-html": { 1044 | "version": "1.0.3", 1045 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 1046 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 1047 | }, 1048 | "esprima": { 1049 | "version": "4.0.1", 1050 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 1051 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" 1052 | }, 1053 | "esutils": { 1054 | "version": "2.0.3", 1055 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1056 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" 1057 | }, 1058 | "extracted-loader": { 1059 | "version": "1.0.4", 1060 | "resolved": "https://registry.npmjs.org/extracted-loader/-/extracted-loader-1.0.4.tgz", 1061 | "integrity": "sha512-G8A0hT/WCWIjesZm7BwbWdST5dQ08GNnCpTrJT/k/FYzuiJwlV1gyWjnuoizOzAR4jpEYXG2J++JyEKN/EB26Q==" 1062 | }, 1063 | "eyes": { 1064 | "version": "0.1.8", 1065 | "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", 1066 | "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" 1067 | }, 1068 | "fast-deep-equal": { 1069 | "version": "3.1.1", 1070 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", 1071 | "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" 1072 | }, 1073 | "fast-json-stable-stringify": { 1074 | "version": "2.1.0", 1075 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1076 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 1077 | }, 1078 | "fastparse": { 1079 | "version": "1.1.2", 1080 | "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", 1081 | "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" 1082 | }, 1083 | "fresh": { 1084 | "version": "0.5.2", 1085 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1086 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 1087 | }, 1088 | "graphql": { 1089 | "version": "15.4.0", 1090 | "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.4.0.tgz", 1091 | "integrity": "sha512-EB3zgGchcabbsU9cFe1j+yxdzKQKAbGUWRb13DsrsMN1yyfmmIq+2+L5MqVWcDCE4V89R5AyUOi7sMOGxdsYtA==" 1092 | }, 1093 | "graphql-tag": { 1094 | "version": "2.10.3", 1095 | "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.10.3.tgz", 1096 | "integrity": "sha512-4FOv3ZKfA4WdOKJeHdz6B3F/vxBLSgmBcGeAFPf4n1F64ltJUvOOerNj0rsJxONQGdhUMynQIvd6LzB+1J5oKA==" 1097 | }, 1098 | "has-ansi": { 1099 | "version": "2.0.0", 1100 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 1101 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 1102 | "requires": { 1103 | "ansi-regex": "^2.0.0" 1104 | } 1105 | }, 1106 | "has-flag": { 1107 | "version": "3.0.0", 1108 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1109 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 1110 | }, 1111 | "hoist-non-react-statics": { 1112 | "version": "3.3.2", 1113 | "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", 1114 | "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", 1115 | "requires": { 1116 | "react-is": "^16.7.0" 1117 | } 1118 | }, 1119 | "hsluv": { 1120 | "version": "0.1.0", 1121 | "resolved": "https://registry.npmjs.org/hsluv/-/hsluv-0.1.0.tgz", 1122 | "integrity": "sha512-ERcanKLAszD2XN3Vh5r5Szkrv9q0oSTudmP0rkiKAGM/3NMc9FLmMZBB7TSqTaXJfSDBOreYTfjezCOYbRKqlw==" 1123 | }, 1124 | "http-assert": { 1125 | "version": "1.4.1", 1126 | "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.4.1.tgz", 1127 | "integrity": "sha512-rdw7q6GTlibqVVbXr0CKelfV5iY8G2HqEUkhSk297BMbSpSL8crXC+9rjKoMcZZEsksX30le6f/4ul4E28gegw==", 1128 | "requires": { 1129 | "deep-equal": "~1.0.1", 1130 | "http-errors": "~1.7.2" 1131 | } 1132 | }, 1133 | "http-errors": { 1134 | "version": "1.7.3", 1135 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", 1136 | "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", 1137 | "requires": { 1138 | "depd": "~1.1.2", 1139 | "inherits": "2.0.4", 1140 | "setprototypeof": "1.1.1", 1141 | "statuses": ">= 1.5.0 < 2", 1142 | "toidentifier": "1.0.0" 1143 | } 1144 | }, 1145 | "iconv-lite": { 1146 | "version": "0.4.24", 1147 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1148 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1149 | "requires": { 1150 | "safer-buffer": ">= 2.1.2 < 3" 1151 | } 1152 | }, 1153 | "icss-replace-symbols": { 1154 | "version": "1.1.0", 1155 | "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", 1156 | "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" 1157 | }, 1158 | "ieee754": { 1159 | "version": "1.1.13", 1160 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", 1161 | "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" 1162 | }, 1163 | "ignore-loader": { 1164 | "version": "0.1.2", 1165 | "resolved": "https://registry.npmjs.org/ignore-loader/-/ignore-loader-0.1.2.tgz", 1166 | "integrity": "sha1-2B8kA3bQuk8Nd4lyw60lh0EXpGM=" 1167 | }, 1168 | "import-cwd": { 1169 | "version": "2.1.0", 1170 | "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", 1171 | "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", 1172 | "requires": { 1173 | "import-from": "^2.1.0" 1174 | } 1175 | }, 1176 | "import-fresh": { 1177 | "version": "2.0.0", 1178 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", 1179 | "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", 1180 | "requires": { 1181 | "caller-path": "^2.0.0", 1182 | "resolve-from": "^3.0.0" 1183 | } 1184 | }, 1185 | "import-from": { 1186 | "version": "2.1.0", 1187 | "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", 1188 | "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", 1189 | "requires": { 1190 | "resolve-from": "^3.0.0" 1191 | } 1192 | }, 1193 | "inflation": { 1194 | "version": "2.0.0", 1195 | "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", 1196 | "integrity": "sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8=" 1197 | }, 1198 | "inherits": { 1199 | "version": "2.0.4", 1200 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1201 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1202 | }, 1203 | "is-arrayish": { 1204 | "version": "0.2.1", 1205 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1206 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" 1207 | }, 1208 | "is-class-hotfix": { 1209 | "version": "0.0.6", 1210 | "resolved": "https://registry.npmjs.org/is-class-hotfix/-/is-class-hotfix-0.0.6.tgz", 1211 | "integrity": "sha512-0n+pzCC6ICtVr/WXnN2f03TK/3BfXY7me4cjCAqT8TYXEl0+JBRoqBo94JJHXcyDSLUeWbNX8Fvy5g5RJdAstQ==" 1212 | }, 1213 | "is-directory": { 1214 | "version": "0.3.1", 1215 | "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", 1216 | "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" 1217 | }, 1218 | "is-generator-function": { 1219 | "version": "1.0.7", 1220 | "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz", 1221 | "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==" 1222 | }, 1223 | "is-type-of": { 1224 | "version": "1.2.1", 1225 | "resolved": "https://registry.npmjs.org/is-type-of/-/is-type-of-1.2.1.tgz", 1226 | "integrity": "sha512-uK0kyX9LZYhSDS7H2sVJQJop1UnWPWmo5RvR3q2kFH6AUHYs7sOrVg0b4nyBHw29kRRNFofYN/JbHZDlHiItTA==", 1227 | "requires": { 1228 | "core-util-is": "^1.0.2", 1229 | "is-class-hotfix": "~0.0.6", 1230 | "isstream": "~0.1.2" 1231 | } 1232 | }, 1233 | "isomorphic-fetch": { 1234 | "version": "3.0.0", 1235 | "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", 1236 | "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", 1237 | "requires": { 1238 | "node-fetch": "^2.6.1", 1239 | "whatwg-fetch": "^3.4.1" 1240 | } 1241 | }, 1242 | "isstream": { 1243 | "version": "0.1.2", 1244 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 1245 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 1246 | }, 1247 | "js-cookie": { 1248 | "version": "2.2.1", 1249 | "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", 1250 | "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==" 1251 | }, 1252 | "js-tokens": { 1253 | "version": "4.0.0", 1254 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1255 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 1256 | }, 1257 | "js-yaml": { 1258 | "version": "3.13.1", 1259 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 1260 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 1261 | "requires": { 1262 | "argparse": "^1.0.7", 1263 | "esprima": "^4.0.0" 1264 | } 1265 | }, 1266 | "json-parse-better-errors": { 1267 | "version": "1.0.2", 1268 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", 1269 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" 1270 | }, 1271 | "json-schema-traverse": { 1272 | "version": "0.4.1", 1273 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1274 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 1275 | }, 1276 | "keygrip": { 1277 | "version": "1.1.0", 1278 | "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", 1279 | "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", 1280 | "requires": { 1281 | "tsscmp": "1.0.6" 1282 | } 1283 | }, 1284 | "koa": { 1285 | "version": "2.13.0", 1286 | "resolved": "https://registry.npmjs.org/koa/-/koa-2.13.0.tgz", 1287 | "integrity": "sha512-i/XJVOfPw7npbMv67+bOeXr3gPqOAw6uh5wFyNs3QvJ47tUx3M3V9rIE0//WytY42MKz4l/MXKyGkQ2LQTfLUQ==", 1288 | "requires": { 1289 | "accepts": "^1.3.5", 1290 | "cache-content-type": "^1.0.0", 1291 | "content-disposition": "~0.5.2", 1292 | "content-type": "^1.0.4", 1293 | "cookies": "~0.8.0", 1294 | "debug": "~3.1.0", 1295 | "delegates": "^1.0.0", 1296 | "depd": "^1.1.2", 1297 | "destroy": "^1.0.4", 1298 | "encodeurl": "^1.0.2", 1299 | "escape-html": "^1.0.3", 1300 | "fresh": "~0.5.2", 1301 | "http-assert": "^1.3.0", 1302 | "http-errors": "^1.6.3", 1303 | "is-generator-function": "^1.0.7", 1304 | "koa-compose": "^4.1.0", 1305 | "koa-convert": "^1.2.0", 1306 | "on-finished": "^2.3.0", 1307 | "only": "~0.0.2", 1308 | "parseurl": "^1.3.2", 1309 | "statuses": "^1.5.0", 1310 | "type-is": "^1.6.16", 1311 | "vary": "^1.1.2" 1312 | }, 1313 | "dependencies": { 1314 | "debug": { 1315 | "version": "3.1.0", 1316 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 1317 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 1318 | "requires": { 1319 | "ms": "2.0.0" 1320 | } 1321 | }, 1322 | "koa-compose": { 1323 | "version": "4.1.0", 1324 | "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", 1325 | "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==" 1326 | }, 1327 | "ms": { 1328 | "version": "2.0.0", 1329 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1330 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1331 | } 1332 | } 1333 | }, 1334 | "koa-better-http-proxy": { 1335 | "version": "0.2.5", 1336 | "resolved": "https://registry.npmjs.org/koa-better-http-proxy/-/koa-better-http-proxy-0.2.5.tgz", 1337 | "integrity": "sha512-HCVidGuAsYwtYeNJmfhdIZSwr8ak48qAwqvP7++dpUIpta+0Z2iWiwkVgDzqymCyo7hUUSd5Yu0XU70dAh2h8A==", 1338 | "requires": { 1339 | "es6-promise": "^3.3.1", 1340 | "raw-body": "^2.2.0", 1341 | "winston": "^2.3.1" 1342 | } 1343 | }, 1344 | "koa-bodyparser": { 1345 | "version": "4.3.0", 1346 | "resolved": "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-4.3.0.tgz", 1347 | "integrity": "sha512-uyV8G29KAGwZc4q/0WUAjH+Tsmuv9ImfBUF2oZVyZtaeo0husInagyn/JH85xMSxM0hEk/mbCII5ubLDuqW/Rw==", 1348 | "requires": { 1349 | "co-body": "^6.0.0", 1350 | "copy-to": "^2.0.1" 1351 | } 1352 | }, 1353 | "koa-compose": { 1354 | "version": "3.2.1", 1355 | "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz", 1356 | "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=", 1357 | "requires": { 1358 | "any-promise": "^1.1.0" 1359 | } 1360 | }, 1361 | "koa-convert": { 1362 | "version": "1.2.0", 1363 | "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-1.2.0.tgz", 1364 | "integrity": "sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA=", 1365 | "requires": { 1366 | "co": "^4.6.0", 1367 | "koa-compose": "^3.0.0" 1368 | } 1369 | }, 1370 | "koa-mount": { 1371 | "version": "4.0.0", 1372 | "resolved": "https://registry.npmjs.org/koa-mount/-/koa-mount-4.0.0.tgz", 1373 | "integrity": "sha512-rm71jaA/P+6HeCpoRhmCv8KVBIi0tfGuO/dMKicbQnQW/YJntJ6MnnspkodoA4QstMVEZArsCphmd0bJEtoMjQ==", 1374 | "requires": { 1375 | "debug": "^4.0.1", 1376 | "koa-compose": "^4.1.0" 1377 | }, 1378 | "dependencies": { 1379 | "koa-compose": { 1380 | "version": "4.1.0", 1381 | "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", 1382 | "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==" 1383 | } 1384 | } 1385 | }, 1386 | "koa-router": { 1387 | "version": "8.0.8", 1388 | "resolved": "https://registry.npmjs.org/koa-router/-/koa-router-8.0.8.tgz", 1389 | "integrity": "sha512-2rNF2cgu/EWi/NV8GlBE5+H/QBoaof83X6Z0dULmalkbt7W610/lyP2EOLVqVrUUFfjsVWL/Ju5TVBcGJDY9XQ==", 1390 | "requires": { 1391 | "debug": "^4.1.1", 1392 | "http-errors": "^1.7.3", 1393 | "koa-compose": "^4.1.0", 1394 | "methods": "^1.1.2", 1395 | "path-to-regexp": "1.x", 1396 | "urijs": "^1.19.2" 1397 | }, 1398 | "dependencies": { 1399 | "http-errors": { 1400 | "version": "1.7.3", 1401 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", 1402 | "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", 1403 | "requires": { 1404 | "depd": "~1.1.2", 1405 | "inherits": "2.0.4", 1406 | "setprototypeof": "1.1.1", 1407 | "statuses": ">= 1.5.0 < 2", 1408 | "toidentifier": "1.0.0" 1409 | } 1410 | }, 1411 | "isarray": { 1412 | "version": "0.0.1", 1413 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 1414 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 1415 | }, 1416 | "koa-compose": { 1417 | "version": "4.1.0", 1418 | "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", 1419 | "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==" 1420 | }, 1421 | "path-to-regexp": { 1422 | "version": "1.8.0", 1423 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", 1424 | "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", 1425 | "requires": { 1426 | "isarray": "0.0.1" 1427 | } 1428 | } 1429 | } 1430 | }, 1431 | "koa-session": { 1432 | "version": "6.1.0", 1433 | "resolved": "https://registry.npmjs.org/koa-session/-/koa-session-6.1.0.tgz", 1434 | "integrity": "sha512-xhMrpJxscg14rtMnVe5tCgORkhvH3ZmLFxT6XE5HP1ccoSNL2G2t4L/deJNvE+6SKyY0Zm0fXejNW7rOVKQKzA==", 1435 | "requires": { 1436 | "crc": "^3.4.4", 1437 | "debug": "^3.1.0", 1438 | "is-type-of": "^1.0.0", 1439 | "uuid": "^3.3.2" 1440 | }, 1441 | "dependencies": { 1442 | "debug": { 1443 | "version": "3.2.7", 1444 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 1445 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 1446 | "requires": { 1447 | "ms": "^2.1.1" 1448 | } 1449 | } 1450 | } 1451 | }, 1452 | "loader-utils": { 1453 | "version": "1.2.3", 1454 | "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", 1455 | "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", 1456 | "requires": { 1457 | "big.js": "^5.2.2", 1458 | "emojis-list": "^2.0.0", 1459 | "json5": "^1.0.1" 1460 | }, 1461 | "dependencies": { 1462 | "json5": { 1463 | "version": "1.0.1", 1464 | "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", 1465 | "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", 1466 | "requires": { 1467 | "minimist": "^1.2.0" 1468 | } 1469 | } 1470 | } 1471 | }, 1472 | "locate-path": { 1473 | "version": "2.0.0", 1474 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 1475 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 1476 | "requires": { 1477 | "p-locate": "^2.0.0", 1478 | "path-exists": "^3.0.0" 1479 | } 1480 | }, 1481 | "lodash": { 1482 | "version": "4.17.21", 1483 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1484 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 1485 | }, 1486 | "lodash.camelcase": { 1487 | "version": "4.3.0", 1488 | "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", 1489 | "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" 1490 | }, 1491 | "loose-envify": { 1492 | "version": "1.4.0", 1493 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 1494 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 1495 | "requires": { 1496 | "js-tokens": "^3.0.0 || ^4.0.0" 1497 | } 1498 | }, 1499 | "media-typer": { 1500 | "version": "0.3.0", 1501 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1502 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 1503 | }, 1504 | "methods": { 1505 | "version": "1.1.2", 1506 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1507 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 1508 | }, 1509 | "mime-db": { 1510 | "version": "1.44.0", 1511 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 1512 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" 1513 | }, 1514 | "mime-types": { 1515 | "version": "2.1.27", 1516 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 1517 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 1518 | "requires": { 1519 | "mime-db": "1.44.0" 1520 | } 1521 | }, 1522 | "minimist": { 1523 | "version": "1.2.6", 1524 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 1525 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" 1526 | }, 1527 | "ms": { 1528 | "version": "2.1.2", 1529 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1530 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1531 | }, 1532 | "nanoid": { 1533 | "version": "3.3.4", 1534 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", 1535 | "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" 1536 | }, 1537 | "negotiator": { 1538 | "version": "0.6.2", 1539 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 1540 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 1541 | }, 1542 | "next": { 1543 | "version": "12.1.0", 1544 | "resolved": "https://registry.npmjs.org/next/-/next-12.1.0.tgz", 1545 | "integrity": "sha512-s885kWvnIlxsUFHq9UGyIyLiuD0G3BUC/xrH0CEnH5lHEWkwQcHOORgbDF0hbrW9vr/7am4ETfX4A7M6DjrE7Q==", 1546 | "requires": { 1547 | "@next/env": "12.1.0", 1548 | "@next/swc-android-arm64": "12.1.0", 1549 | "@next/swc-darwin-arm64": "12.1.0", 1550 | "@next/swc-darwin-x64": "12.1.0", 1551 | "@next/swc-linux-arm-gnueabihf": "12.1.0", 1552 | "@next/swc-linux-arm64-gnu": "12.1.0", 1553 | "@next/swc-linux-arm64-musl": "12.1.0", 1554 | "@next/swc-linux-x64-gnu": "12.1.0", 1555 | "@next/swc-linux-x64-musl": "12.1.0", 1556 | "@next/swc-win32-arm64-msvc": "12.1.0", 1557 | "@next/swc-win32-ia32-msvc": "12.1.0", 1558 | "@next/swc-win32-x64-msvc": "12.1.0", 1559 | "caniuse-lite": "^1.0.30001283", 1560 | "postcss": "8.4.5", 1561 | "styled-jsx": "5.0.0", 1562 | "use-subscription": "1.5.1" 1563 | }, 1564 | "dependencies": { 1565 | "postcss": { 1566 | "version": "8.4.5", 1567 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", 1568 | "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", 1569 | "requires": { 1570 | "nanoid": "^3.1.30", 1571 | "picocolors": "^1.0.0", 1572 | "source-map-js": "^1.0.1" 1573 | } 1574 | } 1575 | } 1576 | }, 1577 | "node-fetch": { 1578 | "version": "2.6.7", 1579 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", 1580 | "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", 1581 | "requires": { 1582 | "whatwg-url": "^5.0.0" 1583 | } 1584 | }, 1585 | "nonce": { 1586 | "version": "1.0.4", 1587 | "resolved": "https://registry.npmjs.org/nonce/-/nonce-1.0.4.tgz", 1588 | "integrity": "sha512-FVPu+tMZPP91HDwiq1DNhn9WIhg4/uo6mXR0xXAn0IMOxDmjJOkgbH0tm7qtowvAFZofWZRX+9KWZpNURrgtSA==" 1589 | }, 1590 | "object-assign": { 1591 | "version": "4.1.1", 1592 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1593 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 1594 | }, 1595 | "on-finished": { 1596 | "version": "2.3.0", 1597 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1598 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 1599 | "requires": { 1600 | "ee-first": "1.1.1" 1601 | } 1602 | }, 1603 | "only": { 1604 | "version": "0.0.2", 1605 | "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", 1606 | "integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=" 1607 | }, 1608 | "optimism": { 1609 | "version": "0.10.3", 1610 | "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.10.3.tgz", 1611 | "integrity": "sha512-9A5pqGoQk49H6Vhjb9kPgAeeECfUDF6aIICbMDL23kDLStBn1MWk3YvcZ4xWF9CsSf6XEgvRLkXy4xof/56vVw==", 1612 | "requires": { 1613 | "@wry/context": "^0.4.0" 1614 | } 1615 | }, 1616 | "p-limit": { 1617 | "version": "1.3.0", 1618 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", 1619 | "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", 1620 | "requires": { 1621 | "p-try": "^1.0.0" 1622 | } 1623 | }, 1624 | "p-locate": { 1625 | "version": "2.0.0", 1626 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 1627 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 1628 | "requires": { 1629 | "p-limit": "^1.1.0" 1630 | } 1631 | }, 1632 | "p-try": { 1633 | "version": "1.0.0", 1634 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", 1635 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" 1636 | }, 1637 | "parseurl": { 1638 | "version": "1.3.3", 1639 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1640 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1641 | }, 1642 | "path-exists": { 1643 | "version": "3.0.0", 1644 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1645 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" 1646 | }, 1647 | "picocolors": { 1648 | "version": "1.0.0", 1649 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 1650 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 1651 | }, 1652 | "postcss": { 1653 | "version": "7.0.27", 1654 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", 1655 | "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", 1656 | "requires": { 1657 | "chalk": "^2.4.2", 1658 | "source-map": "^0.6.1", 1659 | "supports-color": "^6.1.0" 1660 | }, 1661 | "dependencies": { 1662 | "supports-color": { 1663 | "version": "6.1.0", 1664 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", 1665 | "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", 1666 | "requires": { 1667 | "has-flag": "^3.0.0" 1668 | } 1669 | } 1670 | } 1671 | }, 1672 | "postcss-load-config": { 1673 | "version": "2.1.0", 1674 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", 1675 | "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", 1676 | "requires": { 1677 | "cosmiconfig": "^5.0.0", 1678 | "import-cwd": "^2.0.0" 1679 | } 1680 | }, 1681 | "postcss-loader": { 1682 | "version": "3.0.0", 1683 | "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", 1684 | "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", 1685 | "requires": { 1686 | "loader-utils": "^1.1.0", 1687 | "postcss": "^7.0.0", 1688 | "postcss-load-config": "^2.0.0", 1689 | "schema-utils": "^1.0.0" 1690 | }, 1691 | "dependencies": { 1692 | "schema-utils": { 1693 | "version": "1.0.0", 1694 | "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", 1695 | "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", 1696 | "requires": { 1697 | "ajv": "^6.1.0", 1698 | "ajv-errors": "^1.0.0", 1699 | "ajv-keywords": "^3.1.0" 1700 | } 1701 | } 1702 | } 1703 | }, 1704 | "prop-types": { 1705 | "version": "15.7.2", 1706 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", 1707 | "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", 1708 | "requires": { 1709 | "loose-envify": "^1.4.0", 1710 | "object-assign": "^4.1.1", 1711 | "react-is": "^16.8.1" 1712 | } 1713 | }, 1714 | "punycode": { 1715 | "version": "2.1.1", 1716 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1717 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 1718 | }, 1719 | "qs": { 1720 | "version": "6.9.4", 1721 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", 1722 | "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==" 1723 | }, 1724 | "raw-body": { 1725 | "version": "2.4.1", 1726 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", 1727 | "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", 1728 | "requires": { 1729 | "bytes": "3.1.0", 1730 | "http-errors": "1.7.3", 1731 | "iconv-lite": "0.4.24", 1732 | "unpipe": "1.0.0" 1733 | } 1734 | }, 1735 | "react": { 1736 | "version": "17.0.1", 1737 | "resolved": "https://registry.npmjs.org/react/-/react-17.0.1.tgz", 1738 | "integrity": "sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w==", 1739 | "requires": { 1740 | "loose-envify": "^1.1.0", 1741 | "object-assign": "^4.1.1" 1742 | } 1743 | }, 1744 | "react-apollo": { 1745 | "version": "3.1.5", 1746 | "resolved": "https://registry.npmjs.org/react-apollo/-/react-apollo-3.1.5.tgz", 1747 | "integrity": "sha512-xOxMqxORps+WHrUYbjVHPliviomefOpu5Sh35oO3osuOyPTxvrljdfTLGCggMhcXBsDljtS5Oy4g+ijWg3D4JQ==", 1748 | "requires": { 1749 | "@apollo/react-common": "^3.1.4", 1750 | "@apollo/react-components": "^3.1.5", 1751 | "@apollo/react-hoc": "^3.1.5", 1752 | "@apollo/react-hooks": "^3.1.5", 1753 | "@apollo/react-ssr": "^3.1.5" 1754 | } 1755 | }, 1756 | "react-dom": { 1757 | "version": "17.0.1", 1758 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.1.tgz", 1759 | "integrity": "sha512-6eV150oJZ9U2t9svnsspTMrWNyHc6chX0KzDeAOXftRa8bNeOKTTfCJ7KorIwenkHd2xqVTBTCZd79yk/lx/Ug==", 1760 | "requires": { 1761 | "loose-envify": "^1.1.0", 1762 | "object-assign": "^4.1.1", 1763 | "scheduler": "^0.20.1" 1764 | } 1765 | }, 1766 | "react-is": { 1767 | "version": "16.8.6", 1768 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", 1769 | "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==" 1770 | }, 1771 | "react-transition-group": { 1772 | "version": "4.4.1", 1773 | "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.1.tgz", 1774 | "integrity": "sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw==", 1775 | "requires": { 1776 | "@babel/runtime": "^7.5.5", 1777 | "dom-helpers": "^5.0.1", 1778 | "loose-envify": "^1.4.0", 1779 | "prop-types": "^15.6.2" 1780 | } 1781 | }, 1782 | "regenerate": { 1783 | "version": "1.4.0", 1784 | "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", 1785 | "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" 1786 | }, 1787 | "regenerate-unicode-properties": { 1788 | "version": "8.1.0", 1789 | "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", 1790 | "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", 1791 | "requires": { 1792 | "regenerate": "^1.4.0" 1793 | } 1794 | }, 1795 | "regenerator-runtime": { 1796 | "version": "0.13.4", 1797 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.4.tgz", 1798 | "integrity": "sha512-plpwicqEzfEyTQohIKktWigcLzmNStMGwbOUbykx51/29Z3JOGYldaaNGK7ngNXV+UcoqvIMmloZ48Sr74sd+g==" 1799 | }, 1800 | "regexpu-core": { 1801 | "version": "4.6.0", 1802 | "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", 1803 | "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", 1804 | "requires": { 1805 | "regenerate": "^1.4.0", 1806 | "regenerate-unicode-properties": "^8.1.0", 1807 | "regjsgen": "^0.5.0", 1808 | "regjsparser": "^0.6.0", 1809 | "unicode-match-property-ecmascript": "^1.0.4", 1810 | "unicode-match-property-value-ecmascript": "^1.1.0" 1811 | } 1812 | }, 1813 | "regjsgen": { 1814 | "version": "0.5.1", 1815 | "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", 1816 | "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==" 1817 | }, 1818 | "regjsparser": { 1819 | "version": "0.6.3", 1820 | "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.3.tgz", 1821 | "integrity": "sha512-8uZvYbnfAtEm9Ab8NTb3hdLwL4g/LQzEYP7Xs27T96abJCCE2d6r3cPZPQEsLKy0vRSGVNG+/zVGtLr86HQduA==", 1822 | "requires": { 1823 | "jsesc": "~0.5.0" 1824 | }, 1825 | "dependencies": { 1826 | "jsesc": { 1827 | "version": "0.5.0", 1828 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", 1829 | "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" 1830 | } 1831 | } 1832 | }, 1833 | "resolve-from": { 1834 | "version": "3.0.0", 1835 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", 1836 | "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" 1837 | }, 1838 | "safe-buffer": { 1839 | "version": "5.1.2", 1840 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1841 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1842 | }, 1843 | "safe-compare": { 1844 | "version": "1.1.4", 1845 | "resolved": "https://registry.npmjs.org/safe-compare/-/safe-compare-1.1.4.tgz", 1846 | "integrity": "sha512-b9wZ986HHCo/HbKrRpBJb2kqXMK9CEWIE1egeEvZsYn69ay3kdfl9nG3RyOcR+jInTDf7a86WQ1d4VJX7goSSQ==", 1847 | "requires": { 1848 | "buffer-alloc": "^1.2.0" 1849 | } 1850 | }, 1851 | "safer-buffer": { 1852 | "version": "2.1.2", 1853 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1854 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1855 | }, 1856 | "scheduler": { 1857 | "version": "0.20.1", 1858 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.1.tgz", 1859 | "integrity": "sha512-LKTe+2xNJBNxu/QhHvDR14wUXHRQbVY5ZOYpOGWRzhydZUqrLb2JBvLPY7cAqFmqrWuDED0Mjk7013SZiOz6Bw==", 1860 | "requires": { 1861 | "loose-envify": "^1.1.0", 1862 | "object-assign": "^4.1.1" 1863 | } 1864 | }, 1865 | "setprototypeof": { 1866 | "version": "1.1.1", 1867 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 1868 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 1869 | }, 1870 | "source-list-map": { 1871 | "version": "2.0.1", 1872 | "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", 1873 | "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" 1874 | }, 1875 | "source-map": { 1876 | "version": "0.6.1", 1877 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1878 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 1879 | }, 1880 | "source-map-js": { 1881 | "version": "1.0.2", 1882 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1883 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" 1884 | }, 1885 | "sprintf-js": { 1886 | "version": "1.0.3", 1887 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1888 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" 1889 | }, 1890 | "stack-trace": { 1891 | "version": "0.0.10", 1892 | "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", 1893 | "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" 1894 | }, 1895 | "statuses": { 1896 | "version": "1.5.0", 1897 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1898 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 1899 | }, 1900 | "store-js": { 1901 | "version": "2.0.4", 1902 | "resolved": "https://registry.npmjs.org/store-js/-/store-js-2.0.4.tgz", 1903 | "integrity": "sha512-ap3Tcpc5kbPnUOpty9g5v7XozAxPylPokzhPxnQ4EtyTbjt+pHw4GVgxkng8vxcT1R9ZShXY/aCKqAQrhjTESA==" 1904 | }, 1905 | "styled-jsx": { 1906 | "version": "5.0.0", 1907 | "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.0.tgz", 1908 | "integrity": "sha512-qUqsWoBquEdERe10EW8vLp3jT25s/ssG1/qX5gZ4wu15OZpmSMFI2v+fWlRhLfykA5rFtlJ1ME8A8pm/peV4WA==" 1909 | }, 1910 | "supports-color": { 1911 | "version": "5.5.0", 1912 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1913 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1914 | "requires": { 1915 | "has-flag": "^3.0.0" 1916 | } 1917 | }, 1918 | "symbol-observable": { 1919 | "version": "1.2.0", 1920 | "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", 1921 | "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" 1922 | }, 1923 | "toidentifier": { 1924 | "version": "1.0.0", 1925 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 1926 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 1927 | }, 1928 | "tr46": { 1929 | "version": "0.0.3", 1930 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 1931 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" 1932 | }, 1933 | "ts-invariant": { 1934 | "version": "0.4.4", 1935 | "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz", 1936 | "integrity": "sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==", 1937 | "requires": { 1938 | "tslib": "^1.9.3" 1939 | } 1940 | }, 1941 | "tslib": { 1942 | "version": "1.11.1", 1943 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", 1944 | "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" 1945 | }, 1946 | "tsscmp": { 1947 | "version": "1.0.6", 1948 | "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", 1949 | "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==" 1950 | }, 1951 | "type-is": { 1952 | "version": "1.6.18", 1953 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1954 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1955 | "requires": { 1956 | "media-typer": "0.3.0", 1957 | "mime-types": "~2.1.24" 1958 | } 1959 | }, 1960 | "unicode-canonical-property-names-ecmascript": { 1961 | "version": "1.0.4", 1962 | "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", 1963 | "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==" 1964 | }, 1965 | "unicode-match-property-ecmascript": { 1966 | "version": "1.0.4", 1967 | "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", 1968 | "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", 1969 | "requires": { 1970 | "unicode-canonical-property-names-ecmascript": "^1.0.4", 1971 | "unicode-property-aliases-ecmascript": "^1.0.4" 1972 | } 1973 | }, 1974 | "unicode-match-property-value-ecmascript": { 1975 | "version": "1.1.0", 1976 | "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", 1977 | "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==" 1978 | }, 1979 | "unicode-property-aliases-ecmascript": { 1980 | "version": "1.0.5", 1981 | "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", 1982 | "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==" 1983 | }, 1984 | "unpipe": { 1985 | "version": "1.0.0", 1986 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1987 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1988 | }, 1989 | "uri-js": { 1990 | "version": "4.2.2", 1991 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 1992 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 1993 | "requires": { 1994 | "punycode": "^2.1.0" 1995 | } 1996 | }, 1997 | "urijs": { 1998 | "version": "1.19.11", 1999 | "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", 2000 | "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==" 2001 | }, 2002 | "use-subscription": { 2003 | "version": "1.5.1", 2004 | "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz", 2005 | "integrity": "sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==", 2006 | "requires": { 2007 | "object-assign": "^4.1.1" 2008 | } 2009 | }, 2010 | "uuid": { 2011 | "version": "3.4.0", 2012 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 2013 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" 2014 | }, 2015 | "vary": { 2016 | "version": "1.1.2", 2017 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 2018 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 2019 | }, 2020 | "webidl-conversions": { 2021 | "version": "3.0.1", 2022 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 2023 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" 2024 | }, 2025 | "webpack-sources": { 2026 | "version": "1.4.3", 2027 | "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", 2028 | "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", 2029 | "requires": { 2030 | "source-list-map": "^2.0.0", 2031 | "source-map": "~0.6.1" 2032 | } 2033 | }, 2034 | "whatwg-fetch": { 2035 | "version": "3.6.2", 2036 | "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", 2037 | "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" 2038 | }, 2039 | "whatwg-url": { 2040 | "version": "5.0.0", 2041 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 2042 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 2043 | "requires": { 2044 | "tr46": "~0.0.3", 2045 | "webidl-conversions": "^3.0.0" 2046 | } 2047 | }, 2048 | "winston": { 2049 | "version": "2.4.5", 2050 | "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.5.tgz", 2051 | "integrity": "sha512-TWoamHt5yYvsMarGlGEQE59SbJHqGsZV8/lwC+iCcGeAe0vUaOh+Lv6SYM17ouzC/a/LB1/hz/7sxFBtlu1l4A==", 2052 | "requires": { 2053 | "async": "~1.0.0", 2054 | "colors": "1.0.x", 2055 | "cycle": "1.0.x", 2056 | "eyes": "0.1.x", 2057 | "isstream": "0.1.x", 2058 | "stack-trace": "0.0.x" 2059 | } 2060 | }, 2061 | "ylru": { 2062 | "version": "1.2.1", 2063 | "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.2.1.tgz", 2064 | "integrity": "sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ==" 2065 | }, 2066 | "zen-observable": { 2067 | "version": "0.8.15", 2068 | "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", 2069 | "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" 2070 | }, 2071 | "zen-observable-ts": { 2072 | "version": "0.8.21", 2073 | "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz", 2074 | "integrity": "sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg==", 2075 | "requires": { 2076 | "tslib": "^1.9.3", 2077 | "zen-observable": "^0.8.0" 2078 | } 2079 | } 2080 | } 2081 | } 2082 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "shopify-app-node-react", 3 | "version": "1.0.0", 4 | "description": "Shopify Application built with React, Node.js, Next.js, and GraphQL", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "dev": "node server.js", 9 | "build": "next build", 10 | "start": "NODE_ENV=production node server.js" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "git+https://github.com/jaayperez/shopify-app-node-react.git" 15 | }, 16 | "keywords": [], 17 | "author": "", 18 | "license": "ISC", 19 | "bugs": { 20 | "url": "https://github.com/jaayperez/shopify-app-node-react/issues" 21 | }, 22 | "homepage": "https://github.com/jaayperez/shopify-app-node-react#readme", 23 | "dependencies": { 24 | "@shopify/app-bridge": "^1.21.4", 25 | "@shopify/app-bridge-react": "^1.28.0", 26 | "@shopify/koa-shopify-auth": "^3.1.63", 27 | "@shopify/koa-shopify-graphql-proxy": "^4.0.4", 28 | "@shopify/koa-shopify-webhooks": "^2.4.2", 29 | "@shopify/polaris": "^5.10.1", 30 | "@zeit/next-css": "^1.0.1", 31 | "apollo-boost": "^0.4.9", 32 | "dotenv": "^8.2.0", 33 | "graphql": "^15.4.0", 34 | "isomorphic-fetch": "^3.0.0", 35 | "js-cookie": "^2.2.1", 36 | "koa": "^2.13.0", 37 | "koa-router": "^8.0.8", 38 | "koa-session": "^6.1.0", 39 | "next": "^12.1.0", 40 | "react": "^17.0.1", 41 | "react-apollo": "^3.1.5", 42 | "react-dom": "^17.0.1", 43 | "store-js": "^2.0.4" 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /pages/_app.js: -------------------------------------------------------------------------------- 1 | import App from 'next/app'; 2 | import Head from 'next/head'; 3 | import { AppProvider } from '@shopify/polaris'; 4 | import { Provider } from '@shopify/app-bridge-react'; 5 | import '@shopify/polaris/styles.css'; 6 | import translations from '@shopify/polaris/locales/en.json'; 7 | import Cookies from 'js-cookie'; 8 | import ApolloClient from 'apollo-boost'; 9 | import { ApolloProvider } from 'react-apollo'; 10 | 11 | const client = new ApolloClient({ 12 | fetchOptions: { 13 | credentials: 'include' 14 | }, 15 | }); 16 | 17 | 18 | class MyApp extends App { 19 | render() { 20 | const { Component, pageProps } = this.props; 21 | const config = { apiKey: API_KEY, shopOrigin: Cookies.get("shopOrigin"), forceRedirect: true }; 22 | return ( 23 | 24 | 25 | Shopify App 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | ); 37 | } 38 | } 39 | 40 | export default MyApp; 41 | -------------------------------------------------------------------------------- /pages/annotatedLayout.js: -------------------------------------------------------------------------------- 1 | import { 2 | Button, 3 | Card, 4 | Form, 5 | FormLayout, 6 | Layout, 7 | Page, 8 | SettingToggle, 9 | Stack, 10 | TextField, 11 | TextStyle, 12 | } from '@shopify/polaris'; 13 | 14 | class AnnotatedLayout extends React.Component { 15 | state = { 16 | discount: '10%', 17 | enabled: false, 18 | }; 19 | 20 | render() { 21 | const { discount, enabled } = this.state; 22 | const contentStatus = enabled ? 'Disable' : 'Enable'; 23 | const textStatus = enabled ? 'enabled' : 'disabled'; 24 | 25 | return ( 26 | 27 | 28 | 32 | 33 |
34 | 35 | 41 | 42 | 45 | 46 | 47 |
48 |
49 |
50 | 54 | 61 | This setting is{' '} 62 | {textStatus}. 63 | 64 | 65 |
66 |
67 | ); 68 | } 69 | 70 | handleSubmit = () => { 71 | this.setState({ 72 | discount: this.state.discount, 73 | }); 74 | console.log('submission', this.state); 75 | }; 76 | handleChange = (field) => { 77 | return (value) => this.setState({ [field]: value }); 78 | }; 79 | handleToggle = () => { 80 | this.setState(({ enabled }) => { 81 | return { enabled: !enabled }; 82 | }); 83 | }; 84 | } 85 | 86 | export default AnnotatedLayout; 87 | -------------------------------------------------------------------------------- /pages/editProducts.js: -------------------------------------------------------------------------------- 1 | import { 2 | Banner, 3 | Card, 4 | DisplayText, 5 | Form, 6 | FormLayout, 7 | Frame, 8 | Layout, 9 | Page, 10 | PageActions, 11 | TextField, 12 | Toast 13 | } from '@shopify/polaris'; 14 | import store from 'store-js'; 15 | import gql from 'graphql-tag'; 16 | import { Mutation } from 'react-apollo'; 17 | 18 | const UPDATE_PRICE = gql` 19 | mutation productVariantUpdate($input: ProductVariantInput!) { 20 | productVariantUpdate(input: $input) { 21 | product { 22 | title 23 | } 24 | productVariant { 25 | id 26 | price 27 | } 28 | } 29 | } 30 | `; 31 | 32 | class EditProduct extends React.Component { 33 | state = { 34 | discount: '', 35 | price: '', 36 | variantId: '', 37 | showToast: false 38 | }; 39 | 40 | componentDidMount() { 41 | this.setState({ discount: this.itemToBeConsumed() }); 42 | } 43 | 44 | render() { 45 | const { name, price, discount, variantId } = this.state; 46 | return ( 47 | 50 | {(handleSubmit, {error, data}) => { 51 | const showError = error && ( 52 | {error.message} 53 | ); 54 | const showToast = data && data.productVariantUpdate && ( 55 | this.setState({ showToast: false })} 58 | /> 59 | ); 60 | return ( 61 | 62 | 63 | 64 | {showToast} 65 | 66 | {showError} 67 | 68 | 69 | {name} 70 |
71 | 72 | 73 | 74 | 81 | 88 | 89 |

90 | This sale price will expire in two weeks 91 |

92 |
93 |
94 | { 99 | const productVariableInput = { 100 | id: variantId, 101 | price: discount, 102 | }; 103 | handleSubmit({ 104 | variables: { input: productVariableInput }, 105 | }); 106 | } 107 | } 108 | ]} 109 | secondaryActions={[ 110 | { 111 | content: 'Remove discount' 112 | } 113 | ]} 114 | /> 115 | 116 |
117 |
118 |
119 | 120 | ); 121 | }} 122 |
123 | ); 124 | } 125 | 126 | handleChange = (field) => { 127 | return (value) => this.setState({ [field]: value }); 128 | }; 129 | 130 | itemToBeConsumed = () => { 131 | const item = store.get('item'); 132 | const price = item.variants.edges[0].node.price; 133 | const variantId = item.variants.edges[0].node.id; 134 | const discounter = price * 0.1; 135 | this.setState({ price, variantId }); 136 | return (price - discounter).toFixed(2); 137 | }; 138 | } 139 | 140 | export default EditProduct; 141 | -------------------------------------------------------------------------------- /pages/index.js: -------------------------------------------------------------------------------- 1 | import { EmptyState, Layout, Page } from '@shopify/polaris'; 2 | import { ResourcePicker, TitleBar } from '@shopify/app-bridge-react'; 3 | import store from 'store-js'; 4 | import ResourceListWithProducts from '../components/ResourceList'; 5 | 6 | const img = 'https://cdn.shopify.com/s/files/1/0757/9955/files/empty-state.svg'; 7 | 8 | class Index extends React.Component { 9 | state = { open: false } 10 | render() { 11 | const emptyState = !store.get('ids'); 12 | return ( 13 | 14 | 19 | this.handleSelection(resources)} 24 | onCancel={() => this.setState({ open: false })} 25 | /> 26 | {emptyState ? ( 27 | 28 | this.setState({ open: true }), 33 | }} 34 | image={img} 35 | > 36 |

Select products to change their price temporarily.

37 |
38 |
39 | ) : ( 40 | 41 | )} 42 |
43 | ); 44 | } 45 | handleSelection = (resources) => { 46 | const idsFromResources = resources.selection.map((product) => product.id); 47 | this.setState({ open: false }) 48 | store.set('ids', idsFromResources); 49 | }; 50 | } 51 | 52 | export default Index; 53 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | require('isomorphic-fetch'); 2 | const dotenv = require('dotenv'); 3 | const Koa = require('koa'); 4 | const next = require('next'); 5 | const { default: createShopifyAuth } = require('@shopify/koa-shopify-auth'); 6 | const { verifyRequest } = require('@shopify/koa-shopify-auth'); 7 | const session = require('koa-session'); 8 | 9 | dotenv.config(); 10 | const { default: graphQLProxy } = require('@shopify/koa-shopify-graphql-proxy'); 11 | const Router = require('koa-router'); 12 | const {receiveWebhook, registerWebhook} = require('@shopify/koa-shopify-webhooks'); 13 | const { ApiVersion } = require('@shopify/koa-shopify-graphql-proxy'); 14 | const getSubscriptionUrl = require('./server/getSubscriptionUrl'); 15 | 16 | const port = parseInt(process.env.PORT, 10) || 3000; 17 | const dev = process.env.NODE_ENV !== 'production'; 18 | const app = next({ dev }); 19 | const handle = app.getRequestHandler(); 20 | 21 | const { 22 | SHOPIFY_API_SECRET_KEY, 23 | SHOPIFY_API_KEY, 24 | HOST, 25 | } = process.env; 26 | 27 | app.prepare().then(() => { 28 | const server = new Koa(); 29 | server.use(session({ secure: true, sameSite: 'none' }, server)); 30 | server.keys = [SHOPIFY_API_SECRET_KEY]; 31 | 32 | server.use( 33 | createShopifyAuth({ 34 | apiKey: SHOPIFY_API_KEY, 35 | secret: SHOPIFY_API_SECRET_KEY, 36 | scopes: ['read_products', 'write_products'], 37 | async afterAuth(ctx) { 38 | const { shop, accessToken } = ctx.session; 39 | ctx.cookies.set('shopOrigin', shop, { 40 | httpOnly: false, 41 | secure: true, 42 | sameSite: 'none' 43 | }); 44 | const registration = await registerWebhook({ 45 | address: `${HOST}/webhooks/products/create`, 46 | topic: 'PRODUCTS_CREATE', 47 | accessToken, 48 | shop, 49 | apiVersion: ApiVersion.October19 50 | }); 51 | 52 | if (registration.success) { 53 | console.log('Successfully registered webhook!'); 54 | } else { 55 | console.log('Failed to register webhook', registration.result); 56 | } 57 | await getSubscriptionUrl(ctx, accessToken, shop); 58 | }, 59 | }), 60 | ); 61 | 62 | const webhook = receiveWebhook({secret: SHOPIFY_API_SECRET_KEY}); 63 | 64 | router.post('/webhooks/products/create', webhook, (ctx) => { 65 | console.log('received webhook: ', ctx.state.webhook); 66 | }); 67 | 68 | server.use(graphQLProxy({version: ApiVersion.October19})) 69 | 70 | router.get('*', verifyRequest(), async (ctx) => { 71 | await handle(ctx.req, ctx.res); 72 | ctx.respond = false; 73 | ctx.res.statusCode = 200; 74 | }); 75 | server.use(router.allowedMethods()); 76 | server.use(router.routes()); 77 | 78 | server.listen(port, () => { 79 | console.log(`> Ready on http://localhost:${port}`); 80 | }); 81 | }); 82 | -------------------------------------------------------------------------------- /server/getSubscriptionUrl.js: -------------------------------------------------------------------------------- 1 | const getSubscriptionUrl = async (ctx, accessToken, shop) => { 2 | const query = JSON.stringify({ 3 | query: `mutation { 4 | appSubscriptionCreate( 5 | name: "Super Duper Plan" 6 | returnUrl: "${process.env.HOST}" 7 | test: true 8 | lineItems: [ 9 | { 10 | plan: { 11 | appUsagePricingDetails: { 12 | cappedAmount: { amount: 10, currencyCode: USD } 13 | terms: "$1 for 1000 emails" 14 | } 15 | } 16 | } 17 | { 18 | plan: { 19 | appRecurringPricingDetails: { 20 | price: { amount: 10, currencyCode: USD } 21 | } 22 | } 23 | } 24 | ] 25 | ) { 26 | userErrors { 27 | field 28 | message 29 | } 30 | confirmationUrl 31 | appSubscription { 32 | id 33 | } 34 | } 35 | }` 36 | }); 37 | 38 | const response = await fetch(`https://${shop}/admin/api/2019-10/graphql.json`, { 39 | method: 'POST', 40 | headers: { 41 | 'Content-Type': 'application/json', 42 | "X-Shopify-Access-Token": accessToken, 43 | }, 44 | body: query 45 | }) 46 | 47 | const responseJson = await response.json(); 48 | const confirmationUrl = responseJson.data.appSubscriptionCreate.confirmationUrl 49 | return ctx.redirect(confirmationUrl) 50 | }; 51 | 52 | module.exports = getSubscriptionUrl; 53 | --------------------------------------------------------------------------------