├── .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 | 
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 |
--------------------------------------------------------------------------------