From 0e581555e55885de97f3b3c7a83313a2a36ce2ee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Mar 2020 03:23:28 +0000 Subject: [PATCH 1/6] Bump acorn from 5.7.3 to 5.7.4 Bumps [acorn](https://github.com/acornjs/acorn) from 5.7.3 to 5.7.4. - [Release notes](https://github.com/acornjs/acorn/releases) - [Commits](https://github.com/acornjs/acorn/compare/5.7.3...5.7.4) Signed-off-by: dependabot[bot] --- package-lock.json | 332 +++++++++++++++++++++++++++++++++++++++++++--- yarn.lock | 6 +- 2 files changed, 313 insertions(+), 25 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8e57150..3f028b8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "create-rogue-app", - "version": "0.1.0", + "version": "0.3.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1366,6 +1366,26 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" }, + "@reduxjs/toolkit": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.2.5.tgz", + "integrity": "sha512-/OWoW5mniUXAomw4+3ZhhWodcs1/SRvK2HKyxLXdW6vKgmJhiBiSHe/huHARlKWujEmGaJrkafx548GE494bCQ==", + "requires": { + "immer": "^4.0.1", + "redux": "^4.0.0", + "redux-devtools-extension": "^2.13.8", + "redux-immutable-state-invariant": "^2.1.0", + "redux-thunk": "^2.3.0", + "reselect": "^4.0.0" + }, + "dependencies": { + "immer": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/immer/-/immer-4.0.2.tgz", + "integrity": "sha512-Q/tm+yKqnKy4RIBmmtISBlhXuSDrB69e9EKTYiIenIKQkXBQir43w+kN/eGiax3wt1J0O1b2fYcNqLSbEcXA7w==" + } + } + }, "@sheerun/mutationobserver-shim": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.2.tgz", @@ -1495,6 +1515,8 @@ }, "@testing-library/jest-dom": { "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-4.2.4.tgz", + "integrity": "sha512-j31Bn0rQo12fhCWOUWy9fl7wtqkp7In/YP2p5ZFyRuiiB9Qs3g+hS4gAmDWONbAHcRmVooNJ5eOHQDCOmUFXHg==", "requires": { "@babel/runtime": "^7.5.1", "chalk": "^2.4.1", @@ -1509,6 +1531,8 @@ }, "@testing-library/react": { "version": "9.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-9.4.1.tgz", + "integrity": "sha512-sta3ui24HPgW92quHyQj6gpOkNgLNx8BX/QOU4k1bddo43ZdqlGwmzCYwL93bExfhergwiau+IzBGl7TCsSFeA==", "requires": { "@babel/runtime": "^7.8.3", "@testing-library/dom": "^6.11.0", @@ -1516,7 +1540,9 @@ } }, "@testing-library/user-event": { - "version": "7.2.1" + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-7.2.1.tgz", + "integrity": "sha512-oZ0Ib5I4Z2pUEcoo95cT1cr6slco9WY7yiPpG+RGNkj8YcYgJnM7pXmYmorNOReh8MIGcKSqXyeGjxnr8YiZbA==" }, "@types/babel__core": { "version": "7.1.6", @@ -1626,6 +1652,8 @@ }, "@types/jest": { "version": "24.9.1", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.9.1.tgz", + "integrity": "sha512-Fb38HkXSVA4L8fGKEZ6le5bB8r6MRWlOCZbVuWZcmOMSCd2wCYOwN1ibj8daIoV9naq7aaOZjrLCoCMptKU/4Q==", "requires": { "jest-diff": "^24.3.0" } @@ -1640,6 +1668,16 @@ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" }, + "@types/nearley": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/@types/nearley/-/nearley-2.11.1.tgz", + "integrity": "sha512-oaAg5gn74VFpPYs6Ou2pjDao3WJxnlnH29q9rLOxSGb0PTw2QtBQcTAN9xs1OAHrtI9En5kIXKM96stf7//c9w==" + }, + "@types/node": { + "version": "12.12.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.30.tgz", + "integrity": "sha512-sz9MF/zk6qVr3pAnM0BSQvYIBK44tS75QC5N+VbWSE4DjCV/pJ+UzCW/F+vVnl7TkOPcuwQureKNtSSwjBTaMg==" + }, "@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", @@ -1655,6 +1693,23 @@ "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==" }, + "@types/react": { + "version": "16.9.23", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.23.tgz", + "integrity": "sha512-SsGVT4E7L2wLN3tPYLiF20hmZTPGuzaayVunfgXzUn1x4uHVsKH6QDJQ/TdpHqwsTLd4CwrmQ2vOgxN7gE24gw==", + "requires": { + "@types/prop-types": "*", + "csstype": "^2.2.0" + } + }, + "@types/react-dom": { + "version": "16.9.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.5.tgz", + "integrity": "sha512-BX6RQ8s9D+2/gDhxrj8OW+YD4R+8hj7FEM/OJHGNR0KipE1h1mSsf39YeyC81qafkq+N3rU3h3RFbLSwE5VqUg==", + "requires": { + "@types/react": "*" + } + }, "@types/react-native": { "version": "0.61.17", "resolved": "https://registry.npmjs.org/@types/react-native/-/react-native-0.61.17.tgz", @@ -1674,6 +1729,14 @@ } } }, + "@types/redux": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@types/redux/-/redux-3.6.0.tgz", + "integrity": "sha1-8evh5UEVGAcuT9/KXHbhbnTBOZo=", + "requires": { + "redux": "*" + } + }, "@types/stack-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", @@ -1681,6 +1744,8 @@ }, "@types/styled-components": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.0.1.tgz", + "integrity": "sha512-1yRYO1dAE2MGEuYKF1yQFeMdoyerIQn6ZDnFFkxZamcs3rn8RQVn98edPsTROAxbTz81tqnVN4BJ3Qs1cm/tKg==", "requires": { "@types/hoist-non-react-statics": "*", "@types/react": "*", @@ -1998,9 +2063,9 @@ } }, "acorn": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", - "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==" + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" }, "acorn-globals": { "version": "4.3.4", @@ -2012,9 +2077,9 @@ }, "dependencies": { "acorn": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", - "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==" + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" } } }, @@ -3705,6 +3770,58 @@ "sha.js": "^2.4.8" } }, + "cross-env": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.2.tgz", + "integrity": "sha512-KZP/bMEOJEDCkDQAyRhu3RL2ZO/SUVrxQVI0G3YEQ+OLbRA3c6zgixe8Mq8a/z7+HKlNEjo8oiLUs8iRijY2Rw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -4236,6 +4353,11 @@ "path-type": "^3.0.0" } }, + "discontinuous-range": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", + "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=" + }, "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -6620,9 +6742,9 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" }, "immer": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz", - "integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg==" + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/immer/-/immer-5.3.6.tgz", + "integrity": "sha512-pqWQ6ozVfNOUDjrLfm4Pt7q4Q12cGw2HUZgry4Q5+Myxu9nmHRkWBpI0J4+MK0AxbdFtdMTwEGVl7Vd+vEiK+A==" }, "import-cwd": { "version": "2.1.0", @@ -7209,9 +7331,9 @@ }, "dependencies": { "acorn": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", - "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==" + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" }, "jsdom": { "version": "14.1.0", @@ -7638,9 +7760,9 @@ }, "dependencies": { "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==" } } }, @@ -7728,6 +7850,11 @@ "object.assign": "^4.1.0" } }, + "keycode-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/keycode-js/-/keycode-js-2.0.3.tgz", + "integrity": "sha512-nGuOQ0zvYQFr0OOBOZS47e/ifsiuNz1pleQIFS+LX+udj3St6AvHpv55MI8DCre6Yg9D2CG/qqWbuAx7iQt9FQ==" + }, "killable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", @@ -8095,6 +8222,12 @@ } } }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", + "dev": true + }, "merge-deep": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz", @@ -8339,6 +8472,16 @@ } } }, + "modern-css-reset": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/modern-css-reset/-/modern-css-reset-1.1.0.tgz", + "integrity": "sha512-JOsOWxyDiZJWhvvx0LVtY9l4MT/1tlDevBkmPbGFEvxTLGVwCOJ/f0ZoT9moTdMsrqZeShJOX/bTaUfI4WfFQw==" + }, + "moo": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz", + "integrity": "sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w==" + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -8412,6 +8555,18 @@ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" }, + "nearley": { + "version": "2.19.1", + "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.19.1.tgz", + "integrity": "sha512-xq47GIUGXxU9vQg7g/y1o1xuKnkO7ev4nRWqftmQrLkfnE/FjRqDaGOUakM8XHPn/6pW3bGjU2wgoJyId90rqg==", + "requires": { + "commander": "^2.19.0", + "moo": "^0.5.0", + "railroad-diagrams": "^1.0.0", + "randexp": "0.4.6", + "semver": "^5.4.1" + } + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -8596,6 +8751,54 @@ "sort-keys": "^1.0.0" } }, + "npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + } + } + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -9108,6 +9311,12 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==" }, + "pidtree": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.0.tgz", + "integrity": "sha512-9CT4NFlDcosssyg8KVFltgokyKZIFjoBxw8CTGy+5F38Y1eQWrt8tRayiUOXE+zVKQnYu5BR8JjCtvK3BcnBhg==", + "dev": true + }, "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", @@ -10301,6 +10510,20 @@ "performance-now": "^2.1.0" } }, + "railroad-diagrams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", + "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=" + }, + "randexp": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", + "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", + "requires": { + "discontinuous-range": "1.0.0", + "ret": "~0.1.10" + } + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -10343,6 +10566,8 @@ }, "react": { "version": "16.13.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.13.0.tgz", + "integrity": "sha512-TSavZz2iSLkq5/oiE7gnFzmURKZMltmi193rm5HEoUDAXpzT9Kzw6oNZnGoai/4+fUnm7FqS5dwgUL34TujcWQ==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -10432,6 +10657,11 @@ "path-exists": "^4.0.0" } }, + "immer": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz", + "integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg==" + }, "json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", @@ -10509,6 +10739,8 @@ }, "react-dom": { "version": "16.13.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.0.tgz", + "integrity": "sha512-y09d2c4cG220DzdlFkPTnVvGTszVvNpC73v+AaLGLHbkpy3SSgvYq8x0rNwPJ/Rk/CicTNgk0hbHNw1gMEZAXg==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -10528,6 +10760,8 @@ }, "react-scripts": { "version": "3.4.0", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.4.0.tgz", + "integrity": "sha512-pBqaAroFoHnFAkuX+uSK9Th1uEh2GYdGY2IG1I9/7HmuEf+ls3lLCk1p2GFYRSrLMz6ieQR/SyN6TLIGK3hKRg==", "requires": { "@babel/core": "7.8.4", "@svgr/webpack": "4.3.3", @@ -10722,6 +10956,34 @@ "strip-indent": "^3.0.0" } }, + "redux": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz", + "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==", + "requires": { + "loose-envify": "^1.4.0", + "symbol-observable": "^1.2.0" + } + }, + "redux-devtools-extension": { + "version": "2.13.8", + "resolved": "https://registry.npmjs.org/redux-devtools-extension/-/redux-devtools-extension-2.13.8.tgz", + "integrity": "sha512-8qlpooP2QqPtZHQZRhx3x3OP5skEV1py/zUdMY28WNAocbafxdG2tRD1MWE7sp8obGMNYuLWanhhQ7EQvT1FBg==" + }, + "redux-immutable-state-invariant": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/redux-immutable-state-invariant/-/redux-immutable-state-invariant-2.1.0.tgz", + "integrity": "sha512-3czbDKs35FwiBRsx/3KabUk5zSOoTXC+cgVofGkpBNv3jQcqIe5JrHcF5AmVt7B/4hyJ8MijBIpCJ8cife6yJg==", + "requires": { + "invariant": "^2.1.0", + "json-stringify-safe": "^5.0.1" + } + }, + "redux-thunk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.3.0.tgz", + "integrity": "sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==" + }, "regenerate": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", @@ -10948,6 +11210,11 @@ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, + "reselect": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.0.0.tgz", + "integrity": "sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA==" + }, "resolve": { "version": "1.15.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", @@ -11963,6 +12230,16 @@ } } }, + "string.prototype.padend": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.0.tgz", + "integrity": "sha512-3aIv8Ffdp8EZj8iLwREGpQaUZiPyrWrpzMBHvkiSW/bK/EGve9np07Vwy7IJ5waydpGXzQZu/F8Oze2/IWkBaA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, "string.prototype.trimleft": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", @@ -12076,6 +12353,8 @@ }, "styled-components": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.0.1.tgz", + "integrity": "sha512-E0xKTRIjTs4DyvC1MHu/EcCXIj6+ENCP8hP01koyoADF++WdBUOrSGwU1scJRw7/YaYOhDvvoad6VlMG+0j53A==", "requires": { "@babel/helper-module-imports": "^7.0.0", "@babel/traverse": "^7.4.5", @@ -12209,6 +12488,11 @@ "util.promisify": "~1.0.0" } }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" + }, "symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -12624,7 +12908,9 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "typescript": { - "version": "3.7.5" + "version": "3.7.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz", + "integrity": "sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw==" }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", @@ -12838,7 +13124,9 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { - "version": "7.0.1" + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.1.tgz", + "integrity": "sha512-yqjRXZzSJm9Dbl84H2VDHpM3zMjzSJQ+hn6C4zqd5ilW+7P4ZmLEEqwho9LjP+tGuZlF4xrHQXT0h9QZUS/pWA==" }, "v8-compile-cache": { "version": "2.1.0", @@ -13054,9 +13342,9 @@ }, "dependencies": { "acorn": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", - "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==" + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" }, "cacache": { "version": "12.0.3", diff --git a/yarn.lock b/yarn.lock index 544cb89..a9dbd03 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1748,9 +1748,9 @@ acorn-walk@^6.0.1: integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== acorn@^5.5.3: - version "5.7.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" - integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== + version "5.7.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" + integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== acorn@^6.0.1, acorn@^6.0.4, acorn@^6.2.1: version "6.4.0" From 66ab3116aa23caf469abbf2480fd434222e62f68 Mon Sep 17 00:00:00 2001 From: Peter Hurst Date: Wed, 18 Mar 2020 23:27:07 +0000 Subject: [PATCH 2/6] experiments with story syntax --- src/engine/grid.ts | 61 +++++++++--- src/engine/hasTile.tsx | 27 +++-- src/game/behaviours/hasFaction.ts | 16 +++ src/game/scenes/mage/Familiar.tsx | 4 + src/game/scenes/mage/Mage.tsx | 0 src/game/scenes/mage/WanderingMage.tsx | 77 +++++++++++++++ src/game/scenes/tavern/TavernInterior.tsx | 21 +++- src/game/scenes/tavern/entities.tsx | 114 ++++++++++++++++++++++ src/game/scenes/tavern/maps.ts | 26 +++++ src/game/scenes/tavern/text.ts | 18 +++- 10 files changed, 332 insertions(+), 32 deletions(-) create mode 100644 src/game/behaviours/hasFaction.ts create mode 100644 src/game/scenes/mage/Familiar.tsx create mode 100644 src/game/scenes/mage/Mage.tsx create mode 100644 src/game/scenes/mage/WanderingMage.tsx create mode 100644 src/game/scenes/tavern/entities.tsx create mode 100644 src/game/scenes/tavern/maps.ts diff --git a/src/engine/grid.ts b/src/engine/grid.ts index 201aa77..f595e93 100644 --- a/src/engine/grid.ts +++ b/src/engine/grid.ts @@ -17,15 +17,11 @@ export enum GridLayers { export type Tile = { id: string; - TileComponent: React.ComponentType; + TileComponent: React.ComponentType; layer: GridLayers; position: Vector; entity?: EntityContext; -}; - -type TileHandle = { - tile: Tile; - position: Vector; + state?: any; }; export type Cell = { @@ -67,13 +63,15 @@ export type GridState = { }; export type GridActions = { - addTile: ( + addTile: ( position: Vector, - TileComponent: React.ComponentType, + TileComponent: React.ComponentType, layer?: GridLayers, - entity?: EntityContext - ) => TileHandle; - removeTile: (handle: TileHandle) => void; + entity?: EntityContext, + state?: S + ) => Tile; + updateTileState: (handle: Tile, state: any) => Tile; + removeTile: (handle: Tile) => void; findTiles: (predicate: TileFilterPredicate) => Tile[]; getCell: (at: Vector) => Cell; updateSeen: (seen: SeenGrid) => void; @@ -85,13 +83,21 @@ export const [useGrid, GridProvider] = createContext(); export const [useGridState, GridStateProvider] = createContext(); export const gridMutations = { - addTile: ( + addTile: ( position: Vector, - TileComponent: React.ComponentType, + TileComponent: React.ComponentType, layer: GridLayers = GridLayers.Floor, - entity?: EntityContext + entity?: EntityContext, + state?: S ) => (grid: GridState): [GridState, Tile] => { - const tile: Tile = { TileComponent, id: v4(), layer, position, entity }; + const tile: Tile = { + TileComponent, + id: v4(), + layer, + position, + entity, + state + }; // TODO: Following grid expansion code didn't work (because of immer proxy) // can be reinstated now but need to handle seen grid too // if (!original.map[position.y]) { @@ -113,6 +119,31 @@ export const gridMutations = { tile ]; }, + updateTileState: (handle: Tile, state: any) => ( + grid: GridState + ): [GridState, Tile] => { + const tiles = grid.map[handle.position.y]?.[handle.position.x]?.tiles; + if (!tiles) { + return [grid, handle]; + } + // Slightly contorted map so we can retrieve the newly generated item to return as handle + let newHandle: Tile | undefined; + const newTiles = tiles.map(tile => { + // TODO: Can't remember why refs didn't work and id was needed... + if (tile.id === handle.id) { + newHandle = { ...tile, state }; + return newHandle; + } + return tile; + }); + if (newHandle) { + const newGrid = produce(grid, grid => { + grid.map[handle.position.y][handle.position.x].tiles = newTiles; + }); + return [newGrid, newHandle! || handle]; + } + return [grid, handle]; + }, removeTile: (handle: Tile) => (grid: GridState): [GridState, undefined] => { const tiles = grid.map[handle.position.y]?.[handle.position.x]?.tiles; const index = tiles?.findIndex(tile => tile.id === handle.id); diff --git a/src/engine/hasTile.tsx b/src/engine/hasTile.tsx index 4023fc7..62703e9 100644 --- a/src/engine/hasTile.tsx +++ b/src/engine/hasTile.tsx @@ -1,6 +1,6 @@ -import React, { useEffect } from "react"; +import React, { useEffect, useRef } from "react"; import { hasPosition } from "./hasPosition"; -import { useGrid, GridLayers } from "./grid"; +import { useGrid, GridLayers, TileHandle, Tile } from "./grid"; import { useEntity } from "./useEntitiesState"; import { Emoji } from "../ui/Typography"; @@ -8,21 +8,32 @@ export type TileProps = { TileComponent?: React.ComponentType; }; -export const hasTile = ( - TileComponent: React.ComponentType, - layer?: GridLayers +export const hasTile = ( + TileComponent: React.ComponentType, + layer?: GridLayers, + state?: S ) => { const entity = useEntity(); - const { addTile, removeTile } = useGrid(); + const { addTile, removeTile, updateTileState } = useGrid(); const [position] = hasPosition(null); + const tileRef = useRef(); + useEffect(() => { if (position) { - const tileHandle = addTile(position, TileComponent, layer, entity); - return () => removeTile(tileHandle); + tileRef.current = addTile(position, TileComponent, layer, entity, state); + // TODO: If only position changed, move the tile instead of replace + return () => removeTile(tileRef.current!); } }, [position, TileComponent, addTile, removeTile]); + + useEffect(() => { + // TODO: Hmm ... could go on main effect + if (tileRef.current && tileRef.current.state !== state) { + updateTileState(tileRef.current, state); + } + }, [state]); }; export const tile = (glyph: string) => () => {glyph}; diff --git a/src/game/behaviours/hasFaction.ts b/src/game/behaviours/hasFaction.ts new file mode 100644 index 0000000..7f504f7 --- /dev/null +++ b/src/game/behaviours/hasFaction.ts @@ -0,0 +1,16 @@ +import { useEntityState } from "../../engine/useEntityState"; +export enum Factions { + // Player themselves, and allies + Player, + // Typical monster, will go after player + Monster, + // Shopkeepers and quest givers, not targetted + NPC, + // In faction by themselves, will go after anyone + Self +} + +const FactionStateKey = Symbol("Faction"); + +export const hasFaction = (faction: Factions) => + useEntityState(FactionStateKey, faction); diff --git a/src/game/scenes/mage/Familiar.tsx b/src/game/scenes/mage/Familiar.tsx new file mode 100644 index 0000000..ec814d6 --- /dev/null +++ b/src/game/scenes/mage/Familiar.tsx @@ -0,0 +1,4 @@ + +enum + +export const Familiar \ No newline at end of file diff --git a/src/game/scenes/mage/Mage.tsx b/src/game/scenes/mage/Mage.tsx new file mode 100644 index 0000000..e69de29 diff --git a/src/game/scenes/mage/WanderingMage.tsx b/src/game/scenes/mage/WanderingMage.tsx new file mode 100644 index 0000000..2782500 --- /dev/null +++ b/src/game/scenes/mage/WanderingMage.tsx @@ -0,0 +1,77 @@ +import React, { useRef } from "react"; +import { RoadLayout } from "../../biomes/plains/RoadLayout"; + +// TODO: +// Many scenes (e.g. this, tavern) are transferrable to different biomes. RoadLayout would come from the biome tagged as "OutdoorsLayout", +// (or it could internally adapt different road/floor tiles and other inserts for misc entities). It will still produce flags to place +// additional scene elements at roadside or wherever. Need to ensure a definite spawn order: the tavern should spawn before any flora/fauna +// so it doesn't spawn solid materials on top of wildlife. +// Something like the mage can adapt with different costumes and inventory. Familiar could be biome-appropriate animal. + +export const WanderingMage = () => { + const mageRef = useRef(); + + const state = useStory`( +By the side of the track you see $(wizard=$(gender)Kinds)), +accompanied by $(familiar=$familiars). looks up as +you approach, cocks $possessivePronoun head on one side, and $observes. +) + +appearance: +mangy +shabby +ragged +twitchy +scrawny + +genders: +male +female + +maleKinds: +mage +wizard +sorceror + +femaleKinds: +mage +witch +enchantress + +familiars: +cat +dog +rabbit +bat + +subjectPronoun: +he + +possessivePronoun: +[$gender=female]her +[$gender=male]his + +observes: +swints sideways at you +glares in your direction +puzzledly watches you +gazes at a point several feet behind you +hurls a fireball in your direction! ${warningFireball} It narrowly missing you. "Just a warning shot," $subjectPronoun says, $seriously. + +seriously: +pointedly +seriously +threateningly +intimidatingly +weightily +gruffly +`; + + return ( + <> + + + + + ); +}; diff --git a/src/game/scenes/tavern/TavernInterior.tsx b/src/game/scenes/tavern/TavernInterior.tsx index a1776b4..43fa538 100644 --- a/src/game/scenes/tavern/TavernInterior.tsx +++ b/src/game/scenes/tavern/TavernInterior.tsx @@ -1,10 +1,11 @@ import React, { useMemo, useEffect } from "react"; import { Room } from "../../levels/Room"; -import { multiply, vector } from "../../../engine/vector"; +import { multiply, subtract } from "../../../engine/vector"; import { TavernState } from "./types"; import { useTerminal } from "../../../engine/terminal"; import { tavernInteriorDescription } from "./text"; import { useRng } from "../../../engine/useRng"; +import { Patron, Barkeep } from "./entities"; type Props = { state: TavernState }; @@ -17,10 +18,20 @@ export const TavernInterior = ({ state }: Props) => { useEffect(() => { terminal.write(tavernInteriorDescription(rng, { tavernName: state.name })); }); - const [size, origin] = useMemo(() => { + const [size, origin, doors] = useMemo(() => { const size = multiply(state.size, 2); - const origin = vector(40, 40); - return [size, origin]; + const origin = subtract(state.spawn!, multiply(state.door, 2)); + const doors = [state.door]; + return [size, origin, doors]; }, [state.size]); - return ; + return ( + + + + + + + + + ); }; diff --git a/src/game/scenes/tavern/entities.tsx b/src/game/scenes/tavern/entities.tsx new file mode 100644 index 0000000..3287e17 --- /dev/null +++ b/src/game/scenes/tavern/entities.tsx @@ -0,0 +1,114 @@ +import React from "react"; +import { Emoji } from "../../../ui/Typography"; +import { hasRandomMovement } from "../../behaviours/hasRandomMovement"; +import { hasTile } from "../../../engine/hasTile"; +import { stats, hasStats } from "../../../engine/hasStats"; +import { Monster } from "../../meta/Monster"; +import { Card, Description } from "../../../ui/Card"; +import { Name } from "../../meta/Name"; +import { patronBanter } from "./text"; +import { onTurn } from "../../../engine/game"; +import { useRng } from "../../../engine/useRng"; +import { useTerminal } from "../../../engine/terminal"; +import { GridLayers } from "../../../engine/grid"; +import { useEntityState } from "../../../engine/useEntityState"; +import { hasFaction, Factions } from "../../behaviours/hasFaction"; +import { text } from "../../../engine/text/parse"; + +enum BarkeepPose { + Normal, + Sweating +} + +type BarkeepTileProps = { + pose?: BarkeepPose; +}; + +const barkeepFaces = { + [BarkeepPose.Normal]: "😃", + [BarkeepPose.Sweating]: "😅" +}; + +const BarkeepTile = ({ pose = BarkeepPose.Normal }: BarkeepTileProps) => { + return {barkeepFaces[pose]}; +}; + +const barkeepStats = stats(30, 20, 6, 5, 10); + +type BarkeepState = { + pose: BarkeepPose; +}; + +const BarkeepStateKey = Symbol("Barkeep"); +const initialState = { pose: BarkeepPose.Normal }; + +const barkeepActivities = text` +spits in a glass and begins polishing it with a filthy rag +begins pushing grime around the floor with an even grimier mop +humming an out-of-time tune +glaring at customers sullenly +arguing with a drunk who has not paid their tab since the last moon +`; + +export const Barkeep = () => { + const rng = useRng(); + const terminal = useTerminal(); + const [state, setState] = useEntityState( + BarkeepStateKey, + initialState + ); + hasTile(BarkeepTile, GridLayers.Actor, state); + hasStats(barkeepStats); + // TODO: Switch between movements depending on faction + hasRandomMovement(); + const faction = hasFaction(Factions.NPC); + + return ( + + + Barkeep + + A grisled and experienced tavern landlord. + + + + ); +}; + +const PatronTile = () => ( + <> + 😁 + 🍺 + +); + +const patronStats = stats(20, 10, 4, 2, 7); + +export const Patron = () => { + const rng = useRng(); + const terminal = useTerminal(); + hasTile(PatronTile); + hasStats(patronStats); + // TODO: Switch between movements depending on faction + hasRandomMovement(); + const faction = hasFaction(Faction.Player); + + onTurn(() => { + terminal.write(patronBanter(rng)); + }); + + return ( + + + Beer-swilling patron + + This inebriate reeks of stale beer and has a distinctly + unwashed look about them. + {faction !== Faction.Player + ? `They are not looking too friendly.` + : `They are stumbling around happily.`} + + + + ); +}; diff --git a/src/game/scenes/tavern/maps.ts b/src/game/scenes/tavern/maps.ts new file mode 100644 index 0000000..0f7f74b --- /dev/null +++ b/src/game/scenes/tavern/maps.ts @@ -0,0 +1,26 @@ +export const interior1 = () => { + return map` +########### +#dddddd..♪# +#BBBBBB..☺# +#======...# +#.........# +#cTc...cTc# +#.........# +#.cTc.cTc.# +#.........# +#cTc...cTc# +#####@##### + +# = ${wall} +. = ${floor} +@ = ${door} + ${player} += = ${bar} + (${beer}|) +♪ = ${floor} + ${piano} +☺ = ${floor} + ${pianist} +B = ${floor} + flag(${FLAG_BARKEEP_SPAWN}) +c = ${floor} + ${chair} +T = ${floor} + ${table} + (${beer}|) +d = ${barrel}|${shelves} +`; +}; diff --git a/src/game/scenes/tavern/text.ts b/src/game/scenes/tavern/text.ts index ced928c..945e6e0 100644 --- a/src/game/scenes/tavern/text.ts +++ b/src/game/scenes/tavern/text.ts @@ -37,6 +37,10 @@ Tavern House Shack Hovel +Hall$s +Stable$s +Castle +Manse and: And @@ -74,6 +78,8 @@ Duke Duchess God Knight +Traveller +Had limb: Arm$s @@ -84,11 +90,11 @@ Knee$s (Feet|Foot) Nose Ear$s -Wing$s Bowel$s Heart Eye$s Nostril$s +Wing$s s: s @@ -101,20 +107,24 @@ const wait = (n: number) => "WAIT:" + n; // $Abandoned export const tavernInteriorDescription = text` -(You stoop into the murky atmosphere. "$tavernName" might just be the grubbiest pub you've ever seen. -Someone eyes you shiftily from the other side of the room. In the corner, the piano stops. +(You stoop into the murky atmosphere. "$tavernName" might just be the grubbiest pub you've ever seen... ${wait(2)} $Scene) Scene: $Brawl +$Abandoned Brawl: -(A patron spits on the floor. "You ain't from around 'ere," they grunt. +(...Someone eyes you shiftily from the other side of the room. In the corner, the piano stops. +A patron spits on the floor. "You ain't from around 'ere," they grunt. Before you can reply, another drunk jeers, "Aye that's rich, comin' from a $(slur=XenophobicSlur)!" "'Oo you callin' a $slur?" replies the first. The second hurls their glass in response. Before you know it, the entire bar is embroiled in an out-of-control brawl! ) +Abandoned: +(...But it's completely deserted! A shiver runs down your spine. Half-drained ale flagons are dotted around the hall.) + XenophobicSlur: Southern Florist Midlandser From 5c905fae1e1d5cee022067a0be0c0b6c8e0b7d90 Mon Sep 17 00:00:00 2001 From: Peter Hurst Date: Fri, 20 Mar 2020 02:24:18 +0000 Subject: [PATCH 3/6] stuff --- src/game/scenes/mage/Familiar.tsx | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/game/scenes/mage/Familiar.tsx b/src/game/scenes/mage/Familiar.tsx index ec814d6..6683230 100644 --- a/src/game/scenes/mage/Familiar.tsx +++ b/src/game/scenes/mage/Familiar.tsx @@ -1,4 +1,13 @@ +import React from "react"; +import { Emoji } from "../../../ui/Typography"; -enum +const CatTile = () => 🐈; -export const Familiar \ No newline at end of file +const familiarTypes = { + cat: Cat, + bat: Bat, + rat: Rat, + dog: Dog +}; + +export const Familiar = { owner }; From fc91355b371c7f2932cd5c6ded6b536b4d70d978 Mon Sep 17 00:00:00 2001 From: Peter Hurst Date: Fri, 20 Mar 2020 02:25:59 +0000 Subject: [PATCH 4/6] mage stuff --- src/game/scenes/mage/Mage.tsx | 14 ++++ src/game/scenes/mage/WanderingMage.tsx | 73 ++++++++++++++++-- src/game/scenes/tavern/entities.tsx | 103 +++++++++++++++++++++++++ 3 files changed, 183 insertions(+), 7 deletions(-) diff --git a/src/game/scenes/mage/Mage.tsx b/src/game/scenes/mage/Mage.tsx index e69de29..16c2dd6 100644 --- a/src/game/scenes/mage/Mage.tsx +++ b/src/game/scenes/mage/Mage.tsx @@ -0,0 +1,14 @@ +import { Monster } from "../../meta/Monster"; +// TODO: depending on biome ... +// wearing shades / swimwear +// thick furs +// building a snowman + +const maleVariants = ["🧙‍♂️", "🧙🏻‍♂️", "🧙🏼‍♂️", "🧙🏽‍♂️", "🧙🏾‍♂️", "🧙🏿‍♂️"]; + +const femaleVariants = ["🧙‍♀️", "🧙🏻‍♀️", "🧙🏼‍♀️", "🧙🏽‍♀️", "🧙🏾‍♀️", "🧙🏿‍♀️"]; + +export const Mage = () => { + // TODO: NPC + return ; +}; diff --git a/src/game/scenes/mage/WanderingMage.tsx b/src/game/scenes/mage/WanderingMage.tsx index 2782500..061570f 100644 --- a/src/game/scenes/mage/WanderingMage.tsx +++ b/src/game/scenes/mage/WanderingMage.tsx @@ -1,5 +1,22 @@ import React, { useRef } from "react"; import { RoadLayout } from "../../biomes/plains/RoadLayout"; +import { text } from '../../../engine/text/parse'; +import { entity } from '../../../engine/entity'; +import { Mage } from './Mage'; +import { EntityContext } from '../../../engine/useEntitiesState'; + +// TODO: Figure out a good way to reuse things between text templates + +enum Genders { + Male = "male", + Female = "female" +} + +type WanderingMageState = { + gender: Genders, + name: string, + kind: string +} // TODO: // Many scenes (e.g. this, tavern) are transferrable to different biomes. RoadLayout would come from the biome tagged as "OutdoorsLayout", @@ -8,13 +25,24 @@ import { RoadLayout } from "../../biomes/plains/RoadLayout"; // so it doesn't spawn solid materials on top of wildlife. // Something like the mage can adapt with different costumes and inventory. Familiar could be biome-appropriate animal. -export const WanderingMage = () => { - const mageRef = useRef(); +export const WanderingMageEncounter = entity(() => { + const mageRef = useRef(); - const state = useStory`( -By the side of the track you see $(wizard=$(gender)Kinds)), + const state:WanderingMageState = useStory(()=>{ + const warningFireball = async (state:WanderingMageState) => { + // TODO: Some contortions required here if we want to avoid promises (for savegame support). + // Need a ref to a story handle (2nd arg to this callback) that can be resolved when the fireball lands. + // On rehydate, we'll need to get back to this point and can call this function again; + // and the state that instances the fireball needs to be restored. + // Could handle this by using predetermined id (e.g. "WanderingMageWarningFireball") + // Also consider state machines (useful also for e.g switching behaviours, see Barkeep) + mageRef + return "FWOOOOOOM!" + } + return text`( +By the side of the track you see $(kind=$(gender)Kinds)), accompanied by $(familiar=$familiars). looks up as -you approach, cocks $possessivePronoun head on one side, and $observes. +you approach, cocks $possessivePronoun head on one side, and $observes. The $familiar $familiarVerbs. ) appearance: @@ -41,9 +69,35 @@ enchantress familiars: cat dog -rabbit +rat bat +familiarVerbs: +$(kind=$(familiar)Kinds)) + +catVerbs: +hisses +arches its back +licks its paws +mews + +dogVerbs: +growls +barks +yaps excitedely +says, "Ruff!" +looks hungry + +ratVerbs: +squeaks +scurries under $possessivePronoun robes +casts its beady eyes towards you + +batVerbs: +chitters +doesn't make a sound, but somehow you feel that it did +flaps its leathery wings + subjectPronoun: he @@ -56,7 +110,7 @@ swints sideways at you glares in your direction puzzledly watches you gazes at a point several feet behind you -hurls a fireball in your direction! ${warningFireball} It narrowly missing you. "Just a warning shot," $subjectPronoun says, $seriously. +hurls a fireball in your direction!${warningFireball} It narrowly misses you. "Just a warning shot," $subjectPronoun says, $seriously seriously: pointedly @@ -66,12 +120,17 @@ intimidatingly weightily gruffly `; + } + +// TODO: changing the name should update the state +hasName(state.name||state.kind) return ( <> + {children} ); }; diff --git a/src/game/scenes/tavern/entities.tsx b/src/game/scenes/tavern/entities.tsx index 3287e17..7543661 100644 --- a/src/game/scenes/tavern/entities.tsx +++ b/src/game/scenes/tavern/entities.tsx @@ -75,6 +75,109 @@ export const Barkeep = () => { ); }; +const neutralPerson = [ + "👱", + "👱🏻", + "👱🏼", + "👱🏽", + "👱🏾", + "👱🏿", + "🧓", + "🧓🏻", + "🧓🏼", + "🧓🏽", + "🧓🏾", + "🧓🏿", + "🧑", + "🧑🏻", + "🧑🏼", + "🧑🏽", + "🧑🏾", + "🧑🏿" +]; + +const malePerson = [ + "👴", + "👴🏻", + "👴🏼", + "👴🏽", + "👴🏾", + "👴🏿", + "👨‍🦳", + "👨🏻‍🦳", + "👨🏼‍🦳", + "👨🏽‍🦳", + "👨🏾‍🦳", + "👨🏿‍🦳", + "👱‍♂️", + "👱🏻‍♂️", + "👱🏼‍♂️", + "👱🏽‍♂️", + "👱🏾‍♂️", + "👱🏿‍♂️", + "🧔", + "🧔🏻", + "🧔🏼", + "🧔🏽", + "🧔🏾", + "🧔🏿", + "👨", + "👨🏻", + "👨🏼", + "👨🏽", + "👨🏾", + "👨🏿", + "👨‍🦱", + "👨🏻‍🦱", + "👨🏼‍🦱", + "👨🏽‍🦱", + "👨🏾‍🦱", + "👨🏿‍🦱", + "👨‍🦰", + "👨🏻‍🦰", + "👨🏼‍🦰", + "👨🏽‍🦰", + "👨🏾‍🦰", + "👨🏿‍🦰" +]; +const femalePerson = [ + "👱‍♀️", + "👱🏻‍♀️", + "👱🏼‍♀️", + "👱🏽‍♀️", + "👱🏾‍♀️", + "👱🏿‍♀️", + "👩", + "👩🏻", + "👩🏼", + "👩🏽", + "👩🏾", + "👩🏿", + "👵", + "👵🏻", + "👵🏼", + "👵🏽", + "👵🏾", + "👵🏿", + "👩‍🦱", + "👩🏻‍🦱", + "👩🏼‍🦱", + "👩🏽‍🦱", + "👩🏾‍🦱", + "👩🏿‍🦱", + "👩‍🦰", + "👩🏻‍🦰", + "👩🏼‍🦰", + "👩🏽‍🦰", + "👩🏾‍🦰", + "👩🏿‍🦰", + "👩‍🦳", + "👩🏻‍🦳", + "👩🏼‍🦳", + "👩🏽‍🦳", + "👩🏾‍🦳", + "👩🏿‍🦳" +]; const PatronTile = () => ( <> 😁 From 2fc91084b56d2bcca70663c3f57d7122ed6bbf20 Mon Sep 17 00:00:00 2001 From: Peter Hurst Date: Sun, 17 May 2020 04:23:13 +0100 Subject: [PATCH 5/6] broken story stuff --- src/engine/text/commonFunctions.ts | 25 ++++ src/engine/text/parse.ts | 168 ++++++++++++++++--------- src/engine/useStory.ts | 17 +++ src/engine/useText.ts | 22 ++++ src/game/monsters/Dog.tsx | 78 ++++++++++++ src/game/monsters/Rat.tsx | 2 - src/game/scenes/mage/Familiar.tsx | 28 ++++- src/game/scenes/mage/WanderingMage.tsx | 31 +++-- 8 files changed, 294 insertions(+), 77 deletions(-) create mode 100644 src/engine/text/commonFunctions.ts create mode 100644 src/engine/useStory.ts create mode 100644 src/engine/useText.ts create mode 100644 src/game/monsters/Dog.tsx diff --git a/src/engine/text/commonFunctions.ts b/src/engine/text/commonFunctions.ts new file mode 100644 index 0000000..6185397 --- /dev/null +++ b/src/engine/text/commonFunctions.ts @@ -0,0 +1,25 @@ +import { text } from './parse'; + +const vowels = [ + "a","e","i","o","u" + ] + + // TODO: some dictionary of "an" h-words like hour? + const usesAnForm = (word:string) => vowels.includes(word[0]) + + type AProps = { + word:string + } + +const titleCase = (word:string) => word[0].toLocaleUpperCase() + word.slice(1)s + +export const commonFunctions = text` +a($word): +${({word}: AProps)=> usesAnForm(word) ? "an" : "a"} $word + +title: +${titleCase} + +null: +! +` diff --git a/src/engine/text/parse.ts b/src/engine/text/parse.ts index 2dcf03b..06c6af8 100644 --- a/src/engine/text/parse.ts +++ b/src/engine/text/parse.ts @@ -47,11 +47,11 @@ type MainAST = ContentChoiceAST & { type ImportLabels = Record; -export type ParsedText = ( - rng: RNG, - variables?: Record, - importLabels?: ImportLabels -) => string; +const ERROR_MAIN : MainAST = { + type:"main", + choices: [] + labels: [] +} const createLabelsFromObject = (labels: ImportLabels) => Object.entries(labels).map(([key, value]) => ({ @@ -63,13 +63,13 @@ const createLabelsFromObject = (labels: ImportLabels) => { type: "choice", content: { type: "text", text: value } as ContentTextAST, - weight: 10 - } as ChoiceAST + weight: 10, + } as ChoiceAST, ] - : ((Array.isArray(value) ? value : [value]) as ChoiceAST[]) + : ((Array.isArray(value) ? value : [value]) as ChoiceAST[]), })); -export const parse = (input: string): ParsedText => { +export const parse = (input: string): MainAST => { const parser = new nearley.Parser( nearley.Grammar.fromCompiled(grammar as nearley.CompiledRules) ); @@ -80,68 +80,118 @@ export const parse = (input: string): ParsedText => { console.error("Unparseable text:"); console.error(input); console.error(error); - return () => ""; + throw new Error("Unparseable text"); } const main = (parsed.results[0] as unknown) as MainAST; if (main === undefined) { console.error("Undefined main:"); console.error(input); console.error(parsed); - return () => ""; + throw new Error("Undefined main"); } - const execute = ( + return main; +}; + +export const executeText = ( + main: MainAST, + rng: RNG, + variables: Record = {}, + externals: any[] = [], + importLabels?: ImportLabels +) => { + let mergedLabels = importLabels + ? [...main.labels, ...createLabelsFromObject(importLabels)] + : main.labels; + const processContent = (content: ContentAST): string => { + if (Array.isArray(content)) { + return content.map((choice) => processContent(choice)).join(""); + } + switch (content.type) { + case "text": + return (content as ContentTextAST).text; + case "choices": + case "main": + case "label": + const choices = (content as ContentChoiceAST).choices; + const chosen = rng.pick(choices); + return processContent(chosen.content); + case "substitution": + case "assignment": + const label = content as ContentSubstitutionAST; + let found; + if (Object.prototype.hasOwnProperty.call(variables, label.label)) { + found = variables[label.label]; + } else { + found = mergedLabels.find((l) => l.name === label.label); + } + if (found === undefined) { + return ``; + } + const result = + typeof found === "string" ? found : processContent(found); + if (content.type === "assignment") { + variables[(content as ContentAssignmentAST).variable] = result; + } + return result; + case "function": + const functionNode = content as FunctionAST; + switch (functionNode.name) { + case "OUT": + break; + } + default: + throw new Error("Unknown content type: " + content.type); + } + }; + return processContent(main); +}; + +export type ParsedTextTemplate = { + main: MainAST; + externals: any[]; + render: ( rng: RNG, - variables: Record = {}, + variables?: Record, importLabels?: ImportLabels - ) => { - let mergedLabels = importLabels - ? [...main.labels, ...createLabelsFromObject(importLabels)] - : main.labels; - const processContent = (content: ContentAST): string => { - if (Array.isArray(content)) { - return content.map(choice => processContent(choice)).join(""); - } - switch (content.type) { - case "text": - return (content as ContentTextAST).text; - case "choices": - case "main": - case "label": - const choices = (content as ContentChoiceAST).choices; - const chosen = rng.pick(choices); - return processContent(chosen.content); - case "substitution": - case "assignment": - const label = content as ContentSubstitutionAST; - let found; - if (Object.prototype.hasOwnProperty.call(variables, label.label)) { - found = variables[label.label]; - } else { - found = mergedLabels.find(l => l.name === label.label); - } - if (found === undefined) { - return ``; - } - const result = - typeof found === "string" ? found : processContent(found); - if (content.type === "assignment") { - variables[(content as ContentAssignmentAST).variable] = result; - } - return result; - default: - throw new Error("Unknown content type: " + content.type); - } - }; - return processContent(main); - }; - return execute; + ) => string; }; -export const text = (input: TemplateStringsArray, ...interpolations: any[]) => { +export const text = ( + input: TemplateStringsArray, + ...interpolations: any[] +): ParsedTextTemplate => { const flattened = input - .map(value => { - return value; + .map((fragment, i) => { + if (interpolations[i]) { + return `${fragment}`; + } + return fragment; }) .join(""); - return parse(flattened); + try { + const main = parse(flattened); + const externals = interpolations.slice(); + + return { + main, + externals, + render: ( + rng: RNG, + variables?: Record, + importLabels?: ImportLabels, + ) => executeText(main, rng, variables, externals, importLabels), + stream: ( + rng: RNG, + currentState: S, + variables?: Record, + importLabels?: ImportLabels, + ) => executeText(main, rng, currentState, externals, importLabels) + }; + } catch (e) { + return { + main: ERROR_MAIN, + externals: [], + render: () => `` + } + } }; diff --git a/src/engine/useStory.ts b/src/engine/useStory.ts new file mode 100644 index 0000000..ef7e8ed --- /dev/null +++ b/src/engine/useStory.ts @@ -0,0 +1,17 @@ +import { useState, useRef } from "react"; +import { parse } from "./text/parse"; + +export const useStory = (initializer, defaultState = {}) => { + // TODO: implement persistedState already + const [state, setState] = useState(null!); + // Quite a cheap hack. Maybe need to use useEffect, but it's nice if the story + // runs straight away so state that gets set can be used immediately. + // If state changes do we re-run initializer? Need a system to record rng decisions? + const firstRef = useRef(false); + const mainRef = useRef(); + if (!mainRef.current) { + firstRef.current = true; + mainRef.current = initializer(); + } + const main = mainRef.current; +}; diff --git a/src/engine/useText.ts b/src/engine/useText.ts new file mode 100644 index 0000000..20dd134 --- /dev/null +++ b/src/engine/useText.ts @@ -0,0 +1,22 @@ +import { useRng } from "./useRng"; + +export const useText = (text: ParsedText) => { + const rng = useRng(); + + return; +}; + +useMemo(() => { + const parsed = text` +(*$tavernName* welcomes +careful drunks) +(Menu +- Beer +- Beer +- Beer!) +(😁 Happy Hour! +All day long!!) +`; + + return parsed(rng, { tavernName }); +}, []); diff --git a/src/game/monsters/Dog.tsx b/src/game/monsters/Dog.tsx new file mode 100644 index 0000000..8a07f5d --- /dev/null +++ b/src/game/monsters/Dog.tsx @@ -0,0 +1,78 @@ +import React from "react"; +import { hasTile } from "../../engine/hasTile"; +import { Monster } from "../meta/Monster"; +import { entity } from "../../engine/entity"; +import { hasStats, stats } from "../../engine/hasStats"; +import { GridLayers } from "../../engine/grid"; +import { hasRandomMovement } from "../behaviours/hasRandomMovement"; +import { Card, Description } from "../../ui/Card"; +import { Name } from "../meta/Name"; +import { Emoji } from "../../ui/Typography"; +import { text } from "../../engine/text/parse"; + +/* react-custom-renderer */ + +const ratStats = stats(6, 4, 5, 1, 10); + +const DogTile = () => 🐕; + +const nameText = text` +$one$two + +one: +Ro +Fi +Ri +La +Ca + +two: +ver +do +ssie +stro +zlo +zla +`; + +const descriptionText = text` +$title($a({nouny} {verb})) + +nouny: +mangy +contented +fuzzy +fluffy +dopey + +verb: +pooch +$(gender=male)good boy +$(gender=female)good girl +mutt +pup +`; + +export const Dog = entity(() => { + hasTile(DogTile, GridLayers.Actor); + hasStats(ratStats); + hasRandomMovement(); + + return ( + <> + Dog + + + ${description} + + + + ); +}); + +export const Dog = commonActor({ + name: "Dog", + tile: "🐕", + description, + stats: stats(6, 4, 5, 1, 10), +}); diff --git a/src/game/monsters/Rat.tsx b/src/game/monsters/Rat.tsx index 8e3b93b..be4411a 100644 --- a/src/game/monsters/Rat.tsx +++ b/src/game/monsters/Rat.tsx @@ -29,5 +29,3 @@ export const Rat = entity(() => { ); }); - -/* react-custom-renderer */ diff --git a/src/game/scenes/mage/Familiar.tsx b/src/game/scenes/mage/Familiar.tsx index 6683230..4b0b398 100644 --- a/src/game/scenes/mage/Familiar.tsx +++ b/src/game/scenes/mage/Familiar.tsx @@ -1,13 +1,35 @@ -import React from "react"; +import React, { useState, Props } from "react"; import { Emoji } from "../../../ui/Typography"; +import { useRng } from "../../../engine/useRng"; +import { EntityContext } from "../../../engine/useEntitiesState"; const CatTile = () => 🐈; +const DogTile = () => 🐕; const familiarTypes = { cat: Cat, bat: Bat, rat: Rat, - dog: Dog + dog: Dog, }; -export const Familiar = { owner }; +type Props = { + owner: EntityContext; +}; + +export const Familiar = ({ owner }: Props) => { + const rng = useRng(); + + /* TODO: Could theoretically change type at any point to morph the familiar. + This useState should be converted to some kind of "usePersistedState". + Or. Does Familiar become another entity with its own state */ + const [familiarType] = useState(() => rng.pick(Object.keys(familiarTypes))); + + const FamiliarComponent = familiarTypes[familiarType]; + + return ( + + + + ); +}; diff --git a/src/game/scenes/mage/WanderingMage.tsx b/src/game/scenes/mage/WanderingMage.tsx index 061570f..e8b9eaa 100644 --- a/src/game/scenes/mage/WanderingMage.tsx +++ b/src/game/scenes/mage/WanderingMage.tsx @@ -4,6 +4,8 @@ import { text } from '../../../engine/text/parse'; import { entity } from '../../../engine/entity'; import { Mage } from './Mage'; import { EntityContext } from '../../../engine/useEntitiesState'; +import { useStory } from "../../../engine/useStory"; +import { commonFunctions } from "../../../engine/text/commonFunctions"; // TODO: Figure out a good way to reuse things between text templates @@ -12,7 +14,7 @@ enum Genders { Female = "female" } -type WanderingMageState = { +type WanderingMageStory = { gender: Genders, name: string, kind: string @@ -28,8 +30,8 @@ type WanderingMageState = { export const WanderingMageEncounter = entity(() => { const mageRef = useRef(); - const state:WanderingMageState = useStory(()=>{ - const warningFireball = async (state:WanderingMageState) => { + const [story, dispatch] = useStory(()=>{ + const warningFireball = async (state:WanderingMageStory) => { // TODO: Some contortions required here if we want to avoid promises (for savegame support). // Need a ref to a story handle (2nd arg to this callback) that can be resolved when the fireball lands. // On rehydate, we'll need to get back to this point and can call this function again; @@ -39,12 +41,14 @@ export const WanderingMageEncounter = entity(() => { mageRef return "FWOOOOOOM!" } - return text`( -By the side of the track you see $(kind=$(gender)Kinds)), -accompanied by $(familiar=$familiars). looks up as + return text`( +By the side of the track you see $(kind=$(gender)Kinds)), +accompanied by $(familiar=$familiars). looks up as you approach, cocks $possessivePronoun head on one side, and $observes. The $familiar $familiarVerbs. ) +${commonFunctions /* a, title, etc. */ } + appearance: mangy shabby @@ -73,7 +77,7 @@ rat bat familiarVerbs: -$(kind=$(familiar)Kinds)) +$(kind=$(familiars)Verbs)) catVerbs: hisses @@ -99,18 +103,19 @@ doesn't make a sound, but somehow you feel that it did flaps its leathery wings subjectPronoun: -he +<$gender==female?s>he possessivePronoun: -[$gender=female]her -[$gender=male]his +[$gender==female]her +[$gender==male]his observes: swints sideways at you glares in your direction puzzledly watches you gazes at a point several feet behind you -hurls a fireball in your direction!${warningFireball} It narrowly misses you. "Just a warning shot," $subjectPronoun says, $seriously +hurls a fireball in your direction! ${warningFireball} It narrowly misses you. "Just a warning shot," $subjectPronoun says, $seriously +[1%]hurls a fireball in your direction!${ seriously: pointedly @@ -128,8 +133,8 @@ hasName(state.name||state.kind) return ( <> - - + + {children} ); From 12a3dfb518e39d97531867afaa2dae68a406b09e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 7 Jun 2020 22:54:56 +0000 Subject: [PATCH 6/6] Bump websocket-extensions from 0.1.3 to 0.1.4 Bumps [websocket-extensions](https://github.com/faye/websocket-extensions-node) from 0.1.3 to 0.1.4. - [Release notes](https://github.com/faye/websocket-extensions-node/releases) - [Changelog](https://github.com/faye/websocket-extensions-node/blob/master/CHANGELOG.md) - [Commits](https://github.com/faye/websocket-extensions-node/compare/0.1.3...0.1.4) Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- yarn.lock | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3f028b8..7a1c136 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13784,9 +13784,9 @@ } }, "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" }, "whatwg-encoding": { "version": "1.0.5", diff --git a/yarn.lock b/yarn.lock index a9dbd03..b34fba5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10472,9 +10472,9 @@ websocket-driver@>=0.5.1: websocket-extensions ">=0.1.1" websocket-extensions@>=0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" - integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5: version "1.0.5"