diff --git a/.gitignore b/.gitignore index f06235c..bb673b1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ node_modules dist +bundle + +developer-credentials.json diff --git a/.jshintrc b/.jshintrc index 6dd1a7e..c3942c1 100644 --- a/.jshintrc +++ b/.jshintrc @@ -10,7 +10,7 @@ "undef": true, "unused": true, "futurehostile": true, - "esversion": 9, + "esversion": 11, "mocha": true, "globals": { "markdown": true, diff --git a/README.md b/README.md index a91d660..5736996 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,22 @@ This will run [minigame-engine.js](minigame-engine.js), which is just enough Exp The script is using a bare-bones ExpressJS server to emulate the services that will be provided to your game in the Arcade hosting environment. This enables you to iterate at your own pace in your own self-hosted environment. When your bundle is then later deployed to the production servers, your game will be calling the real versions of those services at their actual endpoints in the production environment using different credentials. +## Webpack Integration + +The development server uses the Webpack Dev Middleware plugin to provide dynamic builds of the system as you iterate on game code. Your JavaScript build will be updated and maintained automatically as you work. + +Webpack is also used to generate the Nice Game Bundle. This is a fully-contained optimized build of your JavaScript source that can be easily delivered by the system to players' devices. + +## Game Bundle Submission + +When you are ready to submit your build for hosting in the arcade, run the [bundle-build](bundle-build) script to produce `./bundle/nice-bundle-YYYY-MM-DD.tar.gz`. The script will (re)create the dist directory to ensure each build starts from scratch, populate dist with your game's build artifacts by calling Webpack to process your code and style, then copying files from source locations in the project to dist. It then tar's the dist directory, and removes it. + +All that will be left is `./bundle/nice-bundle-2022-03-24.tar.gz`. This is the file that will be submitted by running the [bundle-submit](bundle-submit) script. + +Your bundle will go through a QA process and, if accepted, will go live in Nice Arcade as quickly as possible. Submitting a bundle while one is pending in the queue will update that bundle. Feel free to update your bundle as often as desired. When in review, we will lock out update permissions to help guarantee we're only talking about one version. + +You can not submit bundle builds without developer credentials. Visit [link](tbd) to apply for a developer account and submit games to Nice Arcade. + ## Game View Everything begins with the game view. This is implemented using [Pug](https://pugjs.org/), a templating and scripting language for generating HTML (and other) output. You are defining a view partial, not the whole page. Your view must implement the `game-view` block. diff --git a/bundle-build b/bundle-build new file mode 100755 index 0000000..2dd5d6e --- /dev/null +++ b/bundle-build @@ -0,0 +1,38 @@ +#!/bin/bash + +# +# Webpack will first clean the dist directory, then produce the build artifacts +# to that directory. +# +echo "Generating Webpack build artifacts..." +yarn webpack --config webpack.config.js + +# +# Copy game/assets and other static assets dist +# +echo "Copying game static assets..." +cp -R ./game/assets ./dist/ +cp ./game/CREDITS.md ./dist/CREDITS.md +cp ./game/views/game-view.pug ./dist/game-view.pug + +# +# Create the hostable application bundle +# + +DATE=`date +%Y-%m-%d` +FILENAME=nice-bundle-${DATE}.tar.gz + +mkdir -p bundle + +echo "Generating Nice Game Bundle..." +tar -czf ./bundle/${FILENAME} dist/* + +echo "Done" +echo "" + +echo "Game distributables:" +tree -L 1 dist +echo "" + +echo "Game bundle file:" +ls -lh ./bundle/${FILENAME} \ No newline at end of file diff --git a/bundle-submit.js b/bundle-submit.js new file mode 100644 index 0000000..3ca002e --- /dev/null +++ b/bundle-submit.js @@ -0,0 +1,43 @@ +// bundle-submit.js +// Copyright (C) 2022 Rob Colbert @rob@nicecrew.digital +// License: Apache-2.0 + +'use strict'; + +import path, { dirname } from 'path'; +import { fileURLToPath } from 'url'; +const __dirname = dirname(fileURLToPath(import.meta.url)); // jshint ignore:line + +import { createRequire } from "module"; +const require = createRequire(import.meta.url); // jshint ignore:line + +import fetch, { FormData } from 'node-fetch'; + +/* + * This script loads the developer's credentials, verifies that a bundle exists, + * and sends that bundle to the configured hosting environment. + */ + +(async ( ) => { + + try { + const credentials = require(path.join(__dirname, 'developer-credentials.json')); + const pkg = require(path.join(__dirname, 'package.json')); + const formData = new FormData(); + + formData.set('package', pkg); + formData.set('bundle-file', ) + const response = await fetch('https://arcade.nicecrew.com/submissions', { + method: 'POST', + headers: { + 'X-Developer-Id': credentials.developerId, + 'X-Developer-Key': credentials.developerKey, + }, + body: formData, + }); + } catch (error) { + console.log('ERROR:', error.message, error); + } finally { + console.log('Nice Arcade bundle submission process complete.'); + } +})(); \ No newline at end of file diff --git a/dist/CREDITS.md b/game/CREDITS.md similarity index 100% rename from dist/CREDITS.md rename to game/CREDITS.md diff --git a/dist/assets/audio/music/blueberries.mp3 b/game/assets/audio/music/blueberries.mp3 similarity index 100% rename from dist/assets/audio/music/blueberries.mp3 rename to game/assets/audio/music/blueberries.mp3 diff --git a/dist/assets/audio/music/blueberries.ogg b/game/assets/audio/music/blueberries.ogg similarity index 100% rename from dist/assets/audio/music/blueberries.ogg rename to game/assets/audio/music/blueberries.ogg diff --git a/dist/assets/audio/music/cyber_pulse.mp3 b/game/assets/audio/music/cyber_pulse.mp3 similarity index 100% rename from dist/assets/audio/music/cyber_pulse.mp3 rename to game/assets/audio/music/cyber_pulse.mp3 diff --git a/dist/assets/audio/music/cyber_pulse.ogg b/game/assets/audio/music/cyber_pulse.ogg similarity index 100% rename from dist/assets/audio/music/cyber_pulse.ogg rename to game/assets/audio/music/cyber_pulse.ogg diff --git a/dist/assets/audio/music/idra.mp3 b/game/assets/audio/music/idra.mp3 similarity index 100% rename from dist/assets/audio/music/idra.mp3 rename to game/assets/audio/music/idra.mp3 diff --git a/dist/assets/audio/music/idra.ogg b/game/assets/audio/music/idra.ogg similarity index 100% rename from dist/assets/audio/music/idra.ogg rename to game/assets/audio/music/idra.ogg diff --git a/dist/assets/audio/music/reset.mp3 b/game/assets/audio/music/reset.mp3 similarity index 100% rename from dist/assets/audio/music/reset.mp3 rename to game/assets/audio/music/reset.mp3 diff --git a/dist/assets/audio/music/reset.ogg b/game/assets/audio/music/reset.ogg similarity index 100% rename from dist/assets/audio/music/reset.ogg rename to game/assets/audio/music/reset.ogg diff --git a/dist/assets/audio/music/underwater.mp3 b/game/assets/audio/music/underwater.mp3 similarity index 100% rename from dist/assets/audio/music/underwater.mp3 rename to game/assets/audio/music/underwater.mp3 diff --git a/dist/assets/audio/music/underwater.ogg b/game/assets/audio/music/underwater.ogg similarity index 100% rename from dist/assets/audio/music/underwater.ogg rename to game/assets/audio/music/underwater.ogg diff --git a/dist/assets/audio/music/victory.mp3 b/game/assets/audio/music/victory.mp3 similarity index 100% rename from dist/assets/audio/music/victory.mp3 rename to game/assets/audio/music/victory.mp3 diff --git a/dist/assets/audio/music/victory.ogg b/game/assets/audio/music/victory.ogg similarity index 100% rename from dist/assets/audio/music/victory.ogg rename to game/assets/audio/music/victory.ogg diff --git a/dist/assets/audio/sfx/impact-001.wav b/game/assets/audio/sfx/impact-001.wav similarity index 100% rename from dist/assets/audio/sfx/impact-001.wav rename to game/assets/audio/sfx/impact-001.wav diff --git a/dist/assets/audio/sfx/impact-002.wav b/game/assets/audio/sfx/impact-002.wav similarity index 100% rename from dist/assets/audio/sfx/impact-002.wav rename to game/assets/audio/sfx/impact-002.wav diff --git a/dist/assets/audio/sfx/impact-003.wav b/game/assets/audio/sfx/impact-003.wav similarity index 100% rename from dist/assets/audio/sfx/impact-003.wav rename to game/assets/audio/sfx/impact-003.wav diff --git a/dist/assets/audio/sfx/impact-004.wav b/game/assets/audio/sfx/impact-004.wav similarity index 100% rename from dist/assets/audio/sfx/impact-004.wav rename to game/assets/audio/sfx/impact-004.wav diff --git a/dist/assets/audio/sfx/impact-005.wav b/game/assets/audio/sfx/impact-005.wav similarity index 100% rename from dist/assets/audio/sfx/impact-005.wav rename to game/assets/audio/sfx/impact-005.wav diff --git a/dist/assets/audio/sfx/impact-006.wav b/game/assets/audio/sfx/impact-006.wav similarity index 100% rename from dist/assets/audio/sfx/impact-006.wav rename to game/assets/audio/sfx/impact-006.wav diff --git a/dist/assets/audio/sfx/impact-007.wav b/game/assets/audio/sfx/impact-007.wav similarity index 100% rename from dist/assets/audio/sfx/impact-007.wav rename to game/assets/audio/sfx/impact-007.wav diff --git a/dist/assets/audio/sfx/pew-pew-pew.wav b/game/assets/audio/sfx/pew-pew-pew.wav similarity index 100% rename from dist/assets/audio/sfx/pew-pew-pew.wav rename to game/assets/audio/sfx/pew-pew-pew.wav diff --git a/dist/assets/audio/sfx/spawn.ogg b/game/assets/audio/sfx/spawn.ogg similarity index 100% rename from dist/assets/audio/sfx/spawn.ogg rename to game/assets/audio/sfx/spawn.ogg diff --git a/dist/assets/audio/sfx/throw-egg-001.wav b/game/assets/audio/sfx/throw-egg-001.wav similarity index 100% rename from dist/assets/audio/sfx/throw-egg-001.wav rename to game/assets/audio/sfx/throw-egg-001.wav diff --git a/dist/assets/audio/vox/tex-biggerfish.wav b/game/assets/audio/vox/tex-biggerfish.wav similarity index 100% rename from dist/assets/audio/vox/tex-biggerfish.wav rename to game/assets/audio/vox/tex-biggerfish.wav diff --git a/dist/assets/audio/vox/tex-shutuptwo.wav b/game/assets/audio/vox/tex-shutuptwo.wav similarity index 100% rename from dist/assets/audio/vox/tex-shutuptwo.wav rename to game/assets/audio/vox/tex-shutuptwo.wav diff --git a/dist/assets/audio/vox/tex-stayfresh.wav b/game/assets/audio/vox/tex-stayfresh.wav similarity index 100% rename from dist/assets/audio/vox/tex-stayfresh.wav rename to game/assets/audio/vox/tex-stayfresh.wav diff --git a/dist/assets/img/beardson.large.png b/game/assets/img/beardson.large.png similarity index 100% rename from dist/assets/img/beardson.large.png rename to game/assets/img/beardson.large.png diff --git a/dist/assets/img/beardson.png b/game/assets/img/beardson.png similarity index 100% rename from dist/assets/img/beardson.png rename to game/assets/img/beardson.png diff --git a/dist/assets/img/bg-001.jpg b/game/assets/img/bg-001.jpg similarity index 100% rename from dist/assets/img/bg-001.jpg rename to game/assets/img/bg-001.jpg diff --git a/dist/assets/img/big-baja-tex.png b/game/assets/img/big-baja-tex.png similarity index 100% rename from dist/assets/img/big-baja-tex.png rename to game/assets/img/big-baja-tex.png diff --git a/dist/assets/img/egg-001.png b/game/assets/img/egg-001.png similarity index 100% rename from dist/assets/img/egg-001.png rename to game/assets/img/egg-001.png diff --git a/dist/assets/img/egg-002.png b/game/assets/img/egg-002.png similarity index 100% rename from dist/assets/img/egg-002.png rename to game/assets/img/egg-002.png diff --git a/dist/assets/img/egg-003.png b/game/assets/img/egg-003.png similarity index 100% rename from dist/assets/img/egg-003.png rename to game/assets/img/egg-003.png diff --git a/dist/assets/img/fuentes-puppy-mode.large.png b/game/assets/img/fuentes-puppy-mode.large.png similarity index 100% rename from dist/assets/img/fuentes-puppy-mode.large.png rename to game/assets/img/fuentes-puppy-mode.large.png diff --git a/dist/assets/img/fuentes-puppy-mode.png b/game/assets/img/fuentes-puppy-mode.png similarity index 100% rename from dist/assets/img/fuentes-puppy-mode.png rename to game/assets/img/fuentes-puppy-mode.png diff --git a/dist/assets/img/fuentes.boss.png b/game/assets/img/fuentes.boss.png similarity index 100% rename from dist/assets/img/fuentes.boss.png rename to game/assets/img/fuentes.boss.png diff --git a/dist/assets/img/groyper.large.png b/game/assets/img/groyper.large.png similarity index 100% rename from dist/assets/img/groyper.large.png rename to game/assets/img/groyper.large.png diff --git a/dist/assets/img/groyper.png b/game/assets/img/groyper.png similarity index 100% rename from dist/assets/img/groyper.png rename to game/assets/img/groyper.png diff --git a/dist/assets/img/rainbow-dildo.large.png b/game/assets/img/rainbow-dildo.large.png similarity index 100% rename from dist/assets/img/rainbow-dildo.large.png rename to game/assets/img/rainbow-dildo.large.png diff --git a/dist/assets/img/rainbow-dildo.png b/game/assets/img/rainbow-dildo.png similarity index 100% rename from dist/assets/img/rainbow-dildo.png rename to game/assets/img/rainbow-dildo.png diff --git a/dist/assets/img/torba.large.png b/game/assets/img/torba.large.png similarity index 100% rename from dist/assets/img/torba.large.png rename to game/assets/img/torba.large.png diff --git a/dist/assets/img/torba.png b/game/assets/img/torba.png similarity index 100% rename from dist/assets/img/torba.png rename to game/assets/img/torba.png diff --git a/game/css/style.css b/game/css/style.css deleted file mode 100644 index 998b16c..0000000 --- a/game/css/style.css +++ /dev/null @@ -1,171 +0,0 @@ -html, body { - margin: 0; - padding: 0; - - --brand-color: rgb(252, 98, 0); -} - -body { - position: fixed; - top: 0; right: 0; bottom: 0; left: 0; - width: 100%; - height: 100%; - background-color: #1a1a1a; - color: #e8e8e8; -} - -a, a:visited { - color: var(--brand-color); -} - -.container { - display: flex; - flex-direction: column; - height: 100%; - justify-content: center; - max-width: 1280px; - margin: 0 auto; - background-color: #000000; - color: #e8e8e8; -} - -.container .text-center { - text-align: center; -} - -.container .margin-block { - display: block; - position: relative; - width: 100%; - margin: 2em 0; -} - -.container .game-title { - font-size: 2.5em; - font-weight: bold; - color: var(--brand-color); -} - -.container .game-subtitle { - margin: 8px 0; - color: var(--brand-color); - font-style: italic; -} - -.container .game-display-wrapper { - position: relative; - width: 100%; - max-width: 960px; - margin: 0 auto; -} - -.container .game-display-wrapper canvas.game-display { - display: block; - position: relative; - box-sizing: border-box; - width: 100%; - max-width: 960px; - margin: 0 auto; - height: auto; - border: solid 1px #4a4a4a; - border-radius: 8px; -} - -.container .game-display-wrapper button.start-button { - position: absolute; - left: calc(50% - 120px); - top: calc(50% - 32px); - width: 240px; - height: 64px; - padding: 10px 20px; - background-color: var(--brand-color); - color: white; - border: solid 3px white; - border-radius: 8px; - font-size: 24px; - font-weight: bold; -} - -.container button { - border: solid 3px; - border-color: rgba(255,255,255, 0); - border-radius: 8px; - width: 80px; - height: 80px; - - -webkit-user-select: none; - -webkit-touch-callout: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.container button.direction-button { - background: rgba(0,0,0, 0.6); - color: white; - font-size: 4em; - font-weight: bold; - font-family: apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol; -} - -.container button.action-button { - background: rgba(255,0,0, 0.6); - color: white; - font-size: 3em; - font-family: apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol; -} - -.container button.action-button.active, -.container button.direction-button.active { - border-color: white; -} - -.container button.direction-button#btn-move-left { - position: absolute; - bottom: 20px; - left: 20px; -} - -.container button.direction-button#btn-move-right { - position: absolute; - bottom: 20px; - right: 20px; -} - -.container button.action-button#btn-throw-egg { - position: absolute; - bottom: 120px; - right: 20px; -} - -@media only screen and (max-width: 480px) { - .container .game-display-wrapper button.start-button { - left: calc(50% - 100px); - top: calc(50% - 28px); - width: 200px; - height: 56px; - padding: 10px 20px; - background-color: var(--brand-color); - color: white; - border: solid 3px white; - border-radius: 8px; - font-size: 24px; - } - - .container button { - width: 50px; - height: 50px; - } - - .container button.direction-button { - font-size: 2em; - } - - .container button.action-button { - font-size: 1.5em; - } - - .container button.action-button#btn-throw-egg { - bottom: 80px; - } -} \ No newline at end of file diff --git a/game/js/game-style.js b/game/js/game-style.js new file mode 100644 index 0000000..97a7c09 --- /dev/null +++ b/game/js/game-style.js @@ -0,0 +1,7 @@ +// game-style.js +// Copyright (C) 2022 Rob Colbert @rob@nicecrew.digital +// Licence: Apache-2.0 + +'use strict'; + +import '../less/style.less'; \ No newline at end of file diff --git a/game/less/style.less b/game/less/style.less new file mode 100644 index 0000000..a03705e --- /dev/null +++ b/game/less/style.less @@ -0,0 +1,172 @@ +html, body { + margin: 0; + padding: 0; + + --brand-color: rgb(252, 98, 0); +} + +body { + position: fixed; + top: 0; right: 0; bottom: 0; left: 0; + width: 100%; + height: 100%; + background-color: #1a1a1a; + color: #e8e8e8; +} + +a, a:visited { + color: var(--brand-color); +} + +.container { + display: flex; + flex-direction: column; + height: 100%; + justify-content: center; + max-width: 1280px; + margin: 0 auto; + background-color: #000000; + color: #e8e8e8; + + .text-center { + text-align: center; + } + + .margin-block { + display: block; + position: relative; + width: 100%; + margin: 2em 0; + } + + .game-title { + font-size: 2.5em; + font-weight: bold; + color: var(--brand-color); + } + + .game-subtitle { + margin: 8px 0; + color: var(--brand-color); + font-style: italic; + } + + .game-display-wrapper { + position: relative; + width: 100%; + max-width: 960px; + margin: 0 auto; + + canvas.game-display { + display: block; + position: relative; + box-sizing: border-box; + width: 100%; + max-width: 960px; + margin: 0 auto; + height: auto; + border: solid 1px #4a4a4a; + border-radius: 8px; + } + + button.start-button { + position: absolute; + left: calc(50% - 120px); + top: calc(50% - 32px); + width: 240px; + height: 64px; + padding: 10px 20px; + background-color: var(--brand-color); + color: white; + border: solid 3px white; + border-radius: 8px; + font-size: 24px; + font-weight: bold; + } + } + + button { + border: solid 3px; + border-color: rgba(255,255,255, 0); + border-radius: 8px; + width: 80px; + height: 80px; + + -webkit-user-select: none; + -webkit-touch-callout: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + + button.direction-button { + background: rgba(0,0,0, 0.6); + color: white; + font-size: 4em; + font-weight: bold; + font-family: apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol; + } + + button.action-button { + background: rgba(255,0,0, 0.6); + color: white; + font-size: 3em; + font-family: apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol; + } + + button.action-button.active, + button.direction-button.active { + border-color: white; + } + + button.direction-button#btn-move-left { + position: absolute; + bottom: 20px; + left: 20px; + } + + button.direction-button#btn-move-right { + position: absolute; + bottom: 20px; + right: 20px; + } + + button.action-button#btn-throw-egg { + position: absolute; + bottom: 120px; + right: 20px; + } +} + + +@media only screen and (max-width: 480px) { + .container .game-display-wrapper button.start-button { + left: calc(50% - 100px); + top: calc(50% - 28px); + width: 200px; + height: 56px; + padding: 10px 20px; + background-color: var(--brand-color); + color: white; + border: solid 3px white; + border-radius: 8px; + font-size: 24px; + } + + .container button { + width: 50px; + height: 50px; + } + + .container button.direction-button { + font-size: 2em; + } + + .container button.action-button { + font-size: 1.5em; + } + + .container button.action-button#btn-throw-egg { + bottom: 80px; + } +} \ No newline at end of file diff --git a/game/views/layout.pug b/game/views/layout.pug index ec64855..61d7403 100644 --- a/game/views/layout.pug +++ b/game/views/layout.pug @@ -5,10 +5,9 @@ html(lang="en") meta(name="viewport" content="width=device-width, initial-scale=1") title CyberEgg 2077 - link(rel="stylesheet" href=`/dist/css/style.css?v=${pkg.version}`) - body .container block game-view + script(src=`/dist/game-style.bundle.js?v=${pkg.version}`, type="module") script(src=`${gameModuleUrl}?v=${pkg.version}`, type="module") \ No newline at end of file diff --git a/minigame-engine.js b/minigame-engine.js index 7fd7214..4a0643c 100644 --- a/minigame-engine.js +++ b/minigame-engine.js @@ -12,35 +12,49 @@ 'use strict'; -const path = require('path'); +import path, { dirname } from 'path'; +import { fileURLToPath } from 'url'; +const __dirname = dirname(fileURLToPath(import.meta.url)); // jshint ignore:line -const express = require('express'); +import { createRequire } from 'module'; +const require = createRequire(import.meta.url); // jshint ignore:line -module.config = { - pkg: require(path.join(__dirname, 'package.json')), +import webpack from 'webpack'; +import webpackDevMiddleware from 'webpack-dev-middleware'; + +import WEBPACK_CONFIG from './webpack.config.js'; +const compiler = webpack(WEBPACK_CONFIG); + +import express from 'express'; + +const APP_CONFIG = { + pkg: require('./package.json'), }; -module.getHomeView = async (req, res) => { - res.locals.gameModuleUrl = '/dist/game-app.js'; +async function getHomeView (req, res) { + res.locals.gameModuleUrl = '/dist/game-app.bundle.js'; res.render('game-view'); -}; +} (async ( ) => { - module.app = express(); + const harness = { + app: express(), + }; + + harness.app.locals.config = APP_CONFIG; + harness.app.locals.pkg = APP_CONFIG.pkg; - module.app.locals.config = module.config; - module.app.locals.pkg = module.config.pkg; + harness.app.set('view engine', 'pug'); + harness.app.set('views', path.join(__dirname, 'game', 'views')); - module.app.set('view engine', 'pug'); - module.app.set('views', path.join(__dirname, 'game', 'views')); + harness.app.use('/dist/assets', express.static(path.join(__dirname, 'game', 'assets'))); - module.app.use('/dtp-nice-game', express.static(path.join(__dirname, 'node_modules', 'dtp-nice-game', 'lib'))); - module.app.use('/dist', express.static(path.join(__dirname, 'dist'))); + harness.app.use(webpackDevMiddleware(compiler, { publicPath: '/dist' })); - module.app.get('/', module.getHomeView); + harness.app.get('/', getHomeView); - module.app.listen(3000, ( ) => { + harness.app.listen(3000, ( ) => { console.log('CyberEgg 2077 is alive'); }); diff --git a/package.json b/package.json index e76d11e..d89bc5f 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,10 @@ { "name": "cyberegg2077", + "type": "module", "version": "1.0.0", "description": "CyberEgg 2077", "scripts": { - "start": "node minigame-engine.js", - "bundle": "yarn run webpack --config webpack.config.js" + "start": "node minigame-engine.js" }, "repository": "https://git.digitaltelepresence.com/rob/cyberegg2077.git", "author": "Rob Colbert", @@ -13,11 +13,18 @@ "dependencies": { "dtp-nice-game": "https://git.digitaltelepresence.com/digital-telepresence/dtp-nice-game.git", "express": "^4.17.3", + "node-fetch": "^3.2.3", "pug": "^3.0.2" }, "devDependencies": { + "css-loader": "^6.7.1", "jshint": "^2.13.4", + "less": "^4.1.2", + "less-loader": "^10.2.0", + "mini-css-extract-plugin": "^2.6.0", + "style-loader": "^3.3.1", "webpack": "^5.70.0", - "webpack-cli": "^4.9.2" + "webpack-cli": "^4.9.2", + "webpack-dev-middleware": "^5.3.1" } } diff --git a/dist/assets/audio/music/blueberries.wav b/src/audio/music/blueberries.wav similarity index 100% rename from dist/assets/audio/music/blueberries.wav rename to src/audio/music/blueberries.wav diff --git a/dist/assets/audio/music/underwater.wav b/src/audio/music/underwater.wav similarity index 100% rename from dist/assets/audio/music/underwater.wav rename to src/audio/music/underwater.wav diff --git a/dist/assets/audio/music/victory.wav b/src/audio/music/victory.wav similarity index 100% rename from dist/assets/audio/music/victory.wav rename to src/audio/music/victory.wav diff --git a/webpack.config.js b/webpack.config.js index c437e7a..24d448c 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -4,13 +4,53 @@ 'use strict'; -const path = require('path'); +import path, { dirname } from 'path'; +import { fileURLToPath } from 'url'; +const __dirname = dirname(fileURLToPath(import.meta.url)); // jshint ignore:line -module.exports = { - entry: './game/js/game-app.js', +export default { + entry: { + 'game-app': './game/js/game-app.js', + 'game-style': './game/js/game-style.js', + }, +// mode: 'development', mode: 'production', output: { - filename: 'game-app.js', + filename: '[name].bundle.js', path: path.resolve(__dirname, 'dist'), + clean: true, + publicPath: '/dist', + }, + optimization: { + splitChunks: { + chunks: 'all', + }, + }, + module: { + rules: [ + { + test: /\.less$/i, + use: [ + { + loader: "style-loader", + }, + { + loader: "css-loader", + options: { + sourceMap: true, + }, + }, + { + loader: "less-loader", + options: { + sourceMap: true, + lessOptions: { + strictMath: true, + }, + }, + }, + ], + }, + ], }, }; \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 4acdf37..3c5a523 100644 --- a/yarn.lock +++ b/yarn.lock @@ -46,7 +46,7 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== -"@types/json-schema@*", "@types/json-schema@^7.0.8": +"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.10" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.10.tgz#9b05b7896166cd00e9cbd59864853abf65d9ac23" integrity sha512-BLO9bBq59vW3fxCpD4o0N4U+DXsvwvIcl+jofw0frQo/GrBFC+/jRZj1E7kgp6dvTyNmA4y6JCV5Id/r3mNP5A== @@ -227,11 +227,25 @@ acorn@^8.4.1, acorn@^8.5.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== +ajv-keywords@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -242,6 +256,16 @@ ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^8.0.0, ajv@^8.8.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -356,7 +380,7 @@ clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" -colorette@^2.0.14: +colorette@^2.0.10, colorette@^2.0.14: version "2.0.16" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== @@ -413,6 +437,13 @@ cookie@0.4.2: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== +copy-anything@^2.0.1: + version "2.0.6" + resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-2.0.6.tgz#092454ea9584a7b7ad5573062b2a87f5900fc480" + integrity sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw== + dependencies: + is-what "^3.14.1" + core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" @@ -427,6 +458,30 @@ cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +css-loader@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.1.tgz#e98106f154f6e1baf3fc3bc455cb9981c1d5fd2e" + integrity sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.7" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.3.5" + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +data-uri-to-buffer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz#b5db46aea50f6176428ac05b73be39a57701a64b" + integrity sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA== + date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" @@ -439,6 +494,13 @@ debug@2.6.9: dependencies: ms "2.0.0" +debug@^3.2.6: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -531,6 +593,13 @@ envinfo@^7.7.3: resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== +errno@^0.1.1: + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + es-module-lexer@^0.9.0: version "0.9.3" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" @@ -637,7 +706,7 @@ express@^4.17.3: utils-merge "1.0.1" vary "~1.1.2" -fast-deep-equal@^3.1.1: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== @@ -652,6 +721,14 @@ fastest-levenshtein@^1.0.12: resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== +fetch-blob@^3.1.2, fetch-blob@^3.1.4: + version "3.1.5" + resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.1.5.tgz#0077bf5f3fcdbd9d75a0b5362f77dbb743489863" + integrity sha512-N64ZpKqoLejlrwkIAnb9iLSA3Vx/kjgzpcDhygcqJ2KKjky8nCgUQ+dzXtbrLaWZGZNmNfQTsiQ0weZ1svglHg== + dependencies: + node-domexception "^1.0.0" + web-streams-polyfill "^3.0.3" + finalhandler@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" @@ -673,6 +750,13 @@ find-up@^4.0.0: locate-path "^5.0.0" path-exists "^4.0.0" +formdata-polyfill@^4.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" + integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== + dependencies: + fetch-blob "^3.1.2" + forwarded@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" @@ -683,6 +767,11 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= +fs-monkey@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -780,13 +869,23 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -iconv-lite@0.4.24: +iconv-lite@0.4.24, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +image-size@~0.5.0: + version "0.5.5" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= + import-local@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" @@ -858,6 +957,11 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== +is-what@^3.14.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" + integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -910,6 +1014,11 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + jstransformer@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/jstransformer/-/jstransformer-1.0.0.tgz#ed8bf0921e2f3f1ed4d5c1a44f68709ed24722c3" @@ -923,6 +1032,35 @@ kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +klona@^2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" + integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== + +less-loader@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-10.2.0.tgz#97286d8797dc3dc05b1d16b0ecec5f968bdd4e32" + integrity sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg== + dependencies: + klona "^2.0.4" + +less@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/less/-/less-4.1.2.tgz#6099ee584999750c2624b65f80145f8674e4b4b0" + integrity sha512-EoQp/Et7OSOVu0aJknJOtlXZsnr8XE8KwuzTHOLeVSEx8pVWUICc8Q0VYRHgzyjX78nMEyC/oztWFbgyhtNfDA== + dependencies: + copy-anything "^2.0.1" + parse-node-version "^1.0.1" + tslib "^2.3.0" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + make-dir "^2.1.0" + mime "^1.4.1" + needle "^2.5.2" + source-map "~0.6.0" + loader-runner@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" @@ -940,11 +1078,33 @@ lodash@~4.17.21: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= +memfs@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.1.tgz#b78092f466a0dce054d63d39275b24c71d3f1305" + integrity sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw== + dependencies: + fs-monkey "1.0.3" + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -965,14 +1125,14 @@ mime-db@1.52.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.27, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" -mime@1.6.0: +mime@1.6.0, mime@^1.4.1: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== @@ -982,6 +1142,13 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mini-css-extract-plugin@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz#578aebc7fc14d32c0ad304c2c34f08af44673f5e" + integrity sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w== + dependencies: + schema-utils "^4.0.0" + minimatch@^3.0.4: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -1001,11 +1168,25 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@2.1.3: +ms@2.1.3, ms@^2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +nanoid@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" + integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== + +needle@^2.5.2: + version "2.9.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.9.1.tgz#22d1dffbe3490c2b83e301f7709b6736cd8f2684" + integrity sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ== + dependencies: + debug "^3.2.6" + iconv-lite "^0.4.4" + sax "^1.2.4" + negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" @@ -1016,6 +1197,20 @@ neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +node-domexception@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" + integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== + +node-fetch@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.2.3.tgz#a03c9cc2044d21d1a021566bd52f080f333719a6" + integrity sha512-AXP18u4pidSZ1xYXRDPY/8jdv3RAozIt/WLNR/MBGZAz+xjtlr90RvCnsvHQRiXyWliZF/CpytExp32UU67/SA== + dependencies: + data-uri-to-buffer "^4.0.0" + fetch-blob "^3.1.4" + formdata-polyfill "^4.0.10" + node-releases@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01" @@ -1073,6 +1268,11 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +parse-node-version@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" + integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== + parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -1108,6 +1308,11 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + pkg-dir@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" @@ -1115,6 +1320,56 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: + version "6.0.9" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz#ee71c3b9ff63d9cd130838876c13a2ec1a992b2f" + integrity sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@^8.4.7: + version "8.4.12" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.12.tgz#1e7de78733b28970fa4743f7da6f3763648b1905" + integrity sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg== + dependencies: + nanoid "^3.3.1" + picocolors "^1.0.0" + source-map-js "^1.0.2" + promise@^7.0.1: version "7.3.1" resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" @@ -1130,6 +1385,11 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + pug-attrs@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-3.0.0.tgz#b10451e0348165e31fad1cc23ebddd9dc7347c41" @@ -1250,7 +1510,7 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -range-parser@~1.2.1: +range-parser@^1.2.1, range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== @@ -1282,6 +1542,11 @@ rechoir@^0.7.0: dependencies: resolve "^1.9.0" +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -1313,6 +1578,11 @@ safe-buffer@5.2.1, safe-buffer@^5.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + schema-utils@^3.1.0, schema-utils@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" @@ -1322,6 +1592,28 @@ schema-utils@^3.1.0, schema-utils@^3.1.1: ajv "^6.12.5" ajv-keywords "^3.5.2" +schema-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" + integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.8.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.0.0" + +semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + send@0.17.2: version "0.17.2" resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" @@ -1387,6 +1679,11 @@ signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" @@ -1395,7 +1692,7 @@ source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0, source-map@^0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -1425,6 +1722,11 @@ strip-json-comments@1.0.x: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" integrity sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E= +style-loader@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.1.tgz#057dfa6b3d4d7c7064462830f9113ed417d38575" + integrity sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ== + supports-color@^8.0.0: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" @@ -1478,6 +1780,11 @@ token-stream@1.0.0: resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-1.0.0.tgz#cc200eab2613f4166d27ff9afc7ca56d49df6eb4" integrity sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ= +tslib@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -1498,6 +1805,11 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -1521,6 +1833,11 @@ watchpack@^2.3.1: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" +web-streams-polyfill@^3.0.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz#a6b74026b38e4885869fb5c589e90b95ccfc7965" + integrity sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA== + webpack-cli@^4.9.2: version "4.9.2" resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.9.2.tgz#77c1adaea020c3f9e2db8aad8ea78d235c83659d" @@ -1539,6 +1856,17 @@ webpack-cli@^4.9.2: rechoir "^0.7.0" webpack-merge "^5.7.3" +webpack-dev-middleware@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz#aa079a8dedd7e58bfeab358a9af7dab304cee57f" + integrity sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg== + dependencies: + colorette "^2.0.10" + memfs "^3.4.1" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + webpack-merge@^5.7.3: version "5.8.0" resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" @@ -1608,3 +1936,8 @@ wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==