├── .gitignore ├── LICENSE.md ├── README.md ├── gatsby-browser.js ├── gatsby-config.js ├── gatsby-node.js ├── package.json ├── plugins └── gatsby-source-shopify-storefront │ ├── gatsby-node.js │ ├── index.js │ ├── package.json │ ├── product-query.js │ ├── src │ ├── gatsby-node.js │ └── product-query.js │ └── yarn.lock ├── src ├── components │ ├── AddToCart │ │ ├── index.js │ │ └── style.js │ ├── BulkOrderBanner │ │ └── index.js │ ├── Button │ │ └── index.js │ ├── Card │ │ ├── index.js │ │ └── style.js │ ├── Cart │ │ ├── index.js │ │ └── style.js │ ├── DesignerCard │ │ ├── index.js │ │ └── style.js │ ├── DesignersGrid │ │ ├── index.js │ │ └── style.js │ ├── EmailSignup │ │ ├── index.js │ │ └── style.js │ ├── Footer │ │ ├── index.js │ │ └── style.js │ ├── Header │ │ ├── Search │ │ │ ├── SearchInput.js │ │ │ ├── SearchResult.js │ │ │ ├── index.js │ │ │ └── style.js │ │ ├── index.js │ │ └── style.js │ ├── IconButton │ │ └── index.js │ ├── IconOnlyButton │ │ └── index.js │ ├── ImageLoader │ │ └── index.js │ ├── Modal │ │ ├── index.js │ │ └── style.js │ ├── Page │ │ ├── ScrollToTop │ │ │ ├── index.js │ │ │ └── style.js │ │ ├── index.js │ │ └── style.js │ ├── ProductCard │ │ ├── index.js │ │ └── style.js │ ├── ProductImage │ │ ├── index.js │ │ └── style.js │ ├── ProductShareButtons │ │ ├── index.js │ │ └── style.js │ ├── ProductView │ │ ├── LightBox.js │ │ ├── index.js │ │ └── style.js │ ├── ProductsGrid │ │ ├── index.js │ │ └── style.js │ └── Transition │ │ └── index.js ├── context │ └── StoreContext.js ├── data.json ├── pages │ └── index.js ├── templates │ └── product.js └── utils │ └── getTransitionStyle.js ├── static ├── banner.png ├── browserconfig.xml ├── favicons │ ├── android-icon-144x144.png │ ├── android-icon-192x192.png │ ├── android-icon-36x36.png │ ├── android-icon-48x48.png │ ├── android-icon-72x72.png │ ├── android-icon-96x96.png │ ├── apple-icon-114x114.png │ ├── apple-icon-120x120.png │ ├── apple-icon-144x144.png │ ├── apple-icon-152x152.png │ ├── apple-icon-180x180.png │ ├── apple-icon-57x57.png │ ├── apple-icon-60x60.png │ ├── apple-icon-72x72.png │ ├── apple-icon-76x76.png │ ├── apple-icon-precomposed.png │ ├── apple-icon.png │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon-96x96.png │ ├── favicon.ico │ ├── ms-icon-144x144.png │ ├── ms-icon-150x150.png │ ├── ms-icon-310x310.png │ └── ms-icon-70x70.png ├── flag.svg ├── manifest.json └── social.png └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | public 3 | .cache 4 | 5 | # Editors 6 | .idea 7 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Hack Club 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 | ![](static/banner.png) 2 | 3 | > Buy your Hack Club merch here 4 | 5 | ### Setup 6 | 7 | The stack: Gatsby, React, you know the deal. 8 | 9 | #### Prerequisites 10 | 11 | - [Git](https://git-scm.com/downloads) 12 | - [Yarn](https://yarnpkg.com/en/docs/install) 13 | - Gatsby CLI (`yarn global add gatsby-cli`) 14 | 15 | 1. Clone the repository 16 | 17 | ``` 18 | git clone https://github.com/hackclub/shop 19 | ``` 20 | 21 | 2. Go into the directory 22 | 23 | ``` 24 | cd shop 25 | ``` 26 | 27 | 3. Install dependencies 28 | 29 | ``` 30 | yarn 31 | ``` 32 | 33 | 4. Run it! 34 | 35 | ``` 36 | yarn dev 37 | ``` 38 | 39 | ### License 40 | 41 | This project is licensed under the MIT license. Please see [`LICENSE.md`](LICENSE.md) for the full text. 42 | -------------------------------------------------------------------------------- /gatsby-browser.js: -------------------------------------------------------------------------------- 1 | /* globals window CustomEvent */ 2 | import createHistory from 'history/createBrowserHistory' 3 | 4 | const timeout = 250 5 | const historyExitingEventType = `history::exiting` 6 | 7 | const getUserConfirmation = (pathname, callback) => { 8 | const event = new CustomEvent(historyExitingEventType, { 9 | detail: { pathname } 10 | }) 11 | window.dispatchEvent(event) 12 | setTimeout(() => { 13 | callback(true) 14 | }, timeout) 15 | } 16 | 17 | let history 18 | if (typeof document !== 'undefined') { 19 | history = createHistory({ getUserConfirmation }) 20 | // block must return a string to conform 21 | history.block((location, action) => location.pathname) 22 | } 23 | 24 | export { historyExitingEventType, timeout } 25 | -------------------------------------------------------------------------------- /gatsby-config.js: -------------------------------------------------------------------------------- 1 | // configure plugins here 2 | module.exports = { 3 | plugins: [ 4 | 'gatsby-plugin-react-helmet', 5 | 'gatsby-plugin-styled-components', 6 | { 7 | resolve: `${__dirname}/plugins/gatsby-source-shopify-storefront`, 8 | options: { 9 | siteName: 'hackclub', 10 | accessToken: 'ba720b36f1e99b2719bc74ef728ec847' 11 | } 12 | }, 13 | { 14 | resolve: 'gatsby-plugin-segment', 15 | options: { 16 | writeKey: '06rvzf07T9l5uxR83GNMUZeuOLGTMIOS' 17 | } 18 | }, 19 | { 20 | resolve: 'gatsby-plugin-canonical-urls', 21 | options: { 22 | siteUrl: 'https://shop.hackclub.com' 23 | } 24 | } 25 | ] 26 | } 27 | -------------------------------------------------------------------------------- /gatsby-node.js: -------------------------------------------------------------------------------- 1 | // implement node api stuff here 2 | 3 | const path = require('path') 4 | 5 | // react-image-lightbox expects window to be defined, 6 | // so we need to load in null during build, 7 | // which can’t reference globals like window, since it 8 | // isn’t running in the browser 9 | exports.onCreateWebpackConfig = ({ stage, loaders, actions }) => { 10 | if (stage === 'build-html') { 11 | actions.setWebpackConfig({ 12 | module: { 13 | rules: [ 14 | { 15 | test: /react-image-lightbox/, 16 | use: loaders.null() 17 | } 18 | ] 19 | } 20 | }) 21 | } 22 | } 23 | 24 | const toKebabCase = str => 25 | str && 26 | str 27 | .match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g) 28 | .map(x => x.toLowerCase()) 29 | .join('-') 30 | 31 | exports.onCreateNode = ({ node, getNode, actions }) => { 32 | const { createNodeField } = actions 33 | if (node.internal.type === 'ShopifyProducts') { 34 | // shortcut to getting the featured image 35 | const image = node.images.edges[0].node.src 36 | createNodeField({ 37 | node, 38 | name: 'image', 39 | value: image 40 | }) 41 | 42 | // slugify the title 43 | const slug = toKebabCase(node.title) 44 | createNodeField({ 45 | node, 46 | name: 'slug', 47 | value: slug 48 | }) 49 | } 50 | } 51 | 52 | exports.createPages = ({ graphql, actions }) => { 53 | const { createPage } = actions 54 | return new Promise((resolve, reject) => { 55 | graphql(` 56 | { 57 | allShopifyProducts { 58 | edges { 59 | node { 60 | fields { 61 | slug 62 | } 63 | } 64 | } 65 | } 66 | } 67 | `).then(result => { 68 | result.data.allShopifyProducts.edges.forEach(({ node }) => { 69 | createPage({ 70 | path: node.fields.slug, 71 | component: path.resolve('./src/templates/product.js'), 72 | context: { 73 | // Data passed to context is available 74 | // in page queries as GraphQL variables. 75 | slug: node.fields.slug 76 | } 77 | }) 78 | }) 79 | resolve() 80 | }) 81 | }) 82 | } 83 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "shop", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "repository": "https://github.com/hackclub/shop", 6 | "author": "merelinguist , zanedb ", 7 | "license": "MIT", 8 | "scripts": { 9 | "dev": "gatsby develop", 10 | "build": "gatsby build", 11 | "fmt": "npx prettier \"{gatsby-*.js,src/**/*.js}\" --single-quote --no-semi --write" 12 | }, 13 | "dependencies": { 14 | "@hackclub/design-system": "^0.0.1-14", 15 | "axios": "^0.18.0", 16 | "babel-plugin-styled-components": "^1.7.1", 17 | "formik": "^1.3.0", 18 | "fuse.js": "^3.2.1", 19 | "gatsby": "^2.0.11", 20 | "gatsby-plugin-canonical-urls": "^2.0.5", 21 | "gatsby-plugin-react-helmet": "^3.0.0", 22 | "gatsby-plugin-segment": "^1.0.2", 23 | "gatsby-plugin-styled-components": "^3.0.0", 24 | "graphql-client": "^2.0.1", 25 | "history": "^4.7.2", 26 | "react": "^16.5.2", 27 | "react-clipboard.js": "^2.0.1", 28 | "react-content-loader": "^3.1.2", 29 | "react-dom": "^16.5.2", 30 | "react-helmet": "^5.2.0", 31 | "react-image-lightbox": "^5.0.0", 32 | "react-lazyload-fadein": "^1.1.0", 33 | "react-overdrive": "^0.0.10", 34 | "react-scrolllock": "^3.0.2", 35 | "react-tilt": "^0.1.4", 36 | "react-transition-group": "^2.5.0", 37 | "react-visibility-sensor": "^4.1.1", 38 | "shopify-buy": "^1.8.0", 39 | "styled-components": "^3.4.9", 40 | "throttle-debounce": "^2.0.1", 41 | "yup": "^0.26.6" 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /plugins/gatsby-source-shopify-storefront/gatsby-node.js: -------------------------------------------------------------------------------- 1 | const crypto = require('crypto') 2 | 3 | const productQuery = require('./product-query') 4 | 5 | exports.sourceNodes = async ({ actions }, { siteName, accessToken }) => { 6 | const { createNode } = actions 7 | 8 | const client = require('graphql-client')({ 9 | url: `https://${siteName}.myshopify.com/api/graphql`, 10 | headers: { 11 | 'X-Shopify-Storefront-Access-Token': accessToken 12 | } 13 | }) 14 | 15 | const response = await client.query(productQuery) 16 | 17 | if ( 18 | response && 19 | response.data && 20 | response.data.shop && 21 | response.data.shop.products && 22 | response.data.shop.products.edges 23 | ) { 24 | response.data.shop.products.edges.forEach(({ node }) => { 25 | node.parent = null 26 | node.children = [] 27 | node.internal = { 28 | mediaType: 'application/json', 29 | type: 'ShopifyProducts', 30 | contentDigest: crypto 31 | .createHash('md5') 32 | .update(JSON.stringify(node)) 33 | .digest('hex'), 34 | content: JSON.stringify(node) 35 | } 36 | createNode(node) 37 | }) 38 | } 39 | 40 | return 41 | } 42 | -------------------------------------------------------------------------------- /plugins/gatsby-source-shopify-storefront/index.js: -------------------------------------------------------------------------------- 1 | // no-op -------------------------------------------------------------------------------- /plugins/gatsby-source-shopify-storefront/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gatsby-source-shopify-storefront", 3 | "dependencies": { 4 | "babel-runtime": "^6.26.0", 5 | "gatsby-node-helpers": "^0.3.0", 6 | "gatsby-source-filesystem": "^1.5.39", 7 | "graphql-client": "^2.0.1" 8 | }, 9 | "devDependencies": { 10 | "@babel/cli": "^7.0.0-rc.3", 11 | "@babel/core": "^7.0.0-rc.3", 12 | "cross-env": "^5.0.5" 13 | }, 14 | "scripts": { 15 | "build": "babel src --out-dir .", 16 | "watch": "babel -w src --out-dir .", 17 | "prepublish": "cross-env NODE_ENV=production npm run build" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /plugins/gatsby-source-shopify-storefront/product-query.js: -------------------------------------------------------------------------------- 1 | module.exports = `query ProductsQuery { 2 | shop { 3 | name 4 | products(first: 250, sortKey: UPDATED_AT) { 5 | pageInfo { 6 | hasNextPage 7 | hasPreviousPage 8 | } 9 | edges { 10 | node { 11 | id 12 | title 13 | createdAt 14 | updatedAt 15 | variants(first: 250) { 16 | pageInfo { 17 | hasNextPage 18 | hasPreviousPage 19 | } 20 | edges { 21 | node { 22 | id 23 | title 24 | selectedOptions { 25 | name 26 | value 27 | } 28 | image { 29 | src 30 | } 31 | price 32 | } 33 | } 34 | } 35 | images(first: 250) { 36 | pageInfo { 37 | hasNextPage 38 | hasPreviousPage 39 | } 40 | edges { 41 | node { 42 | id 43 | src 44 | } 45 | } 46 | } 47 | availableForSale 48 | description 49 | descriptionHtml 50 | productType 51 | tags 52 | } 53 | } 54 | } 55 | } 56 | }` 57 | -------------------------------------------------------------------------------- /plugins/gatsby-source-shopify-storefront/src/gatsby-node.js: -------------------------------------------------------------------------------- 1 | const crypto = require('crypto') 2 | const productQuery = require('./product-query') 3 | 4 | exports.sourceNodes = async ({ actions }, { siteName, accessToken }) => { 5 | const { createNode } = actions 6 | const client = require('graphql-client')({ 7 | url: `https://${siteName}.myshopify.com/api/graphql`, 8 | headers: { 9 | 'X-Shopify-Storefront-Access-Token': accessToken 10 | } 11 | }) 12 | 13 | const response = await client.query(productQuery) 14 | 15 | if ( 16 | response && 17 | response.data && 18 | response.data.shop && 19 | response.data.shop.products && 20 | response.data.shop.products.edges 21 | ) { 22 | response.data.shop.products.edges.forEach(({ node }) => { 23 | node.parent = null 24 | node.children = [] 25 | node.internal = { 26 | mediaType: 'application/json', 27 | type: 'ShopifyProducts', 28 | contentDigest: crypto 29 | .createHash('md5') 30 | .update(JSON.stringify(node)) 31 | .digest('hex'), 32 | content: JSON.stringify(node) 33 | } 34 | 35 | createNode(node) 36 | }) 37 | } 38 | 39 | return 40 | } 41 | -------------------------------------------------------------------------------- /plugins/gatsby-source-shopify-storefront/src/product-query.js: -------------------------------------------------------------------------------- 1 | module.exports = `query ProductsQuery { 2 | shop { 3 | name 4 | products(first: 250, sortKey: UPDATED_AT) { 5 | pageInfo { 6 | hasNextPage 7 | hasPreviousPage 8 | } 9 | edges { 10 | node { 11 | id 12 | title 13 | createdAt 14 | updatedAt 15 | variants(first: 250) { 16 | pageInfo { 17 | hasNextPage 18 | hasPreviousPage 19 | } 20 | edges { 21 | node { 22 | id 23 | title 24 | selectedOptions { 25 | name 26 | value 27 | } 28 | image { 29 | src 30 | } 31 | price 32 | } 33 | } 34 | } 35 | images(first: 250) { 36 | pageInfo { 37 | hasNextPage 38 | hasPreviousPage 39 | } 40 | edges { 41 | node { 42 | id 43 | src 44 | } 45 | } 46 | } 47 | availableForSale 48 | description 49 | descriptionHtml 50 | productType 51 | tags 52 | } 53 | } 54 | } 55 | } 56 | }` 57 | -------------------------------------------------------------------------------- /plugins/gatsby-source-shopify-storefront/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/cli@^7.0.0-rc.3": 6 | version "7.0.0-rc.3" 7 | resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.0.0-rc.3.tgz#bd4ce1abe34847609d10a74c02f878a7389ba6f1" 8 | dependencies: 9 | commander "^2.8.1" 10 | convert-source-map "^1.1.0" 11 | fs-readdir-recursive "^1.1.0" 12 | glob "^7.0.0" 13 | lodash "^4.17.10" 14 | mkdirp "^0.5.1" 15 | output-file-sync "^2.0.0" 16 | slash "^2.0.0" 17 | source-map "^0.5.0" 18 | optionalDependencies: 19 | chokidar "^2.0.3" 20 | 21 | "@babel/code-frame@7.0.0-rc.3": 22 | version "7.0.0-rc.3" 23 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-rc.3.tgz#d77a587401f818a3168700f596e41cd6905947b2" 24 | dependencies: 25 | "@babel/highlight" "7.0.0-rc.3" 26 | 27 | "@babel/core@^7.0.0-rc.3": 28 | version "7.0.0-rc.3" 29 | resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.0.0-rc.3.tgz#0c3b5c4fcc65ea3fc7c019202aca6cd0b17705e7" 30 | dependencies: 31 | "@babel/code-frame" "7.0.0-rc.3" 32 | "@babel/generator" "7.0.0-rc.3" 33 | "@babel/helpers" "7.0.0-rc.3" 34 | "@babel/parser" "7.0.0-rc.3" 35 | "@babel/template" "7.0.0-rc.3" 36 | "@babel/traverse" "7.0.0-rc.3" 37 | "@babel/types" "7.0.0-rc.3" 38 | convert-source-map "^1.1.0" 39 | debug "^3.1.0" 40 | json5 "^0.5.0" 41 | lodash "^4.17.10" 42 | resolve "^1.3.2" 43 | semver "^5.4.1" 44 | source-map "^0.5.0" 45 | 46 | "@babel/generator@7.0.0-rc.3": 47 | version "7.0.0-rc.3" 48 | resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-rc.3.tgz#3267085de2d9b8779bde79052ee5f7070d99a5ab" 49 | dependencies: 50 | "@babel/types" "7.0.0-rc.3" 51 | jsesc "^2.5.1" 52 | lodash "^4.17.10" 53 | source-map "^0.5.0" 54 | trim-right "^1.0.1" 55 | 56 | "@babel/helper-function-name@7.0.0-rc.3": 57 | version "7.0.0-rc.3" 58 | resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-rc.3.tgz#ddfb3793fe6ca13be7161afa045971b8e82f96e8" 59 | dependencies: 60 | "@babel/helper-get-function-arity" "7.0.0-rc.3" 61 | "@babel/template" "7.0.0-rc.3" 62 | "@babel/types" "7.0.0-rc.3" 63 | 64 | "@babel/helper-get-function-arity@7.0.0-rc.3": 65 | version "7.0.0-rc.3" 66 | resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-rc.3.tgz#b9fb083977e1639aac6c9c06b2de7b849aa6fea5" 67 | dependencies: 68 | "@babel/types" "7.0.0-rc.3" 69 | 70 | "@babel/helper-split-export-declaration@7.0.0-rc.3": 71 | version "7.0.0-rc.3" 72 | resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-rc.3.tgz#42ca01340ddb68ab471f81e6ff2c6270dbdbd113" 73 | dependencies: 74 | "@babel/types" "7.0.0-rc.3" 75 | 76 | "@babel/helpers@7.0.0-rc.3": 77 | version "7.0.0-rc.3" 78 | resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.0.0-rc.3.tgz#321c6b575d4d2c0e7b9f33ea085b8ecaa1965b24" 79 | dependencies: 80 | "@babel/template" "7.0.0-rc.3" 81 | "@babel/traverse" "7.0.0-rc.3" 82 | "@babel/types" "7.0.0-rc.3" 83 | 84 | "@babel/highlight@7.0.0-rc.3": 85 | version "7.0.0-rc.3" 86 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-rc.3.tgz#c2ee83f8e5c0c387279a8c48e06fef2e32027004" 87 | dependencies: 88 | chalk "^2.0.0" 89 | esutils "^2.0.2" 90 | js-tokens "^4.0.0" 91 | 92 | "@babel/parser@7.0.0-rc.3": 93 | version "7.0.0-rc.3" 94 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.0.0-rc.3.tgz#859d7b60ef6b939aab5f6d4f4bffbb7bafdc418b" 95 | 96 | "@babel/template@7.0.0-rc.3": 97 | version "7.0.0-rc.3" 98 | resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-rc.3.tgz#2ba7d00f86744762632d06a0ffb0494f8443581f" 99 | dependencies: 100 | "@babel/code-frame" "7.0.0-rc.3" 101 | "@babel/parser" "7.0.0-rc.3" 102 | "@babel/types" "7.0.0-rc.3" 103 | 104 | "@babel/traverse@7.0.0-rc.3": 105 | version "7.0.0-rc.3" 106 | resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-rc.3.tgz#bcf659e46d24244ab51379c849093f8c4e54d239" 107 | dependencies: 108 | "@babel/code-frame" "7.0.0-rc.3" 109 | "@babel/generator" "7.0.0-rc.3" 110 | "@babel/helper-function-name" "7.0.0-rc.3" 111 | "@babel/helper-split-export-declaration" "7.0.0-rc.3" 112 | "@babel/parser" "7.0.0-rc.3" 113 | "@babel/types" "7.0.0-rc.3" 114 | debug "^3.1.0" 115 | globals "^11.1.0" 116 | lodash "^4.17.10" 117 | 118 | "@babel/types@7.0.0-rc.3": 119 | version "7.0.0-rc.3" 120 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-rc.3.tgz#877ebc543b139f4a1e4c9bd8849c25ab9aea8f41" 121 | dependencies: 122 | esutils "^2.0.2" 123 | lodash "^4.17.10" 124 | to-fast-properties "^2.0.0" 125 | 126 | abbrev@1: 127 | version "1.1.1" 128 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 129 | 130 | ansi-regex@^2.0.0: 131 | version "2.1.1" 132 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 133 | 134 | ansi-regex@^3.0.0: 135 | version "3.0.0" 136 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 137 | 138 | ansi-styles@^2.2.1: 139 | version "2.2.1" 140 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 141 | 142 | ansi-styles@^3.2.1: 143 | version "3.2.1" 144 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 145 | dependencies: 146 | color-convert "^1.9.0" 147 | 148 | anymatch@^1.3.0: 149 | version "1.3.2" 150 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" 151 | dependencies: 152 | micromatch "^2.1.5" 153 | normalize-path "^2.0.0" 154 | 155 | anymatch@^2.0.0: 156 | version "2.0.0" 157 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" 158 | dependencies: 159 | micromatch "^3.1.4" 160 | normalize-path "^2.1.1" 161 | 162 | aproba@^1.0.3: 163 | version "1.2.0" 164 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 165 | 166 | are-we-there-yet@~1.1.2: 167 | version "1.1.5" 168 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" 169 | dependencies: 170 | delegates "^1.0.0" 171 | readable-stream "^2.0.6" 172 | 173 | arr-diff@^2.0.0: 174 | version "2.0.0" 175 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" 176 | dependencies: 177 | arr-flatten "^1.0.1" 178 | 179 | arr-diff@^4.0.0: 180 | version "4.0.0" 181 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" 182 | 183 | arr-flatten@^1.0.1, arr-flatten@^1.1.0: 184 | version "1.1.0" 185 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" 186 | 187 | arr-union@^3.1.0: 188 | version "3.1.0" 189 | resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" 190 | 191 | array-unique@^0.2.1: 192 | version "0.2.1" 193 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" 194 | 195 | array-unique@^0.3.2: 196 | version "0.3.2" 197 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" 198 | 199 | assign-symbols@^1.0.0: 200 | version "1.0.0" 201 | resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" 202 | 203 | async-each@^1.0.0: 204 | version "1.0.1" 205 | resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" 206 | 207 | atob@^2.1.1: 208 | version "2.1.2" 209 | resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" 210 | 211 | babel-cli@^6.26.0: 212 | version "6.26.0" 213 | resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1" 214 | dependencies: 215 | babel-core "^6.26.0" 216 | babel-polyfill "^6.26.0" 217 | babel-register "^6.26.0" 218 | babel-runtime "^6.26.0" 219 | commander "^2.11.0" 220 | convert-source-map "^1.5.0" 221 | fs-readdir-recursive "^1.0.0" 222 | glob "^7.1.2" 223 | lodash "^4.17.4" 224 | output-file-sync "^1.1.2" 225 | path-is-absolute "^1.0.1" 226 | slash "^1.0.0" 227 | source-map "^0.5.6" 228 | v8flags "^2.1.1" 229 | optionalDependencies: 230 | chokidar "^1.6.1" 231 | 232 | babel-code-frame@^6.26.0: 233 | version "6.26.0" 234 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" 235 | dependencies: 236 | chalk "^1.1.3" 237 | esutils "^2.0.2" 238 | js-tokens "^3.0.2" 239 | 240 | babel-core@^6.26.0: 241 | version "6.26.3" 242 | resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" 243 | dependencies: 244 | babel-code-frame "^6.26.0" 245 | babel-generator "^6.26.0" 246 | babel-helpers "^6.24.1" 247 | babel-messages "^6.23.0" 248 | babel-register "^6.26.0" 249 | babel-runtime "^6.26.0" 250 | babel-template "^6.26.0" 251 | babel-traverse "^6.26.0" 252 | babel-types "^6.26.0" 253 | babylon "^6.18.0" 254 | convert-source-map "^1.5.1" 255 | debug "^2.6.9" 256 | json5 "^0.5.1" 257 | lodash "^4.17.4" 258 | minimatch "^3.0.4" 259 | path-is-absolute "^1.0.1" 260 | private "^0.1.8" 261 | slash "^1.0.0" 262 | source-map "^0.5.7" 263 | 264 | babel-generator@^6.26.0: 265 | version "6.26.1" 266 | resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" 267 | dependencies: 268 | babel-messages "^6.23.0" 269 | babel-runtime "^6.26.0" 270 | babel-types "^6.26.0" 271 | detect-indent "^4.0.0" 272 | jsesc "^1.3.0" 273 | lodash "^4.17.4" 274 | source-map "^0.5.7" 275 | trim-right "^1.0.1" 276 | 277 | babel-helpers@^6.24.1: 278 | version "6.24.1" 279 | resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" 280 | dependencies: 281 | babel-runtime "^6.22.0" 282 | babel-template "^6.24.1" 283 | 284 | babel-messages@^6.23.0: 285 | version "6.23.0" 286 | resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" 287 | dependencies: 288 | babel-runtime "^6.22.0" 289 | 290 | babel-polyfill@^6.26.0: 291 | version "6.26.0" 292 | resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" 293 | dependencies: 294 | babel-runtime "^6.26.0" 295 | core-js "^2.5.0" 296 | regenerator-runtime "^0.10.5" 297 | 298 | babel-register@^6.26.0: 299 | version "6.26.0" 300 | resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" 301 | dependencies: 302 | babel-core "^6.26.0" 303 | babel-runtime "^6.26.0" 304 | core-js "^2.5.0" 305 | home-or-tmp "^2.0.0" 306 | lodash "^4.17.4" 307 | mkdirp "^0.5.1" 308 | source-map-support "^0.4.15" 309 | 310 | babel-runtime@^6.22.0, babel-runtime@^6.26.0: 311 | version "6.26.0" 312 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" 313 | dependencies: 314 | core-js "^2.4.0" 315 | regenerator-runtime "^0.11.0" 316 | 317 | babel-template@^6.24.1, babel-template@^6.26.0: 318 | version "6.26.0" 319 | resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" 320 | dependencies: 321 | babel-runtime "^6.26.0" 322 | babel-traverse "^6.26.0" 323 | babel-types "^6.26.0" 324 | babylon "^6.18.0" 325 | lodash "^4.17.4" 326 | 327 | babel-traverse@^6.26.0: 328 | version "6.26.0" 329 | resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" 330 | dependencies: 331 | babel-code-frame "^6.26.0" 332 | babel-messages "^6.23.0" 333 | babel-runtime "^6.26.0" 334 | babel-types "^6.26.0" 335 | babylon "^6.18.0" 336 | debug "^2.6.8" 337 | globals "^9.18.0" 338 | invariant "^2.2.2" 339 | lodash "^4.17.4" 340 | 341 | babel-types@^6.26.0: 342 | version "6.26.0" 343 | resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" 344 | dependencies: 345 | babel-runtime "^6.26.0" 346 | esutils "^2.0.2" 347 | lodash "^4.17.4" 348 | to-fast-properties "^1.0.3" 349 | 350 | babylon@^6.18.0: 351 | version "6.18.0" 352 | resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" 353 | 354 | balanced-match@^1.0.0: 355 | version "1.0.0" 356 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 357 | 358 | base@^0.11.1: 359 | version "0.11.2" 360 | resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" 361 | dependencies: 362 | cache-base "^1.0.1" 363 | class-utils "^0.3.5" 364 | component-emitter "^1.2.1" 365 | define-property "^1.0.0" 366 | isobject "^3.0.1" 367 | mixin-deep "^1.2.0" 368 | pascalcase "^0.1.1" 369 | 370 | better-queue-memory@^1.0.1: 371 | version "1.0.2" 372 | resolved "https://registry.yarnpkg.com/better-queue-memory/-/better-queue-memory-1.0.2.tgz#aa6d169aa1d0cc77409185cb9cb5c7dc251bcd41" 373 | 374 | better-queue@^3.8.7: 375 | version "3.8.10" 376 | resolved "https://registry.yarnpkg.com/better-queue/-/better-queue-3.8.10.tgz#1c93b9ec4cb3d1b72eb91d0efcb84fc80e8c6835" 377 | dependencies: 378 | better-queue-memory "^1.0.1" 379 | node-eta "^0.9.0" 380 | uuid "^3.0.0" 381 | 382 | binary-extensions@^1.0.0: 383 | version "1.11.0" 384 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" 385 | 386 | bluebird@^3.5.0: 387 | version "3.5.1" 388 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" 389 | 390 | brace-expansion@^1.1.7: 391 | version "1.1.11" 392 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 393 | dependencies: 394 | balanced-match "^1.0.0" 395 | concat-map "0.0.1" 396 | 397 | braces@^1.8.2: 398 | version "1.8.5" 399 | resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" 400 | dependencies: 401 | expand-range "^1.8.1" 402 | preserve "^0.2.0" 403 | repeat-element "^1.1.2" 404 | 405 | braces@^2.3.0, braces@^2.3.1: 406 | version "2.3.2" 407 | resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" 408 | dependencies: 409 | arr-flatten "^1.1.0" 410 | array-unique "^0.3.2" 411 | extend-shallow "^2.0.1" 412 | fill-range "^4.0.0" 413 | isobject "^3.0.1" 414 | repeat-element "^1.1.2" 415 | snapdragon "^0.8.1" 416 | snapdragon-node "^2.0.1" 417 | split-string "^3.0.2" 418 | to-regex "^3.0.1" 419 | 420 | buffer-alloc-unsafe@^1.1.0: 421 | version "1.1.0" 422 | resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" 423 | 424 | buffer-alloc@^1.1.0: 425 | version "1.2.0" 426 | resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" 427 | dependencies: 428 | buffer-alloc-unsafe "^1.1.0" 429 | buffer-fill "^1.0.0" 430 | 431 | buffer-fill@^1.0.0: 432 | version "1.0.0" 433 | resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" 434 | 435 | cache-base@^1.0.1: 436 | version "1.0.1" 437 | resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" 438 | dependencies: 439 | collection-visit "^1.0.0" 440 | component-emitter "^1.2.1" 441 | get-value "^2.0.6" 442 | has-value "^1.0.0" 443 | isobject "^3.0.1" 444 | set-value "^2.0.0" 445 | to-object-path "^0.3.0" 446 | union-value "^1.0.0" 447 | unset-value "^1.0.0" 448 | 449 | chalk@^1.1.3: 450 | version "1.1.3" 451 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 452 | dependencies: 453 | ansi-styles "^2.2.1" 454 | escape-string-regexp "^1.0.2" 455 | has-ansi "^2.0.0" 456 | strip-ansi "^3.0.0" 457 | supports-color "^2.0.0" 458 | 459 | chalk@^2.0.0: 460 | version "2.4.1" 461 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" 462 | dependencies: 463 | ansi-styles "^3.2.1" 464 | escape-string-regexp "^1.0.5" 465 | supports-color "^5.3.0" 466 | 467 | chokidar@^1.6.1, chokidar@^1.7.0: 468 | version "1.7.0" 469 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" 470 | dependencies: 471 | anymatch "^1.3.0" 472 | async-each "^1.0.0" 473 | glob-parent "^2.0.0" 474 | inherits "^2.0.1" 475 | is-binary-path "^1.0.0" 476 | is-glob "^2.0.0" 477 | path-is-absolute "^1.0.0" 478 | readdirp "^2.0.0" 479 | optionalDependencies: 480 | fsevents "^1.0.0" 481 | 482 | chokidar@^2.0.3: 483 | version "2.0.4" 484 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" 485 | dependencies: 486 | anymatch "^2.0.0" 487 | async-each "^1.0.0" 488 | braces "^2.3.0" 489 | glob-parent "^3.1.0" 490 | inherits "^2.0.1" 491 | is-binary-path "^1.0.0" 492 | is-glob "^4.0.0" 493 | lodash.debounce "^4.0.8" 494 | normalize-path "^2.1.1" 495 | path-is-absolute "^1.0.0" 496 | readdirp "^2.0.0" 497 | upath "^1.0.5" 498 | optionalDependencies: 499 | fsevents "^1.2.2" 500 | 501 | chownr@^1.0.1: 502 | version "1.0.1" 503 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" 504 | 505 | class-utils@^0.3.5: 506 | version "0.3.6" 507 | resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" 508 | dependencies: 509 | arr-union "^3.1.0" 510 | define-property "^0.2.5" 511 | isobject "^3.0.0" 512 | static-extend "^0.1.1" 513 | 514 | code-point-at@^1.0.0: 515 | version "1.1.0" 516 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 517 | 518 | collection-visit@^1.0.0: 519 | version "1.0.0" 520 | resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" 521 | dependencies: 522 | map-visit "^1.0.0" 523 | object-visit "^1.0.0" 524 | 525 | color-convert@^1.9.0: 526 | version "1.9.2" 527 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147" 528 | dependencies: 529 | color-name "1.1.1" 530 | 531 | color-name@1.1.1: 532 | version "1.1.1" 533 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" 534 | 535 | commander@^2.11.0, commander@^2.8.1: 536 | version "2.17.1" 537 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" 538 | 539 | component-emitter@^1.2.1: 540 | version "1.2.1" 541 | resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" 542 | 543 | concat-map@0.0.1: 544 | version "0.0.1" 545 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 546 | 547 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 548 | version "1.1.0" 549 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 550 | 551 | convert-source-map@^1.1.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1: 552 | version "1.5.1" 553 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" 554 | 555 | copy-descriptor@^0.1.0: 556 | version "0.1.1" 557 | resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" 558 | 559 | core-js@^2.4.0, core-js@^2.5.0: 560 | version "2.5.7" 561 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" 562 | 563 | core-util-is@~1.0.0: 564 | version "1.0.2" 565 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 566 | 567 | cross-env@^5.0.5: 568 | version "5.2.0" 569 | resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.2.0.tgz#6ecd4c015d5773e614039ee529076669b9d126f2" 570 | dependencies: 571 | cross-spawn "^6.0.5" 572 | is-windows "^1.0.0" 573 | 574 | cross-spawn@^6.0.5: 575 | version "6.0.5" 576 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 577 | dependencies: 578 | nice-try "^1.0.4" 579 | path-key "^2.0.1" 580 | semver "^5.5.0" 581 | shebang-command "^1.2.0" 582 | which "^1.2.9" 583 | 584 | debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: 585 | version "2.6.9" 586 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 587 | dependencies: 588 | ms "2.0.0" 589 | 590 | debug@^3.1.0: 591 | version "3.1.0" 592 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 593 | dependencies: 594 | ms "2.0.0" 595 | 596 | decode-uri-component@^0.2.0: 597 | version "0.2.0" 598 | resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" 599 | 600 | decompress-response@^3.2.0: 601 | version "3.3.0" 602 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" 603 | dependencies: 604 | mimic-response "^1.0.0" 605 | 606 | deep-extend@^0.6.0: 607 | version "0.6.0" 608 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 609 | 610 | define-property@^0.2.5: 611 | version "0.2.5" 612 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" 613 | dependencies: 614 | is-descriptor "^0.1.0" 615 | 616 | define-property@^1.0.0: 617 | version "1.0.0" 618 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" 619 | dependencies: 620 | is-descriptor "^1.0.0" 621 | 622 | define-property@^2.0.2: 623 | version "2.0.2" 624 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" 625 | dependencies: 626 | is-descriptor "^1.0.2" 627 | isobject "^3.0.1" 628 | 629 | delegates@^1.0.0: 630 | version "1.0.0" 631 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 632 | 633 | detect-indent@^4.0.0: 634 | version "4.0.0" 635 | resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" 636 | dependencies: 637 | repeating "^2.0.0" 638 | 639 | detect-libc@^1.0.2: 640 | version "1.0.3" 641 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" 642 | 643 | duplexer3@^0.1.4: 644 | version "0.1.4" 645 | resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" 646 | 647 | encoding@^0.1.11: 648 | version "0.1.12" 649 | resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" 650 | dependencies: 651 | iconv-lite "~0.4.13" 652 | 653 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 654 | version "1.0.5" 655 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 656 | 657 | esutils@^2.0.2: 658 | version "2.0.2" 659 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 660 | 661 | expand-brackets@^0.1.4: 662 | version "0.1.5" 663 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" 664 | dependencies: 665 | is-posix-bracket "^0.1.0" 666 | 667 | expand-brackets@^2.1.4: 668 | version "2.1.4" 669 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" 670 | dependencies: 671 | debug "^2.3.3" 672 | define-property "^0.2.5" 673 | extend-shallow "^2.0.1" 674 | posix-character-classes "^0.1.0" 675 | regex-not "^1.0.0" 676 | snapdragon "^0.8.1" 677 | to-regex "^3.0.1" 678 | 679 | expand-range@^1.8.1: 680 | version "1.8.2" 681 | resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" 682 | dependencies: 683 | fill-range "^2.1.0" 684 | 685 | extend-shallow@^2.0.1: 686 | version "2.0.1" 687 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" 688 | dependencies: 689 | is-extendable "^0.1.0" 690 | 691 | extend-shallow@^3.0.0, extend-shallow@^3.0.2: 692 | version "3.0.2" 693 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" 694 | dependencies: 695 | assign-symbols "^1.0.0" 696 | is-extendable "^1.0.1" 697 | 698 | extglob@^0.3.1: 699 | version "0.3.2" 700 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" 701 | dependencies: 702 | is-extglob "^1.0.0" 703 | 704 | extglob@^2.0.4: 705 | version "2.0.4" 706 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" 707 | dependencies: 708 | array-unique "^0.3.2" 709 | define-property "^1.0.0" 710 | expand-brackets "^2.1.4" 711 | extend-shallow "^2.0.1" 712 | fragment-cache "^0.2.1" 713 | regex-not "^1.0.0" 714 | snapdragon "^0.8.1" 715 | to-regex "^3.0.1" 716 | 717 | filename-regex@^2.0.0: 718 | version "2.0.1" 719 | resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" 720 | 721 | fill-range@^2.1.0: 722 | version "2.2.4" 723 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" 724 | dependencies: 725 | is-number "^2.1.0" 726 | isobject "^2.0.0" 727 | randomatic "^3.0.0" 728 | repeat-element "^1.1.2" 729 | repeat-string "^1.5.2" 730 | 731 | fill-range@^4.0.0: 732 | version "4.0.0" 733 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" 734 | dependencies: 735 | extend-shallow "^2.0.1" 736 | is-number "^3.0.0" 737 | repeat-string "^1.6.1" 738 | to-regex-range "^2.1.0" 739 | 740 | for-in@^1.0.1, for-in@^1.0.2: 741 | version "1.0.2" 742 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 743 | 744 | for-own@^0.1.4: 745 | version "0.1.5" 746 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" 747 | dependencies: 748 | for-in "^1.0.1" 749 | 750 | fragment-cache@^0.2.1: 751 | version "0.2.1" 752 | resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" 753 | dependencies: 754 | map-cache "^0.2.2" 755 | 756 | fs-extra@^4.0.1: 757 | version "4.0.3" 758 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" 759 | dependencies: 760 | graceful-fs "^4.1.2" 761 | jsonfile "^4.0.0" 762 | universalify "^0.1.0" 763 | 764 | fs-minipass@^1.2.5: 765 | version "1.2.5" 766 | resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" 767 | dependencies: 768 | minipass "^2.2.1" 769 | 770 | fs-readdir-recursive@^1.0.0, fs-readdir-recursive@^1.1.0: 771 | version "1.1.0" 772 | resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" 773 | 774 | fs.realpath@^1.0.0: 775 | version "1.0.0" 776 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 777 | 778 | fsevents@^1.0.0, fsevents@^1.2.2: 779 | version "1.2.4" 780 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" 781 | dependencies: 782 | nan "^2.9.2" 783 | node-pre-gyp "^0.10.0" 784 | 785 | gatsby-node-helpers@^0.3.0: 786 | version "0.3.0" 787 | resolved "https://registry.yarnpkg.com/gatsby-node-helpers/-/gatsby-node-helpers-0.3.0.tgz#3bdca3b7902a702a5834fef280ad66d51099d57c" 788 | dependencies: 789 | json-stringify-safe "^5.0.1" 790 | lodash "^4.17.4" 791 | p-is-promise "^1.1.0" 792 | 793 | gatsby-source-filesystem@^1.5.39: 794 | version "1.5.39" 795 | resolved "https://registry.yarnpkg.com/gatsby-source-filesystem/-/gatsby-source-filesystem-1.5.39.tgz#c7e49b7809632b53c827e66ff3ee0ba74ef62dd8" 796 | dependencies: 797 | babel-cli "^6.26.0" 798 | babel-runtime "^6.26.0" 799 | better-queue "^3.8.7" 800 | bluebird "^3.5.0" 801 | chokidar "^1.7.0" 802 | fs-extra "^4.0.1" 803 | got "^7.1.0" 804 | md5-file "^3.1.1" 805 | mime "^1.3.6" 806 | pretty-bytes "^4.0.2" 807 | slash "^1.0.0" 808 | valid-url "^1.0.9" 809 | 810 | gauge@~2.7.3: 811 | version "2.7.4" 812 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 813 | dependencies: 814 | aproba "^1.0.3" 815 | console-control-strings "^1.0.0" 816 | has-unicode "^2.0.0" 817 | object-assign "^4.1.0" 818 | signal-exit "^3.0.0" 819 | string-width "^1.0.1" 820 | strip-ansi "^3.0.1" 821 | wide-align "^1.1.0" 822 | 823 | get-stream@^3.0.0: 824 | version "3.0.0" 825 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" 826 | 827 | get-value@^2.0.3, get-value@^2.0.6: 828 | version "2.0.6" 829 | resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" 830 | 831 | glob-base@^0.3.0: 832 | version "0.3.0" 833 | resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" 834 | dependencies: 835 | glob-parent "^2.0.0" 836 | is-glob "^2.0.0" 837 | 838 | glob-parent@^2.0.0: 839 | version "2.0.0" 840 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" 841 | dependencies: 842 | is-glob "^2.0.0" 843 | 844 | glob-parent@^3.1.0: 845 | version "3.1.0" 846 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" 847 | dependencies: 848 | is-glob "^3.1.0" 849 | path-dirname "^1.0.0" 850 | 851 | glob@^7.0.0, glob@^7.0.5, glob@^7.1.2: 852 | version "7.1.2" 853 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 854 | dependencies: 855 | fs.realpath "^1.0.0" 856 | inflight "^1.0.4" 857 | inherits "2" 858 | minimatch "^3.0.4" 859 | once "^1.3.0" 860 | path-is-absolute "^1.0.0" 861 | 862 | globals@^11.1.0: 863 | version "11.7.0" 864 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" 865 | 866 | globals@^9.18.0: 867 | version "9.18.0" 868 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" 869 | 870 | got@^7.1.0: 871 | version "7.1.0" 872 | resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" 873 | dependencies: 874 | decompress-response "^3.2.0" 875 | duplexer3 "^0.1.4" 876 | get-stream "^3.0.0" 877 | is-plain-obj "^1.1.0" 878 | is-retry-allowed "^1.0.0" 879 | is-stream "^1.0.0" 880 | isurl "^1.0.0-alpha5" 881 | lowercase-keys "^1.0.0" 882 | p-cancelable "^0.3.0" 883 | p-timeout "^1.1.1" 884 | safe-buffer "^5.0.1" 885 | timed-out "^4.0.0" 886 | url-parse-lax "^1.0.0" 887 | url-to-options "^1.0.1" 888 | 889 | graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6: 890 | version "4.1.11" 891 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 892 | 893 | graphql-client@^2.0.1: 894 | version "2.0.1" 895 | resolved "https://registry.yarnpkg.com/graphql-client/-/graphql-client-2.0.1.tgz#d4a85a9fd2b04a0ef732e242250fac132579a4da" 896 | dependencies: 897 | isomorphic-fetch "^2.2.1" 898 | 899 | has-ansi@^2.0.0: 900 | version "2.0.0" 901 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 902 | dependencies: 903 | ansi-regex "^2.0.0" 904 | 905 | has-flag@^3.0.0: 906 | version "3.0.0" 907 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 908 | 909 | has-symbol-support-x@^1.4.1: 910 | version "1.4.2" 911 | resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" 912 | 913 | has-to-string-tag-x@^1.2.0: 914 | version "1.4.1" 915 | resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" 916 | dependencies: 917 | has-symbol-support-x "^1.4.1" 918 | 919 | has-unicode@^2.0.0: 920 | version "2.0.1" 921 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 922 | 923 | has-value@^0.3.1: 924 | version "0.3.1" 925 | resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" 926 | dependencies: 927 | get-value "^2.0.3" 928 | has-values "^0.1.4" 929 | isobject "^2.0.0" 930 | 931 | has-value@^1.0.0: 932 | version "1.0.0" 933 | resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" 934 | dependencies: 935 | get-value "^2.0.6" 936 | has-values "^1.0.0" 937 | isobject "^3.0.0" 938 | 939 | has-values@^0.1.4: 940 | version "0.1.4" 941 | resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" 942 | 943 | has-values@^1.0.0: 944 | version "1.0.0" 945 | resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" 946 | dependencies: 947 | is-number "^3.0.0" 948 | kind-of "^4.0.0" 949 | 950 | home-or-tmp@^2.0.0: 951 | version "2.0.0" 952 | resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" 953 | dependencies: 954 | os-homedir "^1.0.0" 955 | os-tmpdir "^1.0.1" 956 | 957 | iconv-lite@^0.4.4, iconv-lite@~0.4.13: 958 | version "0.4.24" 959 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 960 | dependencies: 961 | safer-buffer ">= 2.1.2 < 3" 962 | 963 | ignore-walk@^3.0.1: 964 | version "3.0.1" 965 | resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" 966 | dependencies: 967 | minimatch "^3.0.4" 968 | 969 | inflight@^1.0.4: 970 | version "1.0.6" 971 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 972 | dependencies: 973 | once "^1.3.0" 974 | wrappy "1" 975 | 976 | inherits@2, inherits@^2.0.1, inherits@~2.0.3: 977 | version "2.0.3" 978 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 979 | 980 | ini@~1.3.0: 981 | version "1.3.5" 982 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" 983 | 984 | invariant@^2.2.2: 985 | version "2.2.4" 986 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" 987 | dependencies: 988 | loose-envify "^1.0.0" 989 | 990 | is-accessor-descriptor@^0.1.6: 991 | version "0.1.6" 992 | resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" 993 | dependencies: 994 | kind-of "^3.0.2" 995 | 996 | is-accessor-descriptor@^1.0.0: 997 | version "1.0.0" 998 | resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" 999 | dependencies: 1000 | kind-of "^6.0.0" 1001 | 1002 | is-binary-path@^1.0.0: 1003 | version "1.0.1" 1004 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" 1005 | dependencies: 1006 | binary-extensions "^1.0.0" 1007 | 1008 | is-buffer@^1.1.5: 1009 | version "1.1.6" 1010 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 1011 | 1012 | is-data-descriptor@^0.1.4: 1013 | version "0.1.4" 1014 | resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" 1015 | dependencies: 1016 | kind-of "^3.0.2" 1017 | 1018 | is-data-descriptor@^1.0.0: 1019 | version "1.0.0" 1020 | resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" 1021 | dependencies: 1022 | kind-of "^6.0.0" 1023 | 1024 | is-descriptor@^0.1.0: 1025 | version "0.1.6" 1026 | resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" 1027 | dependencies: 1028 | is-accessor-descriptor "^0.1.6" 1029 | is-data-descriptor "^0.1.4" 1030 | kind-of "^5.0.0" 1031 | 1032 | is-descriptor@^1.0.0, is-descriptor@^1.0.2: 1033 | version "1.0.2" 1034 | resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" 1035 | dependencies: 1036 | is-accessor-descriptor "^1.0.0" 1037 | is-data-descriptor "^1.0.0" 1038 | kind-of "^6.0.2" 1039 | 1040 | is-dotfile@^1.0.0: 1041 | version "1.0.3" 1042 | resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" 1043 | 1044 | is-equal-shallow@^0.1.3: 1045 | version "0.1.3" 1046 | resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" 1047 | dependencies: 1048 | is-primitive "^2.0.0" 1049 | 1050 | is-extendable@^0.1.0, is-extendable@^0.1.1: 1051 | version "0.1.1" 1052 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 1053 | 1054 | is-extendable@^1.0.1: 1055 | version "1.0.1" 1056 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" 1057 | dependencies: 1058 | is-plain-object "^2.0.4" 1059 | 1060 | is-extglob@^1.0.0: 1061 | version "1.0.0" 1062 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" 1063 | 1064 | is-extglob@^2.1.0, is-extglob@^2.1.1: 1065 | version "2.1.1" 1066 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1067 | 1068 | is-finite@^1.0.0: 1069 | version "1.0.2" 1070 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 1071 | dependencies: 1072 | number-is-nan "^1.0.0" 1073 | 1074 | is-fullwidth-code-point@^1.0.0: 1075 | version "1.0.0" 1076 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 1077 | dependencies: 1078 | number-is-nan "^1.0.0" 1079 | 1080 | is-fullwidth-code-point@^2.0.0: 1081 | version "2.0.0" 1082 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 1083 | 1084 | is-glob@^2.0.0, is-glob@^2.0.1: 1085 | version "2.0.1" 1086 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" 1087 | dependencies: 1088 | is-extglob "^1.0.0" 1089 | 1090 | is-glob@^3.1.0: 1091 | version "3.1.0" 1092 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" 1093 | dependencies: 1094 | is-extglob "^2.1.0" 1095 | 1096 | is-glob@^4.0.0: 1097 | version "4.0.0" 1098 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" 1099 | dependencies: 1100 | is-extglob "^2.1.1" 1101 | 1102 | is-number@^2.1.0: 1103 | version "2.1.0" 1104 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" 1105 | dependencies: 1106 | kind-of "^3.0.2" 1107 | 1108 | is-number@^3.0.0: 1109 | version "3.0.0" 1110 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" 1111 | dependencies: 1112 | kind-of "^3.0.2" 1113 | 1114 | is-number@^4.0.0: 1115 | version "4.0.0" 1116 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" 1117 | 1118 | is-object@^1.0.1: 1119 | version "1.0.1" 1120 | resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" 1121 | 1122 | is-plain-obj@^1.1.0: 1123 | version "1.1.0" 1124 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" 1125 | 1126 | is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: 1127 | version "2.0.4" 1128 | resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" 1129 | dependencies: 1130 | isobject "^3.0.1" 1131 | 1132 | is-posix-bracket@^0.1.0: 1133 | version "0.1.1" 1134 | resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" 1135 | 1136 | is-primitive@^2.0.0: 1137 | version "2.0.0" 1138 | resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" 1139 | 1140 | is-retry-allowed@^1.0.0: 1141 | version "1.1.0" 1142 | resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" 1143 | 1144 | is-stream@^1.0.0, is-stream@^1.0.1: 1145 | version "1.1.0" 1146 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 1147 | 1148 | is-windows@^1.0.0, is-windows@^1.0.2: 1149 | version "1.0.2" 1150 | resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" 1151 | 1152 | isarray@1.0.0, isarray@~1.0.0: 1153 | version "1.0.0" 1154 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1155 | 1156 | isexe@^2.0.0: 1157 | version "2.0.0" 1158 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1159 | 1160 | isobject@^2.0.0: 1161 | version "2.1.0" 1162 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 1163 | dependencies: 1164 | isarray "1.0.0" 1165 | 1166 | isobject@^3.0.0, isobject@^3.0.1: 1167 | version "3.0.1" 1168 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 1169 | 1170 | isomorphic-fetch@^2.2.1: 1171 | version "2.2.1" 1172 | resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" 1173 | dependencies: 1174 | node-fetch "^1.0.1" 1175 | whatwg-fetch ">=0.10.0" 1176 | 1177 | isurl@^1.0.0-alpha5: 1178 | version "1.0.0" 1179 | resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" 1180 | dependencies: 1181 | has-to-string-tag-x "^1.2.0" 1182 | is-object "^1.0.1" 1183 | 1184 | "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: 1185 | version "4.0.0" 1186 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 1187 | 1188 | js-tokens@^3.0.2: 1189 | version "3.0.2" 1190 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 1191 | 1192 | jsesc@^1.3.0: 1193 | version "1.3.0" 1194 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" 1195 | 1196 | jsesc@^2.5.1: 1197 | version "2.5.1" 1198 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" 1199 | 1200 | json-stringify-safe@^5.0.1: 1201 | version "5.0.1" 1202 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 1203 | 1204 | json5@^0.5.0, json5@^0.5.1: 1205 | version "0.5.1" 1206 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" 1207 | 1208 | jsonfile@^4.0.0: 1209 | version "4.0.0" 1210 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 1211 | optionalDependencies: 1212 | graceful-fs "^4.1.6" 1213 | 1214 | kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: 1215 | version "3.2.2" 1216 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 1217 | dependencies: 1218 | is-buffer "^1.1.5" 1219 | 1220 | kind-of@^4.0.0: 1221 | version "4.0.0" 1222 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" 1223 | dependencies: 1224 | is-buffer "^1.1.5" 1225 | 1226 | kind-of@^5.0.0: 1227 | version "5.1.0" 1228 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" 1229 | 1230 | kind-of@^6.0.0, kind-of@^6.0.2: 1231 | version "6.0.2" 1232 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" 1233 | 1234 | lodash.debounce@^4.0.8: 1235 | version "4.0.8" 1236 | resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" 1237 | 1238 | lodash@^4.17.10, lodash@^4.17.4: 1239 | version "4.17.15" 1240 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" 1241 | 1242 | loose-envify@^1.0.0: 1243 | version "1.4.0" 1244 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" 1245 | dependencies: 1246 | js-tokens "^3.0.0 || ^4.0.0" 1247 | 1248 | lowercase-keys@^1.0.0: 1249 | version "1.0.1" 1250 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" 1251 | 1252 | map-cache@^0.2.2: 1253 | version "0.2.2" 1254 | resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" 1255 | 1256 | map-visit@^1.0.0: 1257 | version "1.0.0" 1258 | resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" 1259 | dependencies: 1260 | object-visit "^1.0.0" 1261 | 1262 | math-random@^1.0.1: 1263 | version "1.0.1" 1264 | resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" 1265 | 1266 | md5-file@^3.1.1: 1267 | version "3.2.3" 1268 | resolved "https://registry.yarnpkg.com/md5-file/-/md5-file-3.2.3.tgz#f9bceb941eca2214a4c0727f5e700314e770f06f" 1269 | dependencies: 1270 | buffer-alloc "^1.1.0" 1271 | 1272 | micromatch@^2.1.5: 1273 | version "2.3.11" 1274 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" 1275 | dependencies: 1276 | arr-diff "^2.0.0" 1277 | array-unique "^0.2.1" 1278 | braces "^1.8.2" 1279 | expand-brackets "^0.1.4" 1280 | extglob "^0.3.1" 1281 | filename-regex "^2.0.0" 1282 | is-extglob "^1.0.0" 1283 | is-glob "^2.0.1" 1284 | kind-of "^3.0.2" 1285 | normalize-path "^2.0.1" 1286 | object.omit "^2.0.0" 1287 | parse-glob "^3.0.4" 1288 | regex-cache "^0.4.2" 1289 | 1290 | micromatch@^3.1.4: 1291 | version "3.1.10" 1292 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" 1293 | dependencies: 1294 | arr-diff "^4.0.0" 1295 | array-unique "^0.3.2" 1296 | braces "^2.3.1" 1297 | define-property "^2.0.2" 1298 | extend-shallow "^3.0.2" 1299 | extglob "^2.0.4" 1300 | fragment-cache "^0.2.1" 1301 | kind-of "^6.0.2" 1302 | nanomatch "^1.2.9" 1303 | object.pick "^1.3.0" 1304 | regex-not "^1.0.0" 1305 | snapdragon "^0.8.1" 1306 | to-regex "^3.0.2" 1307 | 1308 | mime@^1.3.6: 1309 | version "1.6.0" 1310 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 1311 | 1312 | mimic-response@^1.0.0: 1313 | version "1.0.1" 1314 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" 1315 | 1316 | minimatch@^3.0.2, minimatch@^3.0.4: 1317 | version "3.0.4" 1318 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1319 | dependencies: 1320 | brace-expansion "^1.1.7" 1321 | 1322 | minimist@0.0.8: 1323 | version "0.0.8" 1324 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1325 | 1326 | minimist@^1.2.0: 1327 | version "1.2.0" 1328 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1329 | 1330 | minipass@^2.2.1, minipass@^2.3.3: 1331 | version "2.3.4" 1332 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.4.tgz#4768d7605ed6194d6d576169b9e12ef71e9d9957" 1333 | dependencies: 1334 | safe-buffer "^5.1.2" 1335 | yallist "^3.0.0" 1336 | 1337 | minizlib@^1.1.0: 1338 | version "1.1.0" 1339 | resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" 1340 | dependencies: 1341 | minipass "^2.2.1" 1342 | 1343 | mixin-deep@^1.2.0: 1344 | version "1.3.1" 1345 | resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" 1346 | dependencies: 1347 | for-in "^1.0.2" 1348 | is-extendable "^1.0.1" 1349 | 1350 | mkdirp@^0.5.0, mkdirp@^0.5.1: 1351 | version "0.5.1" 1352 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1353 | dependencies: 1354 | minimist "0.0.8" 1355 | 1356 | ms@2.0.0: 1357 | version "2.0.0" 1358 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1359 | 1360 | nan@^2.9.2: 1361 | version "2.11.0" 1362 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.0.tgz#574e360e4d954ab16966ec102c0c049fd961a099" 1363 | 1364 | nanomatch@^1.2.9: 1365 | version "1.2.13" 1366 | resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" 1367 | dependencies: 1368 | arr-diff "^4.0.0" 1369 | array-unique "^0.3.2" 1370 | define-property "^2.0.2" 1371 | extend-shallow "^3.0.2" 1372 | fragment-cache "^0.2.1" 1373 | is-windows "^1.0.2" 1374 | kind-of "^6.0.2" 1375 | object.pick "^1.3.0" 1376 | regex-not "^1.0.0" 1377 | snapdragon "^0.8.1" 1378 | to-regex "^3.0.1" 1379 | 1380 | needle@^2.2.1: 1381 | version "2.2.2" 1382 | resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.2.tgz#1120ca4c41f2fcc6976fd28a8968afe239929418" 1383 | dependencies: 1384 | debug "^2.1.2" 1385 | iconv-lite "^0.4.4" 1386 | sax "^1.2.4" 1387 | 1388 | nice-try@^1.0.4: 1389 | version "1.0.5" 1390 | resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" 1391 | 1392 | node-eta@^0.9.0: 1393 | version "0.9.0" 1394 | resolved "https://registry.yarnpkg.com/node-eta/-/node-eta-0.9.0.tgz#9fb0b099bcd2a021940e603c64254dc003d9a7a8" 1395 | 1396 | node-fetch@^1.0.1: 1397 | version "1.7.3" 1398 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" 1399 | dependencies: 1400 | encoding "^0.1.11" 1401 | is-stream "^1.0.1" 1402 | 1403 | node-pre-gyp@^0.10.0: 1404 | version "0.10.3" 1405 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" 1406 | dependencies: 1407 | detect-libc "^1.0.2" 1408 | mkdirp "^0.5.1" 1409 | needle "^2.2.1" 1410 | nopt "^4.0.1" 1411 | npm-packlist "^1.1.6" 1412 | npmlog "^4.0.2" 1413 | rc "^1.2.7" 1414 | rimraf "^2.6.1" 1415 | semver "^5.3.0" 1416 | tar "^4" 1417 | 1418 | nopt@^4.0.1: 1419 | version "4.0.1" 1420 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" 1421 | dependencies: 1422 | abbrev "1" 1423 | osenv "^0.1.4" 1424 | 1425 | normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: 1426 | version "2.1.1" 1427 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" 1428 | dependencies: 1429 | remove-trailing-separator "^1.0.1" 1430 | 1431 | npm-bundled@^1.0.1: 1432 | version "1.0.5" 1433 | resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" 1434 | 1435 | npm-packlist@^1.1.6: 1436 | version "1.1.11" 1437 | resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de" 1438 | dependencies: 1439 | ignore-walk "^3.0.1" 1440 | npm-bundled "^1.0.1" 1441 | 1442 | npmlog@^4.0.2: 1443 | version "4.1.2" 1444 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 1445 | dependencies: 1446 | are-we-there-yet "~1.1.2" 1447 | console-control-strings "~1.1.0" 1448 | gauge "~2.7.3" 1449 | set-blocking "~2.0.0" 1450 | 1451 | number-is-nan@^1.0.0: 1452 | version "1.0.1" 1453 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1454 | 1455 | object-assign@^4.1.0: 1456 | version "4.1.1" 1457 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1458 | 1459 | object-copy@^0.1.0: 1460 | version "0.1.0" 1461 | resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" 1462 | dependencies: 1463 | copy-descriptor "^0.1.0" 1464 | define-property "^0.2.5" 1465 | kind-of "^3.0.3" 1466 | 1467 | object-visit@^1.0.0: 1468 | version "1.0.1" 1469 | resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" 1470 | dependencies: 1471 | isobject "^3.0.0" 1472 | 1473 | object.omit@^2.0.0: 1474 | version "2.0.1" 1475 | resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" 1476 | dependencies: 1477 | for-own "^0.1.4" 1478 | is-extendable "^0.1.1" 1479 | 1480 | object.pick@^1.3.0: 1481 | version "1.3.0" 1482 | resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" 1483 | dependencies: 1484 | isobject "^3.0.1" 1485 | 1486 | once@^1.3.0: 1487 | version "1.4.0" 1488 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1489 | dependencies: 1490 | wrappy "1" 1491 | 1492 | os-homedir@^1.0.0: 1493 | version "1.0.2" 1494 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1495 | 1496 | os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: 1497 | version "1.0.2" 1498 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1499 | 1500 | osenv@^0.1.4: 1501 | version "0.1.5" 1502 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" 1503 | dependencies: 1504 | os-homedir "^1.0.0" 1505 | os-tmpdir "^1.0.0" 1506 | 1507 | output-file-sync@^1.1.2: 1508 | version "1.1.2" 1509 | resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" 1510 | dependencies: 1511 | graceful-fs "^4.1.4" 1512 | mkdirp "^0.5.1" 1513 | object-assign "^4.1.0" 1514 | 1515 | output-file-sync@^2.0.0: 1516 | version "2.0.1" 1517 | resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-2.0.1.tgz#f53118282f5f553c2799541792b723a4c71430c0" 1518 | dependencies: 1519 | graceful-fs "^4.1.11" 1520 | is-plain-obj "^1.1.0" 1521 | mkdirp "^0.5.1" 1522 | 1523 | p-cancelable@^0.3.0: 1524 | version "0.3.0" 1525 | resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" 1526 | 1527 | p-finally@^1.0.0: 1528 | version "1.0.0" 1529 | resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" 1530 | 1531 | p-is-promise@^1.1.0: 1532 | version "1.1.0" 1533 | resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" 1534 | 1535 | p-timeout@^1.1.1: 1536 | version "1.2.1" 1537 | resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" 1538 | dependencies: 1539 | p-finally "^1.0.0" 1540 | 1541 | parse-glob@^3.0.4: 1542 | version "3.0.4" 1543 | resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" 1544 | dependencies: 1545 | glob-base "^0.3.0" 1546 | is-dotfile "^1.0.0" 1547 | is-extglob "^1.0.0" 1548 | is-glob "^2.0.0" 1549 | 1550 | pascalcase@^0.1.1: 1551 | version "0.1.1" 1552 | resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" 1553 | 1554 | path-dirname@^1.0.0: 1555 | version "1.0.2" 1556 | resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" 1557 | 1558 | path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: 1559 | version "1.0.1" 1560 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1561 | 1562 | path-key@^2.0.1: 1563 | version "2.0.1" 1564 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 1565 | 1566 | path-parse@^1.0.5: 1567 | version "1.0.6" 1568 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 1569 | 1570 | posix-character-classes@^0.1.0: 1571 | version "0.1.1" 1572 | resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" 1573 | 1574 | prepend-http@^1.0.1: 1575 | version "1.0.4" 1576 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" 1577 | 1578 | preserve@^0.2.0: 1579 | version "0.2.0" 1580 | resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" 1581 | 1582 | pretty-bytes@^4.0.2: 1583 | version "4.0.2" 1584 | resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-4.0.2.tgz#b2bf82e7350d65c6c33aa95aaa5a4f6327f61cd9" 1585 | 1586 | private@^0.1.8: 1587 | version "0.1.8" 1588 | resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" 1589 | 1590 | process-nextick-args@~2.0.0: 1591 | version "2.0.0" 1592 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" 1593 | 1594 | randomatic@^3.0.0: 1595 | version "3.1.0" 1596 | resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.0.tgz#36f2ca708e9e567f5ed2ec01949026d50aa10116" 1597 | dependencies: 1598 | is-number "^4.0.0" 1599 | kind-of "^6.0.0" 1600 | math-random "^1.0.1" 1601 | 1602 | rc@^1.2.7: 1603 | version "1.2.8" 1604 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 1605 | dependencies: 1606 | deep-extend "^0.6.0" 1607 | ini "~1.3.0" 1608 | minimist "^1.2.0" 1609 | strip-json-comments "~2.0.1" 1610 | 1611 | readable-stream@^2.0.2, readable-stream@^2.0.6: 1612 | version "2.3.6" 1613 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 1614 | dependencies: 1615 | core-util-is "~1.0.0" 1616 | inherits "~2.0.3" 1617 | isarray "~1.0.0" 1618 | process-nextick-args "~2.0.0" 1619 | safe-buffer "~5.1.1" 1620 | string_decoder "~1.1.1" 1621 | util-deprecate "~1.0.1" 1622 | 1623 | readdirp@^2.0.0: 1624 | version "2.1.0" 1625 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" 1626 | dependencies: 1627 | graceful-fs "^4.1.2" 1628 | minimatch "^3.0.2" 1629 | readable-stream "^2.0.2" 1630 | set-immediate-shim "^1.0.1" 1631 | 1632 | regenerator-runtime@^0.10.5: 1633 | version "0.10.5" 1634 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" 1635 | 1636 | regenerator-runtime@^0.11.0: 1637 | version "0.11.1" 1638 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" 1639 | 1640 | regex-cache@^0.4.2: 1641 | version "0.4.4" 1642 | resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" 1643 | dependencies: 1644 | is-equal-shallow "^0.1.3" 1645 | 1646 | regex-not@^1.0.0, regex-not@^1.0.2: 1647 | version "1.0.2" 1648 | resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" 1649 | dependencies: 1650 | extend-shallow "^3.0.2" 1651 | safe-regex "^1.1.0" 1652 | 1653 | remove-trailing-separator@^1.0.1: 1654 | version "1.1.0" 1655 | resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" 1656 | 1657 | repeat-element@^1.1.2: 1658 | version "1.1.3" 1659 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" 1660 | 1661 | repeat-string@^1.5.2, repeat-string@^1.6.1: 1662 | version "1.6.1" 1663 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 1664 | 1665 | repeating@^2.0.0: 1666 | version "2.0.1" 1667 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 1668 | dependencies: 1669 | is-finite "^1.0.0" 1670 | 1671 | resolve-url@^0.2.1: 1672 | version "0.2.1" 1673 | resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" 1674 | 1675 | resolve@^1.3.2: 1676 | version "1.8.1" 1677 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" 1678 | dependencies: 1679 | path-parse "^1.0.5" 1680 | 1681 | ret@~0.1.10: 1682 | version "0.1.15" 1683 | resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" 1684 | 1685 | rimraf@^2.6.1: 1686 | version "2.6.2" 1687 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" 1688 | dependencies: 1689 | glob "^7.0.5" 1690 | 1691 | safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1692 | version "5.1.2" 1693 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1694 | 1695 | safe-regex@^1.1.0: 1696 | version "1.1.0" 1697 | resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" 1698 | dependencies: 1699 | ret "~0.1.10" 1700 | 1701 | "safer-buffer@>= 2.1.2 < 3": 1702 | version "2.1.2" 1703 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1704 | 1705 | sax@^1.2.4: 1706 | version "1.2.4" 1707 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 1708 | 1709 | semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: 1710 | version "5.5.1" 1711 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" 1712 | 1713 | set-blocking@~2.0.0: 1714 | version "2.0.0" 1715 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1716 | 1717 | set-immediate-shim@^1.0.1: 1718 | version "1.0.1" 1719 | resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" 1720 | 1721 | set-value@^0.4.3: 1722 | version "0.4.3" 1723 | resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" 1724 | dependencies: 1725 | extend-shallow "^2.0.1" 1726 | is-extendable "^0.1.1" 1727 | is-plain-object "^2.0.1" 1728 | to-object-path "^0.3.0" 1729 | 1730 | set-value@^2.0.0: 1731 | version "2.0.0" 1732 | resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" 1733 | dependencies: 1734 | extend-shallow "^2.0.1" 1735 | is-extendable "^0.1.1" 1736 | is-plain-object "^2.0.3" 1737 | split-string "^3.0.1" 1738 | 1739 | shebang-command@^1.2.0: 1740 | version "1.2.0" 1741 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1742 | dependencies: 1743 | shebang-regex "^1.0.0" 1744 | 1745 | shebang-regex@^1.0.0: 1746 | version "1.0.0" 1747 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1748 | 1749 | signal-exit@^3.0.0: 1750 | version "3.0.2" 1751 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1752 | 1753 | slash@^1.0.0: 1754 | version "1.0.0" 1755 | resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" 1756 | 1757 | slash@^2.0.0: 1758 | version "2.0.0" 1759 | resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" 1760 | 1761 | snapdragon-node@^2.0.1: 1762 | version "2.1.1" 1763 | resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" 1764 | dependencies: 1765 | define-property "^1.0.0" 1766 | isobject "^3.0.0" 1767 | snapdragon-util "^3.0.1" 1768 | 1769 | snapdragon-util@^3.0.1: 1770 | version "3.0.1" 1771 | resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" 1772 | dependencies: 1773 | kind-of "^3.2.0" 1774 | 1775 | snapdragon@^0.8.1: 1776 | version "0.8.2" 1777 | resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" 1778 | dependencies: 1779 | base "^0.11.1" 1780 | debug "^2.2.0" 1781 | define-property "^0.2.5" 1782 | extend-shallow "^2.0.1" 1783 | map-cache "^0.2.2" 1784 | source-map "^0.5.6" 1785 | source-map-resolve "^0.5.0" 1786 | use "^3.1.0" 1787 | 1788 | source-map-resolve@^0.5.0: 1789 | version "0.5.2" 1790 | resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" 1791 | dependencies: 1792 | atob "^2.1.1" 1793 | decode-uri-component "^0.2.0" 1794 | resolve-url "^0.2.1" 1795 | source-map-url "^0.4.0" 1796 | urix "^0.1.0" 1797 | 1798 | source-map-support@^0.4.15: 1799 | version "0.4.18" 1800 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" 1801 | dependencies: 1802 | source-map "^0.5.6" 1803 | 1804 | source-map-url@^0.4.0: 1805 | version "0.4.0" 1806 | resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" 1807 | 1808 | source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: 1809 | version "0.5.7" 1810 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 1811 | 1812 | split-string@^3.0.1, split-string@^3.0.2: 1813 | version "3.1.0" 1814 | resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" 1815 | dependencies: 1816 | extend-shallow "^3.0.0" 1817 | 1818 | static-extend@^0.1.1: 1819 | version "0.1.2" 1820 | resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" 1821 | dependencies: 1822 | define-property "^0.2.5" 1823 | object-copy "^0.1.0" 1824 | 1825 | string-width@^1.0.1: 1826 | version "1.0.2" 1827 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1828 | dependencies: 1829 | code-point-at "^1.0.0" 1830 | is-fullwidth-code-point "^1.0.0" 1831 | strip-ansi "^3.0.0" 1832 | 1833 | "string-width@^1.0.2 || 2": 1834 | version "2.1.1" 1835 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 1836 | dependencies: 1837 | is-fullwidth-code-point "^2.0.0" 1838 | strip-ansi "^4.0.0" 1839 | 1840 | string_decoder@~1.1.1: 1841 | version "1.1.1" 1842 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1843 | dependencies: 1844 | safe-buffer "~5.1.0" 1845 | 1846 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 1847 | version "3.0.1" 1848 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1849 | dependencies: 1850 | ansi-regex "^2.0.0" 1851 | 1852 | strip-ansi@^4.0.0: 1853 | version "4.0.0" 1854 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 1855 | dependencies: 1856 | ansi-regex "^3.0.0" 1857 | 1858 | strip-json-comments@~2.0.1: 1859 | version "2.0.1" 1860 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1861 | 1862 | supports-color@^2.0.0: 1863 | version "2.0.0" 1864 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1865 | 1866 | supports-color@^5.3.0: 1867 | version "5.5.0" 1868 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1869 | dependencies: 1870 | has-flag "^3.0.0" 1871 | 1872 | tar@^4: 1873 | version "4.4.6" 1874 | resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b" 1875 | dependencies: 1876 | chownr "^1.0.1" 1877 | fs-minipass "^1.2.5" 1878 | minipass "^2.3.3" 1879 | minizlib "^1.1.0" 1880 | mkdirp "^0.5.0" 1881 | safe-buffer "^5.1.2" 1882 | yallist "^3.0.2" 1883 | 1884 | timed-out@^4.0.0: 1885 | version "4.0.1" 1886 | resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" 1887 | 1888 | to-fast-properties@^1.0.3: 1889 | version "1.0.3" 1890 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" 1891 | 1892 | to-fast-properties@^2.0.0: 1893 | version "2.0.0" 1894 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" 1895 | 1896 | to-object-path@^0.3.0: 1897 | version "0.3.0" 1898 | resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" 1899 | dependencies: 1900 | kind-of "^3.0.2" 1901 | 1902 | to-regex-range@^2.1.0: 1903 | version "2.1.1" 1904 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" 1905 | dependencies: 1906 | is-number "^3.0.0" 1907 | repeat-string "^1.6.1" 1908 | 1909 | to-regex@^3.0.1, to-regex@^3.0.2: 1910 | version "3.0.2" 1911 | resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" 1912 | dependencies: 1913 | define-property "^2.0.2" 1914 | extend-shallow "^3.0.2" 1915 | regex-not "^1.0.2" 1916 | safe-regex "^1.1.0" 1917 | 1918 | trim-right@^1.0.1: 1919 | version "1.0.1" 1920 | resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" 1921 | 1922 | union-value@^1.0.0: 1923 | version "1.0.0" 1924 | resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" 1925 | dependencies: 1926 | arr-union "^3.1.0" 1927 | get-value "^2.0.6" 1928 | is-extendable "^0.1.1" 1929 | set-value "^0.4.3" 1930 | 1931 | universalify@^0.1.0: 1932 | version "0.1.2" 1933 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 1934 | 1935 | unset-value@^1.0.0: 1936 | version "1.0.0" 1937 | resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" 1938 | dependencies: 1939 | has-value "^0.3.1" 1940 | isobject "^3.0.0" 1941 | 1942 | upath@^1.0.5: 1943 | version "1.1.0" 1944 | resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" 1945 | 1946 | urix@^0.1.0: 1947 | version "0.1.0" 1948 | resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" 1949 | 1950 | url-parse-lax@^1.0.0: 1951 | version "1.0.0" 1952 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" 1953 | dependencies: 1954 | prepend-http "^1.0.1" 1955 | 1956 | url-to-options@^1.0.1: 1957 | version "1.0.1" 1958 | resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" 1959 | 1960 | use@^3.1.0: 1961 | version "3.1.1" 1962 | resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" 1963 | 1964 | user-home@^1.1.1: 1965 | version "1.1.1" 1966 | resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" 1967 | 1968 | util-deprecate@~1.0.1: 1969 | version "1.0.2" 1970 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1971 | 1972 | uuid@^3.0.0: 1973 | version "3.3.2" 1974 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" 1975 | 1976 | v8flags@^2.1.1: 1977 | version "2.1.1" 1978 | resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" 1979 | dependencies: 1980 | user-home "^1.1.1" 1981 | 1982 | valid-url@^1.0.9: 1983 | version "1.0.9" 1984 | resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200" 1985 | 1986 | whatwg-fetch@>=0.10.0: 1987 | version "2.0.4" 1988 | resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" 1989 | 1990 | which@^1.2.9: 1991 | version "1.3.1" 1992 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 1993 | dependencies: 1994 | isexe "^2.0.0" 1995 | 1996 | wide-align@^1.1.0: 1997 | version "1.1.3" 1998 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 1999 | dependencies: 2000 | string-width "^1.0.2 || 2" 2001 | 2002 | wrappy@1: 2003 | version "1.0.2" 2004 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2005 | 2006 | yallist@^3.0.0, yallist@^3.0.2: 2007 | version "3.0.2" 2008 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" 2009 | -------------------------------------------------------------------------------- /src/components/AddToCart/index.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | import { Formik } from 'formik' 3 | import * as yup from 'yup' 4 | import axios from 'axios' 5 | import { LargeButton, Text } from '@hackclub/design-system' 6 | import BulkOrderBanner from '../BulkOrderBanner' 7 | import StoreContext from '../../context/StoreContext' 8 | import IconButton from '../IconButton' 9 | import { Highlight, StyledField } from './style' 10 | 11 | const trialProductFieldNames = { 12 | product_id: 'entry.410110617', 13 | product_name: 'entry.1333192008', 14 | email: 'entry.1271490771' 15 | } 16 | 17 | const outOfStockProductFieldNames = { 18 | product_id: 'entry.510327508', 19 | product_name: 'entry.1383558744', 20 | email: 'entry.329361203' 21 | } 22 | 23 | export default class extends Component { 24 | state = { 25 | added: false 26 | } 27 | 28 | setAdded = () => { 29 | this.setState({ 30 | added: true 31 | }) 32 | } 33 | 34 | render() { 35 | const { exists, availableForSale } = this.props 36 | const { added } = this.state 37 | return exists ? ( 38 | availableForSale ? ( 39 | 44 | ) : ( 45 | <> 46 | 47 | This product is currently out of stock 48 | —you can sign up to be notified when it’s available. 49 | 50 | 57 | 58 | ) 59 | ) : ( 60 | <> 61 | 62 | We haven’t made this product yet 63 | —sign up below to be notified if we get enough interest to produce it. 64 | 65 | 72 | 73 | ) 74 | } 75 | } 76 | 77 | const InStockProductForm = ({ added, variants, setAdded }) => ( 78 | 79 | {({ addVariantToCart }) => ( 80 | { 97 | addVariantToCart(values.variant, values.quantity) 98 | setAdded() 99 | }} 100 | > 101 | {({ values, errors, handleChange, handleSubmit }) => ( 102 | <> 103 | {values.quantity > 3 && } 104 | {variants.edges.length !== 1 && ( 105 | 113 | {variants.edges.map(variant => ( 114 | 117 | ))} 118 | 119 | )} 120 | 128 | 137 | {added ? 'Added' : 'Add to Bag'} 138 | 139 | 140 | )} 141 | 142 | )} 143 | 144 | ) 145 | 146 | const ProductWaitlistForm = ({ 147 | added, 148 | setAdded, 149 | id, 150 | title, 151 | fieldNames, 152 | gFormPath 153 | }) => ( 154 | { 163 | const formData = new FormData() 164 | formData.append(fieldNames.email, values.email) 165 | formData.append(fieldNames.product_id, id) 166 | formData.append(fieldNames.product_name, title) 167 | axios.post(gFormPath, formData).then(() => { 168 | setAdded() 169 | }) 170 | }} 171 | > 172 | {({ values, errors, handleChange, handleSubmit }) => ( 173 | <> 174 | 183 | 191 | {added ? 'Signed Up' : 'Sign Up'} 192 | 193 | 194 | )} 195 | 196 | ) 197 | -------------------------------------------------------------------------------- /src/components/AddToCart/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components' 2 | import { Text, Field } from '@hackclub/design-system' 3 | 4 | export const Highlight = styled(Text.span)` 5 | border-radius: 1em 0 1em 0; 6 | background-image: linear-gradient( 7 | -100deg, 8 | rgba(250, 247, 133, 0.33), 9 | rgba(250, 247, 133, 0.66) 95%, 10 | rgba(250, 247, 133, 0.1) 11 | ); 12 | ` 13 | 14 | export const StyledField = styled(Field)` 15 | max-width: 24rem; 16 | ` 17 | -------------------------------------------------------------------------------- /src/components/BulkOrderBanner/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Text, Link, Card } from '@hackclub/design-system' 3 | 4 | export default () => ( 5 | 6 | 7 | Are you a club leader or need stickers for your event? 8 | 9 | 10 | Reach out to us via{' '} 11 | team@hackclub.com or{' '} 12 | #hq on Slack. 13 | 14 | 15 | ) 16 | -------------------------------------------------------------------------------- /src/components/Button/index.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | import IconButton from '../IconButton' 3 | import Clipboard from 'react-clipboard.js' 4 | 5 | export class CopyLinkButton extends Component { 6 | state = { 7 | isClicked: false 8 | } 9 | 10 | onClick = () => { 11 | this.setState({ isClicked: true }) 12 | const ref = setTimeout(() => this.setState({ isClicked: false }), 2000) 13 | this.ref = ref 14 | } 15 | 16 | render() { 17 | const { text, children } = this.props 18 | const { isClicked } = this.state 19 | 20 | return ( 21 | 27 | 34 | 35 | ) 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/components/Card/index.js: -------------------------------------------------------------------------------- 1 | export { Card as default } from './style' 2 | -------------------------------------------------------------------------------- /src/components/Card/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components' 2 | import { Box } from '@hackclub/design-system' 3 | 4 | export const Card = styled(Box)` 5 | position: relative; 6 | background: ${({ theme }) => theme.colors.white}; 7 | border-radius: ${({ theme }) => theme.radii[2]}; 8 | box-shadow: 0 6px 24px rgba(0, 0, 0, 0.0625), 0 8px 32px rgba(0, 0, 0, 0.125); 9 | transition: all 0.2s ease-in-out; 10 | 11 | &:hover { 12 | box-shadow: 0 8px 32px rgba(0, 0, 0, 0.0625), 13 | 0 16px 48px rgba(0, 0, 0, 0.125); 14 | transform: translateY(-4px); 15 | } 16 | 17 | &:active { 18 | box-shadow: 0 6px 24px rgba(0, 0, 0, 0.125), 19 | 0 12px 36px rgba(0, 0, 0, 0.125); 20 | transform: translateY(-2px); 21 | } 22 | ` 23 | -------------------------------------------------------------------------------- /src/components/Cart/index.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | import { 3 | Heading, 4 | LargeButton, 5 | Text, 6 | Link, 7 | Flex, 8 | Box, 9 | Badge 10 | } from '@hackclub/design-system' 11 | 12 | import { 13 | ProductContainer, 14 | Thumbnail, 15 | CartContainer, 16 | CartNumber, 17 | QuantitySelector, 18 | DeleteButton, 19 | CartItemsHeader, 20 | CartHeader, 21 | TotalCost 22 | } from './style' 23 | import IconOnlyButton from '../IconOnlyButton' 24 | import { CloseButton, Modal, Overlay } from '../Modal' 25 | import StoreContext from '../../context/StoreContext' 26 | 27 | export default class extends Component { 28 | state = { active: false } 29 | 30 | toggle = () => { 31 | this.setState(state => ({ active: !state.active })) 32 | } 33 | 34 | handleQuantityChange = (updateQuantity, id) => e => { 35 | e.preventDefault() 36 | updateQuantity(id, Math.trunc(e.target.value)) 37 | } 38 | 39 | // Render a modal for shopping cart 40 | render() { 41 | const { active } = this.state 42 | 43 | return ( 44 | <> 45 | 46 | 56 | 57 | {({ checkout }) => ( 58 | 59 | )} 60 | 61 | 62 | {active && ( 63 | <> 64 | 65 | 66 | 67 | {({ checkout }) => ( 68 | 69 | Your Bag {checkout.lineItems.length} 70 | 71 | )} 72 | 73 | 74 | The money we charge for swag helps to cover production and 75 | shipping costs. Hack Club is a new kind of non-profit with{' '} 76 | 77 | total transparency 78 | 79 | , including in our financials. 80 | 81 | 82 | {({ client, checkout, removeLineItem, updateQuantity }) => { 83 | const handleRemove = id => event => { 84 | event.preventDefault() 85 | removeLineItem(client, checkout.id, id) 86 | } 87 | 88 | if (checkout.lineItems.length > 0) { 89 | return ( 90 | <> 91 | 92 | Items 93 | 94 | Quantity 95 | 96 | 97 | Remove 98 | 99 | 100 | {checkout.lineItems.map(item => ( 101 | 102 | 106 | 107 | 108 | {item.title} 109 | 110 | 111 | {item.variant.title !== 'Default Title' && 112 | `${item.variant.title},`}{' '} 113 | $ 114 | {(item.variant.price * item.quantity).toFixed( 115 | 2 116 | )} 117 | 118 | 119 | 129 | 133 | 134 | ))} 135 | 136 | ${checkout.subtotalPrice} 137 | 138 | Checkout 139 | 140 | 141 | 142 | ) 143 | } 144 | return ( 145 | 146 | 147 | Nothing in your bag. 148 | 149 | 150 | ) 151 | }} 152 | 153 | 154 | 155 | 156 | )} 157 | 158 | ) 159 | } 160 | } 161 | -------------------------------------------------------------------------------- /src/components/Cart/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components' 2 | import { Badge, Box, Field, Flex, Icon, Text } from '@hackclub/design-system' 3 | 4 | export const CartHeader = styled(Flex).attrs({ 5 | as: 'h2', 6 | color: 'black' 7 | })` 8 | align-items: center; 9 | ` 10 | 11 | export const CartItemsHeader = styled(Flex).attrs({ mb: 2, align: 'baseline' })` 12 | p { 13 | width: 64px; 14 | text-align: center; 15 | } 16 | h3 { 17 | flex: 1 1 auto; 18 | } 19 | ` 20 | 21 | export const ProductContainer = styled(Flex).attrs({ mb: 1, width: 1 })` 22 | align-items: center; 23 | label { 24 | margin-bottom: 0; 25 | div { 26 | display: none; 27 | } 28 | } 29 | ` 30 | 31 | export const Thumbnail = styled.img` 32 | border-radius: ${({ theme }) => theme.radius}; 33 | width: 40px; 34 | height: 40px; 35 | min-width: 40px; 36 | max-width: 40px; 37 | ` 38 | 39 | export const CartContainer = styled(Box)` 40 | position: relative; 41 | ` 42 | 43 | export const CartNumber = styled(Badge)` 44 | ${props => props.children === 0 && { display: 'none' }} border-radius: 9999px; 45 | position: absolute; 46 | right: 4px; 47 | bottom: -2px; 48 | pointer-events: none; 49 | ` 50 | 51 | export const QuantitySelector = styled(Field).attrs({ mr: 2 })` 52 | max-width: 64px; 53 | ` 54 | 55 | export const DeleteButton = styled(Icon).attrs({ 56 | role: 'button', 57 | color: 'muted', 58 | width: '64px' 59 | })` 60 | cursor: pointer; 61 | ` 62 | 63 | export const TotalCost = styled(Text).attrs({ 64 | mr: 3, 65 | mt: 2, 66 | f: 4, 67 | color: 'muted' 68 | })` 69 | float: left; 70 | ` 71 | -------------------------------------------------------------------------------- /src/components/DesignerCard/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Avatar, Flex, Heading } from '@hackclub/design-system' 3 | import VisibilitySensor from 'react-visibility-sensor' 4 | 5 | import Card from '../Card' 6 | 7 | export default ({ designer }) => ( 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | {designer.name} 17 | 18 | 19 | {designer.handle} 20 | 21 | 22 | 23 | 24 | 25 | ) 26 | -------------------------------------------------------------------------------- /src/components/DesignerCard/style.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/shop/9911ffde8b55b758c320d800b219879667344516/src/components/DesignerCard/style.js -------------------------------------------------------------------------------- /src/components/DesignersGrid/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | import { Grid } from './style' 4 | import DesignerCard from '../DesignerCard' 5 | 6 | export default ({ cols, designers }) => ( 7 | 8 | {designers.map(designer => { 9 | if (!designer) return null 10 | return 11 | })} 12 | 13 | ) 14 | -------------------------------------------------------------------------------- /src/components/DesignersGrid/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components' 2 | import { Box } from '@hackclub/design-system' 3 | 4 | export const Grid = styled(Box).attrs({ 5 | my: 3, 6 | mx: 0, 7 | width: 1 8 | })` 9 | display: grid; 10 | grid-gap: ${({ theme }) => theme.space[3]}px; 11 | grid-template-columns: repeat(${props => props.cols}, 1fr); 12 | grid-template-rows: auto; 13 | max-width: 1128px; 14 | @media (max-width: 968px) { 15 | grid-template-columns: repeat(${props => (props.cols > 2 ? 2 : 1)}, 1fr); 16 | } 17 | @media (max-width: 768px) { 18 | grid-template-columns: 1fr; 19 | } 20 | ` 21 | -------------------------------------------------------------------------------- /src/components/EmailSignup/index.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | import { Formik } from 'formik' 3 | import axios from 'axios' 4 | import * as yup from 'yup' 5 | import { Box, Field, Heading, Icon, LargeButton } from '@hackclub/design-system' 6 | import IconButton from '../IconButton' 7 | import { Item } from './style' 8 | 9 | const gFormPath = 10 | 'https://proxyparty.hackclub.com/docs.google.com/forms/d/e/1FAIpQLSdvHegwKHC4aQVCA8GgOooAWInwpvOSthn3Xfpo4pNf5IcSrQ/formResponse' 11 | const fieldNames = { 12 | email: 'entry.435587131' 13 | } 14 | 15 | export default class extends Component { 16 | state = { 17 | signedUp: false 18 | } 19 | 20 | render() { 21 | const { signedUp } = this.state 22 | return ( 23 | 24 | 25 | 26 | 27 | Sign up to get notified about new products. 28 | 29 | { 38 | const formData = new FormData() 39 | formData.append(fieldNames.email, values.email) 40 | axios.post(gFormPath, formData).then(() => { 41 | this.setState({ 42 | signedUp: true 43 | }) 44 | }) 45 | }} 46 | > 47 | {({ values, errors, handleChange, handleSubmit }) => ( 48 | <> 49 | 58 | 66 | {signedUp ? 'Signed Up' : 'Sign Up'} 67 | 68 | 69 | )} 70 | 71 | 72 | 73 | ) 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /src/components/EmailSignup/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components' 2 | import Card from '../Card' 3 | import { theme } from '@hackclub/design-system' 4 | 5 | export const Item = styled(Card)` 6 | display: flex; 7 | flex-direction: column; 8 | justify-content: center; 9 | ${theme.mediaQueries.md} { 10 | grid-column: span 2; 11 | } 12 | ` 13 | -------------------------------------------------------------------------------- /src/components/Footer/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Box, Flex, Icon } from '@hackclub/design-system' 3 | 4 | import { SocialLink, Footer, FooterLink } from './style' 5 | 6 | export default () => ( 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | Made by{' '} 25 | 26 | @merelinguist 27 | 28 | {', '} 29 | @zanedb 30 | {', + '} 31 | @lachlanjc 32 | 33 | 34 |
35 | ) 36 | -------------------------------------------------------------------------------- /src/components/Footer/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components' 2 | import { Flex, Link } from '@hackclub/design-system' 3 | 4 | export const SocialLink = styled(Link).attrs({ 5 | target: '_blank', 6 | mx: 2 7 | })` 8 | color: ${({ theme }) => theme.colors.slate}; 9 | &:hover { 10 | color: ${({ theme }) => theme.colors.black}; 11 | } 12 | ` 13 | 14 | export const Footer = styled(Flex).attrs({ 15 | as: 'footer', 16 | flexDirection: 'column', 17 | justify: 'center', 18 | align: 'center', 19 | wrap: 'wrap', 20 | bg: 'smoke', 21 | color: 'slate', 22 | px: 3, 23 | py: 4, 24 | mt: 5 25 | })` 26 | flex-shrink: 0; 27 | ` 28 | 29 | export const FooterLink = styled(Link).attrs({ 30 | target: '_blank', 31 | color: 'inherit', 32 | bold: true 33 | })` 34 | &:hover { 35 | text-decoration: underline; 36 | } 37 | ` 38 | -------------------------------------------------------------------------------- /src/components/Header/Search/SearchInput.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | import { SearchInput } from './style' 4 | 5 | export default ({ value, placeholder, label, onChange, shadow, ...props }) => ( 6 | 15 | ) 16 | -------------------------------------------------------------------------------- /src/components/Header/Search/SearchResult.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Box, Text } from '@hackclub/design-system' 3 | import { Link } from 'gatsby' 4 | 5 | import { SearchProductContainer, Image } from './style' 6 | 7 | export default ({ 8 | product: { 9 | title, 10 | fields: { slug, image }, 11 | variants 12 | }, 13 | clear 14 | }) => ( 15 | 16 | 17 | {title} 18 | 19 | 20 | {title} 21 | 22 | 23 | ${variants.edges[0].node.price} 24 | 25 | 26 | 27 | 28 | ) 29 | -------------------------------------------------------------------------------- /src/components/Header/Search/index.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | import Fuse from 'fuse.js' 3 | 4 | import { Container, Hits } from './style' 5 | import SearchInput from './SearchInput' 6 | import SearchResult from './SearchResult' 7 | 8 | const keys = ['node.title', 'node.description'] 9 | 10 | export default class extends Component { 11 | constructor(props) { 12 | super(props) 13 | this.state = { 14 | value: '', 15 | open: false 16 | } 17 | this.fuse = new Fuse(props.products, { threshold: 0.4, keys }) 18 | } 19 | 20 | handleInputChange = e => this.setState({ value: e.target.value }) 21 | 22 | clear = () => this.setState({ value: '' }) 23 | 24 | render() { 25 | const results = this.fuse.search(this.state.value) 26 | const { shadow } = this.props 27 | 28 | return ( 29 | 30 | this.setState({ open: true })} 37 | onBlur={() => setTimeout(() => this.setState({ open: false }), 200)} 38 | /> 39 | {results.length > 0 && 40 | this.state.open && ( 41 | 42 | {results.map(product => ( 43 | 44 | ))} 45 | 46 | )} 47 | 48 | ) 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/components/Header/Search/style.js: -------------------------------------------------------------------------------- 1 | import styled, { css } from 'styled-components' 2 | import { Box, Flex, Input } from '@hackclub/design-system' 3 | 4 | export const Container = styled(Flex).attrs({ 5 | align: 'center', 6 | justify: 'center', 7 | pt: [1, null, 0] 8 | })` 9 | grid-area: search; 10 | flex: 1 0 auto; 11 | position: relative; 12 | ` 13 | 14 | const placeholder = css` 15 | text-align: center; 16 | color: ${({ theme }) => theme.colors.muted}; 17 | ` 18 | export const SearchInput = styled(Input)` 19 | border: 0; 20 | line-height: 2; 21 | font-size: ${({ theme }) => theme.fontSizes[2]}px; 22 | background: ${props => 23 | props.shadow ? props.theme.colors.gray[1] : props.theme.colors.white}; 24 | color: ${({ theme }) => theme.colors.slate}; 25 | box-shadow: ${props => 26 | props.shadow ? 'none' : '0 4px 8px rgba(0,0,0,0.0625)'}; 27 | border-radius: ${({ theme }) => theme.radii[2]}; 28 | transition: box-shadow 0.25s ease-in-out, background 0.25s ease-in-out, 29 | transform 0.25s ease-in-out; 30 | 31 | // Love our WebKit 32 | ::-webkit-input-placeholder { 33 | ${placeholder}; 34 | } 35 | // Firefox <18 36 | :-moz-placeholder { 37 | ${placeholder}; 38 | } 39 | // Firefox 40 | ::-moz-placeholder { 41 | ${placeholder}; 42 | } 43 | // Thanks Microsoft 44 | :-ms-input-placeholder { 45 | ${placeholder}; 46 | } 47 | 48 | &:hover, 49 | &:focus { 50 | box-shadow: ${props => 51 | props.shadow 52 | ? 'none' 53 | : '0 4px 8px rgba(0,0,0,0.0625), 0 8px 16px rgba(0,0,0,0.125)'}; 54 | } 55 | ` 56 | 57 | export const Hits = styled(Flex).attrs({ 58 | flexDirection: 'column', 59 | width: 1 60 | })` 61 | position: absolute; 62 | top: ${({ theme }) => theme.space[6]}px; 63 | left: 50%; 64 | transform: translateX(-50%); 65 | background: ${({ theme }) => theme.colors.white} none repeat scroll 0% 0%; 66 | box-shadow: ${({ theme }) => theme.boxShadows[2]}; 67 | transition: ${({ theme }) => theme.transition} all; 68 | border-radius: ${({ theme }) => theme.radii[2]}; 69 | z-index: 999; 70 | flex: 0 0 auto; 71 | height: auto; 72 | max-height: 400px; 73 | max-width: 32rem; 74 | overflow-y: scroll; 75 | -webkit-overflow-scrolling: touch; 76 | ` 77 | 78 | export const SearchProductContainer = styled(Flex).attrs({ 79 | as: 'section', 80 | align: 'center', 81 | p: 3, 82 | width: 1 83 | })` 84 | border-bottom: 1px solid ${({ theme }) => theme.colors.snow}; 85 | flex: 1 0 auto; 86 | &:hover { 87 | background: ${({ theme }) => theme.colors.blue[0]}; 88 | img { 89 | box-shadow: ${({ theme }) => theme.boxShadows[1]}; 90 | transform: scale(${({ theme }) => theme.scaleFactor}); 91 | } 92 | } 93 | ` 94 | 95 | export const Image = styled(Box.withComponent('img'))` 96 | border-radius: ${({ theme }) => theme.radius}; 97 | width: 40px; 98 | height: 40px; 99 | min-width: 40px; 100 | max-width: 40px; 101 | transform: scale(1); 102 | transition: ${({ theme }) => theme.transition} all; 103 | ` 104 | -------------------------------------------------------------------------------- /src/components/Header/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { StaticQuery, graphql } from 'gatsby' 3 | 4 | import { Container, Logo, ButtonRowContainer } from './style' 5 | import Search from './Search' 6 | import Cart from '../Cart' 7 | 8 | export default ({ shadow }) => ( 9 | 10 | 16 | ( 42 | 43 | )} 44 | /> 45 | 46 | 47 | 48 | 49 | ) 50 | -------------------------------------------------------------------------------- /src/components/Header/style.js: -------------------------------------------------------------------------------- 1 | import styled, { css } from 'styled-components' 2 | import { Link } from '@hackclub/design-system' 3 | import { Box, Flex } from '@hackclub/design-system' 4 | 5 | export const Container = styled(Box).attrs({ 6 | bg: props => (props.shadow ? 'white' : 'snow'), 7 | align: 'center', 8 | p: [3, 2] 9 | })` 10 | display: grid; 11 | grid-template-columns: 1fr 1fr; 12 | grid-template-areas: 'logo actions' 'search search'; 13 | position: fixed; 14 | top: 0; 15 | left: 0; 16 | right: 0; 17 | z-index: 3; 18 | box-shadow: ${props => 19 | props.shadow ? '0 4px 8px rgba(0,0,0,0.125)' : 'none'}; 20 | transition: ${({ theme }) => theme.transition} all; 21 | ${({ theme }) => theme.mediaQueries.md} { 22 | grid-template-columns: 1fr 2fr 1fr; 23 | grid-template-areas: 'logo search actions'; 24 | } 25 | ` 26 | 27 | export const Logo = styled(Link)` 28 | margin-top: -20px; 29 | background: url(/flag.svg) no-repeat; 30 | background-position: top center; 31 | flex-shrink: 0; 32 | width: 112px; 33 | height: 48px; 34 | transition: ${({ theme }) => theme.transition} transform; 35 | transform-origin: top left; 36 | ${({ theme }) => theme.mediaQueries.md} { 37 | width: 144px; 38 | height: 72px; 39 | } 40 | ${props => 41 | props.shadow && 42 | css` 43 | ${({ theme }) => theme.mediaQueries.md} { 44 | transform: scale(0.8); 45 | height: 60px !important; 46 | } 47 | `}; 48 | ` 49 | 50 | export const ButtonRowContainer = styled(Flex).attrs({ 51 | justify: 'center', 52 | align: 'flex-end', 53 | flexDirection: 'column' 54 | })` 55 | grid-area: actions; 56 | ` 57 | -------------------------------------------------------------------------------- /src/components/IconButton/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import styled from 'styled-components' 4 | import { Button, Icon, Text } from '@hackclub/design-system' 5 | 6 | const IconButton = ({ 7 | is = Button.button, 8 | glyph, 9 | size = 24, 10 | children, 11 | ...props 12 | }) => { 13 | const Component = styled(is)` 14 | display: inline-flex; 15 | align-items: center; 16 | justify-content: center; 17 | ` 18 | return ( 19 | 20 | 21 | {children && } 22 | 23 | ) 24 | } 25 | 26 | export default IconButton 27 | 28 | IconButton.propTypes = { 29 | is: PropTypes.oneOfType([PropTypes.element, PropTypes.func]), 30 | glyph: PropTypes.string.isRequired, 31 | size: PropTypes.number, 32 | children: PropTypes.oneOfType([PropTypes.element, PropTypes.string]) 33 | .isRequired 34 | } 35 | -------------------------------------------------------------------------------- /src/components/IconOnlyButton/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import styled from 'styled-components' 3 | import { Button, Icon } from '@hackclub/design-system' 4 | 5 | const IconOnlyButton = styled(Button.button).attrs({ 6 | children: props => 7 | })` 8 | box-shadow: none !important; 9 | line-height: 0 !important; 10 | background: none; 11 | ${Icon} { 12 | pointer-events: none; 13 | } 14 | ` 15 | 16 | export default IconOnlyButton 17 | -------------------------------------------------------------------------------- /src/components/ImageLoader/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { cx } from '@hackclub/design-system' 3 | import ContentLoader from 'react-content-loader' 4 | 5 | export default props => ( 6 | 14 | 15 | 16 | ) 17 | -------------------------------------------------------------------------------- /src/components/Modal/index.js: -------------------------------------------------------------------------------- 1 | import React, { Fragment } from 'react' 2 | import ScrollLock from 'react-scrolllock' 3 | import IconOnlyButton from '../IconOnlyButton' 4 | 5 | import { Modal, Overlayer } from './style' 6 | 7 | const Overlay = props => ( 8 | 9 | 10 | 11 | 12 | ) 13 | 14 | const CloseButton = props => ( 15 | 16 | ) 17 | 18 | export { Modal, Overlay, Overlayer, CloseButton } 19 | -------------------------------------------------------------------------------- /src/components/Modal/style.js: -------------------------------------------------------------------------------- 1 | import styled, { keyframes } from 'styled-components' 2 | import { Box, Card } from '@hackclub/design-system' 3 | 4 | export const modalKeyframes = keyframes` 5 | 0% { 6 | transform: translate(-5%, -90%) scale(0); 7 | } 8 | 9 | 85% { 10 | transform: translate(-50%, -50%) scale(1.025); 11 | } 12 | 13 | 100% { 14 | transform: translate(-50%, -50%) scale(1); 15 | } 16 | ` 17 | 18 | export const Modal = styled(Card).attrs({ 19 | boxShadowSize: 'lg', 20 | bg: 'white' 21 | })` 22 | border-radius: ${({ theme }) => theme.radii[2]}; 23 | position: fixed; 24 | top: 50%; 25 | left: 50%; 26 | transform: translate(-50%, -50%); 27 | z-index: 1100; 28 | 29 | ${({ theme }) => theme.mediaQueries.md} { 30 | animation: ${modalKeyframes} ease-in 0.25s; 31 | } 32 | 33 | // Responsive size control 34 | width: ${props => props.w || props.width || '36rem'}; 35 | max-width: 95vw; 36 | max-height: 95vh; 37 | margin: 0 auto; 38 | overflow-y: auto; 39 | -webkit-overflow-scrolling: touch; 40 | 41 | > button:first-child { 42 | position: fixed; 43 | top: 0; 44 | right: 0; 45 | } 46 | ` 47 | 48 | export const Overlayer = styled(Box)` 49 | z-index: 1000; 50 | background-color: rgba(0, 0, 0, 0.375); 51 | backdrop-filter: blur(6px); 52 | 53 | position: fixed; 54 | top: 0; 55 | left: 0; 56 | width: 100%; 57 | height: 100%; 58 | ` 59 | -------------------------------------------------------------------------------- /src/components/Page/ScrollToTop/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Icon } from '@hackclub/design-system' 3 | import ScrollToTop from './style' 4 | 5 | export default props => ( 6 | 7 | 8 | 9 | ) 10 | -------------------------------------------------------------------------------- /src/components/Page/ScrollToTop/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components' 2 | import { Flex } from '@hackclub/design-system' 3 | 4 | const ScrollToTop = styled(Flex).attrs({ 5 | align: 'center', 6 | justify: 'center', 7 | bg: 'primary', 8 | color: 'white' 9 | })` 10 | position: fixed; 11 | bottom: ${({ theme }) => theme.space[4]}px; 12 | right: ${({ theme }) => theme.space[4]}px; 13 | width: 48px; 14 | height: 48px; 15 | border-radius: ${({ theme }) => theme.radii[4]}; 16 | box-shadow: 0 6px 18px rgba(0, 0, 0, 0.25); 17 | transition: ${({ theme }) => theme.transition} all; 18 | opacity: ${props => (props.isVisible ? '1' : '0')}; 19 | background-image: linear-gradient( 20 | -86deg, 21 | ${({ theme }) => theme.colors.orange[5]}, 22 | ${({ theme }) => theme.colors.red[5]}, 23 | ${({ theme }) => theme.colors.red[6]} 24 | ); 25 | transform: translateY(${props => (props.isVisible ? 0 : 80)}px); 26 | cursor: pointer; 27 | &:hover { 28 | box-shadow: 0 6px 18px rgba(0, 0, 0, 0.125), 0 8px 24px rgba(0, 0, 0, 0.25); 29 | transform: translateY(-3px); 30 | } 31 | &:active { 32 | box-shadow: 0 6px 18px rgba(0, 0, 0, 0.25), 0 8px 24px rgba(0, 0, 0, 0.25); 33 | transform: translateY(-2px); 34 | } 35 | svg { 36 | transform: rotate(90deg); 37 | } 38 | @media (max-width: 968px) { 39 | bottom: ${({ theme }) => theme.space[3]}px; 40 | right: ${({ theme }) => theme.space[3]}px; 41 | } 42 | ` 43 | 44 | export default ScrollToTop 45 | -------------------------------------------------------------------------------- /src/components/Page/index.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | import { Container, ThemeProvider, cx } from '@hackclub/design-system' 3 | import Helmet from 'react-helmet' 4 | import { name, description, img, url } from '../../data.json' 5 | import { throttle } from 'throttle-debounce' 6 | 7 | import StoreContext, { defaultStoreContext } from '../../context/StoreContext' 8 | import Header from '../Header' 9 | import Transition from '../Transition' 10 | import Footer from '../Footer' 11 | import ScrollToTop from './ScrollToTop' 12 | import { injectGlobal } from 'styled-components' 13 | export { Gradient, SectionHeading } from './style' 14 | 15 | injectGlobal` 16 | html, body { 17 | height: 100%; 18 | } 19 | body { 20 | background: ${cx('snow')}; 21 | color: ${cx('black')}; 22 | } 23 | #___gatsby > div { 24 | min-height: 100vh; 25 | display: flex; 26 | flex-direction: column; 27 | } 28 | ` 29 | 30 | export default class extends Component { 31 | constructor() { 32 | super() 33 | 34 | this.state = { 35 | headerShadow: false, 36 | scrollToTopVisible: false, 37 | store: { 38 | ...defaultStoreContext, 39 | addVariantToCart: (variantId, quantity) => { 40 | if (variantId === '' || !quantity) { 41 | console.error('Both a size and quantity are required.') 42 | return 43 | } 44 | 45 | this.setState(state => ({ 46 | store: { ...state.store, isCartOpen: true } 47 | })) 48 | 49 | const { checkout, client } = this.state.store 50 | const checkoutId = checkout.id 51 | const lineItemsToUpdate = [ 52 | { variantId, quantity: parseInt(quantity, 10) } 53 | ] 54 | 55 | return client.checkout 56 | .addLineItems(checkoutId, lineItemsToUpdate) 57 | .then(checkout => { 58 | this.setState(state => ({ store: { ...state.store, checkout } })) 59 | }) 60 | }, 61 | removeLineItem: (client, checkoutID, lineItemID) => { 62 | client.checkout 63 | .removeLineItems(checkoutID, [lineItemID]) 64 | .then(res => { 65 | this.setState(state => ({ 66 | store: { ...state.store, checkout: res } 67 | })) 68 | }) 69 | }, 70 | updateQuantity: (lineItemId, quantity) => { 71 | const { checkout, client } = this.state.store 72 | const checkoutId = checkout.id 73 | client.checkout 74 | .updateLineItems(checkoutId, [{ id: lineItemId, quantity }]) 75 | .then(res => { 76 | this.setState(state => ({ 77 | store: { ...state.store, checkout: res } 78 | })) 79 | }) 80 | }, 81 | toggleCart: () => { 82 | this.setState(state => ({ 83 | store: { ...state.store, isCartOpen: !state.store.isCartOpen }, 84 | user: { ...state.user, isProfileOpen: false } 85 | })) 86 | } 87 | } 88 | } 89 | this.handleScroll = throttle(300, this.handleScroll) 90 | } 91 | 92 | componentDidMount() { 93 | window && window.addEventListener('scroll', this.handleScroll) 94 | 95 | // Check for an existing cart. 96 | const isBrowser = typeof window !== 'undefined' 97 | const existingCheckoutID = isBrowser 98 | ? localStorage.getItem('shopify_checkout_id') 99 | : null 100 | 101 | const setCheckoutInState = checkout => { 102 | if (isBrowser) { 103 | localStorage.setItem('shopify_checkout_id', checkout.id) 104 | } 105 | 106 | this.setState(state => ({ 107 | store: { 108 | ...state.store, 109 | checkout 110 | } 111 | })) 112 | } 113 | 114 | const createNewCheckout = () => this.state.store.client.checkout.create() 115 | const fetchCheckout = id => this.state.store.client.checkout.fetch(id) 116 | 117 | if (existingCheckoutID) { 118 | fetchCheckout(existingCheckoutID).then(checkout => { 119 | // Make sure this cart hasn’t already been purchased. 120 | if (!checkout.completedAt) { 121 | setCheckoutInState(checkout) 122 | return 123 | } 124 | 125 | createNewCheckout().then(setCheckoutInState) 126 | }) 127 | } else { 128 | createNewCheckout().then(setCheckoutInState) 129 | } 130 | } 131 | 132 | componentWillUnmount() { 133 | window && window.removeEventListener('scroll', this.handleScroll) 134 | } 135 | 136 | handleScroll = () => { 137 | const headerShadow = window && window.pageYOffset > 0 138 | const scrollToTopVisible = window && window.pageYOffset > 240 139 | return this.setState({ headerShadow, scrollToTopVisible }) 140 | } 141 | 142 | scrollToTop = () => { 143 | return window && window.scrollTo(0, 0) 144 | } 145 | 146 | render() { 147 | const { title, children, imageUrl } = this.props 148 | const { headerShadow, scrollToTopVisible } = this.state 149 | const pageDescription = title 150 | ? `Buy ${title} at the Hack Club Shop` 151 | : description 152 | const pageTitle = title ? `${title} – ${name}` : name 153 | 154 | return ( 155 | 156 | 157 | 158 | 159 | <html lang="en" /> 160 | <meta charSet="UTF-8" /> 161 | <meta 162 | name="viewport" 163 | content="width=device-width,initial-scale=1" 164 | /> 165 | <meta name="format-detection" content="telephone=no" /> 166 | <meta name="theme-color" content="#e42d42" /> 167 | <meta name="description" content={pageDescription} /> 168 | <meta name="twitter:card" content="summary_large_image" /> 169 | <meta name="twitter:site" content="@hackclub" /> 170 | <meta name="twitter:domain" content={url} /> 171 | <meta name="twitter:title" content={pageTitle} /> 172 | <meta name="twitter:description" content={pageDescription} /> 173 | <meta name="twitter:image" content={imageUrl ? imageUrl : img} /> 174 | <meta property="og:site_name" content={name} /> 175 | <meta property="og:title" content={pageTitle} /> 176 | <meta property="og:description" content={pageDescription} /> 177 | <meta property="og:image" content={imageUrl ? imageUrl : img} /> 178 | <meta property="og:locale" content="en_US" /> 179 | <meta property="og:type" content="website" /> 180 | <meta property="og:url" content={url} /> 181 | {[57, 60, 72, 76, 114, 120, 144, 152, 180].map(size => ( 182 | <link 183 | rel="apple-touch-icon" 184 | sizes={`${size}x${size}`} 185 | href={`/favicons/apple-icon-${size}x${size}.png`} 186 | key={size} 187 | /> 188 | ))} 189 | {[16, 32, 96].map(size => ( 190 | <link 191 | rel="icon" 192 | sizes={`${size}x${size}`} 193 | href={`/favicons/favicon-${size}x${size}.png`} 194 | key={size} 195 | /> 196 | ))} 197 | <link 198 | rel="icon" 199 | type="image/png" 200 | sizes="192x192" 201 | href="/favicons/android-icon-192x192.png" 202 | /> 203 | <link rel="manifest" href="/manifest.json" /> 204 | <meta name="msapplication-TileColor" content="#ffffff" /> 205 | <meta 206 | name="msapplication-TileImage" 207 | content="/favicons/ms-icon-144x144.png" 208 | /> 209 | <meta name="theme-color" content="#ffffff" /> 210 | </Helmet> 211 | <Header shadow={headerShadow} /> 212 | <Container 213 | px={3} 214 | pt={[7, null, null, 6]} 215 | w={1} 216 | style={{ flex: '1 0 auto' }} 217 | > 218 | <Transition>{children}</Transition> 219 | <ScrollToTop 220 | isVisible={scrollToTopVisible} 221 | onClick={this.scrollToTop} 222 | /> 223 | </Container> 224 | <Footer /> 225 | </ThemeProvider> 226 | </StoreContext.Provider> 227 | ) 228 | } 229 | } 230 | -------------------------------------------------------------------------------- /src/components/Page/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components' 2 | import { Box, Heading } from '@hackclub/design-system' 3 | 4 | export const SectionHeading = styled(Heading.h1).attrs({ 5 | color: 'black', 6 | align: 'center', 7 | px: 3, 8 | mt: [3, 4], 9 | mb: [3, 4], 10 | pt: [0, 2] 11 | })` 12 | line-height: 1.125; 13 | ` 14 | 15 | export const Gradient = styled(Box)` 16 | background-image: linear-gradient( 17 | ${({ theme }) => theme.colors.white}, 18 | ${({ theme }) => theme.colors.snow} 19 | ); 20 | ` 21 | -------------------------------------------------------------------------------- /src/components/ProductCard/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Link } from 'gatsby' 3 | import { Box, Heading, Text } from '@hackclub/design-system' 4 | import FadeIn from 'react-lazyload-fadein' 5 | 6 | import { Item, ImageWrapper, ImageSpacer, StyledImage } from './style' 7 | 8 | export default ({ 9 | product: { 10 | fields: { slug, image }, 11 | title, 12 | description, 13 | availableForSale, 14 | variants 15 | } 16 | }) => { 17 | const productInfo = JSON.parse(description) 18 | return ( 19 | <Link to={slug}> 20 | <Item> 21 | <ImageWrapper> 22 | <ImageSpacer /> 23 | <FadeIn> 24 | {onload => <StyledImage src={image} alt={title} onLoad={onload} />} 25 | </FadeIn> 26 | </ImageWrapper> 27 | <Box p={3}> 28 | <Heading.h3 29 | f={[3, 4]} 30 | mb={1} 31 | color={ 32 | productInfo.exists 33 | ? availableForSale 34 | ? 'black' 35 | : 'muted' 36 | : 'black' 37 | } 38 | > 39 | {title} 40 | </Heading.h3> 41 | <Text 42 | f={2} 43 | mb={2} 44 | color={ 45 | productInfo.exists 46 | ? availableForSale 47 | ? 'black' 48 | : 'muted' 49 | : 'black' 50 | } 51 | > 52 | {productInfo.description} 53 | </Text> 54 | <Text f={2} color="muted"> 55 | {productInfo.exists 56 | ? availableForSale 57 | ? `$${variants.edges[0].node.price}` 58 | : 'Out of Stock' 59 | : `$${variants.edges[0].node.price}`} 60 | </Text> 61 | </Box> 62 | </Item> 63 | </Link> 64 | ) 65 | } 66 | -------------------------------------------------------------------------------- /src/components/ProductCard/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components' 2 | import { Image } from '@hackclub/design-system' 3 | 4 | import Card from '../Card' 5 | 6 | export const Item = styled(Card)` 7 | max-width: 40rem; 8 | height: 100%; 9 | overflow: hidden; 10 | 11 | img { 12 | width: 100%; 13 | } 14 | ` 15 | 16 | export const ImageWrapper = styled.div` 17 | position: relative; 18 | overflow: hidden; 19 | ` 20 | export const ImageSpacer = styled.div` 21 | width: 70%; 22 | padding-bottom: 70%; 23 | ` 24 | 25 | export const StyledImage = styled(Image)` 26 | position: absolute; 27 | top: 0px; 28 | left: 0px; 29 | object-fit: cover; 30 | object-position: center center; 31 | width: 100%; 32 | height: 100%; 33 | ` 34 | -------------------------------------------------------------------------------- /src/components/ProductImage/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import Card from '../Card' 3 | import { BlurredArt, Art } from './style' 4 | import VisibilitySensor from 'react-visibility-sensor' 5 | 6 | export default ({ src, alt }) => ( 7 | <VisibilitySensor> 8 | <Card> 9 | <BlurredArt src={src} alt={alt} /> 10 | <Art src={src} alt={alt} /> 11 | </Card> 12 | </VisibilitySensor> 13 | ) 14 | -------------------------------------------------------------------------------- /src/components/ProductImage/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components' 2 | import { Image } from '@hackclub/design-system' 3 | 4 | export const BlurredArt = styled(Image)` 5 | // there are some problems with blurring images on mobile devices and perf 6 | display: none; 7 | 8 | ${({ theme }) => theme.mediaQueries.sm} { 9 | display: block; 10 | border-radius: ${({ theme }) => theme.radii[2]}; 11 | position: absolute; 12 | width: 106.25%; 13 | height: 106.25%; 14 | left: -3.125%; 15 | filter: blur(12px); 16 | opacity: 0.375; 17 | z-index: 1; 18 | } 19 | ` 20 | 21 | export const Art = styled(Image)` 22 | border-radius: ${({ theme }) => theme.radii[2]}; 23 | width: 100%; 24 | height: 100%; 25 | margin-bottom: -6px; 26 | position: relative; 27 | z-index: 2; 28 | cursor: pointer; 29 | ` 30 | -------------------------------------------------------------------------------- /src/components/ProductShareButtons/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { CopyLinkButton } from '../Button' 3 | import { Container } from './style' 4 | import { url } from '../../data.json' 5 | 6 | export default ({ slug }) => ( 7 | <Container> 8 | <CopyLinkButton text={url + slug}>Copy Link</CopyLinkButton> 9 | </Container> 10 | ) 11 | -------------------------------------------------------------------------------- /src/components/ProductShareButtons/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components' 2 | import { Flex } from '@hackclub/design-system' 3 | 4 | export const Container = styled(Flex).attrs({ 5 | align: 'center', 6 | justify: 'center', 7 | wrap: true, 8 | my: [3, 4] 9 | })`` 10 | -------------------------------------------------------------------------------- /src/components/ProductView/LightBox.js: -------------------------------------------------------------------------------- 1 | import React, { Fragment } from 'react' 2 | import Lightbox from 'react-image-lightbox' 3 | import 'react-image-lightbox/style.css' 4 | 5 | export default ({ 6 | images, 7 | open, 8 | photoIndex, 9 | closeBox, 10 | prevImage, 11 | nextImage 12 | }) => { 13 | const flatImages = images.edges.map(i => i.node.src) 14 | 15 | return ( 16 | <Fragment> 17 | {open && ( 18 | <Lightbox 19 | mainSrc={flatImages[photoIndex]} 20 | nextSrc={flatImages[(photoIndex + 1) % flatImages.length]} 21 | prevSrc={ 22 | flatImages[(photoIndex + flatImages.length - 1) % flatImages.length] 23 | } 24 | onCloseRequest={closeBox} 25 | onMovePrevRequest={prevImage} 26 | onMoveNextRequest={nextImage} 27 | /> 28 | )} 29 | </Fragment> 30 | ) 31 | } 32 | -------------------------------------------------------------------------------- /src/components/ProductView/index.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | import { Box } from '@hackclub/design-system' 3 | import { Link } from 'gatsby' 4 | import FadeIn from 'react-lazyload-fadein' 5 | 6 | import { 7 | Grid, 8 | ImageGrid, 9 | SmallImage, 10 | Sidebar, 11 | Content, 12 | Breadcrumbs, 13 | Title, 14 | Description, 15 | Price, 16 | Divider, 17 | Label, 18 | Bouncing 19 | } from './style' 20 | import ProductImage from '../ProductImage' 21 | import DesignersGrid from '../DesignersGrid' 22 | import ProductShareButtons from '../ProductShareButtons' 23 | import LightBox from './LightBox' 24 | import AddToCart from '../AddToCart' 25 | 26 | export default class extends Component { 27 | state = { 28 | open: false, 29 | photoIndex: 0 30 | } 31 | 32 | openBox = image => 33 | this.setState({ 34 | open: true, 35 | photoIndex: image 36 | }) 37 | 38 | closeBox = () => 39 | this.setState({ 40 | open: false 41 | }) 42 | 43 | prevImage = () => 44 | this.setState({ 45 | photoIndex: 46 | (this.state.photoIndex + this.props.product.images.edges.length - 1) % 47 | this.props.product.images.edges.length 48 | }) 49 | 50 | nextImage = () => 51 | this.setState({ 52 | photoIndex: 53 | (this.state.photoIndex + 1) % this.props.product.images.edges.length 54 | }) 55 | 56 | render() { 57 | const { open, photoIndex } = this.state 58 | const { 59 | product: { 60 | title, 61 | id, 62 | description, 63 | availableForSale, 64 | variants, 65 | images, 66 | fields: { slug, image } 67 | } 68 | } = this.props 69 | const productInfo = JSON.parse(description) // parse product info from JSON 70 | return ( 71 | <Grid my={[4, 5]}> 72 | <LightBox 73 | images={images} 74 | open={open} 75 | photoIndex={photoIndex} 76 | closeBox={this.closeBox} 77 | prevImage={this.prevImage} 78 | nextImage={this.nextImage} 79 | /> 80 | <Sidebar> 81 | <Box onClick={() => this.openBox(0)}> 82 | <ProductImage src={image} alt={title} /> 83 | </Box> 84 | <ImageGrid> 85 | {images.edges.slice(1).map((image, index) => ( 86 | <Box style={{ position: 'relative' }} mt={3}> 87 | <FadeIn height={150} placeholder={<Bouncing />} debounce={1000}> 88 | {onload => ( 89 | <SmallImage 90 | src={image.node.src} 91 | alt="" 92 | onLoad={onload} 93 | onClick={() => this.openBox(index + 1)} 94 | /> 95 | )} 96 | </FadeIn> 97 | </Box> 98 | ))} 99 | </ImageGrid> 100 | <ProductShareButtons slug={slug} /> 101 | {productInfo.designers && 102 | productInfo.designers.length !== 0 && ( 103 | <> 104 | <Divider> 105 | <Label>Designed By</Label> 106 | </Divider> 107 | <DesignersGrid designers={productInfo.designers} /> 108 | </> 109 | )} 110 | </Sidebar> 111 | 112 | <Content> 113 | <Breadcrumbs> 114 | <Link to="/">All Products ›</Link> 115 | </Breadcrumbs> 116 | <Title>{title} 117 | 120 | {variants.edges[0].node.price} 121 | 128 | 129 | 130 | ) 131 | } 132 | } 133 | -------------------------------------------------------------------------------- /src/components/ProductView/style.js: -------------------------------------------------------------------------------- 1 | import styled, { keyframes } from 'styled-components' 2 | import { Box, Flex, Text, Heading, Image } from '@hackclub/design-system' 3 | import React from 'react' 4 | 5 | export const Grid = styled(Box)` 6 | display: grid; 7 | grid-template-columns: 1fr; 8 | grid-template-areas: 'content' 'sidebar'; 9 | grid-gap: ${({ theme }) => theme.space[5]}px; 10 | 11 | ${({ theme }) => theme.mediaQueries.md} { 12 | grid-template-columns: 20rem 1fr; 13 | grid-template-rows: auto; 14 | grid-template-areas: 'sidebar content'; 15 | } 16 | ` 17 | 18 | export const Sidebar = styled(Box)` 19 | grid-area: sidebar; 20 | ` 21 | 22 | export const Content = styled(Box)` 23 | grid-area: content; 24 | 25 | input { 26 | background-color: ${({ theme }) => theme.colors.white}; 27 | } 28 | ` 29 | 30 | export const Breadcrumbs = styled(Text).attrs({ 31 | bold: true, 32 | caps: true, 33 | color: 'slate', 34 | f: 4 35 | })`` 36 | 37 | export const Title = styled(Heading.h1).attrs({ 38 | f: 6, 39 | mt: 0, 40 | mb: 1 41 | })` 42 | line-height: 1.125; 43 | ` 44 | 45 | export const Description = styled(Heading.h2).attrs({ 46 | f: 4, 47 | color: 'slate' 48 | })` 49 | font-weight: 400; 50 | ` 51 | 52 | export const Price = styled(Text).attrs({ 53 | f: 5, 54 | mt: 2, 55 | mb: 3, 56 | color: 'muted' 57 | })` 58 | text-indent: -4px; 59 | &:before { 60 | content: '$'; 61 | display: inline-block; 62 | font-size: ${({ theme }) => theme.fontSizes[2]}px; 63 | vertical-align: text-top; 64 | width: 4px; 65 | } 66 | ` 67 | 68 | export const Divider = styled(Box)` 69 | position: relative; 70 | height: 1px; 71 | border-bottom: 1px solid ${({ theme }) => theme.colors.smoke}; 72 | width: 100%; 73 | margin-top: 48px; 74 | ` 75 | 76 | export const Label = styled(Text.span).attrs({ 77 | fontSize: 1, 78 | bg: 'snow', 79 | color: 'slate' 80 | })` 81 | position: relative; 82 | top: -13px; 83 | padding: 2px 16px 2px 0; 84 | text-transform: uppercase; 85 | letter-spacing: 0.025em; 86 | ` 87 | 88 | export const ImageGrid = styled(Box)` 89 | display: grid; 90 | grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); 91 | grid-gap: 8px; 92 | ` 93 | 94 | export const SmallImage = styled(Image)` 95 | border-radius: 8px; 96 | cursor: pointer; 97 | transform: scale(1); 98 | transition: ${({ theme }) => theme.transition} all; 99 | &:hover { 100 | box-shadow: ${({ theme }) => theme.boxShadows[1]}; 101 | transform: scale(${({ theme }) => theme.scaleFactor}); 102 | } 103 | ` 104 | 105 | const bouncingLoader = keyframes` 106 | from { 107 | opacity: 1; 108 | transform: translateY(0); 109 | } 110 | to { 111 | opacity: 0.1; 112 | transform: translateY(-1rem); 113 | } 114 | ` 115 | 116 | export const StyledBouncing = styled(Flex)` 117 | display: flex; 118 | justify-content: center; 119 | 120 | > div { 121 | width: 1rem; 122 | height: 1rem; 123 | margin: 3rem 0.2rem; 124 | background: ${({ theme }) => theme.colors.slate}; 125 | border-radius: 50%; 126 | animation: ${bouncingLoader} 0.6s infinite alternate; 127 | } 128 | 129 | > div:nth-child(2) { 130 | animation-delay: 0.2s; 131 | } 132 | 133 | > div:nth-child(3) { 134 | animation-delay: 0.4s; 135 | } 136 | ` 137 | 138 | export const Bouncing = () => ( 139 | 140 |
141 |
142 |
143 | 144 | ) 145 | -------------------------------------------------------------------------------- /src/components/ProductsGrid/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { StaticQuery, graphql } from 'gatsby' 3 | import { orderBy } from 'lodash' 4 | 5 | import { Grid } from './style' 6 | import ProductCard from '../ProductCard' 7 | import EmailSignup from '../EmailSignup' 8 | 9 | export default () => ( 10 | ( 37 | 38 | {orderBy(products.edges, [p => p.node.availableForSale], ['desc']).map( 39 | ({ node: product }) => ( 40 | 41 | ) 42 | )} 43 | 44 | 45 | )} 46 | /> 47 | ) 48 | -------------------------------------------------------------------------------- /src/components/ProductsGrid/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components' 2 | import { Box } from '@hackclub/design-system' 3 | 4 | export const Grid = styled(Box)` 5 | display: grid; 6 | grid-gap: 1rem; 7 | ${({ theme }) => theme.mediaQueries.md} { 8 | grid-gap: 2rem; 9 | grid-template-columns: repeat(3, 1fr); 10 | } 11 | ` 12 | -------------------------------------------------------------------------------- /src/components/Transition/index.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | import { Transition as ReactTransition } from 'react-transition-group' 3 | import getTransitionStyle from '../../utils/getTransitionStyle' 4 | import { historyExitingEventType, timeout } from '../../../gatsby-browser' 5 | 6 | class Transition extends Component { 7 | state = { exiting: false } 8 | 9 | listenerHandler = event => { 10 | this.setState({ exiting: true }) 11 | } 12 | 13 | componentDidMount() { 14 | window.addEventListener(historyExitingEventType, this.listenerHandler) 15 | } 16 | 17 | componentWillUnmount() { 18 | window.removeEventListener(historyExitingEventType, this.listenerHandler) 19 | } 20 | 21 | static getDerivedStateFromProps({ exiting }) { 22 | if (exiting) { 23 | return { exiting: false } 24 | } 25 | return null 26 | } 27 | 28 | render() { 29 | const transitionProps = { 30 | timeout: { 31 | enter: 0, 32 | exit: timeout 33 | }, 34 | appear: true, 35 | in: !this.state.exiting 36 | } 37 | 38 | return ( 39 | 40 | {status => ( 41 |
46 | <>{this.props.children} 47 |
48 | )} 49 |
50 | ) 51 | } 52 | } 53 | 54 | export default Transition 55 | -------------------------------------------------------------------------------- /src/context/StoreContext.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import Client from 'shopify-buy' 3 | 4 | const client = Client.buildClient({ 5 | domain: 'hackclub.myshopify.com', 6 | storefrontAccessToken: 'ba720b36f1e99b2719bc74ef728ec847' 7 | }) 8 | 9 | export const defaultStoreContext = { 10 | client, 11 | isCartOpen: false, 12 | checkout: { lineItems: [] }, 13 | products: [], 14 | shop: {}, 15 | addVariantToCart: () => {}, 16 | removeLineItem: () => {}, 17 | updateQuantity: () => {}, 18 | toggleCart: () => {} 19 | } 20 | 21 | export default React.createContext(defaultStoreContext) 22 | -------------------------------------------------------------------------------- /src/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Hack Club Shop", 3 | "description": "Get Hack Club stickers and swag, now available on the Hack Club Shop.", 4 | "url": "https://shop.hackclub.com/", 5 | "img": "https://shop.hackclub.com/social.png" 6 | } 7 | -------------------------------------------------------------------------------- /src/pages/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | import Page, { SectionHeading } from '../components/Page' 4 | import { name } from '../data.json' 5 | import ProductsGrid from '../components/ProductsGrid' 6 | 7 | export default () => ( 8 | 9 | 10 | 11 | 12 | ) 13 | -------------------------------------------------------------------------------- /src/templates/product.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { graphql } from 'gatsby' 3 | 4 | import Page from '../components/Page' 5 | import ProductView from '../components/ProductView' 6 | 7 | export default ({ data: { shopifyProducts } }) => ( 8 | 9 | 10 | 11 | ) 12 | 13 | export const query = graphql` 14 | query($slug: String!) { 15 | shopifyProducts(fields: { slug: { eq: $slug } }) { 16 | id 17 | title 18 | description 19 | availableForSale 20 | tags 21 | images { 22 | edges { 23 | node { 24 | id 25 | src 26 | } 27 | } 28 | } 29 | variants { 30 | edges { 31 | node { 32 | price 33 | title 34 | id 35 | } 36 | } 37 | } 38 | fields { 39 | image 40 | slug 41 | } 42 | } 43 | } 44 | ` 45 | -------------------------------------------------------------------------------- /src/utils/getTransitionStyle.js: -------------------------------------------------------------------------------- 1 | const getTransitionStyles = timeout => { 2 | return { 3 | entering: { 4 | opacity: 0 5 | }, 6 | entered: { 7 | transition: `opacity ${timeout}ms ease-in-out`, 8 | opacity: 1 9 | }, 10 | exiting: { 11 | transition: `opacity ${timeout}ms ease-in-out`, 12 | opacity: 0 13 | } 14 | } 15 | } 16 | 17 | const getTransitionStyle = ({ timeout, status }) => 18 | getTransitionStyles(timeout)[status] 19 | 20 | export default getTransitionStyle 21 | -------------------------------------------------------------------------------- /static/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/shop/9911ffde8b55b758c320d800b219879667344516/static/banner.png -------------------------------------------------------------------------------- /static/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | #ffffff -------------------------------------------------------------------------------- /static/favicons/android-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/shop/9911ffde8b55b758c320d800b219879667344516/static/favicons/android-icon-144x144.png -------------------------------------------------------------------------------- /static/favicons/android-icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/shop/9911ffde8b55b758c320d800b219879667344516/static/favicons/android-icon-192x192.png -------------------------------------------------------------------------------- /static/favicons/android-icon-36x36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/shop/9911ffde8b55b758c320d800b219879667344516/static/favicons/android-icon-36x36.png -------------------------------------------------------------------------------- /static/favicons/android-icon-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/shop/9911ffde8b55b758c320d800b219879667344516/static/favicons/android-icon-48x48.png -------------------------------------------------------------------------------- /static/favicons/android-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/shop/9911ffde8b55b758c320d800b219879667344516/static/favicons/android-icon-72x72.png -------------------------------------------------------------------------------- /static/favicons/android-icon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/shop/9911ffde8b55b758c320d800b219879667344516/static/favicons/android-icon-96x96.png -------------------------------------------------------------------------------- /static/favicons/apple-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/shop/9911ffde8b55b758c320d800b219879667344516/static/favicons/apple-icon-114x114.png -------------------------------------------------------------------------------- /static/favicons/apple-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/shop/9911ffde8b55b758c320d800b219879667344516/static/favicons/apple-icon-120x120.png -------------------------------------------------------------------------------- /static/favicons/apple-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/shop/9911ffde8b55b758c320d800b219879667344516/static/favicons/apple-icon-144x144.png -------------------------------------------------------------------------------- /static/favicons/apple-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/shop/9911ffde8b55b758c320d800b219879667344516/static/favicons/apple-icon-152x152.png -------------------------------------------------------------------------------- /static/favicons/apple-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/shop/9911ffde8b55b758c320d800b219879667344516/static/favicons/apple-icon-180x180.png -------------------------------------------------------------------------------- /static/favicons/apple-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/shop/9911ffde8b55b758c320d800b219879667344516/static/favicons/apple-icon-57x57.png -------------------------------------------------------------------------------- /static/favicons/apple-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/shop/9911ffde8b55b758c320d800b219879667344516/static/favicons/apple-icon-60x60.png -------------------------------------------------------------------------------- /static/favicons/apple-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/shop/9911ffde8b55b758c320d800b219879667344516/static/favicons/apple-icon-72x72.png -------------------------------------------------------------------------------- /static/favicons/apple-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/shop/9911ffde8b55b758c320d800b219879667344516/static/favicons/apple-icon-76x76.png -------------------------------------------------------------------------------- /static/favicons/apple-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/shop/9911ffde8b55b758c320d800b219879667344516/static/favicons/apple-icon-precomposed.png -------------------------------------------------------------------------------- /static/favicons/apple-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/shop/9911ffde8b55b758c320d800b219879667344516/static/favicons/apple-icon.png -------------------------------------------------------------------------------- /static/favicons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/shop/9911ffde8b55b758c320d800b219879667344516/static/favicons/favicon-16x16.png -------------------------------------------------------------------------------- /static/favicons/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/shop/9911ffde8b55b758c320d800b219879667344516/static/favicons/favicon-32x32.png -------------------------------------------------------------------------------- /static/favicons/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/shop/9911ffde8b55b758c320d800b219879667344516/static/favicons/favicon-96x96.png -------------------------------------------------------------------------------- /static/favicons/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/shop/9911ffde8b55b758c320d800b219879667344516/static/favicons/favicon.ico -------------------------------------------------------------------------------- /static/favicons/ms-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/shop/9911ffde8b55b758c320d800b219879667344516/static/favicons/ms-icon-144x144.png -------------------------------------------------------------------------------- /static/favicons/ms-icon-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/shop/9911ffde8b55b758c320d800b219879667344516/static/favicons/ms-icon-150x150.png -------------------------------------------------------------------------------- /static/favicons/ms-icon-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/shop/9911ffde8b55b758c320d800b219879667344516/static/favicons/ms-icon-310x310.png -------------------------------------------------------------------------------- /static/favicons/ms-icon-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/shop/9911ffde8b55b758c320d800b219879667344516/static/favicons/ms-icon-70x70.png -------------------------------------------------------------------------------- /static/flag.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /static/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "App", 3 | "icons": [ 4 | { 5 | "src": "\/android-icon-36x36.png", 6 | "sizes": "36x36", 7 | "type": "image\/png", 8 | "density": "0.75" 9 | }, 10 | { 11 | "src": "\/android-icon-48x48.png", 12 | "sizes": "48x48", 13 | "type": "image\/png", 14 | "density": "1.0" 15 | }, 16 | { 17 | "src": "\/android-icon-72x72.png", 18 | "sizes": "72x72", 19 | "type": "image\/png", 20 | "density": "1.5" 21 | }, 22 | { 23 | "src": "\/android-icon-96x96.png", 24 | "sizes": "96x96", 25 | "type": "image\/png", 26 | "density": "2.0" 27 | }, 28 | { 29 | "src": "\/android-icon-144x144.png", 30 | "sizes": "144x144", 31 | "type": "image\/png", 32 | "density": "3.0" 33 | }, 34 | { 35 | "src": "\/android-icon-192x192.png", 36 | "sizes": "192x192", 37 | "type": "image\/png", 38 | "density": "4.0" 39 | } 40 | ] 41 | } -------------------------------------------------------------------------------- /static/social.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hackclub/shop/9911ffde8b55b758c320d800b219879667344516/static/social.png --------------------------------------------------------------------------------