diff --git a/cypress.json b/cypress.json index 17ef242..31161dc 100644 --- a/cypress.json +++ b/cypress.json @@ -1,3 +1,4 @@ { - "baseUrl": "http://localhost:3000" + "baseUrl": "http://localhost:3000", + "ignoreTestFiles": ["**/__snapshots__/*", "**/__image_snapshots__/*"] } diff --git a/cypress/integration/WardrobePage/Basic outfit state.spec.js b/cypress/integration/WardrobePage/Basic outfit state.spec.js new file mode 100644 index 0000000..4d0a124 --- /dev/null +++ b/cypress/integration/WardrobePage/Basic outfit state.spec.js @@ -0,0 +1,109 @@ +// Give network requests a bit of breathing room! +const networkTimeout = { timeout: 12000 }; + +describe("WardrobePage: Basic outfit state", () => { + it("Initialize simple outfit from URL", () => { + cy.visit("/outfits/new?species=1&color=8&objects[]=76789"); + + getSpeciesSelect(networkTimeout) + .find(":selected") + .should("have.text", "Acara"); + getColorSelect().find(":selected").should("have.text", "Blue"); + cy.location().toMatchSnapshot(); + + cy.contains("A Warm Winters Night Background", networkTimeout).should( + "exist" + ); + + getOutfitPreview().toMatchImageSnapshot(); + }); + + it("Changes species and color", () => { + cy.visit("/outfits/new?species=1&color=8&objects[]=76789"); + + getSpeciesSelect(networkTimeout) + .find(":selected") + .should("have.text", "Acara"); + getColorSelect().find(":selected").should("have.text", "Blue"); + cy.location().toMatchSnapshot(); + getOutfitPreview().toMatchImageSnapshot(); + + getSpeciesSelect().select("Aisha"); + + getSpeciesSelect().find(":selected").should("have.text", "Aisha"); + getColorSelect().find(":selected").should("have.text", "Blue"); + cy.location().toMatchSnapshot(); + getOutfitPreview().toMatchImageSnapshot(); + + getColorSelect().select("Red"); + + getSpeciesSelect().find(":selected").should("have.text", "Aisha"); + getColorSelect().find(":selected").should("have.text", "Red"); + cy.location().toMatchSnapshot(); + getOutfitPreview().toMatchImageSnapshot(); + }); + + it.only("Changes pose", () => { + cy.visit("/outfits/new?species=1&color=8&pose=HAPPY_FEM"); + + getPosePickerButton(networkTimeout).click(); + getPosePickerOption("Happy and Feminine").should("be.checked"); + cy.location().toMatchSnapshot(); + getOutfitPreview().toMatchImageSnapshot(); + + getPosePickerOption("Sad and Masculine").check({ force: true }); + getPosePickerOption("Sad and Masculine").should("be.checked"); + cy.location().toMatchSnapshot(); + getOutfitPreview().toMatchImageSnapshot(); + }); + + it("Toggles item", () => { + cy.visit("/outfits/new?species=1&color=8&objects[]=76789"); + + getOutfitPreview().toMatchImageSnapshot(); + cy.location().toMatchSnapshot(); + + cy.contains("A Warm Winters Night Background").click(); + + getOutfitPreview().toMatchImageSnapshot(); + cy.location().toMatchSnapshot(); + }); + + it("Renames outfit", () => { + cy.visit("/outfits/new?name=My+outfit&species=1&color=8"); + + getOutfitName(networkTimeout).should("have.text", "My outfit"); + + getOutfitName().click().type("Awesome outfit{enter}"); + + getOutfitName().should("have.text", "Awesome outfit"); + cy.location().toMatchSnapshot(); + }); +}); + +function getSpeciesSelect(options) { + return cy.get("[data-test-id=wardrobe-species-picker]", options); +} + +function getColorSelect(options) { + return cy.get("[data-test-id=wardrobe-color-picker]", options); +} + +function getPosePickerButton(options) { + return cy.get("[data-test-id=wardrobe-pose-picker]", options); +} + +function getPosePickerOption(label, options) { + return cy.get(`input[aria-label="${CSS.escape(label)}"]`, options); +} + +function getOutfitPreview() { + return cy.get("[data-test-id=wardrobe-outfit-preview]:not([data-loading])", { + // A bit of an extra-long timeout, to await both server data and image data + timeout: 15000, + }); +} + +function getOutfitName(options) { + return cy.get("[data-test-id=outfit-name]", options); +} diff --git a/cypress/integration/WardrobePage/SearchPanel.spec.js b/cypress/integration/WardrobePage/SearchPanel.spec.js index 47abe22..883dc8c 100644 --- a/cypress/integration/WardrobePage/SearchPanel.spec.js +++ b/cypress/integration/WardrobePage/SearchPanel.spec.js @@ -1,10 +1,10 @@ // Give network requests a bit of breathing room! -const networkTimeout = { timeout: 6000 }; +const networkTimeout = { timeout: 10000 }; describe("WardrobePage: SearchPanel", () => { // NOTE: This test depends on specific search results on certain pages, and // could break if a lot of matching items are added to the site! - it.only("Searches by keyword", () => { + it("Searches by keyword", () => { cy.visit("/outfits/new"); // The first page should contain this item. diff --git a/cypress/integration/WardrobePage/__image_snapshots__/WardrobePage Basic outfit state Changes pose #0.png b/cypress/integration/WardrobePage/__image_snapshots__/WardrobePage Basic outfit state Changes pose #0.png new file mode 100644 index 0000000..3a2e8a8 Binary files /dev/null and b/cypress/integration/WardrobePage/__image_snapshots__/WardrobePage Basic outfit state Changes pose #0.png differ diff --git a/cypress/integration/WardrobePage/__image_snapshots__/WardrobePage Basic outfit state Changes pose #1.png b/cypress/integration/WardrobePage/__image_snapshots__/WardrobePage Basic outfit state Changes pose #1.png new file mode 100644 index 0000000..c5be4d9 Binary files /dev/null and b/cypress/integration/WardrobePage/__image_snapshots__/WardrobePage Basic outfit state Changes pose #1.png differ diff --git a/cypress/integration/WardrobePage/__image_snapshots__/WardrobePage Basic outfit state Changes species and color #0.png b/cypress/integration/WardrobePage/__image_snapshots__/WardrobePage Basic outfit state Changes species and color #0.png new file mode 100644 index 0000000..0c3afe2 Binary files /dev/null and b/cypress/integration/WardrobePage/__image_snapshots__/WardrobePage Basic outfit state Changes species and color #0.png differ diff --git a/cypress/integration/WardrobePage/__image_snapshots__/WardrobePage Basic outfit state Changes species and color #1.png b/cypress/integration/WardrobePage/__image_snapshots__/WardrobePage Basic outfit state Changes species and color #1.png new file mode 100644 index 0000000..d7474cf Binary files /dev/null and b/cypress/integration/WardrobePage/__image_snapshots__/WardrobePage Basic outfit state Changes species and color #1.png differ diff --git a/cypress/integration/WardrobePage/__image_snapshots__/WardrobePage Basic outfit state Changes species and color #2.png b/cypress/integration/WardrobePage/__image_snapshots__/WardrobePage Basic outfit state Changes species and color #2.png new file mode 100644 index 0000000..39065a4 Binary files /dev/null and b/cypress/integration/WardrobePage/__image_snapshots__/WardrobePage Basic outfit state Changes species and color #2.png differ diff --git a/cypress/integration/WardrobePage/__image_snapshots__/WardrobePage Basic outfit state Initialize simple outfit from URL #0.png b/cypress/integration/WardrobePage/__image_snapshots__/WardrobePage Basic outfit state Initialize simple outfit from URL #0.png new file mode 100644 index 0000000..0c3afe2 Binary files /dev/null and b/cypress/integration/WardrobePage/__image_snapshots__/WardrobePage Basic outfit state Initialize simple outfit from URL #0.png differ diff --git a/cypress/integration/WardrobePage/__image_snapshots__/WardrobePage Basic outfit state Toggles item #0.png b/cypress/integration/WardrobePage/__image_snapshots__/WardrobePage Basic outfit state Toggles item #0.png new file mode 100644 index 0000000..0c3afe2 Binary files /dev/null and b/cypress/integration/WardrobePage/__image_snapshots__/WardrobePage Basic outfit state Toggles item #0.png differ diff --git a/cypress/integration/WardrobePage/__image_snapshots__/WardrobePage Basic outfit state Toggles item #1.png b/cypress/integration/WardrobePage/__image_snapshots__/WardrobePage Basic outfit state Toggles item #1.png new file mode 100644 index 0000000..8dfaf1b Binary files /dev/null and b/cypress/integration/WardrobePage/__image_snapshots__/WardrobePage Basic outfit state Toggles item #1.png differ diff --git a/cypress/integration/WardrobePage/__snapshots__/Basic outfit state.spec.js.snap b/cypress/integration/WardrobePage/__snapshots__/Basic outfit state.spec.js.snap new file mode 100644 index 0000000..22c4aeb --- /dev/null +++ b/cypress/integration/WardrobePage/__snapshots__/Basic outfit state.spec.js.snap @@ -0,0 +1,127 @@ +exports[`WardrobePage: Basic outfit state > Initialize simple outfit from URL #0`] = +{ + "auth": "", + "hash": "", + "host": "localhost:3000", + "hostname": "localhost", + "href": "http://localhost:3000/outfits/new?name=&species=1&color=8&pose=HAPPY_FEM&objects%5B%5D=76789", + "origin": "http://localhost:3000", + "originPolicy": "http://localhost:3000", + "pathname": "/outfits/new", + "port": "3000", + "protocol": "http:", + "search": "?name=&species=1&color=8&pose=HAPPY_FEM&objects%5B%5D=76789", + "superDomain": "localhost" +}; + +exports[`WardrobePage: Basic outfit state > Changes species and color #0`] = +{ + "auth": "", + "hash": "", + "host": "localhost:3000", + "hostname": "localhost", + "href": "http://localhost:3000/outfits/new?name=&species=1&color=8&pose=HAPPY_FEM&objects%5B%5D=76789", + "origin": "http://localhost:3000", + "originPolicy": "http://localhost:3000", + "pathname": "/outfits/new", + "port": "3000", + "protocol": "http:", + "search": "?name=&species=1&color=8&pose=HAPPY_FEM&objects%5B%5D=76789", + "superDomain": "localhost" +}; + +exports[`WardrobePage: Basic outfit state > Changes species and color #1`] = +{ + "auth": "", + "hash": "", + "host": "localhost:3000", + "hostname": "localhost", + "href": "http://localhost:3000/outfits/new?name=&species=2&color=8&pose=HAPPY_FEM&objects%5B%5D=76789", + "origin": "http://localhost:3000", + "originPolicy": "http://localhost:3000", + "pathname": "/outfits/new", + "port": "3000", + "protocol": "http:", + "search": "?name=&species=2&color=8&pose=HAPPY_FEM&objects%5B%5D=76789", + "superDomain": "localhost" +}; + +exports[`WardrobePage: Basic outfit state > Changes species and color #2`] = +{ + "auth": "", + "hash": "", + "host": "localhost:3000", + "hostname": "localhost", + "href": "http://localhost:3000/outfits/new?name=&species=2&color=61&pose=HAPPY_FEM&objects%5B%5D=76789", + "origin": "http://localhost:3000", + "originPolicy": "http://localhost:3000", + "pathname": "/outfits/new", + "port": "3000", + "protocol": "http:", + "search": "?name=&species=2&color=61&pose=HAPPY_FEM&objects%5B%5D=76789", + "superDomain": "localhost" +}; + +exports[`WardrobePage: Basic outfit state > Toggles item #0`] = +{ + "auth": "", + "hash": "", + "host": "localhost:3000", + "hostname": "localhost", + "href": "http://localhost:3000/outfits/new?name=&species=1&color=8&pose=HAPPY_FEM&objects%5B%5D=76789", + "origin": "http://localhost:3000", + "originPolicy": "http://localhost:3000", + "pathname": "/outfits/new", + "port": "3000", + "protocol": "http:", + "search": "?name=&species=1&color=8&pose=HAPPY_FEM&objects%5B%5D=76789", + "superDomain": "localhost" +}; + +exports[`WardrobePage: Basic outfit state > Toggles item #1`] = +{ + "auth": "", + "hash": "", + "host": "localhost:3000", + "hostname": "localhost", + "href": "http://localhost:3000/outfits/new?name=&species=1&color=8&pose=HAPPY_FEM&closet%5B%5D=76789", + "origin": "http://localhost:3000", + "originPolicy": "http://localhost:3000", + "pathname": "/outfits/new", + "port": "3000", + "protocol": "http:", + "search": "?name=&species=1&color=8&pose=HAPPY_FEM&closet%5B%5D=76789", + "superDomain": "localhost" +}; + +exports[`WardrobePage: Basic outfit state > Changes pose #0`] = +{ + "auth": "", + "hash": "", + "host": "localhost:3000", + "hostname": "localhost", + "href": "http://localhost:3000/outfits/new?name=&species=1&color=8&pose=HAPPY_FEM", + "origin": "http://localhost:3000", + "originPolicy": "http://localhost:3000", + "pathname": "/outfits/new", + "port": "3000", + "protocol": "http:", + "search": "?name=&species=1&color=8&pose=HAPPY_FEM", + "superDomain": "localhost" +}; + +exports[`WardrobePage: Basic outfit state > Changes pose #1`] = +{ + "auth": "", + "hash": "", + "host": "localhost:3000", + "hostname": "localhost", + "href": "http://localhost:3000/outfits/new?name=&species=1&color=8&pose=SAD_MASC", + "origin": "http://localhost:3000", + "originPolicy": "http://localhost:3000", + "pathname": "/outfits/new", + "port": "3000", + "protocol": "http:", + "search": "?name=&species=1&color=8&pose=SAD_MASC", + "superDomain": "localhost" +}; diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js index aa9918d..bb34830 100644 --- a/cypress/plugins/index.js +++ b/cypress/plugins/index.js @@ -1,21 +1,6 @@ -/// -// *********************************************************** -// This example plugins/index.js can be used to load plugins -// -// You can change the location of this file or turn off loading -// the plugins file with the 'pluginsFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/plugins-guide -// *********************************************************** +const { initPlugin } = require("cypress-plugin-snapshots/plugin"); -// This function is called when a project is opened or re-opened (e.g. due to -// the project's config changing) - -/** - * @type {Cypress.PluginConfig} - */ module.exports = (on, config) => { - // `on` is used to hook into various events Cypress emits - // `config` is the resolved Cypress config -} + initPlugin(on, config); + return config; +}; diff --git a/cypress/support/commands.js b/cypress/support/commands.js index ca4d256..e1cb3a1 100644 --- a/cypress/support/commands.js +++ b/cypress/support/commands.js @@ -1,25 +1 @@ -// *********************************************** -// This example commands.js shows you how to -// create various custom commands and overwrite -// existing commands. -// -// For more comprehensive examples of custom -// commands please read more here: -// https://on.cypress.io/custom-commands -// *********************************************** -// -// -// -- This is a parent command -- -// Cypress.Commands.add("login", (email, password) => { ... }) -// -// -// -- This is a child command -- -// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... }) -// -// -// -- This is a dual command -- -// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... }) -// -// -// -- This will overwrite an existing command -- -// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }) +import "cypress-plugin-snapshots/commands"; diff --git a/package.json b/package.json index 3865606..c2a7eb2 100644 --- a/package.json +++ b/package.json @@ -89,6 +89,7 @@ "apollo-server-testing": "^2.12.0", "auth0": "^2.28.0", "cypress": "^6.4.0", + "cypress-plugin-snapshots": "^1.4.4", "dotenv-cli": "^3.1.0", "es6-promise-pool": "^2.5.0", "inquirer": "^7.3.3", diff --git a/src/app/WardrobePage/ItemsPanel.js b/src/app/WardrobePage/ItemsPanel.js index 1ffb1d3..e377957 100644 --- a/src/app/WardrobePage/ItemsPanel.js +++ b/src/app/WardrobePage/ItemsPanel.js @@ -271,7 +271,7 @@ function OutfitHeading({ outfitState, dispatchToOutfit }) { - + diff --git a/src/app/WardrobePage/OutfitControls.js b/src/app/WardrobePage/OutfitControls.js index 58794d6..76ffd3c 100644 --- a/src/app/WardrobePage/OutfitControls.js +++ b/src/app/WardrobePage/OutfitControls.js @@ -197,6 +197,12 @@ function OutfitControls({ idealPose={outfitState.pose} onChange={onSpeciesColorChange} stateMustAlwaysBeValid + speciesPickerProps={{ + "data-test-id": "wardrobe-species-picker", + }} + colorPickerProps={{ + "data-test-id": "wardrobe-color-picker", + }} /> } @@ -210,6 +216,7 @@ function OutfitControls({ dispatchToOutfit={dispatchToOutfit} onLockFocus={onLockFocus} onUnlockFocus={onUnlockFocus} + data-test-id="wardrobe-pose-picker" /> diff --git a/src/app/WardrobePage/PosePicker.js b/src/app/WardrobePage/PosePicker.js index ce0cad3..a46eb99 100644 --- a/src/app/WardrobePage/PosePicker.js +++ b/src/app/WardrobePage/PosePicker.js @@ -63,6 +63,7 @@ function PosePicker({ dispatchToOutfit, onLockFocus, onUnlockFocus, + ...props }) { const theme = useTheme(); const initialFocusRef = React.useRef(); @@ -193,6 +194,7 @@ function PosePicker({ `, isOpen && "is-open" )} + {...props} > diff --git a/src/app/WardrobePage/WardrobePreviewAndControls.js b/src/app/WardrobePage/WardrobePreviewAndControls.js index ddbc220..9f6f7f0 100644 --- a/src/app/WardrobePage/WardrobePreviewAndControls.js +++ b/src/app/WardrobePage/WardrobePreviewAndControls.js @@ -30,6 +30,7 @@ function WardrobePreviewAndControls({ wornItemIds: outfitState.wornItemIds, onChangeHasAnimations: setHasAnimations, backdrop: , + "data-test-id": "wardrobe-outfit-preview", }); return ( diff --git a/src/app/WardrobePage/useOutfitState.js b/src/app/WardrobePage/useOutfitState.js index 961e907..044f25e 100644 --- a/src/app/WardrobePage/useOutfitState.js +++ b/src/app/WardrobePage/useOutfitState.js @@ -12,10 +12,10 @@ export const OutfitStateContext = React.createContext(null); function useOutfitState() { const apolloClient = useApolloClient(); - const initialState = useParseOutfitUrl(); - const [state, dispatchToOutfit] = React.useReducer( + const urlOutfitState = useParseOutfitUrl(); + const [localOutfitState, dispatchToOutfit] = React.useReducer( outfitStateReducer(apolloClient), - initialState + urlOutfitState ); // If there's an outfit ID (i.e. we're on /outfits/:id), load basic data @@ -56,55 +56,61 @@ function useOutfitState() { } `, { - variables: { id: state.id }, - skip: state.id == null, + variables: { id: urlOutfitState.id }, + skip: urlOutfitState.id == null, returnPartialData: true, onCompleted: (outfitData) => { - // This is only called once the _entire_ query loads, regardless of - // `returnPartialData`. We just use that for some early UI! - // - // Even though we do a HACK to make these values visible early, we - // still want to write them to state, so that reducers can see them and - // edit them! - const outfit = outfitData.outfit; dispatchToOutfit({ type: "reset", - name: outfit.name, - speciesId: outfit.petAppearance.species.id, - colorId: outfit.petAppearance.color.id, - pose: outfit.petAppearance.pose, - wornItemIds: outfit.wornItems.map((item) => item.id), - closetedItemIds: outfit.closetedItems.map((item) => item.id), + newState: getOutfitStateFromOutfitData(outfitData.outfit), }); }, } ); - // HACK: We fall back to outfit data here, to help the loading states go - // smoother. (Otherwise, there's a flicker where `outfitLoading` is false, - // but the `reset` action hasn't fired yet.) This also enables partial outfit - // data to show early, like the name, if we're navigating from Your Outfits. - // - // We also call `Array.from` on our item IDs. It's more convenient to manage - // them as a Set in state, but most callers will find it more convenient to - // access them as arrays! e.g. for `.map()`. - const outfit = outfitData?.outfit || null; - const id = state.id; - const creator = outfit?.creator || null; - const name = state.name || outfit?.name || null; - const speciesId = - state.speciesId || outfit?.petAppearance?.species?.id || null; - const colorId = state.colorId || outfit?.petAppearance?.color?.id || null; - const pose = state.pose || outfit?.petAppearance?.pose || null; - const appearanceId = state.appearanceId || null; - const wornItemIds = Array.from( - state.wornItemIds || outfit?.wornItems?.map((i) => i.id) - ); - const closetedItemIds = Array.from( - state.closetedItemIds || outfit?.closetedItems?.map((i) => i.id) - ); + const creator = outfitData?.outfit?.creator; - const allItemIds = [...state.wornItemIds, ...state.closetedItemIds]; + const savedOutfitState = getOutfitStateFromOutfitData(outfitData?.outfit); + + // Choose which customization state to use. We want it to match the outfit in + // the URL immediately, without having to wait for any effects, to avoid race + // conditions! + // + // The reducer is generally the main source of truth for live changes! + // + // But if: + // - it's not initialized yet (e.g. the first frame of navigating to an + // outfit from Your Outfits), or + // - it's for a different outfit than the URL says (e.g. clicking Back + // or Forward to switch between saved outfits), + // + // Then use saved outfit data or the URL query string instead, because that's + // a better representation of the outfit in the URL. (If the saved outfit + // data isn't loaded yet, then this will be a customization state with + // partial data, and that's okay.) + let outfitState; + if (urlOutfitState.id === localOutfitState.id) { + // Use the reducer state: they're both for the same saved outfit, or both + // for an unsaved outfit (null === null). + outfitState = localOutfitState; + } else if (urlOutfitState.id && urlOutfitState.id === savedOutfitState.id) { + // Use the saved outfit state: it's for the saved outfit the URL points to. + outfitState = savedOutfitState; + } else { + // Use the URL state: it's more up-to-date than any of the others. (Worst + // case, it's empty except for ID, which is fine while the saved outfit + // data loads!) + outfitState = urlOutfitState; + } + + // When unpacking the customization state, we call `Array.from` on our item + // IDs. It's more convenient to manage them as a Set in state, but most + // callers will find it more convenient to access them as arrays! e.g. for + // `.map()`. + const { name, speciesId, colorId, pose, appearanceId } = outfitState; + const wornItemIds = Array.from(outfitState.wornItemIds); + const closetedItemIds = Array.from(outfitState.closetedItemIds); + const allItemIds = [...wornItemIds, ...closetedItemIds]; const { loading: itemsLoading, @@ -209,10 +215,10 @@ function useOutfitState() { .filter((i) => i.appearanceOn.layers.length === 0) .sort((a, b) => a.name.localeCompare(b.name)); - const url = buildOutfitUrl(state); + const url = buildOutfitUrl(outfitState); - const outfitState = { - id, + const outfitStateWithExtras = { + id: urlOutfitState.outfitId, creator, zonesAndItems, incompatibleItems, @@ -235,7 +241,7 @@ function useOutfitState() { return { loading: outfitLoading || itemsLoading, error: outfitError || itemsError, - outfitState, + outfitState: outfitStateWithExtras, dispatchToOutfit, }; } @@ -243,15 +249,16 @@ function useOutfitState() { const outfitStateReducer = (apolloClient) => (baseState, action) => { switch (action.type) { case "rename": - return { ...baseState, name: action.outfitName }; + return produce(baseState, (state) => { + state.name = action.outfitName; + }); case "setSpeciesAndColor": - return { - ...baseState, - speciesId: action.speciesId, - colorId: action.colorId, - pose: action.pose, - appearanceId: null, - }; + return produce(baseState, (state) => { + state.speciesId = action.speciesId; + state.colorId = action.colorId; + state.pose = action.pose; + state.appearanceId = null; + }); case "wearItem": return produce(baseState, (state) => { const { wornItemIds, closetedItemIds } = state; @@ -310,41 +317,31 @@ const outfitStateReducer = (apolloClient) => (baseState, action) => { reconsiderItems(itemIdsToReconsider, state, apolloClient); }); case "setPose": - return { - ...baseState, - pose: action.pose, - + return produce(baseState, (state) => { + state.pose = action.pose; // Usually only the `pose` is specified, but `PosePickerSupport` can // also specify a corresponding `appearanceId`, to get even more // particular about which version of the pose to show if more than one. - appearanceId: action.appearanceId || null, - }; - case "reset": - return produce(baseState, (state) => { - const { - name, - speciesId, - colorId, - pose, - wornItemIds, - closetedItemIds, - } = action; - state.name = name; - state.speciesId = speciesId ? String(speciesId) : baseState.speciesId; - state.colorId = colorId ? String(colorId) : baseState.colorId; - state.pose = pose || baseState.pose; - state.wornItemIds = wornItemIds - ? new Set(wornItemIds.map(String)) - : baseState.wornItemIds; - state.closetedItemIds = closetedItemIds - ? new Set(closetedItemIds.map(String)) - : baseState.closetedItemIds; + state.appearanceId = action.appearanceId || null; }); + case "reset": + return action.newState; default: throw new Error(`unexpected action ${JSON.stringify(action)}`); } }; +const EMPTY_CUSTOMIZATION_STATE = { + id: null, + name: null, + speciesId: null, + colorId: null, + pose: null, + appearanceId: null, + wornItemIds: [], + closetedItemIds: [], +}; + function useParseOutfitUrl() { const { id } = useParams(); @@ -352,14 +349,8 @@ function useParseOutfitUrl() { // outfit data to load in! if (id != null) { return { + ...EMPTY_CUSTOMIZATION_STATE, id, - name: null, - speciesId: null, - colorId: null, - pose: null, - appearanceId: null, - wornItemIds: [], - closetedItemIds: [], }; } @@ -367,7 +358,7 @@ function useParseOutfitUrl() { // not specified. const urlParams = new URLSearchParams(window.location.search); return { - id: id, + id: null, name: urlParams.get("name"), speciesId: urlParams.get("species") || "1", colorId: urlParams.get("color") || "8", @@ -378,6 +369,25 @@ function useParseOutfitUrl() { }; } +function getOutfitStateFromOutfitData(outfit) { + if (!outfit) { + return EMPTY_CUSTOMIZATION_STATE; + } + + return { + id: outfit.id, + name: outfit.name, + // Note that these fields are intentionally null if loading, rather than + // falling back to a default appearance like Blue Acara. + speciesId: outfit.petAppearance?.species?.id, + colorId: outfit.petAppearance?.color?.id, + pose: outfit.petAppearance?.pose, + // Whereas the items are more convenient to just leave as empty lists! + wornItemIds: (outfit.wornItems || []).map((item) => item.id), + closetedItemIds: (outfit.closetedItems || []).map((item) => item.id), + }; +} + function findItemConflicts(itemIdToAdd, state, apolloClient) { const { wornItemIds, speciesId, colorId } = state; @@ -554,7 +564,7 @@ function getZonesAndItems(itemsById, wornItemIds, closetedItemIds) { return zonesAndItems; } -function buildOutfitUrl(state) { +function buildOutfitUrl(outfitState) { const { id, name, @@ -564,7 +574,7 @@ function buildOutfitUrl(state) { appearanceId, wornItemIds, closetedItemIds, - } = state; + } = outfitState; const { origin, pathname } = window.location; diff --git a/src/app/components/OutfitPreview.js b/src/app/components/OutfitPreview.js index 42f8e29..36db461 100644 --- a/src/app/components/OutfitPreview.js +++ b/src/app/components/OutfitPreview.js @@ -52,6 +52,7 @@ export function useOutfitPreview({ loadingDelayMs, spinnerVariant, onChangeHasAnimations = null, + ...props }) { const appearance = useOutfitAppearance({ speciesId, @@ -102,6 +103,7 @@ export function useOutfitPreview({ onChangeHasAnimations={onChangeHasAnimations} doTransitions isPaused={isPaused} + {...props} /> ); } @@ -122,6 +124,7 @@ export function OutfitLayers({ spinnerVariant = "overlay", doTransitions = false, isPaused = true, + ...props }) { const containerRef = React.useRef(null); const [canvasSize, setCanvasSize] = React.useState(0); @@ -178,6 +181,8 @@ export function OutfitLayers({ // Create a stacking context, so the z-indexed layers don't escape! zIndex="0" ref={containerRef} + data-loading={loading ? true : undefined} + {...props} > {backdrop && ( diff --git a/src/app/components/SpeciesColorPicker.js b/src/app/components/SpeciesColorPicker.js index ca651b2..9e7a8f3 100644 --- a/src/app/components/SpeciesColorPicker.js +++ b/src/app/components/SpeciesColorPicker.js @@ -27,6 +27,8 @@ function SpeciesColorPicker({ isDisabled = false, speciesIsDisabled = false, size = "md", + speciesPickerProps = {}, + colorPickerProps = {}, onChange, }) { const { loading: loadingMeta, error: errorMeta, data: meta } = useQuery(gql` @@ -188,6 +190,7 @@ function SpeciesColorPicker({ valids={valids} speciesId={speciesId} colorId={colorId} + {...colorPickerProps} > { // If the selected color isn't in the set we have here, show the @@ -231,6 +234,7 @@ function SpeciesColorPicker({ valids={valids} speciesId={speciesId} colorId={colorId} + {...speciesPickerProps} > { // If the selected species isn't in the set we have here, show the diff --git a/yarn.lock b/yarn.lock index fa91c43..f217015 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3927,6 +3927,16 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" +"@jimp/bmp@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.10.3.tgz#79a23678e8389865c62e77b0dccc3e069dfc27f0" + integrity sha512-keMOc5woiDmONXsB/6aXLR4Z5Q+v8lFq3EY2rcj2FmstbDMhRuGbmcBxlEgOqfRjwvtf/wOtJ3Of37oAWtVfLg== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.10.3" + bmp-js "^0.1.0" + core-js "^3.4.1" + "@jimp/bmp@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.14.0.tgz#6df246026554f276f7b354047c6fff9f5b2b5182" @@ -3936,6 +3946,24 @@ "@jimp/utils" "^0.14.0" bmp-js "^0.1.0" +"@jimp/core@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@jimp/core/-/core-0.10.3.tgz#4095f3bef43837c85d8f8373b912bc431cfe6d1f" + integrity sha512-Gd5IpL3U2bFIO57Fh/OA3HCpWm4uW/pU01E75rI03BXfTdz3T+J7TwvyG1XaqsQ7/DSlS99GXtLQPlfFIe28UA== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.10.3" + any-base "^1.1.0" + buffer "^5.2.0" + core-js "^3.4.1" + exif-parser "^0.1.12" + file-type "^9.0.0" + load-bmfont "^1.3.1" + mkdirp "^0.5.1" + phin "^2.9.1" + pixelmatch "^4.0.2" + tinycolor2 "^1.4.1" + "@jimp/core@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@jimp/core/-/core-0.14.0.tgz#870c9ca25b40be353ebda1d2abb48723d9010055" @@ -3953,6 +3981,15 @@ pixelmatch "^4.0.2" tinycolor2 "^1.4.1" +"@jimp/custom@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@jimp/custom/-/custom-0.10.3.tgz#eb6201b2e8fdd83afc3d8b514538e5faa1d30980" + integrity sha512-nZmSI+jwTi5IRyNLbKSXQovoeqsw+D0Jn0SxW08wYQvdkiWA8bTlDQFgQ7HVwCAKBm8oKkDB/ZEo9qvHJ+1gAQ== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/core" "^0.10.3" + core-js "^3.4.1" + "@jimp/custom@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@jimp/custom/-/custom-0.14.0.tgz#1dbbf0094df7403f4e03bc984ed92e7458842f74" @@ -3961,6 +3998,16 @@ "@babel/runtime" "^7.7.2" "@jimp/core" "^0.14.0" +"@jimp/gif@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@jimp/gif/-/gif-0.10.3.tgz#7661280fd2b9cb70175b20e80f4e2b3e3ecf614e" + integrity sha512-vjlRodSfz1CrUvvrnUuD/DsLK1GHB/yDZXHthVdZu23zYJIW7/WrIiD1IgQ5wOMV7NocfrvPn2iqUfBP81/WWA== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.10.3" + core-js "^3.4.1" + omggif "^1.0.9" + "@jimp/gif@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@jimp/gif/-/gif-0.14.0.tgz#db159f57c3cfd1566bbe8b124958791998614960" @@ -3971,6 +4018,16 @@ gifwrap "^0.9.2" omggif "^1.0.9" +"@jimp/jpeg@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@jimp/jpeg/-/jpeg-0.10.3.tgz#56f66874f204826291747ae12ff9eb337ab5cb8d" + integrity sha512-AAANwgUZOt6f6P7LZxY9lyJ9xclqutYJlsxt3JbriXUGJgrrFAIkcKcqv1nObgmQASSAQKYaMV9KdHjMlWFKlQ== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.10.3" + core-js "^3.4.1" + jpeg-js "^0.3.4" + "@jimp/jpeg@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@jimp/jpeg/-/jpeg-0.14.0.tgz#8a687a6a653bbbae38c522edef8f84bb418d9461" @@ -3980,6 +4037,15 @@ "@jimp/utils" "^0.14.0" jpeg-js "^0.4.0" +"@jimp/plugin-blit@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@jimp/plugin-blit/-/plugin-blit-0.10.3.tgz#095bafbb2d82c300159334a49a094f0b7d362ae6" + integrity sha512-5zlKlCfx4JWw9qUVC7GI4DzXyxDWyFvgZLaoGFoT00mlXlN75SarlDwc9iZ/2e2kp4bJWxz3cGgG4G/WXrbg3Q== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.10.3" + core-js "^3.4.1" + "@jimp/plugin-blit@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@jimp/plugin-blit/-/plugin-blit-0.14.0.tgz#5eb374be1201313b2113899fb842232d8fcfd345" @@ -3988,6 +4054,15 @@ "@babel/runtime" "^7.7.2" "@jimp/utils" "^0.14.0" +"@jimp/plugin-blur@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@jimp/plugin-blur/-/plugin-blur-0.10.3.tgz#1bb91f730fda02b3c99d913e0191111327654766" + integrity sha512-cTOK3rjh1Yjh23jSfA6EHCHjsPJDEGLC8K2y9gM7dnTUK1y9NNmkFS23uHpyjgsWFIoH9oRh2SpEs3INjCpZhQ== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.10.3" + core-js "^3.4.1" + "@jimp/plugin-blur@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@jimp/plugin-blur/-/plugin-blur-0.14.0.tgz#fe07e4932d5a2f5d8c9831e245561553224bfc60" @@ -3996,6 +4071,15 @@ "@babel/runtime" "^7.7.2" "@jimp/utils" "^0.14.0" +"@jimp/plugin-circle@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@jimp/plugin-circle/-/plugin-circle-0.10.3.tgz#c5a6ec275cf1e86b1356824637910a299c9fd662" + integrity sha512-51GAPIVelqAcfuUpaM5JWJ0iWl4vEjNXB7p4P7SX5udugK5bxXUjO6KA2qgWmdpHuCKtoNgkzWU9fNSuYp7tCA== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.10.3" + core-js "^3.4.1" + "@jimp/plugin-circle@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@jimp/plugin-circle/-/plugin-circle-0.14.0.tgz#82c0e904a34e90fa672fb9c286bc892e92088ddf" @@ -4004,6 +4088,16 @@ "@babel/runtime" "^7.7.2" "@jimp/utils" "^0.14.0" +"@jimp/plugin-color@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@jimp/plugin-color/-/plugin-color-0.10.3.tgz#810c0f7cb4ceb21da1aecfbdb6ae09f00c1c0bfa" + integrity sha512-RgeHUElmlTH7vpI4WyQrz6u59spiKfVQbsG/XUzfWGamFSixa24ZDwX/yV/Ts+eNaz7pZeIuv533qmKPvw2ujg== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.10.3" + core-js "^3.4.1" + tinycolor2 "^1.4.1" + "@jimp/plugin-color@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@jimp/plugin-color/-/plugin-color-0.14.0.tgz#772bd2d80a88bc66ea1331d010207870f169a74b" @@ -4013,6 +4107,15 @@ "@jimp/utils" "^0.14.0" tinycolor2 "^1.4.1" +"@jimp/plugin-contain@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@jimp/plugin-contain/-/plugin-contain-0.10.3.tgz#cf62126a60260359061be456b2193818c5eb1df5" + integrity sha512-bYJKW9dqzcB0Ihc6u7jSyKa3juStzbLs2LFr6fu8TzA2WkMS/R8h+ddkiO36+F9ILTWHP0CIA3HFe5OdOGcigw== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.10.3" + core-js "^3.4.1" + "@jimp/plugin-contain@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@jimp/plugin-contain/-/plugin-contain-0.14.0.tgz#c68115420d182e696f81bbe76fb5e704909b2b6a" @@ -4021,6 +4124,15 @@ "@babel/runtime" "^7.7.2" "@jimp/utils" "^0.14.0" +"@jimp/plugin-cover@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@jimp/plugin-cover/-/plugin-cover-0.10.3.tgz#7cdf56ce878c24adc35c583735015118c6de38b4" + integrity sha512-pOxu0cM0BRPzdV468n4dMocJXoMbTnARDY/EpC3ZW15SpMuc/dr1KhWQHgoQX5kVW1Wt8zgqREAJJCQ5KuPKDA== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.10.3" + core-js "^3.4.1" + "@jimp/plugin-cover@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@jimp/plugin-cover/-/plugin-cover-0.14.0.tgz#4755322589c5885e44e14e31b86b542e907297ce" @@ -4029,6 +4141,15 @@ "@babel/runtime" "^7.7.2" "@jimp/utils" "^0.14.0" +"@jimp/plugin-crop@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@jimp/plugin-crop/-/plugin-crop-0.10.3.tgz#03785181f62ddae9558ae73206f8d6217d7fa703" + integrity sha512-nB7HgOjjl9PgdHr076xZ3Sr6qHYzeBYBs9qvs3tfEEUeYMNnvzgCCGtUl6eMakazZFCMk3mhKmcB9zQuHFOvkg== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.10.3" + core-js "^3.4.1" + "@jimp/plugin-crop@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@jimp/plugin-crop/-/plugin-crop-0.14.0.tgz#4cbd856ca84ffc37230fad2534906f2f75aa3057" @@ -4037,6 +4158,15 @@ "@babel/runtime" "^7.7.2" "@jimp/utils" "^0.14.0" +"@jimp/plugin-displace@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@jimp/plugin-displace/-/plugin-displace-0.10.3.tgz#cb5b225e6cf3cf44062b08cd2cf2115b3150d8c3" + integrity sha512-8t3fVKCH5IVqI4lewe4lFFjpxxr69SQCz5/tlpDLQZsrNScNJivHdQ09zljTrVTCSgeCqQJIKgH2Q7Sk/pAZ0w== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.10.3" + core-js "^3.4.1" + "@jimp/plugin-displace@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@jimp/plugin-displace/-/plugin-displace-0.14.0.tgz#b0e6a57d00cb1f893f541413fe9d737d23c3b70c" @@ -4045,6 +4175,15 @@ "@babel/runtime" "^7.7.2" "@jimp/utils" "^0.14.0" +"@jimp/plugin-dither@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@jimp/plugin-dither/-/plugin-dither-0.10.3.tgz#c5c1cbbf157a771ba72b947dd9921a7bff3cf41a" + integrity sha512-JCX/oNSnEg1kGQ8ffZ66bEgQOLCY3Rn+lrd6v1jjLy/mn9YVZTMsxLtGCXpiCDC2wG/KTmi4862ysmP9do9dAQ== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.10.3" + core-js "^3.4.1" + "@jimp/plugin-dither@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@jimp/plugin-dither/-/plugin-dither-0.14.0.tgz#9185ec4c38e02edc9e5831f5d709f6ba891e1b93" @@ -4053,6 +4192,15 @@ "@babel/runtime" "^7.7.2" "@jimp/utils" "^0.14.0" +"@jimp/plugin-fisheye@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@jimp/plugin-fisheye/-/plugin-fisheye-0.10.3.tgz#dee46d704df5c681556dc9ea9e87e8c77ac4fdda" + integrity sha512-RRZb1wqe+xdocGcFtj2xHU7sF7xmEZmIa6BmrfSchjyA2b32TGPWKnP3qyj7p6LWEsXn+19hRYbjfyzyebPElQ== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.10.3" + core-js "^3.4.1" + "@jimp/plugin-fisheye@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@jimp/plugin-fisheye/-/plugin-fisheye-0.14.0.tgz#9f26346cf2fbc660cc2008cd7fd30a83b5029e78" @@ -4061,6 +4209,15 @@ "@babel/runtime" "^7.7.2" "@jimp/utils" "^0.14.0" +"@jimp/plugin-flip@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@jimp/plugin-flip/-/plugin-flip-0.10.3.tgz#12f894f85b283ad4f43b492e0755f8ec9459bc60" + integrity sha512-0epbi8XEzp0wmSjoW9IB0iMu0yNF17aZOxLdURCN3Zr+8nWPs5VNIMqSVa1Y62GSyiMDpVpKF/ITiXre+EqrPg== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.10.3" + core-js "^3.4.1" + "@jimp/plugin-flip@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@jimp/plugin-flip/-/plugin-flip-0.14.0.tgz#7966d6aa3b5fe1aa4d2d561ff12b8ef5ccb9b071" @@ -4069,6 +4226,15 @@ "@babel/runtime" "^7.7.2" "@jimp/utils" "^0.14.0" +"@jimp/plugin-gaussian@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@jimp/plugin-gaussian/-/plugin-gaussian-0.10.3.tgz#279222fc5d3aec24fab6162df2a1190309c71874" + integrity sha512-25eHlFbHUDnMMGpgRBBeQ2AMI4wsqCg46sue0KklI+c2BaZ+dGXmJA5uT8RTOrt64/K9Wz5E+2n7eBnny4dfpQ== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.10.3" + core-js "^3.4.1" + "@jimp/plugin-gaussian@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@jimp/plugin-gaussian/-/plugin-gaussian-0.14.0.tgz#452bc1971a4467ad9b984aa67f4c200bf941bb65" @@ -4077,6 +4243,15 @@ "@babel/runtime" "^7.7.2" "@jimp/utils" "^0.14.0" +"@jimp/plugin-invert@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@jimp/plugin-invert/-/plugin-invert-0.10.3.tgz#6b7beacbe507fa03eec87b1d6343feba80e342eb" + integrity sha512-effYSApWY/FbtlzqsKXlTLkgloKUiHBKjkQnqh5RL4oQxh/33j6aX+HFdDyQKtsXb8CMd4xd7wyiD2YYabTa0g== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.10.3" + core-js "^3.4.1" + "@jimp/plugin-invert@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@jimp/plugin-invert/-/plugin-invert-0.14.0.tgz#cd31a555860e9f821394936d15af161c09c42921" @@ -4085,6 +4260,15 @@ "@babel/runtime" "^7.7.2" "@jimp/utils" "^0.14.0" +"@jimp/plugin-mask@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@jimp/plugin-mask/-/plugin-mask-0.10.3.tgz#72d994c3bb56c050a4edd6515f74b5b6d92dee69" + integrity sha512-twrg8q8TIhM9Z6Jcu9/5f+OCAPaECb0eKrrbbIajJqJ3bCUlj5zbfgIhiQIzjPJ6KjpnFPSqHQfHkU1Vvk/nVw== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.10.3" + core-js "^3.4.1" + "@jimp/plugin-mask@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@jimp/plugin-mask/-/plugin-mask-0.14.0.tgz#52619643ac6222f85e6b27dee33c771ca3a6a4c9" @@ -4093,6 +4277,15 @@ "@babel/runtime" "^7.7.2" "@jimp/utils" "^0.14.0" +"@jimp/plugin-normalize@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@jimp/plugin-normalize/-/plugin-normalize-0.10.3.tgz#f3cbb8a0fcc8e696619d5d46403b0620ee5240d6" + integrity sha512-xkb5eZI/mMlbwKkDN79+1/t/+DBo8bBXZUMsT4gkFgMRKNRZ6NQPxlv1d3QpRzlocsl6UMxrHnhgnXdLAcgrXw== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.10.3" + core-js "^3.4.1" + "@jimp/plugin-normalize@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@jimp/plugin-normalize/-/plugin-normalize-0.14.0.tgz#bf39e356b6d473f582ce95633ad49c9cdb82492b" @@ -4101,6 +4294,16 @@ "@babel/runtime" "^7.7.2" "@jimp/utils" "^0.14.0" +"@jimp/plugin-print@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@jimp/plugin-print/-/plugin-print-0.10.3.tgz#565d57a3a87dd59b4ede9cba7a6e34f8d01ed1b1" + integrity sha512-wjRiI6yjXsAgMe6kVjizP+RgleUCLkH256dskjoNvJzmzbEfO7xQw9g6M02VET+emnbY0CO83IkrGm2q43VRyg== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.10.3" + core-js "^3.4.1" + load-bmfont "^1.4.0" + "@jimp/plugin-print@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@jimp/plugin-print/-/plugin-print-0.14.0.tgz#1c43c2a92a7adc05b464863882cb89ce486d63e6" @@ -4110,6 +4313,15 @@ "@jimp/utils" "^0.14.0" load-bmfont "^1.4.0" +"@jimp/plugin-resize@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@jimp/plugin-resize/-/plugin-resize-0.10.3.tgz#616fab55a1996a12e9583e7c1fb76815388fc14b" + integrity sha512-rf8YmEB1d7Sg+g4LpqF0Mp+dfXfb6JFJkwlAIWPUOR7lGsPWALavEwTW91c0etEdnp0+JB9AFpy6zqq7Lwkq6w== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.10.3" + core-js "^3.4.1" + "@jimp/plugin-resize@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@jimp/plugin-resize/-/plugin-resize-0.14.0.tgz#ef7fc6c2e45f8bcab62456baf8fd3bc415b02b64" @@ -4118,6 +4330,15 @@ "@babel/runtime" "^7.7.2" "@jimp/utils" "^0.14.0" +"@jimp/plugin-rotate@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@jimp/plugin-rotate/-/plugin-rotate-0.10.3.tgz#cfcbdad664e13c84ce9b008ddbc157e03d7baa31" + integrity sha512-YXLlRjm18fkW9MOHUaVAxWjvgZM851ofOipytz5FyKp4KZWDLk+dZK1JNmVmK7MyVmAzZ5jsgSLhIgj+GgN0Eg== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.10.3" + core-js "^3.4.1" + "@jimp/plugin-rotate@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@jimp/plugin-rotate/-/plugin-rotate-0.14.0.tgz#3632bc159bf1c3b9ec9f459d9c05d02a11781ee7" @@ -4126,6 +4347,15 @@ "@babel/runtime" "^7.7.2" "@jimp/utils" "^0.14.0" +"@jimp/plugin-scale@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@jimp/plugin-scale/-/plugin-scale-0.10.3.tgz#b593081ff35b0e9e11d5e0a3188c590eaa838434" + integrity sha512-5DXD7x7WVcX1gUgnlFXQa8F+Q3ThRYwJm+aesgrYvDOY+xzRoRSdQvhmdd4JEEue3lyX44DvBSgCIHPtGcEPaw== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.10.3" + core-js "^3.4.1" + "@jimp/plugin-scale@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@jimp/plugin-scale/-/plugin-scale-0.14.0.tgz#d30f0cd1365b8e68f43fa423300ae7f124e9bf10" @@ -4134,6 +4364,15 @@ "@babel/runtime" "^7.7.2" "@jimp/utils" "^0.14.0" +"@jimp/plugin-shadow@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@jimp/plugin-shadow/-/plugin-shadow-0.10.3.tgz#a9d54c8081a55152e5cc830cf5c898ab882b519a" + integrity sha512-/nkFXpt2zVcdP4ETdkAUL0fSzyrC5ZFxdcphbYBodqD7fXNqChS/Un1eD4xCXWEpW8cnG9dixZgQgStjywH0Mg== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.10.3" + core-js "^3.4.1" + "@jimp/plugin-shadow@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@jimp/plugin-shadow/-/plugin-shadow-0.14.0.tgz#471fdb9f109ff2d9e20d533d45e1e18e0b48c749" @@ -4142,6 +4381,15 @@ "@babel/runtime" "^7.7.2" "@jimp/utils" "^0.14.0" +"@jimp/plugin-threshold@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@jimp/plugin-threshold/-/plugin-threshold-0.10.3.tgz#8dd289c81de4bfbdb496f9c24496f9ee3b751ab5" + integrity sha512-Dzh0Yq2wXP2SOnxcbbiyA4LJ2luwrdf1MghNIt9H+NX7B+IWw/N8qA2GuSm9n4BPGSLluuhdAWJqHcTiREriVA== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.10.3" + core-js "^3.4.1" + "@jimp/plugin-threshold@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@jimp/plugin-threshold/-/plugin-threshold-0.14.0.tgz#ebd72721c7d1d518c5bb6e494e55d97ac3351d3b" @@ -4150,6 +4398,36 @@ "@babel/runtime" "^7.7.2" "@jimp/utils" "^0.14.0" +"@jimp/plugins@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@jimp/plugins/-/plugins-0.10.3.tgz#e15d7ba3f9e2a6b479efad5c344c8b61e01b7cb2" + integrity sha512-jTT3/7hOScf0EIKiAXmxwayHhryhc1wWuIe3FrchjDjr9wgIGNN2a7XwCgPl3fML17DXK1x8EzDneCdh261bkw== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/plugin-blit" "^0.10.3" + "@jimp/plugin-blur" "^0.10.3" + "@jimp/plugin-circle" "^0.10.3" + "@jimp/plugin-color" "^0.10.3" + "@jimp/plugin-contain" "^0.10.3" + "@jimp/plugin-cover" "^0.10.3" + "@jimp/plugin-crop" "^0.10.3" + "@jimp/plugin-displace" "^0.10.3" + "@jimp/plugin-dither" "^0.10.3" + "@jimp/plugin-fisheye" "^0.10.3" + "@jimp/plugin-flip" "^0.10.3" + "@jimp/plugin-gaussian" "^0.10.3" + "@jimp/plugin-invert" "^0.10.3" + "@jimp/plugin-mask" "^0.10.3" + "@jimp/plugin-normalize" "^0.10.3" + "@jimp/plugin-print" "^0.10.3" + "@jimp/plugin-resize" "^0.10.3" + "@jimp/plugin-rotate" "^0.10.3" + "@jimp/plugin-scale" "^0.10.3" + "@jimp/plugin-shadow" "^0.10.3" + "@jimp/plugin-threshold" "^0.10.3" + core-js "^3.4.1" + timm "^1.6.1" + "@jimp/plugins@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@jimp/plugins/-/plugins-0.14.0.tgz#41dba85f15ab8dadb4162100eb54e5f27b93ee2c" @@ -4179,6 +4457,16 @@ "@jimp/plugin-threshold" "^0.14.0" timm "^1.6.1" +"@jimp/png@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@jimp/png/-/png-0.10.3.tgz#5282cad239d02743137d88239e4cb1804ed877dd" + integrity sha512-YKqk/dkl+nGZxSYIDQrqhmaP8tC3IK8H7dFPnnzFVvbhDnyYunqBZZO3SaZUKTichClRw8k/CjBhbc+hifSGWg== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.10.3" + core-js "^3.4.1" + pngjs "^3.3.3" + "@jimp/png@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@jimp/png/-/png-0.14.0.tgz#0f2dddb5125c0795ca7e67c771204c5437fcda4b" @@ -4188,6 +4476,15 @@ "@jimp/utils" "^0.14.0" pngjs "^3.3.3" +"@jimp/tiff@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@jimp/tiff/-/tiff-0.10.3.tgz#6d143bbc42b40c9f618686a596311b35f7ff8502" + integrity sha512-7EsJzZ5Y/EtinkBGuwX3Bi4S+zgbKouxjt9c82VJTRJOQgLWsE/RHqcyRCOQBhHAZ9QexYmDz34medfLKdoX0g== + dependencies: + "@babel/runtime" "^7.7.2" + core-js "^3.4.1" + utif "^2.0.1" + "@jimp/tiff@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@jimp/tiff/-/tiff-0.14.0.tgz#a5b25bbe7c43fc3b07bad4e2ab90e0e164c1967f" @@ -4196,6 +4493,20 @@ "@babel/runtime" "^7.7.2" utif "^2.0.1" +"@jimp/types@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@jimp/types/-/types-0.10.3.tgz#9122e0a3c70129c7f26c05bbeae5030ed3a6fd5d" + integrity sha512-XGmBakiHZqseSWr/puGN+CHzx0IKBSpsKlmEmsNV96HKDiP6eu8NSnwdGCEq2mmIHe0JNcg1hqg59hpwtQ7Tiw== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/bmp" "^0.10.3" + "@jimp/gif" "^0.10.3" + "@jimp/jpeg" "^0.10.3" + "@jimp/png" "^0.10.3" + "@jimp/tiff" "^0.10.3" + core-js "^3.4.1" + timm "^1.6.1" + "@jimp/types@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@jimp/types/-/types-0.14.0.tgz#ef681ff702883c5f105b5e4e30d49abf39ee9e34" @@ -4209,6 +4520,15 @@ "@jimp/tiff" "^0.14.0" timm "^1.6.1" +"@jimp/utils@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@jimp/utils/-/utils-0.10.3.tgz#69209dd6c2d6fd956a0beb67a47c26cb6f52f3fe" + integrity sha512-VcSlQhkil4ReYmg1KkN+WqHyYfZ2XfZxDsKAHSfST1GEz/RQHxKZbX+KhFKtKflnL0F4e6DlNQj3vznMNXCR2w== + dependencies: + "@babel/runtime" "^7.7.2" + core-js "^3.4.1" + regenerator-runtime "^0.13.3" + "@jimp/utils@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@jimp/utils/-/utils-0.14.0.tgz#296254e63118554c62c31c19ac6b8c4bfe6490e5" @@ -5666,6 +5986,11 @@ adjust-sourcemap-loader@3.0.0: loader-utils "^2.0.0" regex-parser "^2.2.11" +after@0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" + integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= + agent-base@4, agent-base@^4.2.0, agent-base@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" @@ -6300,6 +6625,11 @@ array.prototype.flatmap@^1.2.3: es-abstract "^1.18.0-next.1" function-bind "^1.1.1" +arraybuffer.slice@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" + integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== + arrify@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" @@ -6652,7 +6982,7 @@ babylon@^6.18.0: resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== -backo2@^1.0.2: +backo2@1.0.2, backo2@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= @@ -6662,11 +6992,21 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= +base64-arraybuffer@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812" + integrity sha1-mBjHngWbE1X5fgQooBfIOOkLqBI= + base64-js@^1.0.2: version "1.3.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== +base64id@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" + integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== + base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" @@ -6729,6 +7069,11 @@ blob-util@2.0.2: resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ== +blob@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" + integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== + bluebird@^3.5.5, bluebird@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" @@ -7596,11 +7941,26 @@ commondir@^1.0.1: resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= -component-emitter@^1.2.0, component-emitter@^1.2.1, component-emitter@^1.3.0: +component-bind@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= + +component-emitter@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + +component-emitter@^1.2.0, component-emitter@^1.2.1, component-emitter@^1.3.0, component-emitter@~1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== +component-inherit@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" + integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= + compose-function@3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/compose-function/-/compose-function-3.0.3.tgz#9ed675f13cc54501d30950a486ff6a7ba3ab185f" @@ -7732,6 +8092,11 @@ cookie@0.4.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== +cookie@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== + cookiejar@^2.1.0, cookiejar@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" @@ -7797,6 +8162,11 @@ core-js@^3.0.1, core-js@^3.6.4, core-js@^3.6.5: resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== +core-js@^3.4.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.10.1.tgz#e683963978b6806dcc6c0a4a8bd4ab0bdaf3f21a" + integrity sha512-pwCxEXnj27XG47mu7SXAwhLP3L5CrlvCB91ANUkIz40P27kUcvNfSdvyZJ9CLHiVoKSp+TTChMQMSKQEH/IQxA== + core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -8183,6 +8553,27 @@ cyclist@^1.0.1: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= +cypress-plugin-snapshots@^1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/cypress-plugin-snapshots/-/cypress-plugin-snapshots-1.4.4.tgz#3a57f9763da1ab6df34950b8ad01803820885310" + integrity sha512-rijq3RTEZNtxQA4KCUwjXinmE1Ww+z6cQW0B14iodFM/HlX5LN16XT/2QS3X1nUXRKt0QdTrAC5MQfMUrjBkSQ== + dependencies: + diff2html "^2.7.0" + fs-extra "^7.0.1" + image-size "^0.7.2" + jimp "^0.10.3" + js-base64 "^2.5.1" + lodash "^4.17.13" + pixelmatch "^4.0.2" + pngjs "^3.3.3" + prettier "^1.16.4" + rimraf "^2.6.3" + sanitize-filename "^1.6.1" + socket.io "^2.2.0" + socket.io-client "^2.2.0" + source-map-support "^0.5.10" + unidiff "1.0.2" + cypress@^6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/cypress/-/cypress-6.4.0.tgz#432c516bf4f1a0f042a6aa1f2c3a4278fa35a8b2" @@ -8284,14 +8675,14 @@ debug@2, debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: dependencies: ms "2.0.0" -debug@3.1.0, debug@=3.1.0: +debug@3.1.0, debug@=3.1.0, debug@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== dependencies: ms "2.0.0" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@~4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== @@ -8525,6 +8916,21 @@ diff-sequences@^26.6.2: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== +diff2html@^2.7.0: + version "2.12.2" + resolved "https://registry.yarnpkg.com/diff2html/-/diff2html-2.12.2.tgz#356d35f9c87c42ebd11558bedf1c99c5b00886e8" + integrity sha512-G/Zn1KyG/OeC+67N/P26WHsQpjrjUiRyWGvg29ypy3MxSsBmF0bzsU/Irq70i2UAg+f/MzmLx4v/Nkt01TOU3g== + dependencies: + diff "^4.0.1" + hogan.js "^3.0.2" + merge "^1.2.1" + whatwg-fetch "^3.0.0" + +diff@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/diff/-/diff-2.2.3.tgz#60eafd0d28ee906e4e8ff0a52c1229521033bf99" + integrity sha1-YOr9DSjukG5Oj/ClLBIpUhAzv5k= + diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" @@ -8833,6 +9239,46 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" +engine.io-client@~3.5.0: + version "3.5.1" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.5.1.tgz#b500458a39c0cd197a921e0e759721a746d0bdb9" + integrity sha512-oVu9kBkGbcggulyVF0kz6BV3ganqUeqXvD79WOFKa+11oK692w1NyFkuEj4xrkFRpZhn92QOqTk4RQq5LiBXbQ== + dependencies: + component-emitter "~1.3.0" + component-inherit "0.0.3" + debug "~3.1.0" + engine.io-parser "~2.2.0" + has-cors "1.1.0" + indexof "0.0.1" + parseqs "0.0.6" + parseuri "0.0.6" + ws "~7.4.2" + xmlhttprequest-ssl "~1.5.4" + yeast "0.1.2" + +engine.io-parser@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.2.1.tgz#57ce5611d9370ee94f99641b589f94c97e4f5da7" + integrity sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg== + dependencies: + after "0.8.2" + arraybuffer.slice "~0.0.7" + base64-arraybuffer "0.1.4" + blob "0.0.5" + has-binary2 "~1.0.2" + +engine.io@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.5.0.tgz#9d6b985c8a39b1fe87cd91eb014de0552259821b" + integrity sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA== + dependencies: + accepts "~1.3.4" + base64id "2.0.0" + cookie "~0.4.1" + debug "~4.1.0" + engine.io-parser "~2.2.0" + ws "~7.4.2" + enhanced-resolve@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126" @@ -9916,7 +10362,7 @@ fs-capacitor@^2.0.4: resolved "https://registry.yarnpkg.com/fs-capacitor/-/fs-capacitor-2.0.4.tgz#5a22e72d40ae5078b4fe64fe4d08c0d3fc88ad3c" integrity sha512-8S4f4WsCryNw2mJJchi46YgB6CR5Ze+4L1h8ewl9tEpL4SJ3ZO+c/bS4BWhB8bK+O3TMqhuZarTitd0S0eh2pA== -fs-extra@^7.0.0: +fs-extra@^7.0.0, fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== @@ -10375,6 +10821,18 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" +has-binary2@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" + integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== + dependencies: + isarray "2.0.1" + +has-cors@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -10490,6 +10948,14 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" +hogan.js@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/hogan.js/-/hogan.js-3.0.2.tgz#4cd9e1abd4294146e7679e41d7898732b02c7bfd" + integrity sha1-TNnhq9QpQUbnZ55B14mHMrAse/0= + dependencies: + mkdirp "0.3.0" + nopt "1.0.10" + hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" @@ -10768,6 +11234,11 @@ image-q@^1.1.1: resolved "https://registry.yarnpkg.com/image-q/-/image-q-1.1.1.tgz#fc84099664460b90ca862d9300b6bfbbbfbf8056" integrity sha1-/IQJlmRGC5DKhi2TALa/u7+/gFY= +image-size@^0.7.2: + version "0.7.5" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.7.5.tgz#269f357cf5797cb44683dfa99790e54c705ead04" + integrity sha512-Hiyv+mXHfFEP7LzUL/llg9RwFxxY+o9N3JVLIeG5E7iFIFAalxvRU9UZthBdYDEVnzHMgjnKJPPpay5BWf1g9g== + immer@7.0.9: version "7.0.9" resolved "https://registry.yarnpkg.com/immer/-/immer-7.0.9.tgz#28e7552c21d39dd76feccd2b800b7bc86ee4a62e" @@ -10857,6 +11328,11 @@ indexes-of@^1.0.1: resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= + infer-owner@^1.0.3, infer-owner@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" @@ -11374,6 +11850,11 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= +isarray@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" + integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -11917,6 +12398,18 @@ jest@26.6.0: import-local "^3.0.2" jest-cli "^26.6.0" +jimp@^0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.10.3.tgz#285027b49eee3418259a8e1e9a20dd078cf8b7b1" + integrity sha512-meVWmDMtyUG5uYjFkmzu0zBgnCvvxwWNi27c4cg55vWNVC9ES4Lcwb+ogx+uBBQE3Q+dLKjXaLl0JVW+nUNwbQ== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/custom" "^0.10.3" + "@jimp/plugins" "^0.10.3" + "@jimp/types" "^0.10.3" + core-js "^3.4.1" + regenerator-runtime "^0.13.3" + jimp@^0.14.0: version "0.14.0" resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.14.0.tgz#fde55f69bdb918c1b01ac633d89a25853af85625" @@ -11933,11 +12426,21 @@ jmespath@0.15.0: resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217" integrity sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc= +jpeg-js@^0.3.4: + version "0.3.7" + resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.3.7.tgz#471a89d06011640592d314158608690172b1028d" + integrity sha512-9IXdWudL61npZjvLuVe/ktHiA41iE8qFyLB+4VDTblEsWBzeg8WQTlktdUK4CdncUqtUgUg0bbOmTE2bKBKaBQ== + jpeg-js@^0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.4.1.tgz#937a3ae911eb6427f151760f8123f04c8bfe6ef7" integrity sha512-jA55yJiB5tCXEddos8JBbvW+IMrqY0y1tjjx9KNVtA+QPmu7ND5j0zkKopClpUTsaETL135uOM2XfcYG4XRjmw== +js-base64@^2.5.1: + version "2.6.4" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" + integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -12730,6 +13233,11 @@ merge2@^1.3.0: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +merge@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" + integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== + methods@^1.1.1, methods@^1.1.2, methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -12970,6 +13478,11 @@ mixin-object@^2.0.1: for-in "^0.1.3" is-extendable "^0.1.1" +mkdirp@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" + integrity sha1-G79asbqCevI1dRQ0kEJkVfSB/h4= + mkdirp@^0.5.0, mkdirp@^0.5.4, mkdirp@^0.5.5: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" @@ -13248,6 +13761,13 @@ node-releases@^1.1.67: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.67.tgz#28ebfcccd0baa6aad8e8d4d8fe4cbc49ae239c12" integrity sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg== +nopt@1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= + dependencies: + abbrev "1" + nopt@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" @@ -13861,6 +14381,16 @@ parse5@5.1.1: resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== +parseqs@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.6.tgz#8e4bb5a19d1cdc844a08ac974d34e273afa670d5" + integrity sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w== + +parseuri@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.6.tgz#e1496e829e3ac2ff47f39a4dd044b32823c4a25a" + integrity sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow== + parseurl@^1.3.2, parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -14815,6 +15345,11 @@ prepend-http@^2.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= +prettier@^1.16.4: + version "1.19.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" + integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== + prettier@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.5.tgz#d6d56282455243f2f92cc1716692c08aa31522d4" @@ -16040,6 +16575,13 @@ sane@^4.0.3: minimist "^1.1.1" walker "~1.0.5" +sanitize-filename@^1.6.1: + version "1.6.3" + resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378" + integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg== + dependencies: + truncate-utf8-bytes "^1.0.0" + sanitize.css@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/sanitize.css/-/sanitize.css-10.0.0.tgz#b5cb2547e96d8629a60947544665243b1dc3657a" @@ -16446,6 +16988,58 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" +socket.io-adapter@~1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz#ab3f0d6f66b8fc7fca3959ab5991f82221789be9" + integrity sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g== + +socket.io-client@2.4.0, socket.io-client@^2.2.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.4.0.tgz#aafb5d594a3c55a34355562fc8aea22ed9119a35" + integrity sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ== + dependencies: + backo2 "1.0.2" + component-bind "1.0.0" + component-emitter "~1.3.0" + debug "~3.1.0" + engine.io-client "~3.5.0" + has-binary2 "~1.0.2" + indexof "0.0.1" + parseqs "0.0.6" + parseuri "0.0.6" + socket.io-parser "~3.3.0" + to-array "0.1.4" + +socket.io-parser@~3.3.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.2.tgz#ef872009d0adcf704f2fbe830191a14752ad50b6" + integrity sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg== + dependencies: + component-emitter "~1.3.0" + debug "~3.1.0" + isarray "2.0.1" + +socket.io-parser@~3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.4.1.tgz#b06af838302975837eab2dc980037da24054d64a" + integrity sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A== + dependencies: + component-emitter "1.2.1" + debug "~4.1.0" + isarray "2.0.1" + +socket.io@^2.2.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.4.1.tgz#95ad861c9a52369d7f1a68acf0d4a1b16da451d2" + integrity sha512-Si18v0mMXGAqLqCVpTxBa8MGqriHGQh8ccEOhmsmNS3thNCGBwO8WGrwMibANsWtQQ5NStdZwHqZR3naJVFc3w== + dependencies: + debug "~4.1.0" + engine.io "~3.5.0" + has-binary2 "~1.0.2" + socket.io-adapter "~1.1.0" + socket.io-client "2.4.0" + socket.io-parser "~3.4.0" + sockjs-client@1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5" @@ -16506,7 +17100,7 @@ source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.16, source-map-support@^0.5.17, source-map-support@~0.5.19: +source-map-support@^0.5.10, source-map-support@^0.5.16, source-map-support@^0.5.17, source-map-support@~0.5.19: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== @@ -17329,6 +17923,11 @@ tmpl@1.0.x: resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= +to-array@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= + to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" @@ -17410,6 +18009,13 @@ tr46@^2.0.2: dependencies: punycode "^2.1.1" +truncate-utf8-bytes@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" + integrity sha1-QFkjkJWS1W94pYGENLC3hInKXys= + dependencies: + utf8-byte-length "^1.0.1" + tryer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" @@ -17629,6 +18235,13 @@ unicode-property-aliases-ecmascript@^1.0.4: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== +unidiff@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unidiff/-/unidiff-1.0.2.tgz#8706eb36e4aa182a6ca699ecd2f8877f4b906ce0" + integrity sha512-2sbEzki5fBmjgAqoafwxRenfMcumMlmVAoJDwYJa3CI4ZVugkdR6qjTw5sVsl29/4JfBBXhWEAd5ars8nRdqXg== + dependencies: + diff "^2.2.2" + union-value@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" @@ -17828,6 +18441,11 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== +utf8-byte-length@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" + integrity sha1-9F8VDExm7uloGGUFq5P8u4rWv2E= + utif@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/utif/-/utif-2.0.1.tgz#9e1582d9bbd20011a6588548ed3266298e711759" @@ -18161,6 +18779,11 @@ whatwg-encoding@^1.0.5: dependencies: iconv-lite "0.4.24" +whatwg-fetch@^3.0.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" + integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== + whatwg-fetch@^3.4.1: version "3.5.0" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.5.0.tgz#605a2cd0a7146e5db141e29d1c62ab84c0c4c868" @@ -18454,6 +19077,11 @@ ws@^7.2.3: resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.1.tgz#a333be02696bd0e54cea0434e21dcc8a9ac294bb" integrity sha512-pTsP8UAfhy3sk1lSk/O/s4tjD0CRwvMnzvwr4OKGX7ZvqZtUyx4KIJB5JWbkykPoc55tixMGgTNoh3k4FkNGFQ== +ws@~7.4.2: + version "7.4.4" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.4.tgz#383bc9742cb202292c9077ceab6f6047b17f2d59" + integrity sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw== + xdg-basedir@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" @@ -18515,6 +19143,11 @@ xmlchars@^2.2.0: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== +xmlhttprequest-ssl@~1.5.4: + version "1.5.5" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" + integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4= + xmlrpc@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/xmlrpc/-/xmlrpc-1.3.2.tgz#26b2ea347848d028aac7e7514b5351976de3e83d" @@ -18625,6 +19258,11 @@ yauzl@^2.10.0: buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" +yeast@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= + yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"