├── .babelrc ├── .gitignore ├── CHANGELOG.md ├── README.md ├── createNodeEntities.js ├── gatsby-node.js ├── gatsby-source-custom-api-logo.png ├── gatsby-source-custom-api.code-workspace ├── index.js ├── package.json ├── utils ├── buildNode.js ├── flattenEntities.js ├── getTypeDefs.js ├── getUrl.js ├── helpers.js ├── loadImages.js └── normalizeKeys.js └── yarn.lock /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | [ 4 | "@babel/preset-env", 5 | { 6 | "modules": false 7 | } 8 | ] 9 | ], 10 | "plugins": [ 11 | "@babel/plugin-proposal-class-properties", 12 | "@babel/plugin-syntax-dynamic-import", 13 | "babel-plugin-macros" 14 | ] 15 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | __assets 2 | deploy.sh 3 | 4 | # Logs 5 | logs 6 | *.log 7 | npm-debug.log* 8 | yarn-debug.log* 9 | yarn-error.log* 10 | 11 | # Runtime data 12 | pids 13 | *.pid 14 | *.seed 15 | *.pid.lock 16 | 17 | # Directory for instrumented libs generated by jscoverage/JSCover 18 | lib-cov 19 | 20 | # Coverage directory used by tools like istanbul 21 | coverage 22 | 23 | # nyc test coverage 24 | .nyc_output 25 | 26 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 27 | .grunt 28 | 29 | # Bower dependency directory (https://bower.io/) 30 | bower_components 31 | 32 | # node-waf configuration 33 | .lock-wscript 34 | 35 | # Compiled binary addons (http://nodejs.org/api/addons.html) 36 | build/Release 37 | 38 | # Dependency directories 39 | node_modules/ 40 | jspm_packages/ 41 | 42 | # Typescript v1 declaration files 43 | typings/ 44 | 45 | # Optional npm cache directory 46 | .npm 47 | 48 | # Optional eslint cache 49 | .eslintcache 50 | 51 | # Optional REPL history 52 | .node_repl_history 53 | 54 | # Output of 'npm pack' 55 | *.tgz 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # gatsby files 61 | .cache/ 62 | public 63 | 64 | # Mac files 65 | .DS_Store 66 | 67 | # Yarn 68 | yarn-error.log 69 | .pnp/ 70 | .pnp.js 71 | # Yarn Integrity file 72 | .yarn-integrity 73 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | #### 2.3.6 (2022-04-13) 2 | 3 | #### 2.3.4 (2022-03-15) 4 | 5 | #### 2.3.3 (2022-01-31) 6 | 7 | #### 2.3.2 (2021-09-09) 8 | 9 | #### 2.3.1 (2021-08-16) 10 | 11 | ### 2.3.0 (2021-08-16) 12 | 13 | #### 2.2.1 (2021-08-12) 14 | 15 | ##### Other Changes 16 | 17 | * Added gif to supported image ext. ([66aa36ab](https://github.com/AndreasFaust/gatsby-source-custom-api/commit/66aa36ab7e63ecf482f115b601658226b28474af)) 18 | 19 | ### 2.2.0 (2020-12-28) 20 | 21 | #### 2.1.4 (2020-01-19) 22 | 23 | ##### Documentation Changes 24 | 25 | * add information about multiple instances ([9d0076ee](https://github.com/AndreasFaust/gatsby-source-custom-api/commit/9d0076ee200fd045456f2207403ece696cbb9ac4)) 26 | 27 | #### 2.1.3 (2019-12-29) 28 | 29 | #### 2.1.2 (2019-07-19) 30 | 31 | #### 2.1.1 (2019-07-16) 32 | 33 | ##### Bug Fixes 34 | 35 | * add readme ([3553ab46](https://github.com/AndreasFaust/gatsby-source-custom-api/commit/3553ab467ab49b16513ec94284ed09b5b2a676f5)) 36 | 37 | ### 2.1.0 (2019-07-16) 38 | 39 | ##### Breaking Changes 40 | 41 | * restructure projekt. ([1f6ba239](https://github.com/AndreasFaust/gatsby-source-custom-api/commit/1f6ba23984c8bb83952a438f24f61fa9529144e2)) 42 | 43 | ##### New Features 44 | 45 | * Add new test-API. ([59e4ac8e](https://github.com/AndreasFaust/gatsby-source-custom-api/commit/59e4ac8ea489620f46e332b55249f96ef2d35463)) 46 | 47 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Logo of gatsby-source-custom-api](https://github.com/andreasfaust/gatsby-source-custom-api/raw/master/gatsby-source-custom-api-logo.png) 2 | 3 | **gatsby-source-custom-api** helps you sourcing data from any API and transform it into Gatsby nodes. Define keys you want to be transformed into image-nodes and use them with **[Gatsby Image](https://www.gatsbyjs.org/packages/gatsby-image/)**. 4 | 5 | ## Getting Started 6 | 7 | 1. Install the package with **yarn** or **npm** 8 | 9 | `yarn add gatsby-source-custom-api` 10 | 11 | 2. Add to plugins in your gatsby-config.js 12 | 13 | ```javascript 14 | module.exports = { 15 | plugins: [ 16 | { 17 | resolve: "gatsby-source-custom-api", 18 | options: { 19 | url: "www.my-custom-api.com" 20 | } 21 | } 22 | ] 23 | }; 24 | ``` 25 | 26 | ## Options 27 | 28 | | **Name** | **Type** | **Description** | 29 | | :-------- | :--------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | 30 | | url | object or string | `Required.` Url of your API as a string. If you have two different APIs for development and production, define an object with the keys `production` and `development`. | 31 | | headers | object | Request headers. Format is the identical to that accepted by the Headers constructor. See https://www.npmjs.com/package/node-fetch 32 | | auth | object | `Optional`. Define the auth for your API in the following format: `{ username: "username", password: "password" }`. | 33 | | rootKey | string | `Optional.` Name your API. | 34 | | imageKeys | array | Define the keys of image objects. These must have a childkey called `url`, which is a string that defines the path to an image file. Gatsby-Images are added as childkey `local`. Default: `['image']`. | 35 | | schemas | object | Define default-schemas for the objects of your API. See "Provide Default Schemas" for more information. | 36 | 37 | ## Provide Default Schemas 38 | 39 | You need to provide default schemas for the arrays and objects of your API to avoid GraphQl-errors. You can provide default schemas via the prop `schemas`. More information: [https://graphql.org/learn/schema/](https://graphql.org/learn/schema/) 40 | 41 | ```javascript 42 | // Lets assume this is the data from your API: 43 | const exampleDataFromApi = [ 44 | { 45 | url: "post-1", 46 | images: [ 47 | { 48 | url: "image-1.jpg", 49 | modified: 1556752476267 50 | }, 51 | { 52 | url: "image-2.jpg", 53 | modified: 1556752702168 54 | } 55 | ], 56 | author: { 57 | firstname: "John", 58 | lastname: "Doe" 59 | } 60 | } 61 | ]; 62 | 63 | // This is the content of your gatsby-config.js 64 | // and what you need to provide as schema: 65 | module.exports = { 66 | plugins: [ 67 | { 68 | resolve: "gatsby-source-custom-api", 69 | options: { 70 | url: { 71 | development: "http://my-local-api.dev", // on "gatsby develop" 72 | production: "https://my-remote-api.com" // on "gatsby build" 73 | }, 74 | imageKeys: ["images"], 75 | rootKey: "posts", 76 | schemas: { 77 | posts: ` 78 | url: String 79 | images: [images] 80 | author: author 81 | `, 82 | images: ` 83 | url: String 84 | modified: Int 85 | `, 86 | author: ` 87 | firstname: String 88 | lastname: String 89 | ` 90 | } 91 | } 92 | } 93 | ] 94 | }; 95 | ``` 96 | 97 | ## Multiple Sources? Multiple Instances! 98 | 99 | If you have multiple sources for your API in your project, just instantiate the plugin multiple times. Just be sure to set a different `rootKey` for every instance. 100 | 101 | **Connect different APIs** 102 | You can connect the different APIs with `@link`. Find out more about this at https://www.gatsbyjs.org/docs/schema-customization/#foreign-key-fields. 103 | 104 | ```javascript 105 | module.exports = { 106 | plugins: [ 107 | { 108 | resolve: "gatsby-source-custom-api", 109 | options: { 110 | url: "https://my-first-api.com", 111 | rootKey: 'authors', 112 | schemas: { 113 | authors: ` 114 | name: String 115 | description: String 116 | ` 117 | } 118 | } 119 | }, 120 | { 121 | resolve: "gatsby-source-custom-api", 122 | options: { 123 | url: "https://my-second-api.com", 124 | rootKey: 'posts', 125 | schemas: { 126 | posts: ` 127 | text: String 128 | authors: authors @link(by: "name") 129 | ` 130 | } 131 | } 132 | } 133 | ] 134 | }; 135 | ``` 136 | 137 | ## Images 138 | 139 | `Gatsby Source Custom API` automatically downloads your image-files, so you can use them with **[Gatsby Image](https://www.gatsbyjs.org/packages/gatsby-image/)**. 140 | 141 | #### How does it recognize images? 142 | 143 | The default key for images is `image`. You can also define your own image keys with the option `imageKeys`. Images have to be objects containing a childkey called `url`, which is a string that defines the path to an image file. Gatsby-Images are added as childkey `local`. 144 | 145 | #### What about Caching? 146 | 147 | If your image object provides a key called `modified`, this key gets cached and compared every time you build or develop. If it stays the same, the already downloaded version of the image-file is used. 148 | 149 | ## Transform Nodes to Pages 150 | 151 | This is an example of how you use the required nodes to automatically generate pages: Insert the following code into the file `gatsby-node.js`. The sample key here is an array called `posts`. All array-elements can be required in GraphQl via `allPosts`. In this example the posts have a child-key called "url", which defines their path and serves as marker to find them in your matching React-component (`pages/post.js`). 152 | 153 | ```javascript 154 | const path = require("path"); 155 | 156 | exports.createPages = async ({ graphql, actions }) => { 157 | const { createPage } = actions; 158 | const result = await graphql(` 159 | { 160 | allPosts { 161 | nodes { 162 | url 163 | } 164 | } 165 | } 166 | `); 167 | return Promise.all( 168 | result.data.allPosts.nodes.map(async node => { 169 | await createPage({ 170 | path: node.url, 171 | component: path.resolve("./src/pages/post.js"), 172 | context: { 173 | // Data passed to context is available 174 | // in page queries as GraphQL variables. 175 | url: node.url 176 | } 177 | }); 178 | }) 179 | ); 180 | }; 181 | ``` 182 | 183 | In your `pages/post.js` you can require the data like so: 184 | 185 | ```jsx 186 | import React from "react"; 187 | import { graphql } from "gatsby"; 188 | 189 | const Post = ({ data }) => { 190 | return

{data.posts.title}

; 191 | }; 192 | 193 | export const query = graphql` 194 | query($url: String) { 195 | posts(url: { eq: $url }) { 196 | url 197 | title 198 | image { 199 | local { 200 | childImageSharp { 201 | fluid(maxWidth: 2000) { 202 | ...GatsbyImageSharpFluid_withWebp 203 | } 204 | } 205 | } 206 | alttext 207 | } 208 | } 209 | } 210 | `; 211 | 212 | export default Post; 213 | ``` 214 | 215 | ## Replace conflicting Keys 216 | 217 | Some of the returned keys may be transformed, if they conflict with restricted keys used for GraphQL such as the following `['id', 'children', 'parent', 'fields', 'internal']`. These conflicting keys will now show up as `[key]_normalized`. (Thanks to [gatsby-source-apiserver](https://github.com/thinhle-agilityio/gatsby-source-apiserver)) 218 | 219 | ## Contributing 220 | 221 | Every contribution is very much appreciated. 222 | Feel free to file bugs, feature- and pull-requests. 223 | 224 | ❤️ If this plugin is helpful for you, star it on [GitHub](https://github.com/AndreasFaust/gatsby-source-custom-api). 225 | -------------------------------------------------------------------------------- /createNodeEntities.js: -------------------------------------------------------------------------------- 1 | const { isObject, flattenArray, isArray } = require('./utils/helpers') 2 | const uuid = require('uuid/v1') 3 | 4 | function getEntityNodeLinks (entities, nodeData) { 5 | const links = {} 6 | entities.forEach((entity) => { 7 | const { name } = entity 8 | const linkName = name + '___NODE' 9 | if (links[linkName]) { 10 | links[linkName] = isArray(links[linkName]) 11 | ? [...links[linkName], entity.id] 12 | : [links[linkName], entity.id] 13 | // check if node-content is an array. 14 | // if so, make the link also an array, to avoid conflicts, 15 | // when you have node-content-arrays with just one element 16 | } else if (isArray(nodeData[name])) { 17 | links[linkName] = [entity.id] 18 | } else { 19 | links[linkName] = entity.id 20 | } 21 | }) 22 | return links 23 | } 24 | 25 | function getChildNodeKeys (data, schemas) { 26 | if (!data) return [] 27 | return Object.keys(data).filter((key) => { 28 | if (isObject(data[key])) return true 29 | if (isArray(data[key]) && schemas[key]) { 30 | return true 31 | } 32 | return false 33 | }) 34 | } 35 | 36 | function getDataWithoutChildEntities (data, childNodeKeys) { 37 | const newData = { ...data } 38 | childNodeKeys.forEach((key) => { 39 | delete newData[key] 40 | }) 41 | return newData 42 | } 43 | 44 | function buildEntity ({ 45 | name, data, schemas, createNodeId 46 | }) { 47 | const childNodeKeys = getChildNodeKeys(data, schemas) 48 | const childEntities = flattenArray( 49 | childNodeKeys.map(key => ( 50 | createNodeEntities({ 51 | name: key, 52 | data: data[key], 53 | schemas, 54 | createNodeId 55 | }) 56 | )) 57 | ) 58 | const dataWithoutChildEntities = getDataWithoutChildEntities(data, childNodeKeys) 59 | const entityNodeLinks = getEntityNodeLinks(childEntities, data) 60 | return [{ 61 | id: createNodeId(name + uuid()), 62 | name, 63 | data: dataWithoutChildEntities, 64 | links: entityNodeLinks, 65 | childEntities 66 | }] 67 | } 68 | 69 | function normalizeData (name, data, schemas) { 70 | const schema = schemas[name] 71 | if (!data) return { dummy: true } 72 | if (!Object.keys(data).length && !schema) { 73 | return { dummy: true } 74 | } 75 | if (!schema) { 76 | console.log(`Object '${name}': Better provide a schema!`) 77 | } 78 | return data 79 | } 80 | 81 | function createNodeEntities ({ 82 | name, data, createNodeId, schemas 83 | }) { 84 | if (isArray(data)) { 85 | const entitiesArray = data.map(d => buildEntity({ 86 | name, 87 | data: normalizeData(name, d, schemas), 88 | schemas, 89 | createNodeId 90 | })) 91 | return flattenArray(entitiesArray) 92 | } 93 | if (isObject(data)) { 94 | return buildEntity({ 95 | name, 96 | data: normalizeData(name, data, schemas), 97 | schemas, 98 | createNodeId 99 | }) 100 | } 101 | return [] 102 | } 103 | 104 | module.exports = createNodeEntities 105 | -------------------------------------------------------------------------------- /gatsby-node.js: -------------------------------------------------------------------------------- 1 | const fetch = require('node-fetch') 2 | const createNodeEntities = require('./createNodeEntities') 3 | const normalizeKeys = require('./utils/normalizeKeys') 4 | const flattenEntities = require('./utils/flattenEntities') 5 | const loadImages = require('./utils/loadImages') 6 | const getUrl = require('./utils/getUrl') 7 | const getTypeDefs = require('./utils/getTypeDefs') 8 | const buildNode = require('./utils/buildNode') 9 | 10 | 11 | exports.createSchemaCustomization = async ({ actions }, configOptions) => { 12 | const { createTypes } = actions; 13 | const { 14 | imageKeys = ["image"], 15 | schemas = {} 16 | } = configOptions; 17 | 18 | const typeDefs = getTypeDefs(schemas, imageKeys); 19 | createTypes(typeDefs); 20 | }; 21 | 22 | exports.sourceNodes = async ( 23 | { 24 | actions, createNodeId, createContentDigest, store, cache 25 | }, 26 | configOptions 27 | ) => { 28 | const { createNode, touchNode } = actions 29 | const { 30 | url, 31 | headers, 32 | auth, 33 | rootKey = 'customAPI', 34 | imageKeys = ['image'], 35 | schemas = {} 36 | } = configOptions 37 | 38 | const URL = getUrl(process.env.NODE_ENV, url) 39 | const data = await fetch(URL, { headers }).then(res => res.json()).catch(err => console.log(err)) 40 | 41 | // build entities and correct schemas, where necessary 42 | let entities = flattenEntities(createNodeEntities({ 43 | name: rootKey, 44 | data, 45 | schemas, 46 | createNodeId 47 | })) 48 | 49 | // check for problematic keys 50 | entities = entities.map(entity => ({ 51 | ...entity, 52 | data: normalizeKeys(entity.data) 53 | })) 54 | 55 | // load images or default-dummy-image 56 | entities = await loadImages({ 57 | entities, imageKeys, createNode, createNodeId, touchNode, store, cache, createContentDigest, auth 58 | }) 59 | 60 | // build gatsby-node-object 61 | entities = entities.map(entity => buildNode({ entity, createContentDigest })) 62 | 63 | // render nodes 64 | entities.forEach((entity) => { 65 | createNode(entity) 66 | }) 67 | } 68 | -------------------------------------------------------------------------------- /gatsby-source-custom-api-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndreasFaust/gatsby-source-custom-api/cab07959b2b236b5c45ed34b403a28f75eb1eae3/gatsby-source-custom-api-logo.png -------------------------------------------------------------------------------- /gatsby-source-custom-api.code-workspace: -------------------------------------------------------------------------------- 1 | { 2 | "folders": [ 3 | { 4 | "path": "." 5 | } 6 | ], 7 | "settings": {} 8 | } -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndreasFaust/gatsby-source-custom-api/cab07959b2b236b5c45ed34b403a28f75eb1eae3/index.js -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gatsby-source-custom-api", 3 | "version": "2.3.6", 4 | "description": "Source data from any API and transform it into Gatsby-nodes. Download your image files and use them with Gatsby Image.", 5 | "main": "index.js", 6 | "author": "Andreas Faust", 7 | "license": "ISC", 8 | "repository": { 9 | "type": "git", 10 | "url": "https://github.com/AndreasFaust/gatsby-source-custom-api" 11 | }, 12 | "keywords": [ 13 | "gatsby", 14 | "gatsby-plugin", 15 | "source", 16 | "api", 17 | "json", 18 | "image", 19 | "cache" 20 | ], 21 | "scripts": { 22 | "release:major": "changelog -M && git add CHANGELOG.md && git commit -m 'updated CHANGELOG.md' && npm version major && git push origin && git push origin --tags", 23 | "release:minor": "changelog -m && git add CHANGELOG.md && git commit -m 'updated CHANGELOG.md' && npm version minor && git push origin && git push origin --tags", 24 | "release:patch": "changelog -p && git add CHANGELOG.md && git commit -m 'updated CHANGELOG.md' && npm version patch && git push origin && git push origin --tags" 25 | }, 26 | "dependencies": { 27 | "gatsby-source-filesystem": "^2.0.29", 28 | "node-fetch": "^2.6.1", 29 | "uuid": "^3.3.2" 30 | }, 31 | "devDependencies": { 32 | "generate-changelog": "^1.7.1" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /utils/buildNode.js: -------------------------------------------------------------------------------- 1 | module.exports = ({ 2 | entity: { id, name, data, links, childEntities }, 3 | createContentDigest 4 | }) => { 5 | return { 6 | ...data, 7 | ...links, 8 | id, 9 | childEntities, // childentities get flattened at the end! 10 | parent: null, 11 | children: [], 12 | internal: { 13 | type: name, 14 | content: JSON.stringify(data), 15 | contentDigest: createContentDigest(data) 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /utils/flattenEntities.js: -------------------------------------------------------------------------------- 1 | function removeChildEntities (ent) { 2 | const { childEntities, ...rest } = ent 3 | return rest 4 | } 5 | 6 | function flattenEntities (entities, flat) { 7 | let flatEntities = flat || [] 8 | entities.forEach((ent) => { 9 | flatEntities = [...flatEntities, removeChildEntities(ent)] 10 | if (ent.childEntities) { 11 | flatEntities = flattenEntities(ent.childEntities, flatEntities) 12 | } 13 | }) 14 | return flatEntities 15 | } 16 | 17 | module.exports = flattenEntities 18 | -------------------------------------------------------------------------------- /utils/getTypeDefs.js: -------------------------------------------------------------------------------- 1 | const getTypeDef = (name, schema, imageKeys) => { 2 | const local = imageKeys.includes(name) ? 'local: File @link(by: "id", from: "local___NODE")' : '' 3 | return ` 4 | type ${name} implements Node { 5 | ${schema} 6 | ${local} 7 | } 8 | ` 9 | } 10 | 11 | module.exports = (schemas, imageKeys) => { 12 | return Object.keys(schemas) 13 | .map(key => getTypeDef(key, schemas[key], imageKeys)) 14 | } 15 | -------------------------------------------------------------------------------- /utils/getUrl.js: -------------------------------------------------------------------------------- 1 | const urlErrorMessage = 'Url-Error. Please require a valid Url.' 2 | 3 | module.exports = (env, url) => { 4 | if (!url) { 5 | console.log(urlErrorMessage) 6 | return 7 | } 8 | if (typeof url === 'string') return url 9 | const URL = env === 'production' 10 | ? url.production 11 | : url.development 12 | if (URL) return URL 13 | console.log(urlErrorMessage) 14 | } 15 | -------------------------------------------------------------------------------- /utils/helpers.js: -------------------------------------------------------------------------------- 1 | 2 | function isObject (element) { 3 | if (!element) return false 4 | if (typeof element !== 'object') return false 5 | if (element instanceof Array) return false 6 | return true 7 | } 8 | 9 | function flattenArray (array) { 10 | return [].concat(...array) 11 | } 12 | 13 | function isArray (prop) { 14 | if (!prop) return false 15 | return prop.constructor === Array 16 | } 17 | 18 | module.exports = { 19 | isObject, 20 | flattenArray, 21 | isArray 22 | } 23 | -------------------------------------------------------------------------------- /utils/loadImages.js: -------------------------------------------------------------------------------- 1 | const { createRemoteFileNode } = require('gatsby-source-filesystem') 2 | 3 | function isImageKey (key, imageKeys) { 4 | return imageKeys.includes(key) 5 | } 6 | 7 | async function createImageNodes ({ 8 | entity, 9 | createNode, 10 | createNodeId, 11 | store, 12 | cache, 13 | imageName, 14 | imageCacheKey, 15 | auth 16 | }) { 17 | let fileNode 18 | try { 19 | fileNode = await createRemoteFileNode({ 20 | url: entity.data.url, 21 | auth: auth && { htaccess_user: auth.username, htaccess_pass: auth.password }, 22 | store, 23 | cache, 24 | createNode, 25 | createNodeId 26 | }) 27 | } catch (e) { 28 | console.log(e) 29 | } 30 | if (fileNode) { 31 | await cache.set(imageCacheKey, { 32 | id: fileNode.id, 33 | modified: entity.data.modified, 34 | internal: { 35 | type: entity.name 36 | } 37 | }) 38 | console.log('Image downloaded: ' + imageName) 39 | return { 40 | ...entity, 41 | links: { 42 | ...entity.links, 43 | local___NODE: fileNode.id 44 | } 45 | } 46 | } 47 | return entity 48 | } 49 | 50 | function extensionIsValid (url) { 51 | const ext = url.split(/[#?]/)[0].split('.').pop() 52 | switch (ext) { 53 | case 'jpg': 54 | case 'jpeg': 55 | case 'png': 56 | case 'gif': 57 | return true 58 | default: 59 | return false 60 | } 61 | } 62 | 63 | async function loadImages ({ 64 | entities, imageKeys, createNode, createNodeId, store, cache, touchNode, auth 65 | }) { 66 | return Promise.all( 67 | entities.map(async (entity) => { 68 | if (!isImageKey(entity.name, imageKeys) || !entity.data.url) { 69 | return Promise.resolve(entity) 70 | } 71 | if (!extensionIsValid(entity.data.url)) { 72 | console.log(`Image-Extension not valid: ${entity.data.url}`) 73 | return Promise.resolve(entity) 74 | } 75 | const imageName = entity.data.url.match(/([^/]*)\/*$/)[1] 76 | const imageCacheKey = `local-image-${imageName}` 77 | const cachedImage = await cache.get(imageCacheKey) 78 | // If we have cached image and it wasn't modified, reuse 79 | // previously created file node to not try to redownload 80 | if ( 81 | cachedImage && 82 | entity.data.modified && 83 | entity.data.modified === cachedImage.modified 84 | ) { 85 | const { id } = cachedImage 86 | touchNode(cachedImage) 87 | console.log('Image from Cache: ' + imageName) 88 | return Promise.resolve({ 89 | ...entity, 90 | links: { 91 | ...entity.links, 92 | local___NODE: id 93 | } 94 | }) 95 | } 96 | return createImageNodes({ 97 | entity, 98 | createNode, 99 | createNodeId, 100 | store, 101 | cache, 102 | imageName, 103 | imageCacheKey, 104 | auth 105 | }) 106 | }) 107 | ) 108 | } 109 | 110 | module.exports = loadImages 111 | -------------------------------------------------------------------------------- /utils/normalizeKeys.js: -------------------------------------------------------------------------------- 1 | function isRestricted (key) { 2 | const restrictedKeys = ['id', 'children', 'parent', 'fields', 'internal'] 3 | if (restrictedKeys.includes(key)) { 4 | console.log(`The key "${key}" is restricted in GraphQL! Transformed to ${key}__normalized.`) 5 | return `${key}__normalized` 6 | } 7 | return key 8 | } 9 | 10 | module.exports = function checkRestricted (data) { 11 | const dataNormalized = {} 12 | Object.keys(data).forEach(key => { 13 | dataNormalized[isRestricted(key)] = data[key] 14 | }) 15 | return dataNormalized 16 | } 17 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/runtime@^7.12.5": 6 | version "7.12.5" 7 | resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" 8 | integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== 9 | dependencies: 10 | regenerator-runtime "^0.13.4" 11 | 12 | "@sindresorhus/is@^0.14.0": 13 | version "0.14.0" 14 | resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" 15 | integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== 16 | 17 | "@szmarczak/http-timer@^1.1.2": 18 | version "1.1.2" 19 | resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" 20 | integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== 21 | dependencies: 22 | defer-to-connect "^1.0.1" 23 | 24 | "@tokenizer/token@^0.1.0", "@tokenizer/token@^0.1.1": 25 | version "0.1.1" 26 | resolved "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.1.1.tgz#f0d92c12f87079ddfd1b29f614758b9696bc29e3" 27 | integrity sha512-XO6INPbZCxdprl+9qa/AAbFFOMzzwqYxpjPgLICrMD6C2FCw6qfJOPcBk6JqqPLSaZ/Qx87qn4rpPmPMwaAK6w== 28 | 29 | "@types/debug@^4.1.5": 30 | version "4.1.5" 31 | resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.5.tgz#b14efa8852b7768d898906613c23f688713e02cd" 32 | integrity sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ== 33 | 34 | "@types/node@*": 35 | version "14.14.16" 36 | resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.16.tgz#3cc351f8d48101deadfed4c9e4f116048d437b4b" 37 | integrity sha512-naXYePhweTi+BMv11TgioE2/FXU4fSl29HAH1ffxVciNsH3rYXjNP2yM8wqmSm7jS20gM8TIklKiTen+1iVncw== 38 | 39 | "@types/readable-stream@^2.3.9": 40 | version "2.3.9" 41 | resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-2.3.9.tgz#40a8349e6ace3afd2dd1b6d8e9b02945de4566a9" 42 | integrity sha512-sqsgQqFT7HmQz/V5jH1O0fvQQnXAJO46Gg9LRO/JPfjmVmGUlcx831TZZO3Y3HtWhIkzf3kTsNT0Z0kzIhIvZw== 43 | dependencies: 44 | "@types/node" "*" 45 | safe-buffer "*" 46 | 47 | anymatch@~3.1.1: 48 | version "3.1.1" 49 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" 50 | integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== 51 | dependencies: 52 | normalize-path "^3.0.0" 53 | picomatch "^2.0.4" 54 | 55 | balanced-match@^1.0.0: 56 | version "1.0.0" 57 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 58 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 59 | 60 | better-queue-memory@^1.0.1: 61 | version "1.0.4" 62 | resolved "https://registry.yarnpkg.com/better-queue-memory/-/better-queue-memory-1.0.4.tgz#f390d6b30bb3b36aaf2ce52b37a483e8a7a81a22" 63 | integrity sha512-SWg5wFIShYffEmJpI6LgbL8/3Dqhku7xI1oEiy6FroP9DbcZlG0ZDjxvPdP9t7hTGW40IpIcC6zVoGT1oxjOuA== 64 | 65 | better-queue@^3.8.10: 66 | version "3.8.10" 67 | resolved "https://registry.yarnpkg.com/better-queue/-/better-queue-3.8.10.tgz#1c93b9ec4cb3d1b72eb91d0efcb84fc80e8c6835" 68 | integrity sha512-e3gwNZgDCnNWl0An0Tz6sUjKDV9m6aB+K9Xg//vYeo8+KiH8pWhLFxkawcXhm6FpM//GfD9IQv/kmvWCAVVpKA== 69 | dependencies: 70 | better-queue-memory "^1.0.1" 71 | node-eta "^0.9.0" 72 | uuid "^3.0.0" 73 | 74 | binary-extensions@^2.0.0: 75 | version "2.1.0" 76 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" 77 | integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== 78 | 79 | bluebird@^3.0.6: 80 | version "3.7.2" 81 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" 82 | integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== 83 | 84 | brace-expansion@^1.1.7: 85 | version "1.1.11" 86 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 87 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 88 | dependencies: 89 | balanced-match "^1.0.0" 90 | concat-map "0.0.1" 91 | 92 | braces@~3.0.2: 93 | version "3.0.2" 94 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 95 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 96 | dependencies: 97 | fill-range "^7.0.1" 98 | 99 | cacheable-request@^6.0.0: 100 | version "6.1.0" 101 | resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" 102 | integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== 103 | dependencies: 104 | clone-response "^1.0.2" 105 | get-stream "^5.1.0" 106 | http-cache-semantics "^4.0.0" 107 | keyv "^3.0.0" 108 | lowercase-keys "^2.0.0" 109 | normalize-url "^4.1.0" 110 | responselike "^1.0.2" 111 | 112 | chokidar@^3.4.3: 113 | version "3.4.3" 114 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.3.tgz#c1df38231448e45ca4ac588e6c79573ba6a57d5b" 115 | integrity sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ== 116 | dependencies: 117 | anymatch "~3.1.1" 118 | braces "~3.0.2" 119 | glob-parent "~5.1.0" 120 | is-binary-path "~2.1.0" 121 | is-glob "~4.0.1" 122 | normalize-path "~3.0.0" 123 | readdirp "~3.5.0" 124 | optionalDependencies: 125 | fsevents "~2.1.2" 126 | 127 | ci-info@2.0.0: 128 | version "2.0.0" 129 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" 130 | integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== 131 | 132 | clone-response@^1.0.2: 133 | version "1.0.2" 134 | resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" 135 | integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= 136 | dependencies: 137 | mimic-response "^1.0.0" 138 | 139 | commander@^2.9.0: 140 | version "2.20.3" 141 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 142 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 143 | 144 | concat-map@0.0.1: 145 | version "0.0.1" 146 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 147 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 148 | 149 | configstore@^5.0.1: 150 | version "5.0.1" 151 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" 152 | integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== 153 | dependencies: 154 | dot-prop "^5.2.0" 155 | graceful-fs "^4.1.2" 156 | make-dir "^3.0.0" 157 | unique-string "^2.0.0" 158 | write-file-atomic "^3.0.0" 159 | xdg-basedir "^4.0.0" 160 | 161 | crypto-random-string@^2.0.0: 162 | version "2.0.0" 163 | resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" 164 | integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== 165 | 166 | decompress-response@^3.3.0: 167 | version "3.3.0" 168 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" 169 | integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= 170 | dependencies: 171 | mimic-response "^1.0.0" 172 | 173 | defer-to-connect@^1.0.1: 174 | version "1.1.3" 175 | resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" 176 | integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== 177 | 178 | dot-prop@^5.2.0: 179 | version "5.3.0" 180 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" 181 | integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== 182 | dependencies: 183 | is-obj "^2.0.0" 184 | 185 | duplexer3@^0.1.4: 186 | version "0.1.4" 187 | resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" 188 | integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= 189 | 190 | end-of-stream@^1.1.0: 191 | version "1.4.4" 192 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 193 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 194 | dependencies: 195 | once "^1.4.0" 196 | 197 | file-type@^16.0.0: 198 | version "16.1.0" 199 | resolved "https://registry.yarnpkg.com/file-type/-/file-type-16.1.0.tgz#1c8a4458b2103e07d2b49ae7f76384abafe86529" 200 | integrity sha512-G4Klqf6tuprtG0pC4r9kni4Wv8XhAAsfHphVqsQGA+YiOlPAO40BZduDqKfv0RFsu9q9ZbFObWfwszY/NqhEZw== 201 | dependencies: 202 | readable-web-to-node-stream "^3.0.0" 203 | strtok3 "^6.0.3" 204 | token-types "^2.0.0" 205 | typedarray-to-buffer "^3.1.5" 206 | 207 | fill-range@^7.0.1: 208 | version "7.0.1" 209 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 210 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 211 | dependencies: 212 | to-regex-range "^5.0.1" 213 | 214 | fs-extra@^8.1.0: 215 | version "8.1.0" 216 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" 217 | integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== 218 | dependencies: 219 | graceful-fs "^4.2.0" 220 | jsonfile "^4.0.0" 221 | universalify "^0.1.0" 222 | 223 | fs.realpath@^1.0.0: 224 | version "1.0.0" 225 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 226 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 227 | 228 | fsevents@~2.1.2: 229 | version "2.1.3" 230 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" 231 | integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== 232 | 233 | gatsby-core-utils@^1.7.1: 234 | version "1.7.1" 235 | resolved "https://registry.yarnpkg.com/gatsby-core-utils/-/gatsby-core-utils-1.7.1.tgz#7e7e6596c228d580ed8ce4a3fc04c56f103cae3f" 236 | integrity sha512-hnzQCixp2C4opmSgjido/CQwSt4FL3CcmGwq6fK3PVPTT3hLPz7rvuTMQIUlR8BJjGYai6i5f6V3wfkCJ3VTgQ== 237 | dependencies: 238 | ci-info "2.0.0" 239 | configstore "^5.0.1" 240 | fs-extra "^8.1.0" 241 | node-object-hash "^2.0.0" 242 | proper-lockfile "^4.1.1" 243 | tmp "^0.2.1" 244 | xdg-basedir "^4.0.0" 245 | 246 | gatsby-source-filesystem@^2.0.29: 247 | version "2.8.1" 248 | resolved "https://registry.yarnpkg.com/gatsby-source-filesystem/-/gatsby-source-filesystem-2.8.1.tgz#85b5dce6ed7a1df5d43a54e91f8682d2b219a656" 249 | integrity sha512-awvrQ63dayVFsbTnPS8dIpFCsDnvwj5RKUCtwn5wL+DKerOFgcCfyXHsSx4rrnIlnvs30yzR7qNgN5tHSx2++Q== 250 | dependencies: 251 | "@babel/runtime" "^7.12.5" 252 | better-queue "^3.8.10" 253 | chokidar "^3.4.3" 254 | file-type "^16.0.0" 255 | fs-extra "^8.1.0" 256 | gatsby-core-utils "^1.7.1" 257 | got "^9.6.0" 258 | md5-file "^5.0.0" 259 | mime "^2.4.6" 260 | pretty-bytes "^5.4.1" 261 | progress "^2.0.3" 262 | valid-url "^1.0.9" 263 | xstate "^4.14.0" 264 | 265 | generate-changelog@^1.7.1: 266 | version "1.8.0" 267 | resolved "https://registry.yarnpkg.com/generate-changelog/-/generate-changelog-1.8.0.tgz#1d788cdef5a13a649da7eb2a1f3b02674850e4a8" 268 | integrity sha512-msgpxeB75Ziyg3wGsZuPNl7c5RxChMKmYcAX5obnhUow90dBZW3nLic6nxGtst7Bpx453oS6zAIHcX7F3QVasw== 269 | dependencies: 270 | bluebird "^3.0.6" 271 | commander "^2.9.0" 272 | github-url-from-git "^1.4.0" 273 | 274 | get-stream@^4.1.0: 275 | version "4.1.0" 276 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" 277 | integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== 278 | dependencies: 279 | pump "^3.0.0" 280 | 281 | get-stream@^5.1.0: 282 | version "5.2.0" 283 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" 284 | integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== 285 | dependencies: 286 | pump "^3.0.0" 287 | 288 | github-url-from-git@^1.4.0: 289 | version "1.5.0" 290 | resolved "https://registry.yarnpkg.com/github-url-from-git/-/github-url-from-git-1.5.0.tgz#f985fedcc0a9aa579dc88d7aff068d55cc6251a0" 291 | integrity sha1-+YX+3MCpqledyI16/waNVcxiUaA= 292 | 293 | glob-parent@~5.1.0: 294 | version "5.1.2" 295 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 296 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 297 | dependencies: 298 | is-glob "^4.0.1" 299 | 300 | glob@^7.1.3: 301 | version "7.1.6" 302 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 303 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 304 | dependencies: 305 | fs.realpath "^1.0.0" 306 | inflight "^1.0.4" 307 | inherits "2" 308 | minimatch "^3.0.4" 309 | once "^1.3.0" 310 | path-is-absolute "^1.0.0" 311 | 312 | got@^9.6.0: 313 | version "9.6.0" 314 | resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" 315 | integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== 316 | dependencies: 317 | "@sindresorhus/is" "^0.14.0" 318 | "@szmarczak/http-timer" "^1.1.2" 319 | cacheable-request "^6.0.0" 320 | decompress-response "^3.3.0" 321 | duplexer3 "^0.1.4" 322 | get-stream "^4.1.0" 323 | lowercase-keys "^1.0.1" 324 | mimic-response "^1.0.1" 325 | p-cancelable "^1.0.0" 326 | to-readable-stream "^1.0.0" 327 | url-parse-lax "^3.0.0" 328 | 329 | graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: 330 | version "4.2.4" 331 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" 332 | integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== 333 | 334 | http-cache-semantics@^4.0.0: 335 | version "4.1.0" 336 | resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" 337 | integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== 338 | 339 | ieee754@^1.1.13: 340 | version "1.2.1" 341 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" 342 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 343 | 344 | imurmurhash@^0.1.4: 345 | version "0.1.4" 346 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 347 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 348 | 349 | inflight@^1.0.4: 350 | version "1.0.6" 351 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 352 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 353 | dependencies: 354 | once "^1.3.0" 355 | wrappy "1" 356 | 357 | inherits@2, inherits@^2.0.3: 358 | version "2.0.4" 359 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 360 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 361 | 362 | is-binary-path@~2.1.0: 363 | version "2.1.0" 364 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 365 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 366 | dependencies: 367 | binary-extensions "^2.0.0" 368 | 369 | is-extglob@^2.1.1: 370 | version "2.1.1" 371 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 372 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 373 | 374 | is-glob@^4.0.1, is-glob@~4.0.1: 375 | version "4.0.1" 376 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 377 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 378 | dependencies: 379 | is-extglob "^2.1.1" 380 | 381 | is-number@^7.0.0: 382 | version "7.0.0" 383 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 384 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 385 | 386 | is-obj@^2.0.0: 387 | version "2.0.0" 388 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" 389 | integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== 390 | 391 | is-typedarray@^1.0.0: 392 | version "1.0.0" 393 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 394 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 395 | 396 | json-buffer@3.0.0: 397 | version "3.0.0" 398 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" 399 | integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= 400 | 401 | jsonfile@^4.0.0: 402 | version "4.0.0" 403 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 404 | integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= 405 | optionalDependencies: 406 | graceful-fs "^4.1.6" 407 | 408 | keyv@^3.0.0: 409 | version "3.1.0" 410 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" 411 | integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== 412 | dependencies: 413 | json-buffer "3.0.0" 414 | 415 | lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: 416 | version "1.0.1" 417 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" 418 | integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== 419 | 420 | lowercase-keys@^2.0.0: 421 | version "2.0.0" 422 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" 423 | integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== 424 | 425 | make-dir@^3.0.0: 426 | version "3.1.0" 427 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" 428 | integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== 429 | dependencies: 430 | semver "^6.0.0" 431 | 432 | md5-file@^5.0.0: 433 | version "5.0.0" 434 | resolved "https://registry.yarnpkg.com/md5-file/-/md5-file-5.0.0.tgz#e519f631feca9c39e7f9ea1780b63c4745012e20" 435 | integrity sha512-xbEFXCYVWrSx/gEKS1VPlg84h/4L20znVIulKw6kMfmBUAZNAnF00eczz9ICMl+/hjQGo5KSXRxbL/47X3rmMw== 436 | 437 | mime@^2.4.6: 438 | version "2.4.7" 439 | resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.7.tgz#962aed9be0ed19c91fd7dc2ece5d7f4e89a90d74" 440 | integrity sha512-dhNd1uA2u397uQk3Nv5LM4lm93WYDUXFn3Fu291FJerns4jyTudqhIWe4W04YLy7Uk1tm1Ore04NpjRvQp/NPA== 441 | 442 | mimic-response@^1.0.0, mimic-response@^1.0.1: 443 | version "1.0.1" 444 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" 445 | integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== 446 | 447 | minimatch@^3.0.4: 448 | version "3.0.4" 449 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 450 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 451 | dependencies: 452 | brace-expansion "^1.1.7" 453 | 454 | node-eta@^0.9.0: 455 | version "0.9.0" 456 | resolved "https://registry.yarnpkg.com/node-eta/-/node-eta-0.9.0.tgz#9fb0b099bcd2a021940e603c64254dc003d9a7a8" 457 | integrity sha1-n7CwmbzSoCGUDmA8ZCVNwAPZp6g= 458 | 459 | node-fetch@^2.6.1: 460 | version "2.6.7" 461 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" 462 | integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== 463 | dependencies: 464 | whatwg-url "^5.0.0" 465 | 466 | node-object-hash@^2.0.0: 467 | version "2.0.0" 468 | resolved "https://registry.yarnpkg.com/node-object-hash/-/node-object-hash-2.0.0.tgz#9971fcdb7d254f05016bd9ccf508352bee11116b" 469 | integrity sha512-VZR0zroAusy1ETZMZiGeLkdu50LGjG5U1KHZqTruqtTyQ2wfWhHG2Ow4nsUbfTFGlaREgNHcCWoM/OzEm6p+NQ== 470 | 471 | normalize-path@^3.0.0, normalize-path@~3.0.0: 472 | version "3.0.0" 473 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 474 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 475 | 476 | normalize-url@^4.1.0: 477 | version "4.5.1" 478 | resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" 479 | integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== 480 | 481 | once@^1.3.0, once@^1.3.1, once@^1.4.0: 482 | version "1.4.0" 483 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 484 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 485 | dependencies: 486 | wrappy "1" 487 | 488 | p-cancelable@^1.0.0: 489 | version "1.1.0" 490 | resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" 491 | integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== 492 | 493 | path-is-absolute@^1.0.0: 494 | version "1.0.1" 495 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 496 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 497 | 498 | peek-readable@^3.1.0: 499 | version "3.1.0" 500 | resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-3.1.0.tgz#250b08b7de09db8573d7fd8ea475215bbff14348" 501 | integrity sha512-KGuODSTV6hcgdZvDrIDBUkN0utcAVj1LL7FfGbM0viKTtCHmtZcuEJ+lGqsp0fTFkGqesdtemV2yUSMeyy3ddA== 502 | 503 | picomatch@^2.0.4, picomatch@^2.2.1: 504 | version "2.2.2" 505 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" 506 | integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== 507 | 508 | prepend-http@^2.0.0: 509 | version "2.0.0" 510 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" 511 | integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= 512 | 513 | pretty-bytes@^5.4.1: 514 | version "5.5.0" 515 | resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.5.0.tgz#0cecda50a74a941589498011cf23275aa82b339e" 516 | integrity sha512-p+T744ZyjjiaFlMUZZv6YPC5JrkNj8maRmPaQCWFJFplUAzpIUTRaTcS+7wmZtUoFXHtESJb23ISliaWyz3SHA== 517 | 518 | progress@^2.0.3: 519 | version "2.0.3" 520 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" 521 | integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== 522 | 523 | proper-lockfile@^4.1.1: 524 | version "4.1.1" 525 | resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.1.tgz#284cf9db9e30a90e647afad69deb7cb06881262c" 526 | integrity sha512-1w6rxXodisVpn7QYvLk706mzprPTAPCYAqxMvctmPN3ekuRk/kuGkGc82pangZiAt4R3lwSuUzheTTn0/Yb7Zg== 527 | dependencies: 528 | graceful-fs "^4.1.11" 529 | retry "^0.12.0" 530 | signal-exit "^3.0.2" 531 | 532 | pump@^3.0.0: 533 | version "3.0.0" 534 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 535 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 536 | dependencies: 537 | end-of-stream "^1.1.0" 538 | once "^1.3.1" 539 | 540 | readable-stream@^3.6.0: 541 | version "3.6.0" 542 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" 543 | integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== 544 | dependencies: 545 | inherits "^2.0.3" 546 | string_decoder "^1.1.1" 547 | util-deprecate "^1.0.1" 548 | 549 | readable-web-to-node-stream@^3.0.0: 550 | version "3.0.0" 551 | resolved "https://registry.yarnpkg.com/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.0.tgz#4ca5408e70471069119d691934141a52de413955" 552 | integrity sha512-HNmLb3n0SteGAs8HQlErYPGeO+y7cvL/mVUKtXeUkl0iCZ/2GIgKGrCFHyS7UXFnO8uc9U+0y3pYIzAPsjFfvA== 553 | dependencies: 554 | "@types/readable-stream" "^2.3.9" 555 | readable-stream "^3.6.0" 556 | 557 | readdirp@~3.5.0: 558 | version "3.5.0" 559 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" 560 | integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== 561 | dependencies: 562 | picomatch "^2.2.1" 563 | 564 | regenerator-runtime@^0.13.4: 565 | version "0.13.7" 566 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" 567 | integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== 568 | 569 | responselike@^1.0.2: 570 | version "1.0.2" 571 | resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" 572 | integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= 573 | dependencies: 574 | lowercase-keys "^1.0.0" 575 | 576 | retry@^0.12.0: 577 | version "0.12.0" 578 | resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" 579 | integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= 580 | 581 | rimraf@^3.0.0: 582 | version "3.0.2" 583 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 584 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 585 | dependencies: 586 | glob "^7.1.3" 587 | 588 | safe-buffer@*, safe-buffer@~5.2.0: 589 | version "5.2.1" 590 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 591 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 592 | 593 | semver@^6.0.0: 594 | version "6.3.0" 595 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 596 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 597 | 598 | signal-exit@^3.0.2: 599 | version "3.0.3" 600 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" 601 | integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== 602 | 603 | string_decoder@^1.1.1: 604 | version "1.3.0" 605 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 606 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 607 | dependencies: 608 | safe-buffer "~5.2.0" 609 | 610 | strtok3@^6.0.3: 611 | version "6.0.4" 612 | resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-6.0.4.tgz#ede0d20fde5aa9fda56417c3558eaafccc724694" 613 | integrity sha512-rqWMKwsbN9APU47bQTMEYTPcwdpKDtmf1jVhHzNW2cL1WqAxaM9iBb9t5P2fj+RV2YsErUWgQzHD5JwV0uCTEQ== 614 | dependencies: 615 | "@tokenizer/token" "^0.1.1" 616 | "@types/debug" "^4.1.5" 617 | peek-readable "^3.1.0" 618 | 619 | tmp@^0.2.1: 620 | version "0.2.1" 621 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" 622 | integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== 623 | dependencies: 624 | rimraf "^3.0.0" 625 | 626 | to-readable-stream@^1.0.0: 627 | version "1.0.0" 628 | resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" 629 | integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== 630 | 631 | to-regex-range@^5.0.1: 632 | version "5.0.1" 633 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 634 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 635 | dependencies: 636 | is-number "^7.0.0" 637 | 638 | token-types@^2.0.0: 639 | version "2.0.0" 640 | resolved "https://registry.yarnpkg.com/token-types/-/token-types-2.0.0.tgz#b23618af744818299c6fbf125e0fdad98bab7e85" 641 | integrity sha512-WWvu8sGK8/ZmGusekZJJ5NM6rRVTTDO7/bahz4NGiSDb/XsmdYBn6a1N/bymUHuWYTWeuLUg98wUzvE4jPdCZw== 642 | dependencies: 643 | "@tokenizer/token" "^0.1.0" 644 | ieee754 "^1.1.13" 645 | 646 | tr46@~0.0.3: 647 | version "0.0.3" 648 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" 649 | integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= 650 | 651 | typedarray-to-buffer@^3.1.5: 652 | version "3.1.5" 653 | resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" 654 | integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== 655 | dependencies: 656 | is-typedarray "^1.0.0" 657 | 658 | unique-string@^2.0.0: 659 | version "2.0.0" 660 | resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" 661 | integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== 662 | dependencies: 663 | crypto-random-string "^2.0.0" 664 | 665 | universalify@^0.1.0: 666 | version "0.1.2" 667 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 668 | integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== 669 | 670 | url-parse-lax@^3.0.0: 671 | version "3.0.0" 672 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" 673 | integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= 674 | dependencies: 675 | prepend-http "^2.0.0" 676 | 677 | util-deprecate@^1.0.1: 678 | version "1.0.2" 679 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 680 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 681 | 682 | uuid@^3.0.0, uuid@^3.3.2: 683 | version "3.4.0" 684 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" 685 | integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== 686 | 687 | valid-url@^1.0.9: 688 | version "1.0.9" 689 | resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200" 690 | integrity sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA= 691 | 692 | webidl-conversions@^3.0.0: 693 | version "3.0.1" 694 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" 695 | integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= 696 | 697 | whatwg-url@^5.0.0: 698 | version "5.0.0" 699 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" 700 | integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= 701 | dependencies: 702 | tr46 "~0.0.3" 703 | webidl-conversions "^3.0.0" 704 | 705 | wrappy@1: 706 | version "1.0.2" 707 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 708 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 709 | 710 | write-file-atomic@^3.0.0: 711 | version "3.0.3" 712 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" 713 | integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== 714 | dependencies: 715 | imurmurhash "^0.1.4" 716 | is-typedarray "^1.0.0" 717 | signal-exit "^3.0.2" 718 | typedarray-to-buffer "^3.1.5" 719 | 720 | xdg-basedir@^4.0.0: 721 | version "4.0.0" 722 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" 723 | integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== 724 | 725 | xstate@^4.14.0: 726 | version "4.15.2" 727 | resolved "https://registry.yarnpkg.com/xstate/-/xstate-4.15.2.tgz#52213ecbca7b9458ff9162c977c4944ee16891c8" 728 | integrity sha512-C+3jzJbhkp9ywGB+E2YMbS4mLyuxv366+KGi2RBX6y99xZFezbrGfaPQGRvFvn58OlLlCuSfCwn6bPcp78aMyw== 729 | --------------------------------------------------------------------------------