From d3d5fd07496411453ab5d8caf869f5a66a18b4f6 Mon Sep 17 00:00:00 2001 From: GatsbyJS Bot Date: Thu, 30 Mar 2023 02:36:07 -0400 Subject: [PATCH] fix(gatsby-source-wordpress): prevent inconsistent schema customization (#37749) (#37778) * fix(gatsby-source-wordpress): prevent inconsistent schema customization (#37749) * panic or warn when schema customization is inconsistent * ensure types are always properly excluded * add blocklist of typename parts which cause a type to be excluded if it's name includes a part (cherry picked from commit 9f26b6722955463492776965182baabe779216f8) * ignore browserlist update prompt * fix ignore * fix(gatsby-source-wordpress): Force removal of types (#37424) --------- Co-authored-by: Tyler Barnes Co-authored-by: Michal Piechowiak Co-authored-by: Ty Hopp --- .circleci/config.yml | 2 +- .../__tests__/__snapshots__/index.js.snap | 30 ---- packages/gatsby-source-wordpress/package.json | 6 +- .../src/models/gatsby-api.ts | 30 ---- .../create-schema-customization/helpers.js | 151 ++++++++++++++++++ .../create-schema-customization/index.js | 3 +- .../recursively-transform-fields.js | 14 ++ .../identify-and-store-ingestable-types.js | 52 +++++- .../steps/ingest-remote-schema/is-excluded.js | 33 +++- .../write-queries-to-disk.js | 13 +- .../src/utils/report.ts | 7 + yarn.lock | 98 +++++++----- 12 files changed, 312 insertions(+), 127 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 9fdce490bd5c9..0db4395240917 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -242,7 +242,7 @@ jobs: integration_tests_gatsby_source_wordpress: machine: - image: "ubuntu-2004:202107-02" + image: "ubuntu-2204:2023.02.1" steps: - run: command: | diff --git a/integration-tests/gatsby-source-wordpress/__tests__/__snapshots__/index.js.snap b/integration-tests/gatsby-source-wordpress/__tests__/__snapshots__/index.js.snap index ff4ce39cfd37d..5e2cc19196f57 100644 --- a/integration-tests/gatsby-source-wordpress/__tests__/__snapshots__/index.js.snap +++ b/integration-tests/gatsby-source-wordpress/__tests__/__snapshots__/index.js.snap @@ -999,12 +999,6 @@ Array [ "fields": null, "name": "WpAcfLinkFilterInput", }, - Object { - "fields": Array [ - "node", - ], - "name": "WpActionMonitorActionConnectionEdgeType", - }, Object { "fields": Array [ "default", @@ -5556,18 +5550,6 @@ Array [ ], "name": "WpEdgeType", }, - Object { - "fields": Array [ - "node", - ], - "name": "WpEnqueuedScriptConnectionEdgeType", - }, - Object { - "fields": Array [ - "node", - ], - "name": "WpEnqueuedStylesheetConnectionEdgeType", - }, Object { "fields": null, "name": "WpFieldsEnum", @@ -7237,12 +7219,6 @@ Array [ ], "name": "WpPage_Acfpagefields_repeaterField_RepeaterFlex_RepeaterFlexTitleLayout", }, - Object { - "fields": Array [ - "node", - ], - "name": "WpPluginConnectionEdgeType", - }, Object { "fields": Array [ "author", @@ -8457,12 +8433,6 @@ Array [ "fields": null, "name": "WpTermNodeSortInput", }, - Object { - "fields": Array [ - "node", - ], - "name": "WpThemeConnectionEdgeType", - }, Object { "fields": Array [ "author", diff --git a/packages/gatsby-source-wordpress/package.json b/packages/gatsby-source-wordpress/package.json index 94f5d13e66b9f..47c6af101f593 100644 --- a/packages/gatsby-source-wordpress/package.json +++ b/packages/gatsby-source-wordpress/package.json @@ -32,7 +32,8 @@ "gatsby-plugin-utils": "^3.19.0", "gatsby-source-filesystem": "^4.25.0", "glob": "^7.2.3", - "got": "^11.8.5", + "got": "^11.8.6", + "json-diff": "^1.0.3", "lodash": "^4.17.21", "node-fetch": "^2.6.7", "p-queue": "^6.6.2", @@ -60,8 +61,7 @@ "identity-obj-proxy": "^3.0.0", "react-test-renderer": "^16.14.0", "rimraf": "^3.0.2", - "tree-kill": "^1.2.2", - "wait-on": "^4.0.2" + "tree-kill": "^1.2.2" }, "homepage": "https://github.com/gatsbyjs/gatsby/tree/master/packages/gatsby-source-wordpress#readme", "keywords": [ diff --git a/packages/gatsby-source-wordpress/src/models/gatsby-api.ts b/packages/gatsby-source-wordpress/src/models/gatsby-api.ts index d383d58f687ac..c0b3a18ff1fb9 100644 --- a/packages/gatsby-source-wordpress/src/models/gatsby-api.ts +++ b/packages/gatsby-source-wordpress/src/models/gatsby-api.ts @@ -307,36 +307,6 @@ const defaultPluginOptions: IPluginOptions = { */ beforeChangeNode: menuBeforeChangeNode, }, - // the next two types can't be sourced in Gatsby properly yet - // @todo instead of excluding these manually, auto exclude them - // based on how they behave (no single node query available) - EnqueuedScript: { - exclude: true, - }, - EnqueuedStylesheet: { - exclude: true, - }, - EnqueuedAsset: { - exclude: true, - }, - ContentNodeToEnqueuedScriptConnection: { - exclude: true, - }, - ContentNodeToEnqueuedStylesheetConnection: { - exclude: true, - }, - TermNodeToEnqueuedScriptConnection: { - exclude: true, - }, - TermNodeToEnqueuedStylesheetConnection: { - exclude: true, - }, - UserToEnqueuedScriptConnection: { - exclude: true, - }, - UserToEnqueuedStylesheetConnection: { - exclude: true, - }, }, } diff --git a/packages/gatsby-source-wordpress/src/steps/create-schema-customization/helpers.js b/packages/gatsby-source-wordpress/src/steps/create-schema-customization/helpers.js index 440e2b319f57b..e55cb9e1c1b41 100644 --- a/packages/gatsby-source-wordpress/src/steps/create-schema-customization/helpers.js +++ b/packages/gatsby-source-wordpress/src/steps/create-schema-customization/helpers.js @@ -2,6 +2,9 @@ import store from "~/store" import { typeDefinitionFilters } from "./type-filters" import { getPluginOptions } from "~/utils/get-gatsby-api" import { cloneDeep, merge } from "lodash" +import { diffString } from "json-diff" +import { formatLogMessage } from "../../utils/format-log-message" +import { CODES } from "../../utils/report" export const buildInterfacesListForType = type => { let shouldAddNodeType = false @@ -298,3 +301,151 @@ export const introspectionFieldTypeToSDL = fieldType => { return openingTagsList.join(``) + closingTagsList.reverse().join(``) } + +/** + * This is an expensive fn but it doesn't matter because it's only to show a debugging warning message when something is wrong. + */ +function mergeDuplicateTypesAndReturnDedupedList(typeDefs) { + const clonedDefs = cloneDeep(typeDefs) + + const newList = [] + + for (const def of clonedDefs) { + if (!def) { + continue + } + + const duplicateDefs = clonedDefs.filter( + d => d.config.name === def.config.name + ) + + const newDef = {} + + for (const dDef of duplicateDefs) { + merge(newDef, dDef) + } + + newList.push(newDef) + } + + return newList +} + +/** + * Diffs the built types between this build and the last one with the same remote schema hash. + * This is to catch and add helpful error messages for when an inconsistent schema between builds is inadvertently created due to some bug + */ +export async function diffBuiltTypeDefs(typeDefs) { + if ( + process.env.NODE_ENV !== `development` && + process.env.WP_DIFF_SCHEMA_CUSTOMIZATION !== `true` + ) { + return + } + + const state = store.getState() + + const { + gatsbyApi: { + helpers: { cache, reporter }, + }, + remoteSchema, + } = state + + const previousTypeDefinitions = await cache.get(`previousTypeDefinitions`) + const typeDefString = JSON.stringify(typeDefs) + const typeNames = typeDefs.map(typeDef => typeDef.config.name) + + const remoteSchemaChanged = + !previousTypeDefinitions || + previousTypeDefinitions?.schemaHash !== remoteSchema.schemaHash + + if (remoteSchemaChanged) { + await cache.set(`previousTypeDefinitions`, { + schemaHash: remoteSchema.schemaHash, + typeDefString, + typeNames, + }) + return + } + + // type defs are the same as last time, so don't check for missing/inconsistent types + if (previousTypeDefinitions?.typeDefString === typeDefString) { + return + } + + const missingTypeNames = previousTypeDefinitions.typeNames.filter( + name => !typeNames.includes(name) + ) + + const previousTypeDefJson = mergeDuplicateTypesAndReturnDedupedList( + JSON.parse(previousTypeDefinitions.typeDefString) + ) + + const newParsedTypeDefs = mergeDuplicateTypesAndReturnDedupedList( + JSON.parse(typeDefString) + ) + + const changedTypeDefs = newParsedTypeDefs + .map(typeDef => { + const previousTypeDef = previousTypeDefJson.find( + previousTypeDef => previousTypeDef.config.name === typeDef.config.name + ) + + const isDifferent = diffString(previousTypeDef, typeDef) + + if (isDifferent) { + return `Typename ${typeDef.config.name} diff:\n${diffString( + previousTypeDef, + typeDef, + { + // diff again to also show unchanged lines + full: true, + } + )}` + } + + return null + }) + .filter(Boolean) + + let errorMessage = formatLogMessage( + `The remote WPGraphQL schema hasn't changed but local generated type definitions have. This is a bug, please open an issue on Github${ + missingTypeNames.length || changedTypeDefs.length + ? ` and include the following text.` + : `` + }.${ + missingTypeNames.length + ? `\n\nMissing type names: ${missingTypeNames.join(`\n`)}\n` + : `` + }${ + changedTypeDefs.length + ? `\n\nChanged type defs:\n\n${changedTypeDefs.join(`\n`)}` + : `` + }` + ) + + const maxErrorLength = 5000 + + if (errorMessage.length > maxErrorLength) { + errorMessage = + errorMessage.substring(0, maxErrorLength) + + `\n\n...\n[Diff exceeded ${maxErrorLength} characters and was truncated]` + } + + if (process.env.WP_INCONSISTENT_SCHEMA_WARN !== `true`) { + reporter.info( + formatLogMessage( + `Panicking due to inconsistent schema customization. Turn this into a warning by setting process.env.WP_INCONSISTENT_SCHEMA_WARN to a string of "true"` + ) + ) + reporter.panic({ + id: CODES.InconsistentSchemaCustomization, + context: { + sourceMessage: errorMessage, + }, + }) + } else { + reporter.warn(errorMessage) + } +} diff --git a/packages/gatsby-source-wordpress/src/steps/create-schema-customization/index.js b/packages/gatsby-source-wordpress/src/steps/create-schema-customization/index.js index 57afc366b99d9..27c5b906dee6c 100644 --- a/packages/gatsby-source-wordpress/src/steps/create-schema-customization/index.js +++ b/packages/gatsby-source-wordpress/src/steps/create-schema-customization/index.js @@ -1,6 +1,6 @@ import store from "~/store" -import { buildInterfacesListForType, fieldOfTypeWasFetched } from "./helpers" +import { diffBuiltTypeDefs, fieldOfTypeWasFetched } from "./helpers" import buildType from "./build-types" import { getGatsbyNodeTypeNames } from "../source-nodes/fetch-nodes/fetch-nodes" @@ -105,6 +105,7 @@ const customizeSchema = async ({ actions, schema, store: gatsbyStore }) => { ) ) + diffBuiltTypeDefs(typeDefs) actions.createTypes(typeDefs) } diff --git a/packages/gatsby-source-wordpress/src/steps/ingest-remote-schema/build-queries-from-introspection/recursively-transform-fields.js b/packages/gatsby-source-wordpress/src/steps/ingest-remote-schema/build-queries-from-introspection/recursively-transform-fields.js index 18847d1de5834..f7f28451518f4 100644 --- a/packages/gatsby-source-wordpress/src/steps/ingest-remote-schema/build-queries-from-introspection/recursively-transform-fields.js +++ b/packages/gatsby-source-wordpress/src/steps/ingest-remote-schema/build-queries-from-introspection/recursively-transform-fields.js @@ -9,6 +9,7 @@ import { fieldIsExcludedOnAll, } from "~/steps/ingest-remote-schema/is-excluded" import { returnAliasedFieldName } from "~/steps/create-schema-customization/transform-fields" +import { typeIsExcluded } from "../is-excluded" export const transformInlineFragments = ({ possibleTypes, @@ -63,6 +64,15 @@ export const transformInlineFragments = ({ return false } + if ( + typeIsExcluded({ + pluginOptions, + typeName: findNamedTypeName(type), + }) + ) { + return false + } + possibleType.type = { ...type } // save this type so we can use it in schema customization @@ -531,6 +541,10 @@ const transformFields = ({ !fieldIsExcludedOnAll({ pluginOptions, field, + }) && + !typeIsExcluded({ + pluginOptions, + typeName: findNamedTypeName(field.type), }) ) .map(field => { diff --git a/packages/gatsby-source-wordpress/src/steps/ingest-remote-schema/identify-and-store-ingestable-types.js b/packages/gatsby-source-wordpress/src/steps/ingest-remote-schema/identify-and-store-ingestable-types.js index 6f15eed33ad81..86974e2369e8e 100644 --- a/packages/gatsby-source-wordpress/src/steps/ingest-remote-schema/identify-and-store-ingestable-types.js +++ b/packages/gatsby-source-wordpress/src/steps/ingest-remote-schema/identify-and-store-ingestable-types.js @@ -63,7 +63,12 @@ const identifyAndStoreIngestableFieldsAndTypes = async () => { continue } - if (typeIsExcluded({ pluginOptions, typeName: field.type.name })) { + if ( + typeIsExcluded({ + pluginOptions, + typeName: findNamedType(field.type).name, + }) + ) { continue } @@ -76,6 +81,15 @@ const identifyAndStoreIngestableFieldsAndTypes = async () => { const nodeListField = type.fields.find(nodeListFilter) if (nodeListField) { + if ( + typeIsExcluded({ + typeName: findNamedTypeName(nodeListField.type), + pluginOptions, + }) + ) { + continue + } + nodeInterfaceTypes.push(findNamedTypeName(nodeListField.type)) store.dispatch.remoteSchema.addFetchedType(nodeListField.type) @@ -85,7 +99,14 @@ const identifyAndStoreIngestableFieldsAndTypes = async () => { ) for (const innerField of nodeListFieldType.fields) { - store.dispatch.remoteSchema.addFetchedType(innerField.type) + if ( + !typeIsExcluded({ + typeName: findNamedTypeName(innerField.type), + pluginOptions, + }) + ) { + store.dispatch.remoteSchema.addFetchedType(innerField.type) + } } if ( @@ -104,8 +125,15 @@ const identifyAndStoreIngestableFieldsAndTypes = async () => { // we need to mark all the possible types as being fetched // and also need to record the possible type as a node type for (const type of nodeInterfaceType?.possibleTypes || []) { - nodeInterfacePossibleTypeNames.push(type.name) - store.dispatch.remoteSchema.addFetchedType(type) + if ( + !typeIsExcluded({ + typeName: findNamedTypeName(type), + pluginOptions, + }) + ) { + nodeInterfacePossibleTypeNames.push(type.name) + store.dispatch.remoteSchema.addFetchedType(type) + } } nodeListRootFields.push(field) @@ -114,7 +142,13 @@ const identifyAndStoreIngestableFieldsAndTypes = async () => { continue } } else if (nodeField) { - if (fieldBlacklist.includes(field.name)) { + if ( + fieldBlacklist.includes(field.name) || + typeIsExcluded({ + typeName: findNamedType(field.type).name, + pluginOptions, + }) + ) { continue } @@ -185,7 +219,13 @@ const identifyAndStoreIngestableFieldsAndTypes = async () => { if (interfaceType.fields) { for (const interfaceField of interfaceType.fields) { - if (interfaceField.type) { + if ( + interfaceField.type && + !typeIsExcluded({ + typeName: findNamedType(interfaceField.type).name, + pluginOptions, + }) + ) { store.dispatch.remoteSchema.addFetchedType(interfaceField.type) } } diff --git a/packages/gatsby-source-wordpress/src/steps/ingest-remote-schema/is-excluded.js b/packages/gatsby-source-wordpress/src/steps/ingest-remote-schema/is-excluded.js index 4837d6eb31916..599d3be1ce134 100644 --- a/packages/gatsby-source-wordpress/src/steps/ingest-remote-schema/is-excluded.js +++ b/packages/gatsby-source-wordpress/src/steps/ingest-remote-schema/is-excluded.js @@ -4,10 +4,37 @@ import { getTypeSettingsByType, } from "~/steps/create-schema-customization/helpers" +// these types do not work in Gatsby because there's no way to reliably invalidate caches or do partial data updates for them +const blockListedTypenameParts = [ + `PluginConnection`, + `ThemeConnection`, + `ActionMonitorAction`, + `EnqueuedScript`, + `EnqueuedStylesheet`, + `EnqueuedAsset`, +] + +const seenTypesWhileBlockingByParts = {} + +function typenamePartIsBlocked(name) { + if (seenTypesWhileBlockingByParts[name]) { + return seenTypesWhileBlockingByParts[name] + } + + const typenameContainsBlocklistedPart = !!blockListedTypenameParts.find(b => + name?.includes(b) + ) + + seenTypesWhileBlockingByParts[name] = typenameContainsBlocklistedPart + + return typenameContainsBlocklistedPart +} + const typeIsExcluded = ({ pluginOptions, typeName }) => - pluginOptions && - pluginOptions.type[typeName] && - pluginOptions.type[typeName].exclude + typenamePartIsBlocked(typeName) || + (pluginOptions && + pluginOptions.type[typeName] && + pluginOptions.type[typeName].exclude) const fieldIsExcludedOnAll = ({ pluginOptions, field }) => { const allFieldSettings = pluginOptions?.type?.__all diff --git a/packages/gatsby-source-wordpress/src/steps/ingest-remote-schema/write-queries-to-disk.js b/packages/gatsby-source-wordpress/src/steps/ingest-remote-schema/write-queries-to-disk.js index 2cf0c3aeee749..5bcd87be2c54f 100644 --- a/packages/gatsby-source-wordpress/src/steps/ingest-remote-schema/write-queries-to-disk.js +++ b/packages/gatsby-source-wordpress/src/steps/ingest-remote-schema/write-queries-to-disk.js @@ -24,15 +24,10 @@ export const writeQueriesToDisk = async ({ reporter }, pluginOptions) => { const wordPressGraphQLDirectory = `${process.cwd()}/WordPress/GraphQL` // remove before writing in case there are old types - try { - fs.rmSync(wordPressGraphQLDirectory, { - recursive: true, - }) - } catch (e) { - if (!e.message.includes(`no such file or directory, stat`)) { - throw e - } - } + fs.rmSync(wordPressGraphQLDirectory, { + recursive: true, + force: true, + }) for (const { nodeListQueries, diff --git a/packages/gatsby-source-wordpress/src/utils/report.ts b/packages/gatsby-source-wordpress/src/utils/report.ts index 4eb13ef867aee..9fef87ad47322 100644 --- a/packages/gatsby-source-wordpress/src/utils/report.ts +++ b/packages/gatsby-source-wordpress/src/utils/report.ts @@ -13,6 +13,7 @@ export const CODES = { /* GraphQL Errors */ RemoteGraphQLError: `112001`, MissingAppendedPath: `112002`, + InconsistentSchemaCustomization: `112004`, /* CodeErrors */ SourcePluginCodeError: `112003`, @@ -63,6 +64,12 @@ export const ERROR_MAP: IErrorMap = { level: `ERROR`, category: `THIRD_PARTY`, }, + [CODES.InconsistentSchemaCustomization]: { + text: getErrorText, + level: `ERROR`, + category: `SYSTEM`, + type: `PLUGIN`, + }, [CODES.SourcePluginCodeError]: { text: getErrorText, level: `ERROR`, diff --git a/yarn.lock b/yarn.lock index 3047a5d8b5654..f7e72ab75b215 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1863,6 +1863,13 @@ unique-filename "^1.1.1" which "^1.3.1" +"@ewoudenberg/difflib@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@ewoudenberg/difflib/-/difflib-0.1.0.tgz#a2ae5d3321ffa7c1b47691cf0db189d1264aaaa4" + integrity sha512-OU5P5mJyD3OoWYMWY+yIgwvgNS9cFAU10f+DDuvtogcWQOoJIsQ4Hy2McSfUfhKjq8L0FuWVb4Rt7kgA+XK86A== + dependencies: + heap ">= 0.2.0" + "@gatsbyjs/reach-router@^1.3.9": version "1.3.9" resolved "https://registry.yarnpkg.com/@gatsbyjs/reach-router/-/reach-router-1.3.9.tgz#305c3c4c5041f27e53fc33e344a08ee2c4b985af" @@ -2109,23 +2116,11 @@ resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.0.0.tgz#9f05469c88cb2fd3dcd624776b54ee95c312126a" integrity sha512-mV6T0IYqb0xL1UALPFplXYQmR0twnXG0M6jUswpquqT2sD12BOiCiLy3EvMp/Fy7s3DZElC4/aPjEjo2jeZpvw== -"@hapi/address@^4.0.1": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@hapi/address/-/address-4.1.0.tgz#d60c5c0d930e77456fdcde2598e77302e2955e1d" - integrity sha512-SkszZf13HVgGmChdHo/PxchnSaCJ6cetVqLzyciudzZRT0jcOouIF/Q93mgjw8cce+D+4F4C1Z/WrfFN+O3VHQ== - dependencies: - "@hapi/hoek" "^9.0.0" - "@hapi/bourne@1.x.x": version "1.3.2" resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a" integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA== -"@hapi/formula@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@hapi/formula/-/formula-2.0.0.tgz#edade0619ed58c8e4f164f233cda70211e787128" - integrity sha512-V87P8fv7PI0LH7LiVi8Lkf3x+KCO7pQozXRssAHNXXL9L1K+uyu4XypLXwxqVDKgyQai6qj3/KteNlrqDx4W5A== - "@hapi/hoek@6.x.x": version "6.2.4" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-6.2.4.tgz#4b95fbaccbfba90185690890bdf1a2fbbda10595" @@ -2151,22 +2146,6 @@ "@hapi/hoek" "8.x.x" "@hapi/topo" "3.x.x" -"@hapi/joi@^17.1.1": - version "17.1.1" - resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-17.1.1.tgz#9cc8d7e2c2213d1e46708c6260184b447c661350" - integrity sha512-p4DKeZAoeZW4g3u7ZeRo+vCDuSDgSvtsB/NpfjXEHTUjSeINAi/RrVOWiVQ1isaoLzMvFEhe8n5065mQq1AdQg== - dependencies: - "@hapi/address" "^4.0.1" - "@hapi/formula" "^2.0.0" - "@hapi/hoek" "^9.0.0" - "@hapi/pinpoint" "^2.0.0" - "@hapi/topo" "^5.0.0" - -"@hapi/pinpoint@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@hapi/pinpoint/-/pinpoint-2.0.0.tgz#805b40d4dbec04fc116a73089494e00f073de8df" - integrity sha512-vzXR5MY7n4XeIvLpfl3HtE3coZYO4raKXW766R6DZw/6aLqR26iuZ109K7a0NtF2Db0jxqh7xz2AxkUwpUFybw== - "@hapi/topo@3.x.x": version "3.1.0" resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.0.tgz#5c47cd9637c2953db185aa957a27bcb2a8b7a6f8" @@ -7539,6 +7518,11 @@ colors@^1.1.2: version "1.3.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.2.tgz#2df8ff573dfbf255af562f8ce7181d6b971a359b" +colors@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + colors@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" @@ -9552,6 +9536,13 @@ dotgitignore@^2.1.0: find-up "^3.0.0" minimatch "^3.0.4" +dreamopt@~0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/dreamopt/-/dreamopt-0.8.0.tgz#5bcc80be7097e45fc489c342405ab68140a8c1d9" + integrity sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg== + dependencies: + wordwrap ">=0.0.2" + dset@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/dset/-/dset-3.1.0.tgz#23feb6df93816ea452566308b1374d6e869b0d7b" @@ -11860,6 +11851,23 @@ got@^11.8.0, got@^11.8.5: p-cancelable "^2.0.0" responselike "^2.0.0" +got@^11.8.6: + version "11.8.6" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" + integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.2" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" + got@^6.7.1: version "6.7.1" resolved "http://registry.npmjs.org/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" @@ -12450,6 +12458,11 @@ headers-polyfill@^3.0.4: resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-3.0.4.tgz#cd70c815a441dd882372fcd6eda212ce997c9b18" integrity sha512-I1DOM1EdWYntdrnCvqQtcKwSSuiTzoqOExy4v1mdcFixFZABlWP4IPHdmoLtPda0abMHqDOY4H9svhQ10DFR4w== +"heap@>= 0.2.0": + version "0.2.7" + resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" + integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== + hex-color-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" @@ -14628,6 +14641,15 @@ json-buffer@3.0.1: resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== +json-diff@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/json-diff/-/json-diff-1.0.3.tgz#67c7ac4e084ca518974fdbb6fe08ce271f4fe2f4" + integrity sha512-W0yk/xzjz7bag9v9eS4qthvPG4O07uxNeXwirhvcOqmX4w8HLtB/Pw76o5Z7Pblwvf4vpCi4+iHOlHDnmav/rA== + dependencies: + "@ewoudenberg/difflib" "0.1.0" + colors "^1.4.0" + dreamopt "~0.8.0" + json-loader@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" @@ -21546,7 +21568,7 @@ request-promise-core@1.1.4: dependencies: lodash "^4.17.19" -request-promise-native@^1.0.7, request-promise-native@^1.0.8: +request-promise-native@^1.0.7: version "1.0.9" resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== @@ -21580,7 +21602,7 @@ request@2.88.0: tunnel-agent "^0.6.0" uuid "^3.3.2" -request@2.88.2, request@^2.83.0, request@^2.88.0, request@^2.88.2: +request@2.88.2, request@^2.83.0, request@^2.88.0: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -22097,7 +22119,7 @@ rx-lite@*, rx-lite@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" -rxjs@^6.4.0, rxjs@^6.5.5, rxjs@^6.6.0, rxjs@^6.6.3: +rxjs@^6.4.0, rxjs@^6.6.0, rxjs@^6.6.3: version "6.6.7" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== @@ -25488,18 +25510,6 @@ w3c-xmlserializer@^2.0.0: dependencies: xml-name-validator "^3.0.0" -wait-on@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-4.0.2.tgz#6ee9b5751b4e0329630abbb5fdba787802b32914" - integrity sha512-Qpmgm3Hw/sXm7xK68FBsYy5r+Uid94/QymwnEjn9GTpfiWTUVYm0bccivVwY/BXGYO2r+5Cd8S/DzrRZqHK/9w== - dependencies: - "@hapi/joi" "^17.1.1" - lodash "^4.17.15" - minimist "^1.2.5" - request "^2.88.2" - request-promise-native "^1.0.8" - rxjs "^6.5.5" - walker@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" @@ -25822,7 +25832,7 @@ word@~0.3.0: resolved "https://registry.yarnpkg.com/word/-/word-0.3.0.tgz#8542157e4f8e849f4a363a288992d47612db9961" integrity sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA== -wordwrap@^1.0.0: +wordwrap@>=0.0.2, wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"