From 202ed12b859957d2008f048373e54a728ee07f63 Mon Sep 17 00:00:00 2001 From: Benedicte Raae Date: Tue, 13 Feb 2024 11:11:03 +0100 Subject: [PATCH] feat: configurable transform types #245 (#250) Allows for sourced data with invalid data shape by configuring a map from invalid to valid data shape. --- README.md | 175 +++- demo/gatsby-config.js | 27 +- demo/package.json | 1 + demo/src/{ => content}/images/giphyCat.gif | Bin .../images/joppe-spaa-unsplash.jpeg | Bin .../images/sergey-semin-unsplash.jpeg | Bin demo/src/content/manual-tests/test1.md | 12 + .../{markdownRemark.frontmatter__slug}.js | 55 ++ plugin/gatsby-node.js | 30 +- plugin/gatsby-node.test.js | 111 ++- plugin/gatsby-plugin-image/index.js | 65 +- plugin/gatsby-plugin-image/index.test.js | 180 ++++ plugin/gatsby-plugin-image/resolve-asset.js | 150 +-- .../gatsby-plugin-image/resolve-asset.test.js | 102 +- plugin/gatsby-plugin-image/resolvers.js | 19 +- yarn.lock | 879 +++++++++++++++++- 16 files changed, 1680 insertions(+), 126 deletions(-) rename demo/src/{ => content}/images/giphyCat.gif (100%) rename demo/src/{ => content}/images/joppe-spaa-unsplash.jpeg (100%) rename demo/src/{ => content}/images/sergey-semin-unsplash.jpeg (100%) create mode 100644 demo/src/content/manual-tests/test1.md create mode 100644 demo/src/pages/manual-tests/{markdownRemark.frontmatter__slug}.js create mode 100644 plugin/gatsby-plugin-image/index.test.js diff --git a/README.md b/README.md index 2376aec..9038db0 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,8 @@ With `gatsby-transformer-cloudinary` you may: - [Install Packages](#install-packages) - [Configure Plugins](#configure-plugins) - [Example usage](#example-usage) + - [Sanity.io Configuration](#sanityio-configuration) + - [Contentful Configuration](#contentful-configuration) - [📤 Upload local images and add Gatsby Image Support](#📤-upload-local-images-and-add-gatsby-image-support) - [Install Packages](#install-packages-1) - [Configure Plugins](#configure-plugins-1) @@ -32,14 +34,11 @@ With `gatsby-transformer-cloudinary` you may: ## 🖼️ Add Gatsby Image Support to Existing Cloudinary Assets -Use assets hosted by Cloudinary together with Gatsby's Image component: +Information about Existing Cloudinary Assets is sourced into the Gatsby data layer using a plugin like [gatsby-source-contentful](https://www.gatsbyjs.com/plugins/gatsby-source-contentful/), [gatsby-source-sanity](https://www.gatsbyjs.com/plugins/gatsby-source-sanity/) etc. or a custom source plugin. -- The plugin adds the `gatsbyImageData` resolver to each GraphQLType configured. +- The plugin adds the `gatsbyImageData` resolver to the sourced GraphQL Types configured. - -This configuration and example assumes your Gatsby Data Layer has at least one node of type `BlogPost` with a `heroImage` field describing an already uploaded Cloudinary asset. - -👉 More details in [Transform Type Requierments](#transform-type-requierments). +The GraphQL Type must describe an existing Cloudinary asset and [contain the following data](#transform-type-requierments). ### Install Packages @@ -60,11 +59,16 @@ yarn add gatsby-transformer-cloudinary gatsby-plugin-image module.exports = { plugins: [ + // Some source plugin creating a GraphQL Type named `BlogPostHeroImage` { resolve: `gatsby-transformer-cloudinary`, options: { - // Add the `gatsbyImageData` resolver to `BlogPostHeroImage` - transformTypes: [`BlogPostHeroImage`], + transformTypes: [ + // Assumes a GraphQL Type named `BlogPostHeroImage` + // Could be a `BlogPost` node with a `heroImage` field + // with the required data shape + `BlogPostHeroImage`, + ], // Optional transformation option defaultTransformations: ['c_fill', 'g_auto', 'q_auto'], }, @@ -114,30 +118,162 @@ export const query = graphql` export default BlogPost; ``` -### Transform Type Requierments +### Transform Type Requirements -You may add Gatsby Image support to any GraphQL Type describing a Cloudinary assets with this data shape: +Gatsby Image support may be added to any GraphQL Type describing a Cloudinary asset with the following information: ```js { // Required - cloudName: "my-amazing-blog", - publicId: "blue-blue-blue", + cloud_name: "my-amazing-blog", + public_id: "blue-blue-blue", // Optional: Saves a network request for size/format data per image queried if all are added - originalHeight: 360, - originalWidth: 820, - originalFormat: "jpg", + heigh: 360, + width: 820, + format: "jpg", // Optional: Saves a Cloudinary transformation per image queried with `placeholder=BLURRED` as this value will be used instead - defaultBase64: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mMMXG/8HwAEwAI0Bj1bnwAAAABJRU5ErkJggg==", + base64: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mMMXG/8HwAEwAI0Bj1bnwAAAABJRU5ErkJggg==", // Optional: Saves a Cloudinary transformation per image queried with `placeholder=TRACED_SVG` as this value will be used instead - defaultTracedSVG: "data:image/svg+xml,%3Csvg%20height%3D%229999%22%20viewBox%3D%220%200%209999%209999%22%20width%3D%229999%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22m0%200h9999v9999h-9999z%22%20fill%3D%22%23f9fafb%22%2F%3E%3C%2Fsvg%3E", + tracedSVG: "data:image/svg+xml,%3Csvg%20height%3D%229999%22%20viewBox%3D%220%200%209999%209999%22%20width%3D%229999%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22m0%200h9999v9999h-9999z%22%20fill%3D%22%23f9fafb%22%2F%3E%3C%2Fsvg%3E", } ``` -To find the GraphQL Type describing your Cloudinary assets use the built in [GraphiQL exlorer](https://www.gatsbyjs.com/docs/how-to/querying-data/running-queries-with-graphiql/). Either hover over the field describing the asset, or look in the "Documentation Explorer". +If the GraphQL Type does not have the required data shape, you may use the `mapping` option to map the data from the sourced data shape to the required data shape: + +```js +// File: ./gatsby-config.js + +module.exports = { + plugins: [ + // Some source plugin creating a GraphQL Type named `BlogPostHeroImage` + { + resolve: `gatsby-transformer-cloudinary`, + options: { + transformTypes: [ + { + type: `CustomType`, + mapping: { + // Use a static value + cloudName: () => 'my-cloud', + // Use a differnt key than the default + publicId: 'thePublicId', // default for publicId is `public_id` + // Resolve a value using a function + height: (data) => data.dimensions?.height, + width: (data) => data.dimentions?.width, + }, + }, + ], + // Optional transformation option + defaultTransformations: ['c_fill', 'g_auto', 'q_auto'], + }, + }, + `gatsby-plugin-image`, + ], +}; +``` + +To find the GraphQL Type describing your Cloudinary assets use the built-in [GraphiQL exlorer](https://www.gatsbyjs.com/docs/how-to/querying-data/running-queries-with-graphiql/)](https://www.gatsbyjs.com/docs/how-to/querying-data/running-queries-with-graphiql/). Either hover over the field describing the asset or look in the "Documentation Explorer". `defaultBase64` and `defaultTracedSVG` is the base64 URI of the placeholder image, it must comply with [RFC 2397](https://tools.ietf.org/html/rfc2397). +### Sanity.io Configuration + +If you are using [Sanity.io](https://www.sanity.io/) and the [gatsby-source-sanity](https://www.gatsbyjs.com/plugins/gatsby-source-sanity/) plugin use the following configuration to add the `gatsbyImageData` resolver to the sourced Sanity Cloudinary assets: + +```js +// File: ./gatsby-config.js + +module.exports = { + plugins: [ + { + resolve: `gatsby-source-sanity`, + options: { + projectId: process.env.SANITY_PROJECT_ID, + dataset: process.env.SANITY_DATASET, + token: process.env.SANITY_TOKEN, + }, + }, + { + resolve: `gatsby-transformer-cloudinary`, + options: { + transformTypes: [ + { + type: 'SanityCloudinaryAsset', + mapping: { + // Dynamically get the cloud name + // from SanityCloudinaryAsset.url + cloudName: (data) => { + const findCloudName = new RegExp( + '(cloudinary.com/)([^/]+)', + 'i' + ); + const result = data.url.match(findCloudName); + return result[1]; + }, + // Or set it statically if all assets are from the same cloud + // cloudName: () => "my-cloud", + }, + }, + ], + // Optional transformation option + defaultTransformations: ['c_fill', 'g_auto', 'q_auto'], + }, + }, + `gatsby-plugin-image`, + ], +}; +``` + +### Contentful Configuration + +If you are using [Contentful](https://www.contentful.com/) and the [gatsby-source-contentful](https://github.com/gatsbyjs/gatsby/tree/master/packages/gatsby-source-contentful) plugin use the following configuration to add the `gatsbyImageData` resolver to the sourced Cloudinary assets: + +```js +// File: ./gatsby-config.js + +module.exports = { + plugins: [ + { + resolve: `gatsby-source-contentful`, + options: { + spaceId: process.env.CONTENTFUL_SPACE_ID, + accessToken: process.env.CONTENTFUL_ACCESS_TOKEN, + }, + }, + { + resolve: `gatsby-transformer-cloudinary`, + options: { + transformTypes: [ + { + // ❗❕ Replace `contentfulBlogPostFeaturedImageJsonNode` + // with the name of the GraphQL Type describing your Cloudinary assets + // will always start with `contentful` and end with `JsonNode` + type: 'contentfulBlogPostFeaturedImageJsonNode', + mapping: { + // Dynamically get the cloud name + // from SanityCloudinaryAsset.url + cloudName: (data) => { + const findCloudName = new RegExp( + '(cloudinary.com/)([^/]+)', + 'i' + ); + const result = data.url.match(findCloudName); + return result[1]; + }, + // Or set it statically if all assets are from the same cloud + // cloudName: () => "my-cloud", + }, + }, + ], + // Optional transformation option + defaultTransformations: ['c_fill', 'g_auto', 'q_auto'], + }, + }, + `gatsby-plugin-image`, + ], +}; +``` +   ## 📤 Upload Local Images and Add Gatsby Image Support @@ -439,7 +575,7 @@ An optional array limiting uploads to file nodes with a matching `sourceInstance An optional array of GraphQL Types to add the `gatsbyImageData` resolver for Gatsby Image support. -**Type:** `[String]`\ +**Type:** `[String] | [Object]`\ **Default:** `['CloudinaryAsset']` ### `overwriteExisting` @@ -533,7 +669,6 @@ Read the [Gatsby Plugin Image Docs](https://www.gatsbyjs.com/docs/reference/buil - [Using Cloudinary image service for media optimization](https://www.gatsbyjs.org/docs/using-cloudinary-image-service/) - [Watch Jason Lengstorf build this plugin's first version](https://www.learnwithjason.dev/build-a-gatsby-transformer-plugin-for-cloudinary) -   ## 🏴‍☠️ Contribute diff --git a/demo/gatsby-config.js b/demo/gatsby-config.js index fb2d65f..249025c 100644 --- a/demo/gatsby-config.js +++ b/demo/gatsby-config.js @@ -12,9 +12,17 @@ module.exports = { resolve: `gatsby-source-filesystem`, options: { name: `images`, - path: `${__dirname}/src/images`, + path: `${__dirname}/src/content/images`, }, }, + { + resolve: `gatsby-source-filesystem`, + options: { + name: `images`, + path: `${__dirname}/src/content/manual-tests`, + }, + }, + `gatsby-transformer-remark`, { resolve: `gatsby-plugin-image`, }, @@ -32,6 +40,23 @@ module.exports = { 'BlogPostHeroImage', 'VariedData', 'EmptyDataCloudinary', + 'MarkdownRemarkFrontmatterHeroImage', + // { + // name: 'MarkdownRemarkFrontmatterHeroImage', + // mapping: { + // cloudName: `cloudName`, + // publicId: `publicId`, + // } + // }, + { + type: 'MarkdownRemarkFrontmatterHeroImageWithUnconformingShape', + mapping: { + cloudName: `a_cloud_name`, + publicId: (data) => { + return data['a_public_id']; + }, + }, + }, ], }, }, diff --git a/demo/package.json b/demo/package.json index 2a261f8..cf047d3 100644 --- a/demo/package.json +++ b/demo/package.json @@ -8,6 +8,7 @@ "gatsby-plugin-image": "3.3.2", "gatsby-source-filesystem": "5.3.1", "gatsby-transformer-cloudinary": "*", + "gatsby-transformer-remark": "^6.13.0", "react": "18.2.0", "react-dom": "18.2.0" }, diff --git a/demo/src/images/giphyCat.gif b/demo/src/content/images/giphyCat.gif similarity index 100% rename from demo/src/images/giphyCat.gif rename to demo/src/content/images/giphyCat.gif diff --git a/demo/src/images/joppe-spaa-unsplash.jpeg b/demo/src/content/images/joppe-spaa-unsplash.jpeg similarity index 100% rename from demo/src/images/joppe-spaa-unsplash.jpeg rename to demo/src/content/images/joppe-spaa-unsplash.jpeg diff --git a/demo/src/images/sergey-semin-unsplash.jpeg b/demo/src/content/images/sergey-semin-unsplash.jpeg similarity index 100% rename from demo/src/images/sergey-semin-unsplash.jpeg rename to demo/src/content/images/sergey-semin-unsplash.jpeg diff --git a/demo/src/content/manual-tests/test1.md b/demo/src/content/manual-tests/test1.md new file mode 100644 index 0000000..5dd57c3 --- /dev/null +++ b/demo/src/content/manual-tests/test1.md @@ -0,0 +1,12 @@ +--- +title: Data Shape Tests +slug: shape-tests +heroImage: + cloudName: lilly-labs-consulting + publicId: gatsby-transformer-cloudinary-demo/photo-1631462685412-80a75dd611bc + alt: A fine hero image from Cloudinary +heroImageWithUnconformingShape: + a_cloud_name: lilly-labs-consulting + a_public_id: gatsby-transformer-cloudinary-demo/photo-1631462685412-80a75dd611bc + alt: A fine hero image from Cloudinary +--- diff --git a/demo/src/pages/manual-tests/{markdownRemark.frontmatter__slug}.js b/demo/src/pages/manual-tests/{markdownRemark.frontmatter__slug}.js new file mode 100644 index 0000000..81293a4 --- /dev/null +++ b/demo/src/pages/manual-tests/{markdownRemark.frontmatter__slug}.js @@ -0,0 +1,55 @@ +import * as React from 'react'; +import { graphql } from 'gatsby'; +import { GatsbyImage } from 'gatsby-plugin-image'; + +export default function BlogPostTemplate({ data }) { + const { markdownRemark } = data; + const { frontmatter, html } = markdownRemark; + const { title, heroImage, heroImageWithUnconformingShape } = frontmatter; + return ( + <> +

{title}

+ + {heroImage?.gatsbyImageData ? ( + + ) : ( +

+ No gatsby image for heroImage +

+ )} + + {heroImageWithUnconformingShape?.gatsbyImageData ? ( + + ) : ( +

+ No gatsby image for heroImageWithUnconformingShape +

+ )} + +
+ + ); +} + +export const pageQuery = graphql` + query ($id: String!) { + markdownRemark(id: { eq: $id }) { + html + frontmatter { + slug + title + heroImage { + gatsbyImageData(height: 200, layout: FIXED) + alt + } + heroImageWithUnconformingShape { + gatsbyImageData(height: 200, layout: FIXED) + alt + } + } + } + } +`; diff --git a/plugin/gatsby-node.js b/plugin/gatsby-node.js index 4c05ea0..6df3ee0 100644 --- a/plugin/gatsby-node.js +++ b/plugin/gatsby-node.js @@ -27,7 +27,35 @@ exports.pluginOptionsSchema = ({ Joi }) => { uploadFolder: Joi.string(), uploadSourceInstanceNames: Joi.array().items(Joi.string()), transformTypes: Joi.array() - .items(Joi.string()) + .items( + Joi.string(), + Joi.object({ + type: Joi.string().required(), + mapping: Joi.object({ + cloudName: Joi.alternatives() + .try(Joi.function(), Joi.string()) + .default('cloud_name'), + publicId: Joi.alternatives() + .try(Joi.function(), Joi.string()) + .default('public_id'), + height: Joi.alternatives() + .try(Joi.function(), Joi.string()) + .default('height'), + width: Joi.alternatives() + .try(Joi.function(), Joi.string()) + .default('width'), + format: Joi.alternatives() + .try(Joi.function(), Joi.string()) + .default('format'), + base64: Joi.alternatives() + .try(Joi.function(), Joi.string()) + .default('base64'), + tracedSVG: Joi.alternatives() + .try(Joi.function(), Joi.string()) + .default('tracedSVG'), + }), + }) + ) .default(['CloudinaryAsset']), overwriteExisting: Joi.boolean().default(false), defaultTransformations: Joi.array() diff --git a/plugin/gatsby-node.test.js b/plugin/gatsby-node.test.js index 0c11c29..8c1ad37 100644 --- a/plugin/gatsby-node.test.js +++ b/plugin/gatsby-node.test.js @@ -40,12 +40,121 @@ describe('pluginOptionsSchema', () => { `"apiSecret" must be a string`, `"uploadFolder" must be a string`, `"uploadSourceInstanceNames" must be an array`, - `"transformTypes[0]" must be a string`, + `"transformTypes[0]" does not match any of the allowed types`, `"overwriteExisting" must be a boolean`, `"defaultTransformations" must be an array`, ]); }); + test('should invalidate incorrect transform type config', async () => { + // cloudName, apiKey, apiSecret + // only needed if uploading + const options = { + transformTypes: [ + 'Type0', + { + type: 'Type1', + mapping: { + cloudName: 'cloud_name', + publicId: 'public_id', + height: () => 400, + width: 'the_width', + format: () => 'jpg', + base64: () => 'base64', + tracedSVG: () => 'tracedSVG', + }, + }, + { + type: undefined, // Missing type + mapping: { + cloudName: 'cloud_name', + publicId: 'public_id', + height: () => 400, + width: 'the_width', + format: () => 'jpg', + base64: () => 'base64', + tracedSVG: () => 'tracedSVG', + }, + }, + { + type: 'Type3', + mapping: { + cloudName: 'cloud_name', + publicId: 'public_id', + height: 400, // height is a number + width: 'the_width', + format: () => 'jpg', + base64: () => 'base64', + tracedSVG: () => 'tracedSVG', + }, + }, + { + type: 'Type4', + mapping: { + cloudName: 'cloud_name', + publicId: 'public_id', + height: 'the_height', + width: 700, // width is string, not number or function + format: () => 'jpg', + base64: 'base64', + tracedSVG: 'tracedSVG', + }, + }, + { + type: 'Type5', + mapping: { + cloudName: 'cloud_name', + publicId: 'public_id', + height: 300, + width: () => 200, + format: new Date('Hello'), // format is not string or function + base64: () => 'base64', + tracedSVG: () => 'tracedSVG', + }, + }, + { + type: 'Type6', + mapping: { + cloudName: 'cloud_name', + publicId: 'public_id', + height: 300, + width: () => 200, + format: 'png', + base64: 2342, // base64 is not string or function + tracedSVG: () => 'tracedSVG', + }, + }, + { + type: 'Type7', + mapping: { + cloudName: 'cloud_name', + publicId: 'public_id', + height: 300, + width: () => 200, + format: 'png', + base64: 'base64', + tracedSVG: 224, // tracedSVG is not string or function + }, + }, + ], + }; + + const { isValid, errors } = await testPluginOptionsSchema( + pluginOptionsSchema, + options + ); + + expect(isValid).toBe(false); + expect(errors).toEqual([ + `"transformTypes[2]" does not match any of the allowed types`, + `"transformTypes[3]" does not match any of the allowed types`, + `"transformTypes[4]" does not match any of the allowed types`, + `"transformTypes[5]" does not match any of the allowed types`, + `"transformTypes[6]" does not match any of the allowed types`, + `"transformTypes[7]" does not match any of the allowed types`, + ]); + }); + test('should add defaults', async () => { const schema = pluginOptionsSchema({ Joi }); const options = { diff --git a/plugin/gatsby-plugin-image/index.js b/plugin/gatsby-plugin-image/index.js index bd4a88c..dd6216b 100644 --- a/plugin/gatsby-plugin-image/index.js +++ b/plugin/gatsby-plugin-image/index.js @@ -1,26 +1,57 @@ const { createGatsbyPluginImageResolver } = require('./resolvers'); +const amendTransformTypeMapping = (mapping) => { + return [ + 'cloudName', + 'publicId', + 'height', + 'width', + 'format', + 'base64', + 'tracedSVG', + ].reduce((acc, key) => { + if (typeof mapping[key] === 'function') { + // Example config: { publicId: (data) => data['a_public_id'] } + // Use the configued function to get the field value + acc[key] = mapping[key]; + } else if (typeof mapping[key] === 'string') { + // Example config: { publicId: 'a_public_id' } + // Use the configured key as the field name + acc[key] = (source) => source[mapping[key]]; + } else { + // Use the key as the field name + acc[key] = (source) => source[key]; + } + return acc; + }, {}); +}; + +exports._amendTransformTypeMapping = amendTransformTypeMapping; + exports.createGatsbyImageDataResolver = (gatsbyUtils, pluginOptions) => { const { createResolvers } = gatsbyUtils; const { transformTypes } = pluginOptions; - const gatsbyImageResolver = createGatsbyPluginImageResolver( - gatsbyUtils, - pluginOptions - ); - - if (gatsbyImageResolver) { - const resolvers = {}; - // Make the resolver nullable, createGatsbyPluginImageResolver sets the type to 'GatsbyImageData!' - gatsbyImageResolver.type = 'GatsbyImageData'; - - transformTypes.forEach((type) => { - // Add gatsbyImageData resolver - // to all types that should be transformed - resolvers[type] = { + + const resolvers = {}; + + transformTypes.forEach((transformType) => { + const transformTypeConfig = { + type: transformType.type || transformType, + mapping: amendTransformTypeMapping(transformType.mapping || {}), + }; + + const gatsbyImageResolver = createGatsbyPluginImageResolver( + gatsbyUtils, + transformTypeConfig, + { transformations: pluginOptions.defaultTransformations, secure: true } + ); + + if (gatsbyImageResolver) { + resolvers[transformTypeConfig.type] = { gatsbyImageData: gatsbyImageResolver, }; - }); + } + }); - createResolvers(resolvers); - } + createResolvers(resolvers); }; diff --git a/plugin/gatsby-plugin-image/index.test.js b/plugin/gatsby-plugin-image/index.test.js new file mode 100644 index 0000000..2b771be --- /dev/null +++ b/plugin/gatsby-plugin-image/index.test.js @@ -0,0 +1,180 @@ +const { + createGatsbyImageDataResolver, + _amendTransformTypeMapping, +} = require('./index'); + +const gatsbyUtilsMocks = { + createResolvers: jest.fn(), +}; + +describe('_amendTransformTypeConfig', () => { + it('defaults to using the field name as key', () => { + const ammendedMapping = _amendTransformTypeMapping({}); + + const source = { + publicId: 'a publicId', + cloudName: 'a cloudName', + height: 300, + width: 200, + format: 'a format', + base64: 'a base64', + tracedSVG: 'a tracedSVG', + }; + + expect({ + publicId: ammendedMapping.publicId(source), + cloudName: ammendedMapping.cloudName(source), + height: ammendedMapping.height(source), + width: ammendedMapping.width(source), + format: ammendedMapping.format(source), + base64: ammendedMapping.base64(source), + tracedSVG: ammendedMapping.tracedSVG(source), + }).toEqual(source); + }); + + it('allows field name config', () => { + const originalMapping = { + publicId: 'field1', + cloudName: 'field2', + height: 'field3', + width: 'field4', + format: 'field5', + base64: 'field6', + tracedSVG: 'field7', + }; + const ammenedMapping = _amendTransformTypeMapping(originalMapping); + + const source = { + field1: 'a publicId', + field2: 'a cloudName', + field3: 300, + field4: 200, + field5: 'a format', + field6: 'a base64', + field7: 'a tracedSVG', + }; + + const asset = { + publicId: 'a publicId', + cloudName: 'a cloudName', + height: 300, + width: 200, + format: 'a format', + base64: 'a base64', + tracedSVG: 'a tracedSVG', + }; + + expect({ + publicId: ammenedMapping.publicId(source), + cloudName: ammenedMapping.cloudName(source), + height: ammenedMapping.height(source), + width: ammenedMapping.width(source), + format: ammenedMapping.format(source), + base64: ammenedMapping.base64(source), + tracedSVG: ammenedMapping.tracedSVG(source), + }).toEqual(asset); + }); + + it('allows function config', () => { + const originalMapping = { + publicId: (source) => { + return source.field1; + }, + cloudName: () => { + return 'cloud five'; + }, + height: (source) => { + return source.field3.height; + }, + width: () => { + return 200; + }, + format: (source) => { + return source.field5.toLowerCase(); + }, + base64: (source) => { + return source.field6.toUpperCase(); + }, + tracedSVG: (source) => { + return undefined; + }, + }; + const ammendedMapping = _amendTransformTypeMapping(originalMapping); + + const source = { + field1: 'a publicId', + field2: 'a cloudName', // will not be used + field3: { height: 300 }, + field4: 200, // will not be used + field5: 'A FORMAT', + field6: 'a base64', + field7: 'a tracedSVG', // will not be used + }; + + const asset = { + publicId: 'a publicId', + cloudName: 'cloud five', + height: 300, + width: 200, + format: 'a format', + base64: 'A BASE64', + tracedSVG: undefined, + }; + + expect({ + publicId: ammendedMapping.publicId(source), + cloudName: ammendedMapping.cloudName(source), + height: ammendedMapping.height(source), + width: ammendedMapping.width(source), + format: ammendedMapping.format(source), + base64: ammendedMapping.base64(source), + tracedSVG: ammendedMapping.tracedSVG(source), + }).toEqual(asset); + }); +}); + +describe('createGatsbyImageDataResolver', () => { + it('creates a resolver', () => { + const pluginOptions = { + defaultTransformations: ['c_fill', 'g_auto', 'q_auto'], + transformTypes: ['CloudinaryAsset', { type: 'CloudinaryAsset2' }], + }; + + createGatsbyImageDataResolver(gatsbyUtilsMocks, pluginOptions); + + expect(gatsbyUtilsMocks.createResolvers).toBeCalledWith({ + CloudinaryAsset: expect.objectContaining({ + gatsbyImageData: expect.objectContaining({ + type: 'GatsbyImageData', + resolve: expect.any(Function), + args: expect.objectContaining({ + transformations: expect.objectContaining({ + defaultValue: ['c_fill', 'g_auto', 'q_auto'], + type: '[String]', + }), + secure: expect.objectContaining({ + defaultValue: true, + type: 'Boolean', + }), + }), + }), + }), + CloudinaryAsset2: expect.objectContaining({ + gatsbyImageData: expect.objectContaining({ + type: 'GatsbyImageData', + resolve: expect.any(Function), + args: expect.objectContaining({ + transformations: expect.objectContaining({ + defaultValue: ['c_fill', 'g_auto', 'q_auto'], + type: '[String]', + }), + secure: expect.objectContaining({ + defaultValue: true, + type: 'Boolean', + }), + }), + }), + }), + }); + }); +}); diff --git a/plugin/gatsby-plugin-image/resolve-asset.js b/plugin/gatsby-plugin-image/resolve-asset.js index 487268d..12cf8dd 100644 --- a/plugin/gatsby-plugin-image/resolve-asset.js +++ b/plugin/gatsby-plugin-image/resolve-asset.js @@ -41,34 +41,34 @@ const generateCloudinaryAssetSource = ( return imageSource; }; -const generateMetadata = async (source, args, transformType, reporter) => { +const validateMetadataAndFetchIfNeeded = async ( + cldAssetSource, + args, + reporter +) => { const schema = Joi.object({ width: Joi.number().positive().required(), height: Joi.number().positive().required(), format: Joi.string().default('auto'), }).required(); - const originalMetadata = { - width: source.originalWidth, - height: source.originalHeight, - format: source.originalFormat, - }; - - const { value, error } = schema.validate(originalMetadata); + const { value, error } = schema.validate(cldAssetSource, { + stripUnknown: true, + }); if (!error) { - // Original metadata is valid, - // use validated value return value; } try { - // Lacking metadata, so let's fetch it reporter.verbose( - `[gatsby-transformer-cloudinary] Missing metadata fields on ${transformType}: cloudName=${source.cloudName}, publicId=${source.publicId} >>> To save on network requests add originalWidth, originalHeight and originalFormat to ${transformType}` + `[gatsby-transformer-cloudinary] Missing metadata fields on ${cldAssetSource.type}: cloudName=${cldAssetSource.cloudName}, publicId=${cldAssetSource.publicId} >>> To save on network requests add width, height and format to ${cldAssetSource.transformType}` ); - const fetchedMetadata = await getAssetMetadata({ source, args }); + const fetchedMetadata = await getAssetMetadata({ + source: cldAssetSource, + args, + }); const { value, error } = schema.validate(fetchedMetadata); if (!error) { @@ -78,14 +78,44 @@ const generateMetadata = async (source, args, transformType, reporter) => { } else { // Fetched metadata is not valid reporter.verbose( - `[gatsby-transformer-cloudinary] Invalid fetched metadata for ${transformType}: cloudName=${source.cloudName}, publicId=${source.publicId} >>> ${error.message}` + `[gatsby-transformer-cloudinary] Invalid fetched metadata for ${cldAssetSource.type}: cloudName=${cldAssetSource.cloudName}, publicId=${cldAssetSource.publicId} >>> ${error.message}` ); return null; } } catch (error) { // Error fetching reporter.verbose( - `[gatsby-transformer-cloudinary] Could not fetch metadata for ${transformType}: cloudName=${source.cloudName}, publicId=${source.publicId} >>> ${error.message}` + `[gatsby-transformer-cloudinary] Could not fetch metadata for ${cldAssetSource.type}: cloudName=${cldAssetSource.cloudName}, publicId=${cldAssetSource.publicId} >>> ${error.message}` + ); + return null; + } +}; + +const validateRequiredData = (cldAssetSource, reporter) => { + const schema = Joi.object({ + cloudName: Joi.string().required(), + publicId: Joi.string().required(), + }).required(); + + const { value, error } = schema.validate(cldAssetSource, { + abortEarly: false, + stripUnknown: true, + }); + + if (!error) { + return value; + } + + if (error?.details.length < 2 && error?.details[0].path.length > 0) { + // Probably a mistake as it has one of the required fields + reporter.warn( + `[gatsby-transformer-cloudinary] Missing required field on ${cldAssetSource.type}: cloudName=${cldAssetSource.cloudName}, publicId=${cldAssetSource.publicId} >>> gatsbyImageData will resolve to null` + ); + return null; + } else { + // Probably a non Cloudinary asses as it has none of the required fields + reporter.verbose( + `[gatsby-transformer-cloudinary] Missing cloudName and publicId on ${cldAssetSource.type} >>> gatsbyImageData will resolve to null` ); return null; } @@ -95,81 +125,79 @@ const generateMetadata = async (source, args, transformType, reporter) => { exports._generateCloudinaryAssetSource = generateCloudinaryAssetSource; exports.createResolveCloudinaryAssetData = - (gatsbyUtils) => async (source, args, _context, info) => { + (gatsbyUtils, transformTypeConfig) => async (source, args, _context) => { let { reporter } = gatsbyUtils; reporter = resolverReporter({ reporter, logLevel: args.logLevel }); - const transformType = info.parentType || 'UnknownTransformType'; - - const schema = Joi.object({ - cloudName: Joi.string().required(), - publicId: Joi.string().required(), - }).required(); + source = source || {}; + const mapping = transformTypeConfig.mapping || {}; + + let cldAssetSource = { + type: transformTypeConfig.type, + cloudName: mapping['cloudName'](source) || source['cloudName'], + publicId: mapping['publicId'](source) || source['publicId'], + height: mapping['height'](source) || source['originalHeight'], + width: mapping['width'](source) || source['originalWidth'], + format: mapping['format'](source) || source['originalFormat'], + base64: mapping['base64'](source) || source['defaultBase64'], + tracedSVG: mapping['tracedSVG'](source) || source['defaultTracedSVG'], + }; - const { error } = schema.validate(source, { - allowUnknown: true, - abortEarly: false, - }); + const cldAssetRequired = validateRequiredData(cldAssetSource, reporter); + if (!cldAssetRequired) return null; - if (error) { - if (error.details.length < 2 && error.details[0].path.length > 0) { - reporter.warn( - `[gatsby-transformer-cloudinary] Missing required field on ${transformType}: cloudName=${source?.cloudName}, publicId=${source?.publicId} >>> gatsbyImageData will resolve to null` - ); - } else { - reporter.verbose( - `[gatsby-transformer-cloudinary] Missing cloudName and publicId on ${transformType} >>> gatsbyImageData will resolve to null` - ); - } - - return null; - } + cldAssetSource = { + ...cldAssetSource, + ...cldAssetRequired, + }; - const metadata = await generateMetadata( - source, + const cldAssetMetadata = await validateMetadataAndFetchIfNeeded( + cldAssetSource, args, - transformType, reporter ); + if (!cldAssetMetadata) return null; - if (!metadata) { - reporter.warn( - `[gatsby-transformer-cloudinary] No metadata for ${transformType}: cloudName=${source.cloudName}, publicId=${source.publicId} >>> gatsbyImageData will resolve to null` - ); - return null; - } + cldAssetSource = { + ...cldAssetSource, + ...cldAssetMetadata, + }; - const assetDataArgs = { + const gatsbyAssetDataArgs = { ...args, - filename: source.cloudName + '>>>' + source.publicId, + filename: cldAssetSource.cloudName + '>>>' + cldAssetSource.publicId, // Passing the plugin name allows for better error messages pluginName: `gatsby-transformer-cloudinary`, - sourceMetadata: metadata, + sourceMetadata: cldAssetMetadata, generateImageSource: generateCloudinaryAssetSource, options: args, }; try { if (args.placeholder === 'blurred') { - if (source.defaultBase64) { - assetDataArgs.placeholderURL = source.defaultBase64; + if (cldAssetSource.base64) { + gatsbyAssetDataArgs.placeholderURL = cldAssetSource.base64; } else { - const lowResolutionUrl = getLowResolutionImageURL(assetDataArgs); + const lowResolutionUrl = + getLowResolutionImageURL(gatsbyAssetDataArgs); const base64 = await getUrlAsBase64Image(lowResolutionUrl); - assetDataArgs.placeholderURL = base64; + gatsbyAssetDataArgs.placeholderURL = base64; } } else if (args.placeholder === 'tracedSVG') { - if (source.defaultTracedSVG) { - assetDataArgs.placeholderURL = source.defaultTracedSVG; + if (cldAssetSource.tracedSVG) { + gatsbyAssetDataArgs.placeholderURL = cldAssetSource.tracedSVG; } else { - const tracedSvg = await getAssetAsTracedSvg({ source, args }); - assetDataArgs.placeholderURL = tracedSvg; + const tracedSvg = await getAssetAsTracedSvg({ + source: cldAssetSource, + args, + }); + gatsbyAssetDataArgs.placeholderURL = tracedSvg; } } } catch (error) { reporter.error( - `[gatsby-transformer-cloudinary] Could not generate placeholder (${args.placeholder}) for ${source.cloudName} > ${source.publicId}: ${error.message}` + `[gatsby-transformer-cloudinary] Could not generate placeholder (${args.placeholder}) for ${cldAssetSource.cloudName} > ${cldAssetSource.publicId}: ${error.message}` ); } - return generateImageData(assetDataArgs); + return generateImageData(gatsbyAssetDataArgs); }; diff --git a/plugin/gatsby-plugin-image/resolve-asset.test.js b/plugin/gatsby-plugin-image/resolve-asset.test.js index 5bfc88e..c9c6b29 100644 --- a/plugin/gatsby-plugin-image/resolve-asset.test.js +++ b/plugin/gatsby-plugin-image/resolve-asset.test.js @@ -27,8 +27,21 @@ const { createResolveCloudinaryAssetData, } = require('./resolve-asset'); -const resolveCloudinaryAssetData = - createResolveCloudinaryAssetData(gatsbyUtilsMocks); +const resolveCloudinaryAssetData = createResolveCloudinaryAssetData( + gatsbyUtilsMocks, + { + type: 'CloudinaryAsset', + mapping: { + cloudName: (data) => data.cloudName, + publicId: (data) => data.publicId, + height: () => 300, + width: (data) => data.width, + format: (data) => data.format, + base64: (data) => data.base64, + tracedSVG: (data) => data.tracedSVG, + }, + } +); describe('generateCloudinaryAssetSource', () => { const filename = 'cloud-name>>>public-id'; @@ -65,15 +78,15 @@ describe('resolveCloudinaryAssetData', () => { publicId: 'public-id', cloudName: 'cloud-name', originalWidth: '600', - originalHeight: '300', + // originalHeight: '300', originalFormat: 'jpg', }; const sourceWithoutFormat = { publicId: 'public-id', cloudName: 'cloud-name', - originalWidth: '600', - originalHeight: '300', + width: '600', + // height: '300', }; const sourceWithoutMeta = { @@ -81,6 +94,16 @@ describe('resolveCloudinaryAssetData', () => { cloudName: 'cloud-name', }; + const sourceWithPlaceholder = { + publicId: 'public-id', + cloudName: 'cloud-name', + originalWidth: '600', + // originalHeight: '300', + originalFormat: 'jpg', + defaultBase64: 'defaultBase64DataUrl', + tracedSVG: 'defaultSvgDataUrl', + }; + const context = {}; // Never used const info = {}; @@ -109,7 +132,10 @@ describe('resolveCloudinaryAssetData', () => { const args = { transformations: ['e_grayscale'] }; await resolveCloudinaryAssetData(sourceWithMetadata, args, context, info); await resolveCloudinaryAssetData(sourceWithoutFormat, args, context, info); + expect(getAssetMetadata).toBeCalledTimes(0); + expect(generateImageData).toBeCalledTimes(2); + expect(generateImageData).toHaveBeenNthCalledWith(1, { filename: 'cloud-name>>>public-id', generateImageSource: _generateCloudinaryAssetSource, @@ -165,10 +191,17 @@ describe('resolveCloudinaryAssetData', () => { it('fetches and adds correct "blurred" placeholder', async () => { const args = { placeholder: 'blurred' }; await resolveCloudinaryAssetData(sourceWithMetadata, args, context, info); + await resolveCloudinaryAssetData( + sourceWithPlaceholder, + args, + context, + info + ); expect(getLowResolutionImageURL).toBeCalledTimes(1); expect(getUrlAsBase64Image).toBeCalledTimes(1); - expect(generateImageData).toHaveBeenCalledWith({ + expect(generateImageData).toBeCalledTimes(2); + expect(generateImageData).toHaveBeenNthCalledWith(1, { filename: 'cloud-name>>>public-id', generateImageSource: _generateCloudinaryAssetSource, options: { placeholder: 'blurred' }, @@ -181,14 +214,34 @@ describe('resolveCloudinaryAssetData', () => { placeholderURL: 'base64DataUrl', placeholder: 'blurred', }); + expect(generateImageData).toHaveBeenNthCalledWith(2, { + filename: 'cloud-name>>>public-id', + generateImageSource: _generateCloudinaryAssetSource, + options: { placeholder: 'blurred' }, + pluginName: 'gatsby-transformer-cloudinary', + sourceMetadata: { + format: 'jpg', + height: 300, + width: 600, + }, + placeholderURL: 'defaultBase64DataUrl', + placeholder: 'blurred', + }); }); it('fetches and adds correct "tracedSVG" placeholder', async () => { const args = { placeholder: 'tracedSVG' }; await resolveCloudinaryAssetData(sourceWithMetadata, args, context, info); + await resolveCloudinaryAssetData( + sourceWithPlaceholder, + args, + context, + info + ); expect(getAssetAsTracedSvg).toBeCalledTimes(1); - expect(generateImageData).toHaveBeenCalledWith({ + expect(generateImageData).toBeCalledTimes(2); + expect(generateImageData).toHaveBeenNthCalledWith(1, { filename: 'cloud-name>>>public-id', generateImageSource: _generateCloudinaryAssetSource, options: { placeholder: 'tracedSVG' }, @@ -201,6 +254,19 @@ describe('resolveCloudinaryAssetData', () => { placeholderURL: 'svgDataUrl', placeholder: 'tracedSVG', }); + expect(generateImageData).toHaveBeenNthCalledWith(2, { + filename: 'cloud-name>>>public-id', + generateImageSource: _generateCloudinaryAssetSource, + options: { placeholder: 'tracedSVG' }, + pluginName: 'gatsby-transformer-cloudinary', + sourceMetadata: { + format: 'jpg', + height: 300, + width: 600, + }, + placeholderURL: 'defaultSvgDataUrl', + placeholder: 'tracedSVG', + }); }); describe('when unconforming source', () => { @@ -342,7 +408,7 @@ describe('resolveCloudinaryAssetData', () => { }); }); - describe('when fetched asset data is invalid', () => { + describe('when fetched asset metadata is invalid', () => { beforeEach(() => { getAssetMetadata.mockResolvedValue({ width: 100, @@ -355,7 +421,7 @@ describe('resolveCloudinaryAssetData', () => { jest.clearAllMocks(); }); - it('calls reporter.warn on invalid metadata and returns null', async () => { + it('calls reporter.verbose on invalid metadata and returns null', async () => { const args = {}; const result = await resolveCloudinaryAssetData( sourceWithoutMeta, @@ -365,12 +431,14 @@ describe('resolveCloudinaryAssetData', () => { ); expect(getAssetMetadata).toBeCalledTimes(1); expect(generateImageData).toBeCalledTimes(0); - expect(gatsbyUtilsMocks.reporter.warn).toBeCalledTimes(1); + // Once to notify invalid original metadata + // Once to notify about invalid fetched metadata + expect(gatsbyUtilsMocks.reporter.verbose).toBeCalledTimes(2); expect(result).toBe(null); }); }); - describe('when fetched asset data is undefined', () => { + describe('when fetched asset metadata is undefined', () => { beforeEach(() => { getAssetMetadata.mockResolvedValue(undefined); }); @@ -379,7 +447,7 @@ describe('resolveCloudinaryAssetData', () => { jest.clearAllMocks(); }); - it('calls reporter.warn on undefined metadata and returns null', async () => { + it('calls reporter.verbose on undefined metadata and returns null', async () => { const args = {}; const result = await resolveCloudinaryAssetData( sourceWithoutMeta, @@ -389,7 +457,9 @@ describe('resolveCloudinaryAssetData', () => { ); expect(getAssetMetadata).toBeCalledTimes(1); expect(generateImageData).toBeCalledTimes(0); - expect(gatsbyUtilsMocks.reporter.warn).toBeCalledTimes(1); + // Once to notify invalid original metadata + // Once to notify about invalid fetched metadata + expect(gatsbyUtilsMocks.reporter.verbose).toBeCalledTimes(2); expect(result).toBe(null); }); }); @@ -412,7 +482,7 @@ describe('resolveCloudinaryAssetData', () => { jest.clearAllMocks(); }); - it('calls reporter.error on metadata error and returns null', async () => { + it('calls reporter.verbose on metadata error and returns null', async () => { const args = {}; const result = await resolveCloudinaryAssetData( sourceWithoutMeta, @@ -422,7 +492,9 @@ describe('resolveCloudinaryAssetData', () => { ); expect(getAssetMetadata).toBeCalledTimes(1); expect(generateImageData).toBeCalledTimes(0); - expect(gatsbyUtilsMocks.reporter.warn).toBeCalledTimes(1); + // Once to notify invalid original metadata + // Once to notify about invalid fetched metadata + expect(gatsbyUtilsMocks.reporter.verbose).toBeCalledTimes(2); expect(result).toBe(null); }); diff --git a/plugin/gatsby-plugin-image/resolvers.js b/plugin/gatsby-plugin-image/resolvers.js index c9503fd..7b28dcd 100644 --- a/plugin/gatsby-plugin-image/resolvers.js +++ b/plugin/gatsby-plugin-image/resolvers.js @@ -1,4 +1,8 @@ -exports.createGatsbyPluginImageResolver = (gatsbyUtils, pluginOptions) => { +exports.createGatsbyPluginImageResolver = ( + gatsbyUtils, + transformTypeConfig, + defaultValues = {} +) => { const { reporter } = gatsbyUtils; try { const { @@ -7,12 +11,12 @@ exports.createGatsbyPluginImageResolver = (gatsbyUtils, pluginOptions) => { const { createResolveCloudinaryAssetData } = require('./resolve-asset'); const { CloudinaryPlaceholderType } = require('./types'); - return getGatsbyImageResolver( - createResolveCloudinaryAssetData(gatsbyUtils), + const gatsbyImageResolver = getGatsbyImageResolver( + createResolveCloudinaryAssetData(gatsbyUtils, transformTypeConfig), { transformations: { type: '[String]', - defaultValue: pluginOptions.defaultTransformations, + defaultValue: defaultValues.transformations, }, chained: '[String]', placeholder: { @@ -20,13 +24,18 @@ exports.createGatsbyPluginImageResolver = (gatsbyUtils, pluginOptions) => { }, secure: { type: 'Boolean', - defaultValue: true, + defaultValue: defaultValues.secure, }, logLevel: { type: 'String', }, } ); + + // Make the resolver nullable + gatsbyImageResolver.type = 'GatsbyImageData'; + + return gatsbyImageResolver; } catch (error) { reporter.warn( '[gatsby-transformer-cloudinary] Install and configure gatsby-plugin-image to use the new GatsbyImage component and gatsbyImageData resolver' diff --git a/yarn.lock b/yarn.lock index ad1d591..2bbcd54 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2715,6 +2715,13 @@ dependencies: "@types/node" "*" +"@types/hast@^2.0.0": + version "2.3.9" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.9.tgz#a9a1b5bbce46e8a1312e977364bacabc8e93d2cf" + integrity sha512-pTHyNlaMD/oKJmS+ZZUyFUcsZeBZpC0lmGquw98CqRVNgAdJZJeD7GoeLiT6Xbx5rU9VCjSt0RwEvDgzh4obFw== + dependencies: + "@types/unist" "^2" + "@types/http-cache-semantics@*", "@types/http-cache-semantics@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" @@ -2768,6 +2775,13 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.191.tgz#09511e7f7cba275acd8b419ddac8da9a6a79e2fa" integrity sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ== +"@types/mdast@^3.0.0", "@types/mdast@^3.0.3": + version "3.0.15" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.15.tgz#49c524a263f30ffa28b71ae282f813ed000ab9f5" + integrity sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ== + dependencies: + "@types/unist" "^2" + "@types/minimatch@*", "@types/minimatch@^5.1.2": version "5.1.2" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" @@ -2813,6 +2827,11 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/parse5@^5.0.0": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" + integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== + "@types/prettier@^2.1.5": version "2.7.2" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" @@ -2881,6 +2900,11 @@ resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.0.33.tgz#1073c4bc824754ae3d10cfab88ab0237ba964e4d" integrity sha512-gVC1InwyVrO326wbBZw+AO3u2vRXz/iRWq9jYhpG4W8LXyIgDv3ZmcLQ5Q4Gs+gFMyqx+viFoFT+l3p61QFCmQ== +"@types/unist@^2", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": + version "2.0.10" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.10.tgz#04ffa7f406ab628f7f7e97ca23e290cd8ab15efc" + integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== + "@types/yargs-parser@*": version "21.0.0" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" @@ -3389,6 +3413,11 @@ array-includes@^3.1.5, array-includes@^3.1.6: get-intrinsic "^1.1.3" is-string "^1.0.7" +array-iterate@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/array-iterate/-/array-iterate-1.1.4.tgz#add1522e9dd9749bb41152d08b845bd08d6af8b7" + integrity sha512-sNRaPGh9nnmdC8Zf+pT3UqP8rnWj5Hf9wiFGsX3wUQ2yVSIhO2ShFwCoceIPpB41QF6i2OEmrHmCo36xronCVA== + array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" @@ -3738,6 +3767,11 @@ backo2@~1.0.2: resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" integrity sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA== +bail@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" + integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -4072,6 +4106,11 @@ cardinal@^2.1.1: ansicolors "~0.3.2" redeyed "~2.1.0" +ccount@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" + integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== + chalk@^2.0.0, chalk@^2.3.2, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -4149,6 +4188,26 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== +character-entities-html4@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-1.1.4.tgz#0e64b0a3753ddbf1fdc044c5fd01d0199a02e125" + integrity sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g== + +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -4411,6 +4470,11 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" +comma-separated-tokens@^1.0.0: + version "1.0.8" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" + integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== + command-exists@^1.2.4: version "1.2.9" resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" @@ -4767,6 +4831,11 @@ css-select@^4.1.3, css-select@^4.2.1: domutils "^2.8.0" nth-check "^2.0.1" +css-selector-parser@^1.0.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/css-selector-parser/-/css-selector-parser-1.4.1.tgz#03f9cb8a81c3e5ab2c51684557d5aaf6d2569759" + integrity sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g== + css-tree@^1.1.2, css-tree@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" @@ -5167,7 +5236,16 @@ dom-serializer@^1.0.1: domhandler "^4.2.0" entities "^2.0.0" -domelementtype@^2.0.1, domelementtype@^2.2.0: +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== @@ -5179,6 +5257,13 @@ domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: dependencies: domelementtype "^2.2.0" +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" @@ -5188,6 +5273,15 @@ domutils@^2.5.2, domutils@^2.8.0: domelementtype "^2.2.0" domhandler "^4.2.0" +domutils@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + dot-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" @@ -5335,6 +5429,11 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== +entities@^4.2.0, entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + env-ci@^5.0.0: version "5.5.0" resolved "https://registry.yarnpkg.com/env-ci/-/env-ci-5.5.0.tgz#43364e3554d261a586dec707bc32be81112b545f" @@ -5898,6 +5997,18 @@ ext@^1.1.2: dependencies: type "^2.7.2" +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + dependencies: + is-extendable "^0.1.0" + +extend@^3.0.0, extend@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + external-editor@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" @@ -5945,6 +6056,13 @@ fastq@^1.13.0, fastq@^1.6.0: dependencies: reusify "^1.0.4" +fastq@^1.15.0: + version "1.16.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.16.0.tgz#83b9a9375692db77a822df081edb6a9cf6839320" + integrity sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA== + dependencies: + reusify "^1.0.4" + fb-watchman@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" @@ -6217,6 +6335,15 @@ fs-extra@^11.0.0, fs-extra@^11.1.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@^11.1.1: + version "11.2.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" + integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" @@ -6338,6 +6465,28 @@ gatsby-cli@^5.3.1: yoga-layout-prebuilt "^1.10.0" yurnalist "^2.1.0" +gatsby-core-utils@^4.13.0: + version "4.13.0" + resolved "https://registry.yarnpkg.com/gatsby-core-utils/-/gatsby-core-utils-4.13.0.tgz#b286d9a5f31363d5264114b724a8d122850df2cd" + integrity sha512-+oJJsADfcEnzpQpof+L5qtP4iSeMaEPn1QSjXENlg/go9Pi/4eqb+Nn3y3q8bC/zy4hMWFWrPdMJmdW581uNvA== + dependencies: + "@babel/runtime" "^7.20.13" + ci-info "2.0.0" + configstore "^5.0.1" + fastq "^1.15.0" + file-type "^16.5.4" + fs-extra "^11.1.1" + got "^11.8.6" + hash-wasm "^4.9.0" + import-from "^4.0.0" + lmdb "2.5.3" + lock "^1.1.0" + node-object-hash "^2.3.10" + proper-lockfile "^4.1.2" + resolve-from "^5.0.0" + tmp "^0.2.1" + xdg-basedir "^4.0.0" + gatsby-core-utils@^4.3.1, gatsby-core-utils@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/gatsby-core-utils/-/gatsby-core-utils-4.7.0.tgz#f2c9d74da334979b0ae847bc6cfe283670c2f752" @@ -6501,6 +6650,14 @@ gatsby-sharp@^1.3.0, gatsby-sharp@^1.7.0: "@types/sharp" "^0.31.1" sharp "^0.31.3" +gatsby-source-cloudinary@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/gatsby-source-cloudinary/-/gatsby-source-cloudinary-0.6.0.tgz#b98725bd0aa13b109b024fc72f09dbcf0385244e" + integrity sha512-5I229BbrskagoI/UKKotx6pNSkEeRHEBaeCelsOrR3Nl9VGGjPRr9+76lrZB6MCiCWY1FPXi3AUq9X4AShjR7A== + dependencies: + cloudinary "^1.35.0" + lodash "^4.17.21" + gatsby-source-filesystem@5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/gatsby-source-filesystem/-/gatsby-source-filesystem-5.3.1.tgz#6d041fb2838e84c68843cf944de1727d1b48e1ea" @@ -6535,6 +6692,34 @@ gatsby-telemetry@^4.3.1, gatsby-telemetry@^4.7.0: lodash "^4.17.21" node-fetch "^2.6.8" +gatsby-transformer-remark@^6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/gatsby-transformer-remark/-/gatsby-transformer-remark-6.13.0.tgz#972e78406c98baf4cef515de31129f2c567bcd56" + integrity sha512-eliRUa1fXgJMXpSYTeg1ayvrVTPHQlC93Nd9LymYhgrLbxhyI/zDG46O1oNDKiY2qYE4++i6woMhk0TUSJXW8w== + dependencies: + "@babel/runtime" "^7.20.13" + gatsby-core-utils "^4.13.0" + gray-matter "^4.0.3" + hast-util-raw "^6.1.0" + hast-util-to-html "^7.1.3" + lodash "^4.17.21" + mdast-util-to-hast "^10.2.0" + mdast-util-to-string "^2.0.0" + mdast-util-toc "^5.1.0" + remark "^13.0.0" + remark-footnotes "^3.0.0" + remark-gfm "^1.0.0" + remark-parse "^9.0.0" + remark-retext "^4.0.0" + remark-stringify "^9.0.1" + retext-english "^3.0.4" + sanitize-html "^2.11.0" + underscore.string "^3.3.6" + unified "^9.2.2" + unist-util-remove-position "^3.0.0" + unist-util-select "^3.0.4" + unist-util-visit "^2.0.3" + gatsby-worker@^2.3.0: version "2.7.0" resolved "https://registry.yarnpkg.com/gatsby-worker/-/gatsby-worker-2.7.0.tgz#2d3cfced5ecac1d345d5c4e8b896aca282e7a72a" @@ -6825,6 +7010,11 @@ github-from-package@0.0.0: resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== +github-slugger@^1.2.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.5.0.tgz#17891bbc73232051474d68bd867a34625c955f7d" + integrity sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw== + glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -6914,7 +7104,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -got@^11.8.5: +got@^11.8.5, got@^11.8.6: version "11.8.6" resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== @@ -6982,6 +7172,16 @@ graphql@^16.6.0: resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.6.0.tgz#c2dcffa4649db149f6282af726c8c83f1c7c5fdb" integrity sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw== +gray-matter@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" + integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== + dependencies: + js-yaml "^3.13.1" + kind-of "^6.0.2" + section-matter "^1.0.0" + strip-bom-string "^1.0.0" + gzip-size@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" @@ -7080,6 +7280,101 @@ hasha@^5.2.2: is-stream "^2.0.0" type-fest "^0.8.0" +hast-to-hyperscript@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d" + integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== + dependencies: + "@types/unist" "^2.0.3" + comma-separated-tokens "^1.0.0" + property-information "^5.3.0" + space-separated-tokens "^1.0.0" + style-to-object "^0.3.0" + unist-util-is "^4.0.0" + web-namespaces "^1.0.0" + +hast-util-from-parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz#554e34abdeea25ac76f5bd950a1f0180e0b3bc2a" + integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== + dependencies: + "@types/parse5" "^5.0.0" + hastscript "^6.0.0" + property-information "^5.0.0" + vfile "^4.0.0" + vfile-location "^3.2.0" + web-namespaces "^1.0.0" + +hast-util-is-element@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz#3b3ed5159a2707c6137b48637fbfe068e175a425" + integrity sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ== + +hast-util-parse-selector@^2.0.0: + version "2.2.5" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" + integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== + +hast-util-raw@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-6.1.0.tgz#e16a3c2642f65cc7c480c165400a40d604ab75d0" + integrity sha512-5FoZLDHBpka20OlZZ4I/+RBw5piVQ8iI1doEvffQhx5CbCyTtP8UCq8Tw6NmTAMtXgsQxmhW7Ly8OdFre5/YMQ== + dependencies: + "@types/hast" "^2.0.0" + hast-util-from-parse5 "^6.0.0" + hast-util-to-parse5 "^6.0.0" + html-void-elements "^1.0.0" + parse5 "^6.0.0" + unist-util-position "^3.0.0" + unist-util-visit "^2.0.0" + vfile "^4.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hast-util-to-html@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-7.1.3.tgz#9f339ca9bea71246e565fc79ff7dbfe98bb50f5e" + integrity sha512-yk2+1p3EJTEE9ZEUkgHsUSVhIpCsL/bvT8E5GzmWc+N1Po5gBw+0F8bo7dpxXR0nu0bQVxVZGX2lBGF21CmeDw== + dependencies: + ccount "^1.0.0" + comma-separated-tokens "^1.0.0" + hast-util-is-element "^1.0.0" + hast-util-whitespace "^1.0.0" + html-void-elements "^1.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + stringify-entities "^3.0.1" + unist-util-is "^4.0.0" + xtend "^4.0.0" + +hast-util-to-parse5@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz#1ec44650b631d72952066cea9b1445df699f8479" + integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== + dependencies: + hast-to-hyperscript "^9.0.0" + property-information "^5.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hast-util-whitespace@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz#e4fe77c4a9ae1cb2e6c25e02df0043d0164f6e41" + integrity sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A== + +hastscript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" + integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + he@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -7134,6 +7429,11 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== +html-void-elements@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" + integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== + htmlparser2@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" @@ -7144,6 +7444,16 @@ htmlparser2@^6.1.0: domutils "^2.5.2" entities "^2.0.0" +htmlparser2@^8.0.0: + version "8.0.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" + integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + entities "^4.4.0" + http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0, http-cache-semantics@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" @@ -7316,7 +7626,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -7344,6 +7654,11 @@ init-package-json@^3.0.2: validate-npm-package-license "^3.0.4" validate-npm-package-name "^4.0.0" +inline-style-parser@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" + integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== + inquirer@^7.0.0: version "7.3.3" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" @@ -7420,6 +7735,19 @@ is-absolute@^1.0.0: is-relative "^1.0.0" is-windows "^1.0.1" +is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" @@ -7469,6 +7797,11 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-buffer@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" @@ -7502,11 +7835,21 @@ is-date-object@^1.0.1, is-date-object@^1.0.5: dependencies: has-tostringtag "^1.0.0" +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + is-docker@^2.0.0, is-docker@^2.1.1, is-docker@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== +is-extendable@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" @@ -7541,6 +7884,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + is-invalid-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-invalid-path/-/is-invalid-path-0.1.0.tgz#307a855b3cf1a938b44ea70d2c61106053714f34" @@ -7602,6 +7950,11 @@ is-plain-obj@^1.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== +is-plain-obj@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -8371,7 +8724,7 @@ keyv@^4.0.0, keyv@^4.5.2: dependencies: json-buffer "3.0.1" -kind-of@^6.0.2, kind-of@^6.0.3: +kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -8753,6 +9106,11 @@ lodash@^4.17.10, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +longest-streak@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" + integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg== + loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -8884,6 +9242,13 @@ map-obj@^4.0.0: resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== +markdown-table@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-2.0.0.tgz#194a90ced26d31fe753d8b9434430214c011865b" + integrity sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A== + dependencies: + repeat-string "^1.0.0" + marked-terminal@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-5.1.1.tgz#d2edc2991841d893ee943b44b40b2ee9518b4d9f" @@ -8906,11 +9271,147 @@ md5-file@^5.0.0: resolved "https://registry.yarnpkg.com/md5-file/-/md5-file-5.0.0.tgz#e519f631feca9c39e7f9ea1780b63c4745012e20" integrity sha512-xbEFXCYVWrSx/gEKS1VPlg84h/4L20znVIulKw6kMfmBUAZNAnF00eczz9ICMl+/hjQGo5KSXRxbL/47X3rmMw== +mdast-util-definitions@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" + integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== + dependencies: + unist-util-visit "^2.0.0" + +mdast-util-find-and-replace@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz#b7db1e873f96f66588c321f1363069abf607d1b5" + integrity sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA== + dependencies: + escape-string-regexp "^4.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" + +mdast-util-footnote@^0.1.0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/mdast-util-footnote/-/mdast-util-footnote-0.1.7.tgz#4b226caeab4613a3362c144c94af0fdd6f7e0ef0" + integrity sha512-QxNdO8qSxqbO2e3m09KwDKfWiLgqyCurdWTQ198NpbZ2hxntdc+VKS4fDJCmNWbAroUdYnSthu+XbZ8ovh8C3w== + dependencies: + mdast-util-to-markdown "^0.6.0" + micromark "~2.11.0" + +mdast-util-from-markdown@^0.8.0: + version "0.8.5" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz#d1ef2ca42bc377ecb0463a987910dae89bd9a28c" + integrity sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-string "^2.0.0" + micromark "~2.11.0" + parse-entities "^2.0.0" + unist-util-stringify-position "^2.0.0" + +mdast-util-gfm-autolink-literal@^0.1.0: + version "0.1.3" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-0.1.3.tgz#9c4ff399c5ddd2ece40bd3b13e5447d84e385fb7" + integrity sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A== + dependencies: + ccount "^1.0.0" + mdast-util-find-and-replace "^1.1.0" + micromark "^2.11.3" + +mdast-util-gfm-strikethrough@^0.2.0: + version "0.2.3" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz#45eea337b7fff0755a291844fbea79996c322890" + integrity sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA== + dependencies: + mdast-util-to-markdown "^0.6.0" + +mdast-util-gfm-table@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-0.1.6.tgz#af05aeadc8e5ee004eeddfb324b2ad8c029b6ecf" + integrity sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ== + dependencies: + markdown-table "^2.0.0" + mdast-util-to-markdown "~0.6.0" + +mdast-util-gfm-task-list-item@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-0.1.6.tgz#70c885e6b9f543ddd7e6b41f9703ee55b084af10" + integrity sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A== + dependencies: + mdast-util-to-markdown "~0.6.0" + +mdast-util-gfm@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz#8ecddafe57d266540f6881f5c57ff19725bd351c" + integrity sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ== + dependencies: + mdast-util-gfm-autolink-literal "^0.1.0" + mdast-util-gfm-strikethrough "^0.2.0" + mdast-util-gfm-table "^0.1.0" + mdast-util-gfm-task-list-item "^0.1.0" + mdast-util-to-markdown "^0.6.1" + +mdast-util-to-hast@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.2.0.tgz#61875526a017d8857b71abc9333942700b2d3604" + integrity sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + mdast-util-definitions "^4.0.0" + mdurl "^1.0.0" + unist-builder "^2.0.0" + unist-util-generated "^1.0.0" + unist-util-position "^3.0.0" + unist-util-visit "^2.0.0" + +mdast-util-to-markdown@^0.6.0, mdast-util-to-markdown@^0.6.1, mdast-util-to-markdown@~0.6.0: + version "0.6.5" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz#b33f67ca820d69e6cc527a93d4039249b504bebe" + integrity sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ== + dependencies: + "@types/unist" "^2.0.0" + longest-streak "^2.0.0" + mdast-util-to-string "^2.0.0" + parse-entities "^2.0.0" + repeat-string "^1.0.0" + zwitch "^1.0.0" + +mdast-util-to-nlcst@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-to-nlcst/-/mdast-util-to-nlcst-4.0.1.tgz#ff8b5339c960b38209273fa8bf4dd7a9498f8636" + integrity sha512-Y4ffygj85MTt70STKnEquw6k73jYWJBaYcb4ITAKgSNokZF7fH8rEHZ1GsRY/JaxqUevMaEnsDmkVv5Z9uVRdg== + dependencies: + nlcst-to-string "^2.0.0" + repeat-string "^1.0.0" + unist-util-position "^3.0.0" + vfile-location "^3.1.0" + +mdast-util-to-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" + integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== + +mdast-util-toc@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-toc/-/mdast-util-toc-5.1.0.tgz#3af0f9c9a764b993538af03f1f79f4e3cec22736" + integrity sha512-csimbRIVkiqc+PpFeKDGQ/Ck2N4f9FYH3zzBMMJzcxoKL8m+cM0n94xXm0I9eaxHnKdY9n145SGTdyJC7i273g== + dependencies: + "@types/mdast" "^3.0.3" + "@types/unist" "^2.0.3" + extend "^3.0.2" + github-slugger "^1.2.1" + mdast-util-to-string "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit "^2.0.0" + mdn-data@2.0.14: version "2.0.14" resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== +mdurl@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== + meant@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/meant/-/meant-1.0.3.tgz#67769af9de1d158773e928ae82c456114903554c" @@ -8987,6 +9488,66 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== +micromark-extension-footnote@^0.3.0: + version "0.3.2" + resolved "https://registry.yarnpkg.com/micromark-extension-footnote/-/micromark-extension-footnote-0.3.2.tgz#129b74ef4920ce96719b2c06102ee7abb2b88a20" + integrity sha512-gr/BeIxbIWQoUm02cIfK7mdMZ/fbroRpLsck4kvFtjbzP4yi+OPVbnukTc/zy0i7spC2xYE/dbX1Sur8BEDJsQ== + dependencies: + micromark "~2.11.0" + +micromark-extension-gfm-autolink-literal@~0.5.0: + version "0.5.7" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz#53866c1f0c7ef940ae7ca1f72c6faef8fed9f204" + integrity sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw== + dependencies: + micromark "~2.11.3" + +micromark-extension-gfm-strikethrough@~0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz#96cb83356ff87bf31670eefb7ad7bba73e6514d1" + integrity sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw== + dependencies: + micromark "~2.11.0" + +micromark-extension-gfm-table@~0.4.0: + version "0.4.3" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-0.4.3.tgz#4d49f1ce0ca84996c853880b9446698947f1802b" + integrity sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA== + dependencies: + micromark "~2.11.0" + +micromark-extension-gfm-tagfilter@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-0.3.0.tgz#d9f26a65adee984c9ccdd7e182220493562841ad" + integrity sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q== + +micromark-extension-gfm-task-list-item@~0.3.0: + version "0.3.3" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-0.3.3.tgz#d90c755f2533ed55a718129cee11257f136283b8" + integrity sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ== + dependencies: + micromark "~2.11.0" + +micromark-extension-gfm@^0.3.0: + version "0.3.3" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz#36d1a4c089ca8bdfd978c9bd2bf1a0cb24e2acfe" + integrity sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A== + dependencies: + micromark "~2.11.0" + micromark-extension-gfm-autolink-literal "~0.5.0" + micromark-extension-gfm-strikethrough "~0.6.5" + micromark-extension-gfm-table "~0.4.0" + micromark-extension-gfm-tagfilter "~0.3.0" + micromark-extension-gfm-task-list-item "~0.3.0" + +micromark@^2.11.3, micromark@~2.11.0, micromark@~2.11.3: + version "2.11.4" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a" + integrity sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA== + dependencies: + debug "^4.0.0" + parse-entities "^2.0.0" + micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" @@ -9305,6 +9866,11 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +nlcst-to-string@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/nlcst-to-string/-/nlcst-to-string-2.0.4.tgz#9315dfab80882bbfd86ddf1b706f53622dc400cc" + integrity sha512-3x3jwTd6UPG7vi5k4GEzvxJ5rDA7hVUIRNHPblKuMVP9Z3xmlsd9cgLcpAMkc5uPOBna82EeshROFhsPkbnTZg== + no-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" @@ -9474,6 +10040,11 @@ normalize-url@^8.0.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.0.0.tgz#593dbd284f743e8dcf6a5ddf8fadff149c82701a" integrity sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw== +not@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/not/-/not-0.1.0.tgz#c9691c1746c55dcfbe54cbd8bd4ff041bc2b519d" + integrity sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA== + npm-audit-report@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/npm-audit-report/-/npm-audit-report-3.0.0.tgz#1bf3e531208b5f77347c8d00c3d9badf5be30cd6" @@ -9671,7 +10242,7 @@ npmlog@^6.0.0, npmlog@^6.0.2: gauge "^4.0.3" set-blocking "^2.0.0" -nth-check@^2.0.1: +nth-check@^2.0.0, nth-check@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== @@ -10062,6 +10633,28 @@ parse-conflict-json@^2.0.1, parse-conflict-json@^2.0.2: just-diff "^5.0.1" just-diff-apply "^5.2.0" +parse-english@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/parse-english/-/parse-english-4.2.0.tgz#037b68f34d1a1bdf3d33668b87791bdfc1f01e1e" + integrity sha512-jw5N6wZUZViIw3VLG/FUSeL3vDhfw5Q2g4E3nYC69Mm5ANbh9ZWd+eligQbeUoyObZM8neynTn3l14e09pjEWg== + dependencies: + nlcst-to-string "^2.0.0" + parse-latin "^4.0.0" + unist-util-modify-children "^2.0.0" + unist-util-visit-children "^1.0.0" + +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + parse-filepath@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" @@ -10089,6 +10682,15 @@ parse-json@^5.0.0, parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +parse-latin@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/parse-latin/-/parse-latin-4.3.0.tgz#1a70fc5601743baa06c5f12253c334fc94b4a917" + integrity sha512-TYKL+K98dcAWoCw/Ac1yrPviU8Trk+/gmjQVaoWEFDZmVD4KRg6c/80xKqNNFQObo2mTONgF8trzAf2UTwKafw== + dependencies: + nlcst-to-string "^2.0.0" + unist-util-modify-children "^2.0.0" + unist-util-visit-children "^1.0.0" + parse-path@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-7.0.0.tgz#605a2d58d0a749c8594405d8cc3a2bf76d16099b" @@ -10096,6 +10698,11 @@ parse-path@^7.0.0: dependencies: protocols "^2.0.0" +parse-srcset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/parse-srcset/-/parse-srcset-1.0.2.tgz#f2bd221f6cc970a938d88556abc589caaaa2bde1" + integrity sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q== + parse-url@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-8.1.0.tgz#972e0827ed4b57fc85f0ea6b0d839f0d8a57a57d" @@ -10103,6 +10710,11 @@ parse-url@^8.1.0: dependencies: parse-path "^7.0.0" +parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + parseqs@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.6.tgz#8e4bb5a19d1cdc844a08ac974d34e273afa670d5" @@ -10654,6 +11266,13 @@ proper-lockfile@^4.1.2: retry "^0.12.0" signal-exit "^3.0.2" +property-information@^5.0.0, property-information@^5.3.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" + integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== + dependencies: + xtend "^4.0.0" + proto-list@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" @@ -11123,6 +11742,52 @@ relay-runtime@12.0.0: fbjs "^3.0.0" invariant "^2.2.4" +remark-footnotes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/remark-footnotes/-/remark-footnotes-3.0.0.tgz#5756b56f8464fa7ed80dbba0c966136305d8cb8d" + integrity sha512-ZssAvH9FjGYlJ/PBVKdSmfyPc3Cz4rTWgZLI4iE/SX8Nt5l3o3oEjv3wwG5VD7xOjktzdwp5coac+kJV9l4jgg== + dependencies: + mdast-util-footnote "^0.1.0" + micromark-extension-footnote "^0.3.0" + +remark-gfm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-1.0.0.tgz#9213643001be3f277da6256464d56fd28c3b3c0d" + integrity sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA== + dependencies: + mdast-util-gfm "^0.1.0" + micromark-extension-gfm "^0.3.0" + +remark-parse@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-9.0.0.tgz#4d20a299665880e4f4af5d90b7c7b8a935853640" + integrity sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw== + dependencies: + mdast-util-from-markdown "^0.8.0" + +remark-retext@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/remark-retext/-/remark-retext-4.0.0.tgz#255ed98ac3e0a68da5c6ba4f172299b8d062bb28" + integrity sha512-cYCchalpf25bTtfXF24ribYvqytPKq0TiEhqQDBHvVEEsApebwruPWP1cTcvTFBidmpXyqzycm+y8ng7Kmvc8Q== + dependencies: + mdast-util-to-nlcst "^4.0.0" + +remark-stringify@^9.0.0, remark-stringify@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-9.0.1.tgz#576d06e910548b0a7191a71f27b33f1218862894" + integrity sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg== + dependencies: + mdast-util-to-markdown "^0.6.0" + +remark@^13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/remark/-/remark-13.0.0.tgz#d15d9bf71a402f40287ebe36067b66d54868e425" + integrity sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA== + dependencies: + remark-parse "^9.0.0" + remark-stringify "^9.0.0" + unified "^9.1.0" + remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -11139,6 +11804,11 @@ renderkid@^2.0.4: lodash "^4.17.21" strip-ansi "^3.0.1" +repeat-string@^1.0.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -11226,6 +11896,14 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" +retext-english@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/retext-english/-/retext-english-3.0.4.tgz#f978828d51fbcee842bc3807a45b7f709822ea8d" + integrity sha512-yr1PgaBDde+25aJXrnt3p1jvT8FVLVat2Bx8XeAWX13KXo8OT+3nWGU3HWxM4YFJvmfqvJYJZG2d7xxaO774gw== + dependencies: + parse-english "^4.0.0" + unherit "^1.0.4" + retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" @@ -11298,6 +11976,18 @@ safe-regex-test@^1.0.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sanitize-html@^2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-2.11.0.tgz#9a6434ee8fcaeddc740d8ae7cd5dd71d3981f8f6" + integrity sha512-BG68EDHRaGKqlsNjJ2xUB7gpInPA8gVx/mvjO743hZaeMCZ2DwzW7xvsqZ+KNU4QKwj86HJ3uu2liISf2qBBUA== + dependencies: + deepmerge "^4.2.2" + escape-string-regexp "^4.0.0" + htmlparser2 "^8.0.0" + is-plain-object "^5.0.0" + parse-srcset "^1.0.2" + postcss "^8.3.11" + sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" @@ -11337,6 +12027,14 @@ schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: ajv "^6.12.5" ajv-keywords "^3.5.2" +section-matter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" + integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== + dependencies: + extend-shallow "^2.0.1" + kind-of "^6.0.0" + semantic-release@^19.0.5: version "19.0.5" resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-19.0.5.tgz#d7fab4b33fc20f1288eafd6c441e5d0938e5e174" @@ -11717,6 +12415,11 @@ source-map@^0.7.3: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== +space-separated-tokens@^1.0.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" + integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== + spawn-error-forwarder@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz#1afd94738e999b0346d7b9fc373be55e07577029" @@ -11781,6 +12484,11 @@ sponge-case@^1.0.1: dependencies: tslib "^2.0.3" +sprintf-js@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -11949,6 +12657,15 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +stringify-entities@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-3.1.0.tgz#b8d3feac256d9ffcc9fa1fefdcf3ca70576ee903" + integrity sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg== + dependencies: + character-entities-html4 "^1.0.0" + character-entities-legacy "^1.0.0" + xtend "^4.0.0" + strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -11970,6 +12687,11 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-bom-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" + integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -12023,6 +12745,13 @@ style-loader@^2.0.0: loader-utils "^2.0.0" schema-utils "^3.0.0" +style-to-object@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" + integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== + dependencies: + inline-style-parser "0.1.1" + stylehacks@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9" @@ -12304,6 +13033,11 @@ trim-newlines@^3.0.0: resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== +trough@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" + integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== + "true-case-path@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-2.2.1.tgz#c5bf04a5bbec3fd118be4084461b3a27c4d796bf" @@ -12471,6 +13205,22 @@ unc-path-regex@^0.1.2: resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" integrity sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg== +underscore.string@^3.3.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.6.tgz#ad8cf23d7423cb3b53b898476117588f4e2f9159" + integrity sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ== + dependencies: + sprintf-js "^1.1.1" + util-deprecate "^1.0.2" + +unherit@^1.0.4: + version "1.1.3" + resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" + integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== + dependencies: + inherits "^2.0.0" + xtend "^4.0.0" + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -12494,6 +13244,18 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== +unified@^9.1.0, unified@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" + integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + unique-filename@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-2.0.1.tgz#e785f8675a9a7589e0ac77e0b5c34d2eaeac6da2" @@ -12515,6 +13277,80 @@ unique-string@^2.0.0: dependencies: crypto-random-string "^2.0.0" +unist-builder@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" + integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== + +unist-util-generated@^1.0.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" + integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== + +unist-util-is@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" + integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== + +unist-util-modify-children@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unist-util-modify-children/-/unist-util-modify-children-2.0.0.tgz#9c9c30d4e32502aabb3fde10d7872a17c86801e2" + integrity sha512-HGrj7JQo9DwZt8XFsX8UD4gGqOsIlCih9opG6Y+N11XqkBGKzHo8cvDi+MfQQgiZ7zXRUiQREYHhjOBHERTMdg== + dependencies: + array-iterate "^1.0.0" + +unist-util-position@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" + integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== + +unist-util-remove-position@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-3.0.0.tgz#4cd19e82c8e665f462b6acfcfd0a8353235a88e9" + integrity sha512-17kIOuolVuK16LMb9KyMJlqdfCtlfQY5FjY3Sdo9iC7F5wqdXhNjMq0PBvMpkVNNnAmHxXssUW+rZ9T2zbP0Rg== + dependencies: + unist-util-visit "^2.0.0" + +unist-util-select@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/unist-util-select/-/unist-util-select-3.0.4.tgz#702c9dc1db1b2bbbfe27f796fce99e43f25edc60" + integrity sha512-xf1zCu4okgPqGLdhCDpRnjwBNyv3EqjiXRUbz2SdK1+qnLMB7uXXajfzuBvvbHoQ+JLyp4AEbFCGndmc6S72sw== + dependencies: + css-selector-parser "^1.0.0" + not "^0.1.0" + nth-check "^2.0.0" + unist-util-is "^4.0.0" + zwitch "^1.0.0" + +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + +unist-util-visit-children@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/unist-util-visit-children/-/unist-util-visit-children-1.1.4.tgz#e8a087e58a33a2815f76ea1901c15dec2cb4b432" + integrity sha512-sA/nXwYRCQVRwZU2/tQWUqJ9JSFM1X3x7JIOsIgSzrFHcfVt6NkzDtKzyxg2cZWkCwGF9CO8x4QNZRJRMK8FeQ== + +unist-util-visit-parents@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" + integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + +unist-util-visit@^2.0.0, unist-util-visit@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" + integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" + universal-user-agent@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" @@ -12654,6 +13490,29 @@ vary@^1, vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== +vfile-location@^3.1.0, vfile-location@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" + integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== + +vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + +vfile@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" + integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + vm2@^3.9.8: version "3.9.14" resolved "https://registry.yarnpkg.com/vm2/-/vm2-3.9.14.tgz#964042b474cf1e6e4f475a39144773cdb9deb734" @@ -12694,6 +13553,11 @@ weak-lru-cache@^1.2.2: resolved "https://registry.yarnpkg.com/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz#fdbb6741f36bae9540d12f480ce8254060dccd19" integrity sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw== +web-namespaces@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" + integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -13065,3 +13929,8 @@ yurnalist@^2.1.0: is-ci "^2.0.0" read "^1.0.7" strip-ansi "^5.2.0" + +zwitch@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" + integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==