From a1257545256cabef1a9a63c9afd24c9c9e3b77c7 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Thu, 3 Oct 2019 23:11:43 -0500 Subject: [PATCH 001/103] remove vue. webpacker => 4.0.7. babel-core => 7.6.2. Trashed package-lock.json. --- Gemfile.lock | 2 +- app/javascript/packs/search.js | 103 +--------- app/javascript/search_ex_editor.vue | 280 ---------------------------- config/webpack/environment.js | 4 - config/webpack/loaders/vue.js | 6 - config/webpacker.yml | 1 - package.json | 7 +- yarn.lock | 221 +++++++++++++--------- 8 files changed, 142 insertions(+), 482 deletions(-) delete mode 100644 app/javascript/search_ex_editor.vue delete mode 100644 config/webpack/loaders/vue.js diff --git a/Gemfile.lock b/Gemfile.lock index 31b5f5cb..de6815ec 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -253,7 +253,7 @@ GEM activemodel (>= 5.0) bindex (>= 0.4.0) railties (>= 5.0) - webpacker (4.0.0.rc.7) + webpacker (4.0.7) activesupport (>= 4.2) rack-proxy (>= 0.6.1) railties (>= 4.2) diff --git a/app/javascript/packs/search.js b/app/javascript/packs/search.js index e7908aae..7257cf8a 100644 --- a/app/javascript/packs/search.js +++ b/app/javascript/packs/search.js @@ -3,13 +3,8 @@ // to the head of your layout file, // like app/views/layouts/application.html.erb. -import Vue from "vue/dist/vue.esm" -import Vuex from "vuex/dist/vuex.esm" import { SearchEx } from "../search_ex.js" import LibFigure from "../libfigure/libfigure.js" -import SearchExEditor from "../search_ex_editor.vue" - -Vue.use(Vuex) function selectChooserNameOptions(dialect) { return { @@ -124,71 +119,6 @@ const radioChooserNameOptions = { chooser_half_or_full: ["*", [0.5, "half"], [1.0, "full"]], } -const store = new Vuex.Store({ - state: { - lisp: ["and", ["figure", "*"], ["progression"]], - dialect: LibFigure.defaultDialect, - tagNames: [], - radioChooserNameOptions: Object.freeze(radioChooserNameOptions), - }, - getters: { - searchEx: state => SearchEx.fromLisp(state.lisp), - selectChooserNameOptions: state => selectChooserNameOptions(state.dialect), - }, - actions: SearchEx.allProps().reduce( - (hash, prop) => { - if (prop !== "op" && prop !== "move") { - const propName = SearchEx.mutationNameForProp(prop) - hash[propName] = function({ commit, state, getters }, payload) { - let searchEx = getters.searchEx.copy() - getSearchExAtPath(searchEx, payload.path)[prop] = payload[prop] - commit("setRootSearchEx", searchEx) - } - } - return hash - }, - { - setOp({ commit, state, getters }, { path, op }) { - const rootSearchEx = getters.searchEx.copy() - const newSearchEx = getSearchExAtPath(rootSearchEx, path).castTo(op) - commit( - "setRootSearchEx", - setSearchExAtPath(newSearchEx, rootSearchEx, path) - ) - }, - setMove({ commit, state, getters }, payload) { - const rootSearchEx = getters.searchEx - const searchEx = getSearchExAtPath(rootSearchEx, payload.path) - searchEx.move = payload.move // destructive! - commit("setRootSearchEx", rootSearchEx) // should I be calling some other, more fine-grained mutation? - }, - setParameter({ commit, state, getters }, { path, index, value }) { - const rootSearchEx = getters.searchEx - let searchEx = getSearchExAtPath(rootSearchEx, path) - searchEx.parameters[index] = value // destructive! - commit("setRootSearchEx", rootSearchEx) // should I be calling some other, more fine-grained mutation? - }, - deleteSearchEx({ commit, state, getters }, { path }) { - const rootSearchEx = getters.searchEx - if (path.length) { - let searchEx = rootSearchEx - for (let i = 0; i < path.length - 1; i++) - searchEx = searchEx.subexpressions[path[i]] - searchEx.subexpressions.splice(path[path.length - 1], 1) - commit("setRootSearchEx", rootSearchEx) // should I be calling some other, more fine-grained mutation? - } else { - // silently fail to delete root node. It shouldn't be an option anyway. - } - }, - } - ), - mutations: { - setRootSearchEx(state, rootSearchEx) { - state.lisp = rootSearchEx.toLisp() - }, - }, -}) - function getSearchExAtPath(rootSearchEx, path) { return path.reduce( (searchEx, subExIndex) => searchEx.subexpressions[subExIndex], @@ -196,41 +126,12 @@ function getSearchExAtPath(rootSearchEx, path) { ) } -// modifies substructure, AND you have to pay attention to the return value. -function setSearchExAtPath(valueSearchEx, rootSearchEx, path) { - if (path.length) { - let searchEx = rootSearchEx - for (let i = 0; i < path.length - 1; i++) { - searchEx = searchEx.subexpressions[path[i]] - } - searchEx.subexpressions[path[path.length - 1]] = valueSearchEx - return rootSearchEx - } else { - return valueSearchEx - } -} - -document.addEventListener("DOMContentLoaded", () => { - var search = new Vue({ - el: "#search-app", - store, - data: {}, - template: `

state.lisp: {{$store.state.lisp}}

state.dialect: {{$store.state.dialect}}

`, - components: { - SearchExEditor, - }, - methods: { - // wrap() {this.$store.commit('wrap', {name: 'wrap'});} - }, - }) -}) - //////////////////////////////////////////////////////////////// // init function initFromDom() { - store.state.dialect = JSON.parse($("#dialect-json").text()) - store.state.tagNames = JSON.parse($("#tag-names-json").text()) + // store.state.dialect = JSON.parse($('#dialect-json').text()); + // store.state.tagNames = JSON.parse($('#tag-names-json').text()); } $(initFromDom) diff --git a/app/javascript/search_ex_editor.vue b/app/javascript/search_ex_editor.vue deleted file mode 100644 index 20ad6716..00000000 --- a/app/javascript/search_ex_editor.vue +++ /dev/null @@ -1,280 +0,0 @@ - - - - - diff --git a/config/webpack/environment.js b/config/webpack/environment.js index 6ef014b0..d16d9af7 100644 --- a/config/webpack/environment.js +++ b/config/webpack/environment.js @@ -1,7 +1,3 @@ const { environment } = require('@rails/webpacker') -const { VueLoaderPlugin } = require('vue-loader') -const vue = require('./loaders/vue') -environment.plugins.prepend('VueLoaderPlugin', new VueLoaderPlugin()) -environment.loaders.prepend('vue', vue) module.exports = environment diff --git a/config/webpack/loaders/vue.js b/config/webpack/loaders/vue.js deleted file mode 100644 index 509c742b..00000000 --- a/config/webpack/loaders/vue.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - test: /\.vue(\.erb)?$/, - use: [{ - loader: 'vue-loader' - }] -} diff --git a/config/webpacker.yml b/config/webpacker.yml index 125c36bf..6fd53121 100644 --- a/config/webpacker.yml +++ b/config/webpacker.yml @@ -34,7 +34,6 @@ default: &default - .woff2 extensions: - - .vue - .mjs - .js - .sass diff --git a/package.json b/package.json index 69444f8e..979e82ae 100644 --- a/package.json +++ b/package.json @@ -3,12 +3,7 @@ "@babel/core": "^7.2.2", "@babel/preset-env": "^7.3.1", "@rails/webpacker": "^4.0.0-rc.7", - "babel-loader": "^8.0.5", - "vue": "^2.5.22", - "vue-bootstrap-toggle": "^1.1.4", - "vue-loader": "^15.6.2", - "vue-template-compiler": "^2.5.22", - "vuex": "^3.1.0" + "babel-loader": "^8.0.5" }, "devDependencies": { "jest": "^24.8.0", diff --git a/yarn.lock b/yarn.lock index db8b5772..f4f7e591 100644 --- a/yarn.lock +++ b/yarn.lock @@ -242,10 +242,23 @@ version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.5.tgz#a974cfae1e37c3110e71f3c6a2e48b8e71958cd4" integrity sha512-AF79FsnWFxjlaosgdi421vmYG6/jg79bVD0dpD44QdgobzHKuLZ6S3vl8la9qIeSwGi8i1fS0O1mfuDAAdo1/A== +<<<<<<< HEAD + dependencies: + "@babel/helper-create-class-features-plugin" "^7.5.5" +======= dependencies: "@babel/helper-create-class-features-plugin" "^7.5.5" "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-proposal-dynamic-import@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz#e532202db4838723691b10a67b8ce509e397c506" + integrity sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw== + dependencies: +>>>>>>> remove vue. webpacker => 4.0.7. babel-core => 7.6.2. Trashed package-lock.json. + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-dynamic-import" "^7.2.0" + "@babel/plugin-proposal-dynamic-import@^7.5.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz#e532202db4838723691b10a67b8ce509e397c506" @@ -505,6 +518,16 @@ version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== +<<<<<<< HEAD + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-regenerator@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" + integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA== + dependencies: +======= dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -513,6 +536,7 @@ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA== dependencies: +>>>>>>> remove vue. webpacker => 4.0.7. babel-core => 7.6.2. Trashed package-lock.json. regenerator-transform "^0.14.0" "@babel/plugin-transform-reserved-words@^7.2.0": @@ -633,6 +657,30 @@ invariant "^2.2.2" js-levenshtein "^1.1.3" semver "^5.5.0" +<<<<<<< HEAD + +"@babel/runtime@^7.4.2", "@babel/runtime@^7.4.5": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.6.2.tgz#c3d6e41b304ef10dcf13777a33e7694ec4a9a6dd" + integrity sha512-EXxN64agfUqqIGeEjI5dL5z0Sw0ZwWo1mLTi4mQowCZ42O59b7DRpZAnTC6OqdF28wMBMFKNb/4uFGrVaigSpg== + dependencies: + regenerator-runtime "^0.13.2" + +"@babel/template@^7.1.0", "@babel/template@^7.4.0", "@babel/template@^7.4.4", "@babel/template@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6" + integrity sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.6.0" + "@babel/types" "^7.6.0" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5", "@babel/traverse@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.2.tgz#b0e2bfd401d339ce0e6c05690206d1e11502ce2c" + integrity sha512-8fRE76xNwNttVEF2TwxJDGBLWthUkHWSldmfuBzVRmEDWOtu4XdINTgN7TDWzuLg4bbeIMLvfMFD9we5YcWkRQ== + dependencies: +======= "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.5": version "7.6.2" @@ -655,6 +703,7 @@ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.2.tgz#b0e2bfd401d339ce0e6c05690206d1e11502ce2c" integrity sha512-8fRE76xNwNttVEF2TwxJDGBLWthUkHWSldmfuBzVRmEDWOtu4XdINTgN7TDWzuLg4bbeIMLvfMFD9we5YcWkRQ== dependencies: +>>>>>>> remove vue. webpacker => 4.0.7. babel-core => 7.6.2. Trashed package-lock.json. "@babel/code-frame" "^7.5.5" "@babel/generator" "^7.6.2" "@babel/helper-function-name" "^7.1.0" @@ -978,6 +1027,7 @@ dependencies: "@types/yargs-parser" "*" +<<<<<<< HEAD "@vue/component-compiler-utils@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-3.0.0.tgz#d16fa26b836c06df5baaeb45f3d80afc47e35634" @@ -993,6 +1043,8 @@ source-map "~0.6.1" vue-template-es2015-compiler "^1.9.0" +======= +>>>>>>> remove vue. webpacker => 4.0.7. babel-core => 7.6.2. Trashed package-lock.json. "@webassemblyjs/ast@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" @@ -1412,6 +1464,7 @@ atob@^2.1.1: integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== autoprefixer@^9.6.1: +<<<<<<< HEAD version "9.6.4" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.6.4.tgz#e6453be47af316b2923eaeaed87860f52ad4b7eb" integrity sha512-Koz2cJU9dKOxG8P1f8uVaBntOv9lP4yz9ffWvWaicv9gHBPhpQB22nGijwd8gqW9CNT+UdkbQOQNLVI8jN1ZfQ== @@ -1423,6 +1476,19 @@ autoprefixer@^9.6.1: num2fraction "^1.2.2" postcss "^7.0.18" postcss-value-parser "^4.0.2" +======= + version "9.6.1" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.6.1.tgz#51967a02d2d2300bb01866c1611ec8348d355a47" + integrity sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw== + dependencies: + browserslist "^4.6.3" + caniuse-lite "^1.0.30000980" + chalk "^2.4.2" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.17" + postcss-value-parser "^4.0.0" +>>>>>>> remove vue. webpacker => 4.0.7. babel-core => 7.6.2. Trashed package-lock.json. aws-sign2@~0.7.0: version "0.7.0" @@ -1550,7 +1616,11 @@ block-stream@*: dependencies: inherits "~2.0.0" +<<<<<<< HEAD bluebird@^3.1.1, bluebird@^3.5.5: +======= +bluebird@^3.5.5: +>>>>>>> remove vue. webpacker => 4.0.7. babel-core => 7.6.2. Trashed package-lock.json. version "3.7.0" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.0.tgz#56a6a886e03f6ae577cffedeb524f8f2450293cf" integrity sha512-aBQ1FxIa7kSWCcmKHlcHFlT2jt6J/l4FzC7KcPELkOJOsPOb/bccdhmIrKDfXhwFrmc7vDoDrrepFvGqjyXGJg== @@ -1593,11 +1663,6 @@ boolbase@^1.0.0, boolbase@~1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= -bootstrap-toggle@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/bootstrap-toggle/-/bootstrap-toggle-2.2.2.tgz#2b88534fc1b998674f877f98ba0d8b5b743e96fe" - integrity sha1-K4hTT8G5mGdPh3+Yug2LW3Q+lv4= - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -1698,7 +1763,11 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" +<<<<<<< HEAD browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.6.4, browserslist@^4.6.6, browserslist@^4.7.0: +======= +browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.6.3, browserslist@^4.6.4, browserslist@^4.6.6: +>>>>>>> remove vue. webpacker => 4.0.7. babel-core => 7.6.2. Trashed package-lock.json. version "4.7.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.0.tgz#9ee89225ffc07db03409f2fee524dc8227458a17" integrity sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA== @@ -1762,13 +1831,39 @@ cacache@^11.2.0: chownr "^1.1.1" figgy-pudding "^3.5.1" glob "^7.1.4" +<<<<<<< HEAD + graceful-fs "^4.1.15" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cacache@^12.0.2: + version "12.0.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" + integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" +======= +>>>>>>> remove vue. webpacker => 4.0.7. babel-core => 7.6.2. Trashed package-lock.json. graceful-fs "^4.1.15" + infer-owner "^1.0.3" lru-cache "^5.1.1" mississippi "^3.0.0" mkdirp "^0.5.1" move-concurrently "^1.0.1" promise-inflight "^1.0.1" rimraf "^2.6.3" +<<<<<<< HEAD +======= ssri "^6.0.1" unique-filename "^1.1.1" y18n "^4.0.0" @@ -1790,6 +1885,7 @@ cacache@^12.0.2: move-concurrently "^1.0.1" promise-inflight "^1.0.1" rimraf "^2.6.3" +>>>>>>> remove vue. webpacker => 4.0.7. babel-core => 7.6.2. Trashed package-lock.json. ssri "^6.0.1" unique-filename "^1.1.1" y18n "^4.0.0" @@ -1866,10 +1962,17 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" +<<<<<<< HEAD caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30000989, caniuse-lite@^1.0.30000998: version "1.0.30000999" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000999.tgz#427253a69ad7bea4aa8d8345687b8eec51ca0e43" integrity sha512-1CUyKyecPeksKwXZvYw0tEoaMCo/RwBlXmEtN5vVnabvO0KPd9RQLcaAuR9/1F+KDMv6esmOFWlsXuzDk+8rxg== +======= +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000980, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30000989: + version "1.0.30000998" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000998.tgz#7227a8046841e7d01e156ae7227a504d065f6744" + integrity sha512-8Tj5sPZR9kMHeDD9SZXIVr5m9ofufLLCG2Y4QwQrH18GIwG+kCc+zYdlR036ZRkuKjVVetyxeAgGA1xF7XdmzQ== +>>>>>>> remove vue. webpacker => 4.0.7. babel-core => 7.6.2. Trashed package-lock.json. capture-exit@^2.0.0: version "2.0.0" @@ -2144,13 +2247,6 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= -consolidate@^0.15.1: - version "0.15.1" - resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7" - integrity sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw== - dependencies: - bluebird "^3.1.1" - constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" @@ -2525,11 +2621,14 @@ date-now@^0.1.4: resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= +<<<<<<< HEAD de-indent@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" integrity sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0= +======= +>>>>>>> remove vue. webpacker => 4.0.7. babel-core => 7.6.2. Trashed package-lock.json. debug@2.6.9, debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -2784,9 +2883,15 @@ ee-first@1.1.1: integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= electron-to-chromium@^1.3.247: +<<<<<<< HEAD version "1.3.276" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.276.tgz#1cca47c31b6e852ce43ab62ae4f31608db8b95d4" integrity sha512-J7bVRAW2fHJVOGZqxSvmMcbBAWPiueHsKwSq+TjaNq1wQ71Za0uBExC1ECuMmAAQioDA2//auhI/glFINnUGPw== +======= + version "1.3.273" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.273.tgz#94872d6823219f2812f2e35a2ce2a7d03c1eaa3f" + integrity sha512-0kUppiHQvHEENHh+nTtvTt4eXMwcPyWmMaj73GPrSEm3ldKhmmHuOH6IjrmuW6YmyS/fpXcLvMQLNVpqRhpNWw== +>>>>>>> remove vue. webpacker => 4.0.7. babel-core => 7.6.2. Trashed package-lock.json. elliptic@^6.0.0: version "6.5.1" @@ -3561,11 +3666,6 @@ hash-base@^3.0.0: inherits "^2.0.1" safe-buffer "^5.0.1" -hash-sum@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04" - integrity sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ= - hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" @@ -3574,11 +3674,6 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" -he@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - hex-color-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" @@ -4886,7 +4981,7 @@ loud-rejection@^1.0.0: currently-unhandled "^0.4.1" signal-exit "^3.0.0" -lru-cache@^4.0.1, lru-cache@^4.1.2: +lru-cache@^4.0.1: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== @@ -5007,6 +5102,7 @@ merge-descriptors@1.0.1: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= +<<<<<<< HEAD merge-source-map@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" @@ -5014,15 +5110,20 @@ merge-source-map@^1.1.0: dependencies: source-map "^0.6.1" +======= +>>>>>>> remove vue. webpacker => 4.0.7. babel-core => 7.6.2. Trashed package-lock.json. merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== +<<<<<<< HEAD merge@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== +======= +>>>>>>> remove vue. webpacker => 4.0.7. babel-core => 7.6.2. Trashed package-lock.json. methods@~1.1.2: version "1.1.2" @@ -6543,6 +6644,15 @@ postcss-selector-parser@^6.0.0: indexes-of "^1.0.1" uniq "^1.0.1" +postcss-selector-parser@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" + integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + postcss-svgo@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" @@ -6567,7 +6677,7 @@ postcss-value-parser@^3.0.0, postcss-value-parser@^3.2.3, postcss-value-parser@^ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== -postcss-value-parser@^4.0.2: +postcss-value-parser@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz#482282c09a42706d1fc9a069b73f44ec08391dc9" integrity sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ== @@ -6581,7 +6691,7 @@ postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: indexes-of "^1.0.1" uniq "^1.0.1" -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.18, postcss@^7.0.2, postcss@^7.0.5, postcss@^7.0.6: +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.5, postcss@^7.0.6: version "7.0.18" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.18.tgz#4b9cda95ae6c069c67a4d933029eddd4838ac233" integrity sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g== @@ -7837,9 +7947,9 @@ terser-webpack-plugin@^1.3.0, terser-webpack-plugin@^1.4.1: worker-farm "^1.7.0" terser@^4.1.2: - version "4.3.8" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.3.8.tgz#707f05f3f4c1c70c840e626addfdb1c158a17136" - integrity sha512-otmIRlRVmLChAWsnSFNO0Bfk6YySuBp6G9qrHiJwlLDd4mxe2ta4sjI7TzIR+W1nBMjilzrMcPOz9pSusgx3hQ== + version "4.3.4" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.3.4.tgz#ad91bade95619e3434685d69efa621a5af5f877d" + integrity sha512-Kcrn3RiW8NtHBP0ssOAzwa2MsIRQ8lJWiBG/K7JgqPlomA3mtb2DEmp4/hrUA+Jujx+WZ02zqd7GYD+QRBB/2Q== dependencies: commander "^2.20.0" source-map "~0.6.1" @@ -8207,61 +8317,6 @@ vm-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019" integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw== -vue-bootstrap-toggle@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/vue-bootstrap-toggle/-/vue-bootstrap-toggle-1.1.4.tgz#7be9bee0c84397b1281828e1a69d64f930ebe2e0" - integrity sha512-ds5jhFEAJ6HUJwpZq6p+mr9ER3eoPXRXnuOCUNhq4mTdzpd/k+GiNhbz5spNfXxTjb69oxsnjp20dEAejn782A== - dependencies: - bootstrap-toggle "^2.2.2" - merge "^1.2.0" - -vue-hot-reload-api@^2.3.0: - version "2.3.4" - resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2" - integrity sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog== - -vue-loader@^15.6.2: - version "15.7.1" - resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.7.1.tgz#6ccacd4122aa80f69baaac08ff295a62e3aefcfd" - integrity sha512-fwIKtA23Pl/rqfYP5TSGK7gkEuLhoTvRYW+TU7ER3q9GpNLt/PjG5NLv3XHRDiTg7OPM1JcckBgds+VnAc+HbA== - dependencies: - "@vue/component-compiler-utils" "^3.0.0" - hash-sum "^1.0.2" - loader-utils "^1.1.0" - vue-hot-reload-api "^2.3.0" - vue-style-loader "^4.1.0" - -vue-style-loader@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.2.tgz#dedf349806f25ceb4e64f3ad7c0a44fba735fcf8" - integrity sha512-0ip8ge6Gzz/Bk0iHovU9XAUQaFt/G2B61bnWa2tCcqqdgfHs1lF9xXorFbE55Gmy92okFT+8bfmySuUOu13vxQ== - dependencies: - hash-sum "^1.0.2" - loader-utils "^1.0.2" - -vue-template-compiler@^2.5.22: - version "2.6.10" - resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.6.10.tgz#323b4f3495f04faa3503337a82f5d6507799c9cc" - integrity sha512-jVZkw4/I/HT5ZMvRnhv78okGusqe0+qH2A0Em0Cp8aq78+NK9TII263CDVz2QXZsIT+yyV/gZc/j/vlwa+Epyg== - dependencies: - de-indent "^1.0.2" - he "^1.1.0" - -vue-template-es2015-compiler@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825" - integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw== - -vue@^2.5.22: - version "2.6.10" - resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.10.tgz#a72b1a42a4d82a721ea438d1b6bf55e66195c637" - integrity sha512-ImThpeNU9HbdZL3utgMCq0oiMzAkt1mcgy3/E6zWC/G6AaQoeuFdsl9nDhTDU3X1R6FK7nsIUuRACVcjI+A2GQ== - -vuex@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/vuex/-/vuex-3.1.1.tgz#0c264bfe30cdbccf96ab9db3177d211828a5910e" - integrity sha512-ER5moSbLZuNSMBFnEBVGhQ1uCBNJslH9W/Dw2W7GZN23UQA69uapP5GTT9Vm8Trc0PzBSVt6LzF3hGjmv41xcg== - w3c-hr-time@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" From bb94b589eeab09310d0da1ac1e52caf5ead3d3ab Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Fri, 4 Oct 2019 07:35:54 -0500 Subject: [PATCH 002/103] hollow out search page --- app/views/welcome/search.html.erb | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/app/views/welcome/search.html.erb b/app/views/welcome/search.html.erb index 498224a7..627e56b4 100644 --- a/app/views/welcome/search.html.erb +++ b/app/views/welcome/search.html.erb @@ -1,30 +1,6 @@ <%= javascript_pack_tag 'search' %>

Find Dances

-
- - -
- -
- - - - - - - - - - - - - - - - - -
TitleChoreographerHookFormationUserEnteredUpdatedSharingFigures
<%= @dialect_json %>
From 44b7d103f0e3af3fccbae076fbb1e8aa60c240fd Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Fri, 4 Oct 2019 07:42:31 -0500 Subject: [PATCH 003/103] use react 16.10.2 --- app/javascript/packs/hello_react.jsx | 26 +++++++ app/views/welcome/search.html.erb | 2 +- babel.config.js | 17 ++++- config/webpacker.yml | 1 + package.json | 7 +- yarn.lock | 105 ++++++++++++++++++++++++++- 6 files changed, 152 insertions(+), 6 deletions(-) create mode 100644 app/javascript/packs/hello_react.jsx diff --git a/app/javascript/packs/hello_react.jsx b/app/javascript/packs/hello_react.jsx new file mode 100644 index 00000000..772fc97e --- /dev/null +++ b/app/javascript/packs/hello_react.jsx @@ -0,0 +1,26 @@ +// Run this example by adding <%= javascript_pack_tag 'hello_react' %> to the head of your layout file, +// like app/views/layouts/application.html.erb. All it does is render
Hello React
at the bottom +// of the page. + +import React from 'react' +import ReactDOM from 'react-dom' +import PropTypes from 'prop-types' + +const Hello = props => ( +
Hello {props.name}!
+) + +Hello.defaultProps = { + name: 'David' +} + +Hello.propTypes = { + name: PropTypes.string +} + +document.addEventListener('DOMContentLoaded', () => { + ReactDOM.render( + , + document.body.appendChild(document.createElement('div')), + ) +}) diff --git a/app/views/welcome/search.html.erb b/app/views/welcome/search.html.erb index 627e56b4..67840300 100644 --- a/app/views/welcome/search.html.erb +++ b/app/views/welcome/search.html.erb @@ -1,4 +1,4 @@ -<%= javascript_pack_tag 'search' %> +<%= javascript_pack_tag 'hello_react' %>

Find Dances

diff --git a/babel.config.js b/babel.config.js index f930f3e0..91a7b7c2 100644 --- a/babel.config.js +++ b/babel.config.js @@ -30,9 +30,17 @@ module.exports = function(api) { { forceAllTransforms: true, useBuiltIns: 'entry', + corejs: 3, modules: false, exclude: ['transform-typeof-symbol'] } + ], + [ + require('@babel/preset-react').default, + { + development: isDevelopmentEnv || isTestEnv, + useBuiltIns: true + } ] ].filter(Boolean), plugins: [ @@ -56,7 +64,8 @@ module.exports = function(api) { require('@babel/plugin-transform-runtime').default, { helpers: false, - regenerator: true + regenerator: true, + corejs: false } ], [ @@ -64,6 +73,12 @@ module.exports = function(api) { { async: false } + ], + isProductionEnv && [ + require('babel-plugin-transform-react-remove-prop-types').default, + { + removeImport: true + } ] ].filter(Boolean) } diff --git a/config/webpacker.yml b/config/webpacker.yml index 6fd53121..e55e5bee 100644 --- a/config/webpacker.yml +++ b/config/webpacker.yml @@ -34,6 +34,7 @@ default: &default - .woff2 extensions: + - .jsx - .mjs - .js - .sass diff --git a/package.json b/package.json index 979e82ae..77453370 100644 --- a/package.json +++ b/package.json @@ -2,8 +2,13 @@ "dependencies": { "@babel/core": "^7.2.2", "@babel/preset-env": "^7.3.1", + "@babel/preset-react": "^7.0.0", "@rails/webpacker": "^4.0.0-rc.7", - "babel-loader": "^8.0.5" + "babel-loader": "^8.0.5", + "babel-plugin-transform-react-remove-prop-types": "^0.4.24", + "prop-types": "^15.7.2", + "react": "^16.10.2", + "react-dom": "^16.10.2" }, "devDependencies": { "jest": "^24.8.0", diff --git a/yarn.lock b/yarn.lock index f4f7e591..8ab8d2c0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -54,6 +54,14 @@ "@babel/helper-explode-assignable-expression" "^7.1.0" "@babel/types" "^7.0.0" +"@babel/helper-builder-react-jsx@^7.3.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz#a1ac95a5d2b3e88ae5e54846bf462eeb81b318a4" + integrity sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw== + dependencies: + "@babel/types" "^7.3.0" + esutils "^2.0.0" + "@babel/helper-call-delegate@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43" @@ -321,6 +329,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-jsx@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz#0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7" + integrity sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" @@ -522,6 +537,38 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-react-display-name@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz#ebfaed87834ce8dc4279609a4f0c324c156e3eb0" + integrity sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-react-jsx-self@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz#461e21ad9478f1031dd5e276108d027f1b5240ba" + integrity sha512-v6S5L/myicZEy+jr6ielB0OR8h+EH/1QFx/YJ7c7Ua+7lqsjj/vW6fD5FR9hB/6y7mGbfT4vAURn3xqBxsUcdg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@babel/plugin-transform-react-jsx-source@^7.0.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.5.0.tgz#583b10c49cf057e237085bcbd8cc960bd83bd96b" + integrity sha512-58Q+Jsy4IDCZx7kqEZuSDdam/1oW8OdDX8f+Loo6xyxdfg1yF0GE2XNJQSTZCaMol93+FBzpWiPEwtbMloAcPg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@babel/plugin-transform-react-jsx@^7.0.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz#f2cab99026631c767e2745a5368b331cfe8f5290" + integrity sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg== + dependencies: + "@babel/helper-builder-react-jsx" "^7.3.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + "@babel/plugin-transform-regenerator@^7.4.5": version "7.4.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" @@ -659,6 +706,17 @@ semver "^5.5.0" <<<<<<< HEAD +"@babel/preset-react@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.0.0.tgz#e86b4b3d99433c7b3e9e91747e2653958bc6b3c0" + integrity sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-self" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" + "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.5": version "7.6.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.6.2.tgz#c3d6e41b304ef10dcf13777a33e7694ec4a9a6dd" @@ -1556,6 +1614,11 @@ babel-plugin-macros@^2.5.0: cosmiconfig "^5.2.0" resolve "^1.10.0" +babel-plugin-transform-react-remove-prop-types@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" + integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== + babel-preset-jest@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc" @@ -3033,7 +3096,7 @@ estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -esutils@^2.0.2: +esutils@^2.0.0, esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== @@ -4966,7 +5029,7 @@ loglevel@^1.6.4: resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.4.tgz#f408f4f006db8354d0577dcf6d33485b3cb90d56" integrity sha512-p0b6mOGKcGa+7nnmKbpzR6qloPbrgLcnio++E+14Vo/XffOGwZtRpUhr8dTH/x2oCMmEoIU0Zwm3ZauhvYD17g== -loose-envify@^1.0.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -6758,6 +6821,15 @@ prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.3" +prop-types@^15.6.2, prop-types@^15.7.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + proxy-addr@~2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" @@ -6911,11 +6983,30 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-is@^16.8.4: +react-dom@^16.10.2: + version "16.10.2" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.10.2.tgz#4840bce5409176bc3a1f2bd8cb10b92db452fda6" + integrity sha512-kWGDcH3ItJK4+6Pl9DZB16BXYAZyrYQItU4OMy0jAkv5aNqc+mAKb4TpFtAteI6TJZu+9ZlNhaeNQSVQDHJzkw== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.16.2" + +react-is@^16.8.1, react-is@^16.8.4: version "16.10.2" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.10.2.tgz#984120fd4d16800e9a738208ab1fba422d23b5ab" integrity sha512-INBT1QEgtcCCgvccr5/86CfD71fw9EPmDxgiJX4I2Ddr6ZsV6iFXsuby+qWJPtmNuMY0zByTsG4468P7nHuNWA== +react@^16.10.2: + version "16.10.2" + resolved "https://registry.yarnpkg.com/react/-/react-16.10.2.tgz#a5ede5cdd5c536f745173c8da47bda64797a4cf0" + integrity sha512-MFVIq0DpIhrHFyqLU0S3+4dIcBhhOvBE8bJ/5kHPVOVaGdo0KuiQzpcjCPsf585WvhypqtrMILyoE2th6dT+Lw== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + read-cache@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" @@ -7297,6 +7388,14 @@ sax@^1.2.4, sax@~1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== +scheduler@^0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.16.2.tgz#f74cd9d33eff6fc554edfb79864868e4819132c1" + integrity sha512-BqYVWqwz6s1wZMhjFvLfVR5WXP7ZY32M/wYPo04CcuPM7XZEbV2TBNW7Z0UkguPTl0dWMA59VbNXxK6q+pHItg== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + schema-utils@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" From 44f5c0165a92e8115bf0827b266bbf8317eef884 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sat, 5 Oct 2019 10:08:01 -0500 Subject: [PATCH 004/103] add typescript 3.6.3 --- .../{hello_react.jsx => hello_react.tsx} | 6 +- app/javascript/packs/hello_typescript.ts | 4 + config/webpack/environment.js | 2 + config/webpack/loaders/typescript.js | 11 +++ config/webpacker.yml | 2 + package.json | 6 +- tsconfig.json | 20 +++++ yarn.lock | 84 ++++++++++++++++++- 8 files changed, 130 insertions(+), 5 deletions(-) rename app/javascript/packs/{hello_react.jsx => hello_react.tsx} (82%) create mode 100644 app/javascript/packs/hello_typescript.ts create mode 100644 config/webpack/loaders/typescript.js create mode 100644 tsconfig.json diff --git a/app/javascript/packs/hello_react.jsx b/app/javascript/packs/hello_react.tsx similarity index 82% rename from app/javascript/packs/hello_react.jsx rename to app/javascript/packs/hello_react.tsx index 772fc97e..2cd4d77c 100644 --- a/app/javascript/packs/hello_react.jsx +++ b/app/javascript/packs/hello_react.tsx @@ -7,7 +7,7 @@ import ReactDOM from 'react-dom' import PropTypes from 'prop-types' const Hello = props => ( -
Hello {props.name}!
+
Bonjour {props.name}!
) Hello.defaultProps = { @@ -18,9 +18,11 @@ Hello.propTypes = { name: PropTypes.string } +const f = (a:number,b: number): number => a+b + document.addEventListener('DOMContentLoaded', () => { ReactDOM.render( - , + , document.body.appendChild(document.createElement('div')), ) }) diff --git a/app/javascript/packs/hello_typescript.ts b/app/javascript/packs/hello_typescript.ts new file mode 100644 index 00000000..95a72cf0 --- /dev/null +++ b/app/javascript/packs/hello_typescript.ts @@ -0,0 +1,4 @@ +// Run this example by adding <%= javascript_pack_tag 'hello_typescript' %> to the head of your layout file, +// like app/views/layouts/application.html.erb. + +console.log('Hello world from typescript'); diff --git a/config/webpack/environment.js b/config/webpack/environment.js index d16d9af7..f10aeb53 100644 --- a/config/webpack/environment.js +++ b/config/webpack/environment.js @@ -1,3 +1,5 @@ const { environment } = require('@rails/webpacker') +const typescript = require('./loaders/typescript') +environment.loaders.prepend('typescript', typescript) module.exports = environment diff --git a/config/webpack/loaders/typescript.js b/config/webpack/loaders/typescript.js new file mode 100644 index 00000000..2f5e1790 --- /dev/null +++ b/config/webpack/loaders/typescript.js @@ -0,0 +1,11 @@ +const PnpWebpackPlugin = require('pnp-webpack-plugin') + +module.exports = { + test: /\.(ts|tsx)?(\.erb)?$/, + use: [ + { + loader: 'ts-loader', + options: PnpWebpackPlugin.tsLoaderOptions() + } + ] +} diff --git a/config/webpacker.yml b/config/webpacker.yml index e55e5bee..1beb35f9 100644 --- a/config/webpacker.yml +++ b/config/webpacker.yml @@ -34,6 +34,8 @@ default: &default - .woff2 extensions: + - .tsx + - .ts - .jsx - .mjs - .js diff --git a/package.json b/package.json index 77453370..e2f8d944 100644 --- a/package.json +++ b/package.json @@ -4,11 +4,15 @@ "@babel/preset-env": "^7.3.1", "@babel/preset-react": "^7.0.0", "@rails/webpacker": "^4.0.0-rc.7", + "@types/react": "^16.9.5", + "@types/react-dom": "^16.9.1", "babel-loader": "^8.0.5", "babel-plugin-transform-react-remove-prop-types": "^0.4.24", "prop-types": "^15.7.2", "react": "^16.10.2", - "react-dom": "^16.10.2" + "react-dom": "^16.10.2", + "ts-loader": "^6.2.0", + "typescript": "^3.6.3" }, "devDependencies": { "jest": "^24.8.0", diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..7425c2b4 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "declaration": false, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "lib": ["es6", "dom"], + "module": "es6", + "moduleResolution": "node", + "sourceMap": true, + "target": "es5", + "jsx": "react" + }, + "exclude": [ + "**/*.spec.ts", + "node_modules", + "vendor", + "public" + ], + "compileOnSave": false +} diff --git a/yarn.lock b/yarn.lock index 8ab8d2c0..e66a1847 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1063,11 +1063,31 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.11.tgz#be879b52031cfb5d295b047f5462d8ef1a716446" integrity sha512-Otxmr2rrZLKRYIybtdG/sgeO+tHY20GxeDjcGmUnmmlCWyEnv2a2x1ZXBo3BTec4OiTXMQCiazB8NMBf0iRlFw== +"@types/prop-types@*": + version "15.7.3" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" + integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== + "@types/q@^1.5.1": version "1.5.2" resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== +"@types/react-dom@^16.9.1": + version "16.9.1" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.1.tgz#79206237cba9532a9f870b1cd5428bef6b66378c" + integrity sha512-1S/akvkKr63qIUWVu5IKYou2P9fHLb/P2VAwyxVV85JGaGZTcUniMiTuIqM3lXFB25ej6h+CYEQ27ERVwi6eGA== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^16.9.5": + version "16.9.5" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.5.tgz#079dabd918b19b32118c25fd00a786bb6d0d5e51" + integrity sha512-jQ12VMiFOWYlp+j66dghOWcmDDwhca0bnlcTxS4Qz/fh5gi6wpaZDthPEu/Gc/YlAuO87vbiUXL8qKstFvuOaA== + dependencies: + "@types/prop-types" "*" + csstype "^2.2.0" + "@types/stack-utils@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" @@ -1750,6 +1770,13 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" +braces@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" @@ -2054,7 +2081,7 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@2.4.2, chalk@^2.0, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2: +chalk@2.4.2, chalk@^2.0, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2651,6 +2678,11 @@ cssstyle@^1.0.0: dependencies: cssom "0.3.x" +csstype@^2.2.0: + version "2.6.7" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.7.tgz#20b0024c20b6718f4eda3853a1f5a1cce7f5e4a5" + integrity sha512-9Mcn9sFbGBAdmimWb2gLVDtFJzeKtDGIr76TUqmjZrw9LFXBMSU70lcs+C0/7fyCd6iBDqmksUcCOUIkisPHsQ== + currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" @@ -2991,7 +3023,7 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enhanced-resolve@4.1.0, enhanced-resolve@^4.1.0: +enhanced-resolve@4.1.0, enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== @@ -3325,6 +3357,13 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + finalhandler@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" @@ -4225,6 +4264,11 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" @@ -5212,6 +5256,14 @@ micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" +micromatch@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -6043,6 +6095,11 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= +picomatch@^2.0.5: + version "2.0.7" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6" + integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA== + pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -8124,6 +8181,13 @@ to-regex-range@^2.1.0: is-number "^3.0.0" repeat-string "^1.6.1" +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" @@ -8174,6 +8238,17 @@ trim-newlines@^1.0.0: dependencies: glob "^7.1.2" +ts-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-6.2.0.tgz#52d3993ecbc5474c1513242388e1049da0fce880" + integrity sha512-Da8h3fD+HiZ9GvZJydqzk3mTC9nuOKYlJcpuk+Zv6Y1DPaMvBL+56GRzZFypx2cWrZFMsQr869+Ua2slGoLxvQ== + dependencies: + chalk "^2.3.0" + enhanced-resolve "^4.0.0" + loader-utils "^1.0.2" + micromatch "^4.0.0" + semver "^6.0.0" + ts-pnp@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.4.tgz#ae27126960ebaefb874c6d7fa4729729ab200d90" @@ -8221,6 +8296,11 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +typescript@^3.6.3: + version "3.6.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.3.tgz#fea942fabb20f7e1ca7164ff626f1a9f3f70b4da" + integrity sha512-N7bceJL1CtRQ2RiG0AQME13ksR7DiuQh/QehubYcghzv20tnh+MQnQIuJddTmsbqYj+dztchykemz0zFzlvdQw== + uglify-js@^3.1.4: version "3.6.0" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.0.tgz#704681345c53a8b2079fb6cec294b05ead242ff5" From 4b2499461d18ee46face930b7c170b9d4e6632b5 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sat, 5 Oct 2019 15:40:15 -0500 Subject: [PATCH 005/103] barely working react-table --- app/javascript/demo.jsx | 51 +++++++++++++ app/javascript/packs/hello_react.jsx | 78 ++++++++++++++++++++ app/javascript/packs/hello_react.tsx | 28 ------- app/javascript/packs/hello_typescript.js | 4 + app/javascript/packs/hello_typescript.js.map | 1 + package.json | 1 + yarn.lock | 12 +++ 7 files changed, 147 insertions(+), 28 deletions(-) create mode 100644 app/javascript/demo.jsx create mode 100644 app/javascript/packs/hello_react.jsx delete mode 100644 app/javascript/packs/hello_react.tsx create mode 100644 app/javascript/packs/hello_typescript.js create mode 100644 app/javascript/packs/hello_typescript.js.map diff --git a/app/javascript/demo.jsx b/app/javascript/demo.jsx new file mode 100644 index 00000000..84bf4851 --- /dev/null +++ b/app/javascript/demo.jsx @@ -0,0 +1,51 @@ +import React from 'react' +import ReactTable from 'react-table' +import 'react-table/react-table.css' + + +// export class Demo extends React.Component { +// render() { +// const data = [{ +// name: 'Tanner Linsley', +// age: 26, +// friend: { +// name: 'Jason Maurer', +// age: 23, +// } +// },{ +// name: 'Arbor Warmber', +// age: 22, +// friend: { +// name: 'Jason Maurer', +// age: 23, +// } +// },{ +// name: 'Commisioner Cordwood', +// age: 26, +// friend: { +// name: 'Bobby Berman', +// age: 32, +// } +// },] + +// const columns = [{ +// Header: 'Name', +// accessor: 'name' // String-based value accessors! +// }, { +// Header: 'Age', +// accessor: 'age', +// Cell: props => {props.value} // Custom cell components! +// }, { +// id: 'friendName', // Required because our accessor is not a string +// Header: 'Friend Name', +// accessor: d => d.friend.name // Custom value accessors! +// }, { +// Header: props => Friend Age, // Custom header components! +// accessor: 'friend.age' +// }] + +// return +// } +// } + + diff --git a/app/javascript/packs/hello_react.jsx b/app/javascript/packs/hello_react.jsx new file mode 100644 index 00000000..54d7658b --- /dev/null +++ b/app/javascript/packs/hello_react.jsx @@ -0,0 +1,78 @@ +// Run this example by adding <%= javascript_pack_tag 'hello_react' %> to the head of your layout file, +// like app/views/layouts/application.html.erb. All it does is render
Hello React
at the bottom +// of the page. + +import React from 'react' +import ReactDOM from 'react-dom' +import PropTypes from 'prop-types' +import ReactTable from 'react-table' +import 'react-table/react-table.css' + + +class Demo extends React.Component { + render() { + const data = [{ + name: 'Tanner Linsley', + age: 26, + friend: { + name: 'Jason Maurer', + age: 23, + } + },{ + name: 'Arbor Warmber', + age: 22, + friend: { + name: 'Jason Maurer', + age: 23, + } + },{ + name: 'Commisioner Cordwood', + age: 26, + friend: { + name: 'Bobby Berman', + age: 32, + } + },] + + const columns = [{ + Header: 'Name', + accessor: 'name' // String-based value accessors! + }, { + Header: 'Age', + accessor: 'age', + Cell: props => {props.value} // Custom cell components! + }, { + id: 'friendName', // Required because our accessor is not a string + Header: 'Friend Name', + accessor: d => d.friend.name // Custom value accessors! + }, { + Header: props => Friend Age, // Custom header components! + accessor: 'friend.age' + }] + + return + } +} + + + + + +const Hello = props => ( +
Bonjour {props.name}!
+) + +Hello.defaultProps = { + name: 'David' +} + +Hello.propTypes = { + name: PropTypes.string +} + +document.addEventListener('DOMContentLoaded', () => { + ReactDOM.render( + , + document.body.appendChild(document.createElement('div')), + ) +}) diff --git a/app/javascript/packs/hello_react.tsx b/app/javascript/packs/hello_react.tsx deleted file mode 100644 index 2cd4d77c..00000000 --- a/app/javascript/packs/hello_react.tsx +++ /dev/null @@ -1,28 +0,0 @@ -// Run this example by adding <%= javascript_pack_tag 'hello_react' %> to the head of your layout file, -// like app/views/layouts/application.html.erb. All it does is render
Hello React
at the bottom -// of the page. - -import React from 'react' -import ReactDOM from 'react-dom' -import PropTypes from 'prop-types' - -const Hello = props => ( -
Bonjour {props.name}!
-) - -Hello.defaultProps = { - name: 'David' -} - -Hello.propTypes = { - name: PropTypes.string -} - -const f = (a:number,b: number): number => a+b - -document.addEventListener('DOMContentLoaded', () => { - ReactDOM.render( - , - document.body.appendChild(document.createElement('div')), - ) -}) diff --git a/app/javascript/packs/hello_typescript.js b/app/javascript/packs/hello_typescript.js new file mode 100644 index 00000000..8d2797f2 --- /dev/null +++ b/app/javascript/packs/hello_typescript.js @@ -0,0 +1,4 @@ +// Run this example by adding <%= javascript_pack_tag 'hello_typescript' %> to the head of your layout file, +// like app/views/layouts/application.html.erb. +console.log('Hello world from typescript'); +//# sourceMappingURL=hello_typescript.js.map \ No newline at end of file diff --git a/app/javascript/packs/hello_typescript.js.map b/app/javascript/packs/hello_typescript.js.map new file mode 100644 index 00000000..1945d0ed --- /dev/null +++ b/app/javascript/packs/hello_typescript.js.map @@ -0,0 +1 @@ +{"version":3,"file":"hello_typescript.js","sourceRoot":"","sources":["hello_typescript.ts"],"names":[],"mappings":"AAAA,4GAA4G;AAC5G,+CAA+C;AAE/C,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC"} \ No newline at end of file diff --git a/package.json b/package.json index e2f8d944..e5dcc3d5 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "prop-types": "^15.7.2", "react": "^16.10.2", "react-dom": "^16.10.2", + "react-table": "^6.10.3", "ts-loader": "^6.2.0", "typescript": "^3.6.3" }, diff --git a/yarn.lock b/yarn.lock index e66a1847..0ca1004f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2155,6 +2155,11 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" +classnames@^2.2.5: + version "2.2.6" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" + integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== + cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" @@ -7055,6 +7060,13 @@ react-is@^16.8.1, react-is@^16.8.4: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.10.2.tgz#984120fd4d16800e9a738208ab1fba422d23b5ab" integrity sha512-INBT1QEgtcCCgvccr5/86CfD71fw9EPmDxgiJX4I2Ddr6ZsV6iFXsuby+qWJPtmNuMY0zByTsG4468P7nHuNWA== +react-table@^6.10.3: + version "6.10.3" + resolved "https://registry.yarnpkg.com/react-table/-/react-table-6.10.3.tgz#d085487a5a1b18b76486b71cf1d388d87c8c7362" + integrity sha512-sVlq2/rxVaQJywGD95+qGiMr/SMHFIFnXdx619BLOWE/Os5FOGtV6pQJNAjZixbQZiOu7dmBO1kME28uxh6wmA== + dependencies: + classnames "^2.2.5" + react@^16.10.2: version "16.10.2" resolved "https://registry.yarnpkg.com/react/-/react-16.10.2.tgz#a5ede5cdd5c536f745173c8da47bda64797a4cf0" From b41166f6e9ca931ee9bb96106cb735858c65a5f8 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sat, 5 Oct 2019 16:10:04 -0500 Subject: [PATCH 006/103] move react-table into demo component --- app/javascript/demo.jsx | 84 ++++++++++++++-------------- app/javascript/packs/hello_react.jsx | 50 +---------------- 2 files changed, 44 insertions(+), 90 deletions(-) diff --git a/app/javascript/demo.jsx b/app/javascript/demo.jsx index 84bf4851..cc7816b1 100644 --- a/app/javascript/demo.jsx +++ b/app/javascript/demo.jsx @@ -3,49 +3,49 @@ import ReactTable from 'react-table' import 'react-table/react-table.css' -// export class Demo extends React.Component { -// render() { -// const data = [{ -// name: 'Tanner Linsley', -// age: 26, -// friend: { -// name: 'Jason Maurer', -// age: 23, -// } -// },{ -// name: 'Arbor Warmber', -// age: 22, -// friend: { -// name: 'Jason Maurer', -// age: 23, -// } -// },{ -// name: 'Commisioner Cordwood', -// age: 26, -// friend: { -// name: 'Bobby Berman', -// age: 32, -// } -// },] +export class Demo extends React.Component { + render() { + const data = [{ + name: 'Tanner Linsley', + age: 26, + friend: { + name: 'Jason Maurer', + age: 23, + } + },{ + name: 'Arbor Warmber', + age: 22, + friend: { + name: 'Jason Maurer', + age: 23, + } + },{ + name: 'Commisioner Cordwood', + age: 26, + friend: { + name: 'Bobby Berman', + age: 32, + } + },] -// const columns = [{ -// Header: 'Name', -// accessor: 'name' // String-based value accessors! -// }, { -// Header: 'Age', -// accessor: 'age', -// Cell: props => {props.value} // Custom cell components! -// }, { -// id: 'friendName', // Required because our accessor is not a string -// Header: 'Friend Name', -// accessor: d => d.friend.name // Custom value accessors! -// }, { -// Header: props => Friend Age, // Custom header components! -// accessor: 'friend.age' -// }] + const columns = [{ + Header: 'Name', + accessor: 'name' // String-based value accessors! + }, { + Header: 'Age', + accessor: 'age', + Cell: props => {props.value} // Custom cell components! + }, { + id: 'friendName', // Required because our accessor is not a string + Header: 'Friend Name', + accessor: d => d.friend.name // Custom value accessors! + }, { + Header: props => Friend Age, // Custom header components! + accessor: 'friend.age' + }] -// return -// } -// } + return + } +} diff --git a/app/javascript/packs/hello_react.jsx b/app/javascript/packs/hello_react.jsx index 54d7658b..a1d17a9a 100644 --- a/app/javascript/packs/hello_react.jsx +++ b/app/javascript/packs/hello_react.jsx @@ -7,59 +7,13 @@ import ReactDOM from 'react-dom' import PropTypes from 'prop-types' import ReactTable from 'react-table' import 'react-table/react-table.css' - - -class Demo extends React.Component { - render() { - const data = [{ - name: 'Tanner Linsley', - age: 26, - friend: { - name: 'Jason Maurer', - age: 23, - } - },{ - name: 'Arbor Warmber', - age: 22, - friend: { - name: 'Jason Maurer', - age: 23, - } - },{ - name: 'Commisioner Cordwood', - age: 26, - friend: { - name: 'Bobby Berman', - age: 32, - } - },] - - const columns = [{ - Header: 'Name', - accessor: 'name' // String-based value accessors! - }, { - Header: 'Age', - accessor: 'age', - Cell: props => {props.value} // Custom cell components! - }, { - id: 'friendName', // Required because our accessor is not a string - Header: 'Friend Name', - accessor: d => d.friend.name // Custom value accessors! - }, { - Header: props => Friend Age, // Custom header components! - accessor: 'friend.age' - }] - - return - } -} - +import {Demo} from '../demo.jsx' const Hello = props => ( -
Bonjour {props.name}!
+
Hello {props.name}!
) Hello.defaultProps = { From c4125c37fa8213dbd0ea6080624c0d7d2d2188b5 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sat, 5 Oct 2019 17:20:17 -0500 Subject: [PATCH 007/103] convert demo.jsx -> demo.tsx --- app/javascript/demo.jsx | 51 ------------------------- app/javascript/demo.tsx | 57 ++++++++++++++++++++++++++++ app/javascript/packs/hello_react.jsx | 2 +- 3 files changed, 58 insertions(+), 52 deletions(-) delete mode 100644 app/javascript/demo.jsx create mode 100644 app/javascript/demo.tsx diff --git a/app/javascript/demo.jsx b/app/javascript/demo.jsx deleted file mode 100644 index cc7816b1..00000000 --- a/app/javascript/demo.jsx +++ /dev/null @@ -1,51 +0,0 @@ -import React from 'react' -import ReactTable from 'react-table' -import 'react-table/react-table.css' - - -export class Demo extends React.Component { - render() { - const data = [{ - name: 'Tanner Linsley', - age: 26, - friend: { - name: 'Jason Maurer', - age: 23, - } - },{ - name: 'Arbor Warmber', - age: 22, - friend: { - name: 'Jason Maurer', - age: 23, - } - },{ - name: 'Commisioner Cordwood', - age: 26, - friend: { - name: 'Bobby Berman', - age: 32, - } - },] - - const columns = [{ - Header: 'Name', - accessor: 'name' // String-based value accessors! - }, { - Header: 'Age', - accessor: 'age', - Cell: props => {props.value} // Custom cell components! - }, { - id: 'friendName', // Required because our accessor is not a string - Header: 'Friend Name', - accessor: d => d.friend.name // Custom value accessors! - }, { - Header: props => Friend Age, // Custom header components! - accessor: 'friend.age' - }] - - return - } -} - - diff --git a/app/javascript/demo.tsx b/app/javascript/demo.tsx new file mode 100644 index 00000000..289b6e88 --- /dev/null +++ b/app/javascript/demo.tsx @@ -0,0 +1,57 @@ +import React from "react" +import ReactTable from "react-table" +import "react-table/react-table.css" + +export class Demo extends React.Component { + render() { + const data = [ + { + name: "Tanner Linsley", + age: 26, + friend: { + name: "Jason Maurer", + age: 23, + }, + }, + { + name: "Arbor Warmber", + age: 22, + friend: { + name: "Jason Maurer", + age: 23, + }, + }, + { + name: "Commisioner Cordwood", + age: 26, + friend: { + name: "Bobby Berman", + age: 32, + }, + }, + ] + + const columns = [ + { + Header: "Name", + accessor: "name", // String-based value accessors! + }, + { + Header: "Age", + accessor: "age", + Cell: props => {props.value}, // Custom cell components! + }, + { + id: "friendName", // Required because our accessor is not a string + Header: "Friend Name", + accessor: d => d.friend.name, // Custom value accessors! + }, + { + Header: props => Friend Age, // Custom header components! + accessor: "friend.age", + }, + ] + + return + } +} diff --git a/app/javascript/packs/hello_react.jsx b/app/javascript/packs/hello_react.jsx index a1d17a9a..2a1d3aa1 100644 --- a/app/javascript/packs/hello_react.jsx +++ b/app/javascript/packs/hello_react.jsx @@ -7,7 +7,7 @@ import ReactDOM from 'react-dom' import PropTypes from 'prop-types' import ReactTable from 'react-table' import 'react-table/react-table.css' -import {Demo} from '../demo.jsx' +import {Demo} from '../demo.tsx' From 92d1b8906aa927062e74420881f67fd5cfbe80b9 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 6 Oct 2019 21:31:23 -0500 Subject: [PATCH 008/103] prettier config for js files --- yarn.lock | 308 +++++++++++++++++------------------------------------- 1 file changed, 94 insertions(+), 214 deletions(-) diff --git a/yarn.lock b/yarn.lock index 0ca1004f..c8e01453 100644 --- a/yarn.lock +++ b/yarn.lock @@ -54,12 +54,12 @@ "@babel/helper-explode-assignable-expression" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-builder-react-jsx@^7.3.0": - version "7.3.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz#a1ac95a5d2b3e88ae5e54846bf462eeb81b318a4" - integrity sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw== +"@babel/helper-builder-react-jsx@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.3.tgz#dee98d7d79cc1f003d80b76fe01c7f8945665ff6" + integrity sha512-JT8mfnpTkKNCboTqZsQTdGo3l3Ik3l7QIt9hh0O9DYiwVel37VoJpILKM4YFbP2euF32nkQSb+F9cUk9b7DDXQ== dependencies: - "@babel/types" "^7.3.0" + "@babel/types" "^7.8.3" esutils "^2.0.0" "@babel/helper-call-delegate@^7.4.4": @@ -161,6 +161,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== +"@babel/helper-plugin-utils@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" + integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== + "@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.5.5.tgz#0aa6824f7100a2e0e89c1527c23936c152cab351" @@ -250,23 +255,10 @@ version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.5.tgz#a974cfae1e37c3110e71f3c6a2e48b8e71958cd4" integrity sha512-AF79FsnWFxjlaosgdi421vmYG6/jg79bVD0dpD44QdgobzHKuLZ6S3vl8la9qIeSwGi8i1fS0O1mfuDAAdo1/A== -<<<<<<< HEAD - dependencies: - "@babel/helper-create-class-features-plugin" "^7.5.5" -======= dependencies: "@babel/helper-create-class-features-plugin" "^7.5.5" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-proposal-dynamic-import@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz#e532202db4838723691b10a67b8ce509e397c506" - integrity sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw== - dependencies: ->>>>>>> remove vue. webpacker => 4.0.7. babel-core => 7.6.2. Trashed package-lock.json. - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-dynamic-import" "^7.2.0" - "@babel/plugin-proposal-dynamic-import@^7.5.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz#e532202db4838723691b10a67b8ce509e397c506" @@ -329,12 +321,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-jsx@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz#0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7" - integrity sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw== +"@babel/plugin-syntax-jsx@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz#521b06c83c40480f1e58b4fd33b92eceb1d6ea94" + integrity sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.2.0": version "7.2.0" @@ -533,57 +525,46 @@ version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== -<<<<<<< HEAD - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-react-display-name@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz#ebfaed87834ce8dc4279609a4f0c324c156e3eb0" - integrity sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-react-jsx-self@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz#461e21ad9478f1031dd5e276108d027f1b5240ba" - integrity sha512-v6S5L/myicZEy+jr6ielB0OR8h+EH/1QFx/YJ7c7Ua+7lqsjj/vW6fD5FR9hB/6y7mGbfT4vAURn3xqBxsUcdg== +"@babel/plugin-transform-react-display-name@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz#70ded987c91609f78353dd76d2fb2a0bb991e8e5" + integrity sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.2.0" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-react-jsx-source@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.5.0.tgz#583b10c49cf057e237085bcbd8cc960bd83bd96b" - integrity sha512-58Q+Jsy4IDCZx7kqEZuSDdam/1oW8OdDX8f+Loo6xyxdfg1yF0GE2XNJQSTZCaMol93+FBzpWiPEwtbMloAcPg== +"@babel/plugin-transform-react-jsx-self@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.8.3.tgz#c4f178b2aa588ecfa8d077ea80d4194ee77ed702" + integrity sha512-01OT7s5oa0XTLf2I8XGsL8+KqV9lx3EZV+jxn/L2LQ97CGKila2YMroTkCEIE0HV/FF7CMSRsIAybopdN9NTdg== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.2.0" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-jsx" "^7.8.3" -"@babel/plugin-transform-react-jsx@^7.0.0": - version "7.3.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz#f2cab99026631c767e2745a5368b331cfe8f5290" - integrity sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg== +"@babel/plugin-transform-react-jsx-source@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.8.3.tgz#951e75a8af47f9f120db731be095d2b2c34920e0" + integrity sha512-PLMgdMGuVDtRS/SzjNEQYUT8f4z1xb2BAT54vM1X5efkVuYBf5WyGUMbpmARcfq3NaglIwz08UVQK4HHHbC6ag== dependencies: - "@babel/helper-builder-react-jsx" "^7.3.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.2.0" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-jsx" "^7.8.3" -"@babel/plugin-transform-regenerator@^7.4.5": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" - integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA== +"@babel/plugin-transform-react-jsx@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.3.tgz#4220349c0390fdefa505365f68c103562ab2fc4a" + integrity sha512-r0h+mUiyL595ikykci+fbwm9YzmuOrUBi0b+FDIKmi3fPQyFokWVEMJnRWHJPPQEjyFJyna9WZC6Viv6UHSv1g== dependencies: -======= - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-builder-react-jsx" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-jsx" "^7.8.3" "@babel/plugin-transform-regenerator@^7.4.5": version "7.4.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA== dependencies: ->>>>>>> remove vue. webpacker => 4.0.7. babel-core => 7.6.2. Trashed package-lock.json. regenerator-transform "^0.14.0" "@babel/plugin-transform-reserved-words@^7.2.0": @@ -704,41 +685,17 @@ invariant "^2.2.2" js-levenshtein "^1.1.3" semver "^5.5.0" -<<<<<<< HEAD "@babel/preset-react@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.0.0.tgz#e86b4b3d99433c7b3e9e91747e2653958bc6b3c0" - integrity sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w== + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.8.3.tgz#23dc63f1b5b0751283e04252e78cf1d6589273d2" + integrity sha512-9hx0CwZg92jGb7iHYQVgi0tOEHP/kM60CtWJQnmbATSPIQQ2xYzfoCI3EdqAhFBeeJwYMdWQuDUHMsuDbH9hyQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-transform-react-display-name" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/plugin-transform-react-jsx-self" "^7.0.0" - "@babel/plugin-transform-react-jsx-source" "^7.0.0" - -"@babel/runtime@^7.4.2", "@babel/runtime@^7.4.5": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.6.2.tgz#c3d6e41b304ef10dcf13777a33e7694ec4a9a6dd" - integrity sha512-EXxN64agfUqqIGeEjI5dL5z0Sw0ZwWo1mLTi4mQowCZ42O59b7DRpZAnTC6OqdF28wMBMFKNb/4uFGrVaigSpg== - dependencies: - regenerator-runtime "^0.13.2" - -"@babel/template@^7.1.0", "@babel/template@^7.4.0", "@babel/template@^7.4.4", "@babel/template@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6" - integrity sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.6.0" - "@babel/types" "^7.6.0" - -"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5", "@babel/traverse@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.2.tgz#b0e2bfd401d339ce0e6c05690206d1e11502ce2c" - integrity sha512-8fRE76xNwNttVEF2TwxJDGBLWthUkHWSldmfuBzVRmEDWOtu4XdINTgN7TDWzuLg4bbeIMLvfMFD9we5YcWkRQ== - dependencies: -======= + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-react-display-name" "^7.8.3" + "@babel/plugin-transform-react-jsx" "^7.8.3" + "@babel/plugin-transform-react-jsx-self" "^7.8.3" + "@babel/plugin-transform-react-jsx-source" "^7.8.3" "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.5": version "7.6.2" @@ -761,7 +718,6 @@ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.2.tgz#b0e2bfd401d339ce0e6c05690206d1e11502ce2c" integrity sha512-8fRE76xNwNttVEF2TwxJDGBLWthUkHWSldmfuBzVRmEDWOtu4XdINTgN7TDWzuLg4bbeIMLvfMFD9we5YcWkRQ== dependencies: ->>>>>>> remove vue. webpacker => 4.0.7. babel-core => 7.6.2. Trashed package-lock.json. "@babel/code-frame" "^7.5.5" "@babel/generator" "^7.6.2" "@babel/helper-function-name" "^7.1.0" @@ -781,6 +737,15 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" +"@babel/types@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c" + integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg== + dependencies: + esutils "^2.0.2" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + "@cnakazawa/watch@^1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" @@ -1105,24 +1070,6 @@ dependencies: "@types/yargs-parser" "*" -<<<<<<< HEAD -"@vue/component-compiler-utils@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-3.0.0.tgz#d16fa26b836c06df5baaeb45f3d80afc47e35634" - integrity sha512-am+04/0UX7ektcmvhYmrf84BDVAD8afFOf4asZjN84q8xzxFclbk5x0MtxuKGfp+zjN5WWPJn3fjFAWtDdIGSw== - dependencies: - consolidate "^0.15.1" - hash-sum "^1.0.2" - lru-cache "^4.1.2" - merge-source-map "^1.1.0" - postcss "^7.0.14" - postcss-selector-parser "^5.0.0" - prettier "1.16.3" - source-map "~0.6.1" - vue-template-es2015-compiler "^1.9.0" - -======= ->>>>>>> remove vue. webpacker => 4.0.7. babel-core => 7.6.2. Trashed package-lock.json. "@webassemblyjs/ast@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" @@ -1542,7 +1489,6 @@ atob@^2.1.1: integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== autoprefixer@^9.6.1: -<<<<<<< HEAD version "9.6.4" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.6.4.tgz#e6453be47af316b2923eaeaed87860f52ad4b7eb" integrity sha512-Koz2cJU9dKOxG8P1f8uVaBntOv9lP4yz9ffWvWaicv9gHBPhpQB22nGijwd8gqW9CNT+UdkbQOQNLVI8jN1ZfQ== @@ -1554,19 +1500,6 @@ autoprefixer@^9.6.1: num2fraction "^1.2.2" postcss "^7.0.18" postcss-value-parser "^4.0.2" -======= - version "9.6.1" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.6.1.tgz#51967a02d2d2300bb01866c1611ec8348d355a47" - integrity sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw== - dependencies: - browserslist "^4.6.3" - caniuse-lite "^1.0.30000980" - chalk "^2.4.2" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^7.0.17" - postcss-value-parser "^4.0.0" ->>>>>>> remove vue. webpacker => 4.0.7. babel-core => 7.6.2. Trashed package-lock.json. aws-sign2@~0.7.0: version "0.7.0" @@ -1699,11 +1632,7 @@ block-stream@*: dependencies: inherits "~2.0.0" -<<<<<<< HEAD -bluebird@^3.1.1, bluebird@^3.5.5: -======= bluebird@^3.5.5: ->>>>>>> remove vue. webpacker => 4.0.7. babel-core => 7.6.2. Trashed package-lock.json. version "3.7.0" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.0.tgz#56a6a886e03f6ae577cffedeb524f8f2450293cf" integrity sha512-aBQ1FxIa7kSWCcmKHlcHFlT2jt6J/l4FzC7KcPELkOJOsPOb/bccdhmIrKDfXhwFrmc7vDoDrrepFvGqjyXGJg== @@ -1853,11 +1782,7 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -<<<<<<< HEAD -browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.6.4, browserslist@^4.6.6, browserslist@^4.7.0: -======= -browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.6.3, browserslist@^4.6.4, browserslist@^4.6.6: ->>>>>>> remove vue. webpacker => 4.0.7. babel-core => 7.6.2. Trashed package-lock.json. +browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.6.4, browserslist@^4.6.6: version "4.7.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.0.tgz#9ee89225ffc07db03409f2fee524dc8227458a17" integrity sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA== @@ -1866,6 +1791,15 @@ browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.6.3, browserslist@^4.6 electron-to-chromium "^1.3.247" node-releases "^1.1.29" +browserslist@^4.7.0: + version "4.8.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.6.tgz#96406f3f5f0755d272e27a66f4163ca821590a7e" + integrity sha512-ZHao85gf0eZ0ESxLfCp73GG9O/VTytYDIkIiZDlURppLTI9wErSM/5yAKEq6rcUdxBLjMELmrYUJGg5sxGKMHg== + dependencies: + caniuse-lite "^1.0.30001023" + electron-to-chromium "^1.3.341" + node-releases "^1.1.47" + bser@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.0.tgz#65fc784bf7f87c009b973c12db6546902fa9c7b5" @@ -1921,39 +1855,13 @@ cacache@^11.2.0: chownr "^1.1.1" figgy-pudding "^3.5.1" glob "^7.1.4" -<<<<<<< HEAD - graceful-fs "^4.1.15" - lru-cache "^5.1.1" - mississippi "^3.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.3" - ssri "^6.0.1" - unique-filename "^1.1.1" - y18n "^4.0.0" - -cacache@^12.0.2: - version "12.0.3" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" - integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== - dependencies: - bluebird "^3.5.5" - chownr "^1.1.1" - figgy-pudding "^3.5.1" - glob "^7.1.4" -======= ->>>>>>> remove vue. webpacker => 4.0.7. babel-core => 7.6.2. Trashed package-lock.json. graceful-fs "^4.1.15" - infer-owner "^1.0.3" lru-cache "^5.1.1" mississippi "^3.0.0" mkdirp "^0.5.1" move-concurrently "^1.0.1" promise-inflight "^1.0.1" rimraf "^2.6.3" -<<<<<<< HEAD -======= ssri "^6.0.1" unique-filename "^1.1.1" y18n "^4.0.0" @@ -1975,7 +1883,6 @@ cacache@^12.0.2: move-concurrently "^1.0.1" promise-inflight "^1.0.1" rimraf "^2.6.3" ->>>>>>> remove vue. webpacker => 4.0.7. babel-core => 7.6.2. Trashed package-lock.json. ssri "^6.0.1" unique-filename "^1.1.1" y18n "^4.0.0" @@ -2052,17 +1959,15 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -<<<<<<< HEAD -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30000989, caniuse-lite@^1.0.30000998: - version "1.0.30000999" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000999.tgz#427253a69ad7bea4aa8d8345687b8eec51ca0e43" - integrity sha512-1CUyKyecPeksKwXZvYw0tEoaMCo/RwBlXmEtN5vVnabvO0KPd9RQLcaAuR9/1F+KDMv6esmOFWlsXuzDk+8rxg== -======= -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000980, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30000989: +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30000989: version "1.0.30000998" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000998.tgz#7227a8046841e7d01e156ae7227a504d065f6744" integrity sha512-8Tj5sPZR9kMHeDD9SZXIVr5m9ofufLLCG2Y4QwQrH18GIwG+kCc+zYdlR036ZRkuKjVVetyxeAgGA1xF7XdmzQ== ->>>>>>> remove vue. webpacker => 4.0.7. babel-core => 7.6.2. Trashed package-lock.json. + +caniuse-lite@^1.0.30000998, caniuse-lite@^1.0.30001023: + version "1.0.30001023" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001023.tgz#b82155827f3f5009077bdd2df3d8968bcbcc6fc4" + integrity sha512-C5TDMiYG11EOhVOA62W1p3UsJ2z4DsHtMBQtjzp3ZsUglcQn62WOUgW0y795c7A5uZ+GCEIvzkMatLIlAsbNTA== capture-exit@^2.0.0: version "2.0.0" @@ -2721,14 +2626,6 @@ date-now@^0.1.4: resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= -<<<<<<< HEAD -de-indent@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" - integrity sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0= - -======= ->>>>>>> remove vue. webpacker => 4.0.7. babel-core => 7.6.2. Trashed package-lock.json. debug@2.6.9, debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -2983,15 +2880,14 @@ ee-first@1.1.1: integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= electron-to-chromium@^1.3.247: -<<<<<<< HEAD - version "1.3.276" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.276.tgz#1cca47c31b6e852ce43ab62ae4f31608db8b95d4" - integrity sha512-J7bVRAW2fHJVOGZqxSvmMcbBAWPiueHsKwSq+TjaNq1wQ71Za0uBExC1ECuMmAAQioDA2//auhI/glFINnUGPw== -======= version "1.3.273" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.273.tgz#94872d6823219f2812f2e35a2ce2a7d03c1eaa3f" integrity sha512-0kUppiHQvHEENHh+nTtvTt4eXMwcPyWmMaj73GPrSEm3ldKhmmHuOH6IjrmuW6YmyS/fpXcLvMQLNVpqRhpNWw== ->>>>>>> remove vue. webpacker => 4.0.7. babel-core => 7.6.2. Trashed package-lock.json. + +electron-to-chromium@^1.3.341: + version "1.3.342" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.342.tgz#138317aa7399e268735b9269fe374a8566425090" + integrity sha512-An/MLhGLIG/g7lZ5vqs4lar96zv74agd3ZcADDHLpjAa16T7Y/pO/33Q31JOwpmHeyjithtHtUcn7XLuaz78lw== elliptic@^6.0.0: version "6.5.1" @@ -5214,28 +5110,10 @@ merge-descriptors@1.0.1: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= -<<<<<<< HEAD -merge-source-map@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" - integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== - dependencies: - source-map "^0.6.1" - -======= ->>>>>>> remove vue. webpacker => 4.0.7. babel-core => 7.6.2. Trashed package-lock.json. merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -<<<<<<< HEAD - -merge@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" - integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== -======= ->>>>>>> remove vue. webpacker => 4.0.7. babel-core => 7.6.2. Trashed package-lock.json. methods@~1.1.2: version "1.1.2" @@ -5584,6 +5462,13 @@ node-releases@^1.1.29: dependencies: semver "^6.3.0" +node-releases@^1.1.47: + version "1.1.47" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.47.tgz#c59ef739a1fd7ecbd9f0b7cf5b7871e8a8b591e4" + integrity sha512-k4xjVPx5FpwBUj0Gw7uvFOTF4Ep8Hok1I6qjwL3pLfwe7Y0REQSAqOwwv9TWBCUtMHxcXfY4PgRLRozcChvTcA== + dependencies: + semver "^6.3.0" + node-sass@^4.12.0: version "4.12.0" resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.12.0.tgz#0914f531932380114a30cc5fa4fa63233a25f017" @@ -6769,15 +6654,6 @@ postcss-selector-parser@^6.0.0: indexes-of "^1.0.1" uniq "^1.0.1" -postcss-selector-parser@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" - integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== - dependencies: - cssesc "^3.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" - postcss-svgo@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" @@ -6802,7 +6678,7 @@ postcss-value-parser@^3.0.0, postcss-value-parser@^3.2.3, postcss-value-parser@^ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== -postcss-value-parser@^4.0.0: +postcss-value-parser@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz#482282c09a42706d1fc9a069b73f44ec08391dc9" integrity sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ== @@ -6825,6 +6701,15 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2 source-map "^0.6.1" supports-color "^6.1.0" +postcss@^7.0.18: + version "7.0.26" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.26.tgz#5ed615cfcab35ba9bbb82414a4fa88ea10429587" + integrity sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -6835,11 +6720,6 @@ prepend-http@^1.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= -prettier@1.16.3: - version "1.16.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.16.3.tgz#8c62168453badef702f34b45b6ee899574a6a65d" - integrity sha512-kn/GU6SMRYPxUakNXhpP0EedT/KmaPzr0H5lIsDogrykbaxOpOfAFfk5XA7DZrJyMAv1wlMV3CPcZruGXVVUZw== - prettier@1.18.2: version "1.18.2" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" From f75c7d07cdd2139662160d827a7976e344eacf1d Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 20 Oct 2019 20:22:53 -0500 Subject: [PATCH 009/103] yarn install and bump prettier to match master --- yarn.lock | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/yarn.lock b/yarn.lock index c8e01453..27c94fdc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2933,6 +2933,15 @@ enhanced-resolve@4.1.0, enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: memory-fs "^0.4.0" tapable "^1.0.0" +enhanced-resolve@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" + integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + entities@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" @@ -5089,6 +5098,14 @@ memory-fs@^0.4.0, memory-fs@^0.4.1: errno "^0.1.3" readable-stream "^2.0.1" +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + meow@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" From b0a8d729f03c48f36694ce006f6d2da2de9bd1f9 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sat, 26 Oct 2019 14:57:41 -0500 Subject: [PATCH 010/103] nothing works. typescript silently fails but produces working js with no typechecking. argh. --- app/javascript/demo.tsx | 3 ++- app/javascript/foo.ts | 6 +++++ app/javascript/packs/hello_react.jsx | 32 -------------------------- app/javascript/packs/hello_react.tsx | 34 ++++++++++++++++++++++++++++ package.json | 5 ++-- tsconfig.json | 4 ++-- yarn.lock | 18 +++++++++++---- 7 files changed, 60 insertions(+), 42 deletions(-) create mode 100644 app/javascript/foo.ts delete mode 100644 app/javascript/packs/hello_react.jsx create mode 100644 app/javascript/packs/hello_react.tsx diff --git a/app/javascript/demo.tsx b/app/javascript/demo.tsx index 289b6e88..c498dd1f 100644 --- a/app/javascript/demo.tsx +++ b/app/javascript/demo.tsx @@ -1,6 +1,7 @@ import React from "react" import ReactTable from "react-table" import "react-table/react-table.css" +import { foo } from "./foo.ts" export class Demo extends React.Component { render() { @@ -18,7 +19,7 @@ export class Demo extends React.Component { age: 22, friend: { name: "Jason Maurer", - age: 23, + age: foo(22, [17]), }, }, { diff --git a/app/javascript/foo.ts b/app/javascript/foo.ts new file mode 100644 index 00000000..4f224369 --- /dev/null +++ b/app/javascript/foo.ts @@ -0,0 +1,6 @@ + +export const foo = (x: integer, y: string) { + const z: integer [] = x+y; + return z; +} + diff --git a/app/javascript/packs/hello_react.jsx b/app/javascript/packs/hello_react.jsx deleted file mode 100644 index 2a1d3aa1..00000000 --- a/app/javascript/packs/hello_react.jsx +++ /dev/null @@ -1,32 +0,0 @@ -// Run this example by adding <%= javascript_pack_tag 'hello_react' %> to the head of your layout file, -// like app/views/layouts/application.html.erb. All it does is render
Hello React
at the bottom -// of the page. - -import React from 'react' -import ReactDOM from 'react-dom' -import PropTypes from 'prop-types' -import ReactTable from 'react-table' -import 'react-table/react-table.css' -import {Demo} from '../demo.tsx' - - - - -const Hello = props => ( -
Hello {props.name}!
-) - -Hello.defaultProps = { - name: 'David' -} - -Hello.propTypes = { - name: PropTypes.string -} - -document.addEventListener('DOMContentLoaded', () => { - ReactDOM.render( - , - document.body.appendChild(document.createElement('div')), - ) -}) diff --git a/app/javascript/packs/hello_react.tsx b/app/javascript/packs/hello_react.tsx new file mode 100644 index 00000000..c8d3f9ac --- /dev/null +++ b/app/javascript/packs/hello_react.tsx @@ -0,0 +1,34 @@ +// Run this example by adding <%= javascript_pack_tag 'hello_react' %> to the head of your layout file, +// like app/views/layouts/application.html.erb. All it does is render
Hello React
at the bottom +// of the page. + +import React from "react" +import ReactDOM from "react-dom" +import PropTypes from "prop-types" +import ReactTable from "react-table" +import "react-table/react-table.css" +import { Demo } from "../demo" +import { foo } from "../foo.ts" + +const Hello = props => ( +
+ Hello {props.name}! +
+) + +Hello.defaultProps = { + name: "David", +} + +Hello.propTypes = { + name: PropTypes.string, +} + +document.addEventListener("DOMContentLoaded", () => { + ReactDOM.render( + , + document.body.appendChild(document.createElement("div")) + ) + + foo(5, "wombat") +}) diff --git a/package.json b/package.json index e5dcc3d5..cde4d03d 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,8 @@ "@babel/preset-env": "^7.3.1", "@babel/preset-react": "^7.0.0", "@rails/webpacker": "^4.0.0-rc.7", - "@types/react": "^16.9.5", - "@types/react-dom": "^16.9.1", + "@types/react": "^16.9.9", + "@types/react-dom": "^16.9.2", "babel-loader": "^8.0.5", "babel-plugin-transform-react-remove-prop-types": "^0.4.24", "prop-types": "^15.7.2", @@ -24,6 +24,7 @@ "prettier": "prettier", "test": "jest" }, + "license": "AGPL-3.0", "jest": { "roots": [ "spec/javascript" diff --git a/tsconfig.json b/tsconfig.json index 7425c2b4..891af24c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,6 +8,7 @@ "moduleResolution": "node", "sourceMap": true, "target": "es5", + "strict": true, "jsx": "react" }, "exclude": [ @@ -15,6 +16,5 @@ "node_modules", "vendor", "public" - ], - "compileOnSave": false + ] } diff --git a/yarn.lock b/yarn.lock index 27c94fdc..2284f6fd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1038,14 +1038,14 @@ resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== -"@types/react-dom@^16.9.1": - version "16.9.1" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.1.tgz#79206237cba9532a9f870b1cd5428bef6b66378c" - integrity sha512-1S/akvkKr63qIUWVu5IKYou2P9fHLb/P2VAwyxVV85JGaGZTcUniMiTuIqM3lXFB25ej6h+CYEQ27ERVwi6eGA== +"@types/react-dom@^16.9.2": + version "16.9.2" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.2.tgz#90f9e6c161850be1feb31d2f448121be2a4f3b47" + integrity sha512-hgPbBoI1aTSTvZwo8HYw35UaTldW6n2ETLvHAcfcg1FaOuBV3olmyCe5eMpx2WybWMBPv0MdU2t5GOcQhP+3zA== dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^16.9.5": +"@types/react@*": version "16.9.5" resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.5.tgz#079dabd918b19b32118c25fd00a786bb6d0d5e51" integrity sha512-jQ12VMiFOWYlp+j66dghOWcmDDwhca0bnlcTxS4Qz/fh5gi6wpaZDthPEu/Gc/YlAuO87vbiUXL8qKstFvuOaA== @@ -1053,6 +1053,14 @@ "@types/prop-types" "*" csstype "^2.2.0" +"@types/react@^16.9.9": + version "16.9.9" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.9.tgz#a62c6f40f04bc7681be5e20975503a64fe783c3a" + integrity sha512-L+AudFJkDukk+ukInYvpoAPyJK5q1GanFOINOJnM0w6tUgITuWvJ4jyoBPFL7z4/L8hGLd+K/6xR5uUjXu0vVg== + dependencies: + "@types/prop-types" "*" + csstype "^2.2.0" + "@types/stack-utils@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" From 98d9d7c756f0c2fac59836076ddb90bbf235ac28 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sat, 26 Oct 2019 15:13:18 -0500 Subject: [PATCH 011/103] remove webpacker and hopefully all it's stuff --- Gemfile | 2 +- Gemfile.lock | 5 -- babel.config.js | 85 ------------------------ config/webpack/development.js | 5 -- config/webpack/environment.js | 5 -- config/webpack/loaders/typescript.js | 11 ---- config/webpack/production.js | 5 -- config/webpack/test.js | 5 -- config/webpacker.yml | 98 ---------------------------- package.json | 37 ----------- postcss.config.js | 12 ---- 11 files changed, 1 insertion(+), 269 deletions(-) delete mode 100644 babel.config.js delete mode 100644 config/webpack/development.js delete mode 100644 config/webpack/environment.js delete mode 100644 config/webpack/loaders/typescript.js delete mode 100644 config/webpack/production.js delete mode 100644 config/webpack/test.js delete mode 100644 config/webpacker.yml delete mode 100644 package.json delete mode 100644 postcss.config.js diff --git a/Gemfile b/Gemfile index c4319b4c..93ddf443 100644 --- a/Gemfile +++ b/Gemfile @@ -84,4 +84,4 @@ gem 'ajax-datatables-rails' gem 'actionview-encoded_mail_to' -gem 'webpacker', '>= 4.0.x' + diff --git a/Gemfile.lock b/Gemfile.lock index de6815ec..17499fd5 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -253,10 +253,6 @@ GEM activemodel (>= 5.0) bindex (>= 0.4.0) railties (>= 5.0) - webpacker (4.0.7) - activesupport (>= 4.2) - rack-proxy (>= 0.6.1) - railties (>= 4.2) websocket-driver (0.6.5) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.3) @@ -300,7 +296,6 @@ DEPENDENCIES uglifier (>= 1.3.0) unicorn web-console - webpacker (>= 4.0.x) BUNDLED WITH 2.0.2 diff --git a/babel.config.js b/babel.config.js deleted file mode 100644 index 91a7b7c2..00000000 --- a/babel.config.js +++ /dev/null @@ -1,85 +0,0 @@ -module.exports = function(api) { - var validEnv = ['development', 'test', 'production'] - var currentEnv = api.env() - var isDevelopmentEnv = api.env('development') - var isProductionEnv = api.env('production') - var isTestEnv = api.env('test') - - if (!validEnv.includes(currentEnv)) { - throw new Error( - 'Please specify a valid `NODE_ENV` or ' + - '`BABEL_ENV` environment variables. Valid values are "development", ' + - '"test", and "production". Instead, received: ' + - JSON.stringify(currentEnv) + - '.' - ) - } - - return { - presets: [ - isTestEnv && [ - require('@babel/preset-env').default, - { - targets: { - node: 'current' - } - } - ], - (isProductionEnv || isDevelopmentEnv) && [ - require('@babel/preset-env').default, - { - forceAllTransforms: true, - useBuiltIns: 'entry', - corejs: 3, - modules: false, - exclude: ['transform-typeof-symbol'] - } - ], - [ - require('@babel/preset-react').default, - { - development: isDevelopmentEnv || isTestEnv, - useBuiltIns: true - } - ] - ].filter(Boolean), - plugins: [ - require('babel-plugin-macros'), - require('@babel/plugin-syntax-dynamic-import').default, - isTestEnv && require('babel-plugin-dynamic-import-node'), - require('@babel/plugin-transform-destructuring').default, - [ - require('@babel/plugin-proposal-class-properties').default, - { - loose: true - } - ], - [ - require('@babel/plugin-proposal-object-rest-spread').default, - { - useBuiltIns: true - } - ], - [ - require('@babel/plugin-transform-runtime').default, - { - helpers: false, - regenerator: true, - corejs: false - } - ], - [ - require('@babel/plugin-transform-regenerator').default, - { - async: false - } - ], - isProductionEnv && [ - require('babel-plugin-transform-react-remove-prop-types').default, - { - removeImport: true - } - ] - ].filter(Boolean) - } -} diff --git a/config/webpack/development.js b/config/webpack/development.js deleted file mode 100644 index c5edff94..00000000 --- a/config/webpack/development.js +++ /dev/null @@ -1,5 +0,0 @@ -process.env.NODE_ENV = process.env.NODE_ENV || 'development' - -const environment = require('./environment') - -module.exports = environment.toWebpackConfig() diff --git a/config/webpack/environment.js b/config/webpack/environment.js deleted file mode 100644 index f10aeb53..00000000 --- a/config/webpack/environment.js +++ /dev/null @@ -1,5 +0,0 @@ -const { environment } = require('@rails/webpacker') -const typescript = require('./loaders/typescript') - -environment.loaders.prepend('typescript', typescript) -module.exports = environment diff --git a/config/webpack/loaders/typescript.js b/config/webpack/loaders/typescript.js deleted file mode 100644 index 2f5e1790..00000000 --- a/config/webpack/loaders/typescript.js +++ /dev/null @@ -1,11 +0,0 @@ -const PnpWebpackPlugin = require('pnp-webpack-plugin') - -module.exports = { - test: /\.(ts|tsx)?(\.erb)?$/, - use: [ - { - loader: 'ts-loader', - options: PnpWebpackPlugin.tsLoaderOptions() - } - ] -} diff --git a/config/webpack/production.js b/config/webpack/production.js deleted file mode 100644 index be0f53aa..00000000 --- a/config/webpack/production.js +++ /dev/null @@ -1,5 +0,0 @@ -process.env.NODE_ENV = process.env.NODE_ENV || 'production' - -const environment = require('./environment') - -module.exports = environment.toWebpackConfig() diff --git a/config/webpack/test.js b/config/webpack/test.js deleted file mode 100644 index c5edff94..00000000 --- a/config/webpack/test.js +++ /dev/null @@ -1,5 +0,0 @@ -process.env.NODE_ENV = process.env.NODE_ENV || 'development' - -const environment = require('./environment') - -module.exports = environment.toWebpackConfig() diff --git a/config/webpacker.yml b/config/webpacker.yml deleted file mode 100644 index 1beb35f9..00000000 --- a/config/webpacker.yml +++ /dev/null @@ -1,98 +0,0 @@ -# Note: You must restart bin/webpack-dev-server for changes to take effect - -default: &default - source_path: app/javascript - source_entry_path: packs - public_root_path: public - public_output_path: packs - cache_path: tmp/cache/webpacker - check_yarn_integrity: false - webpack_compile_output: false - - # Additional paths webpack should lookup modules - # ['app/assets', 'engine/foo/app/assets'] - resolved_paths: [] - - # Reload manifest.json on all requests so we reload latest compiled packs - cache_manifest: false - - # Extract and emit a css file - extract_css: false - - static_assets_extensions: - - .jpg - - .jpeg - - .png - - .gif - - .tiff - - .ico - - .svg - - .eot - - .otf - - .ttf - - .woff - - .woff2 - - extensions: - - .tsx - - .ts - - .jsx - - .mjs - - .js - - .sass - - .scss - - .css - - .module.sass - - .module.scss - - .module.css - - .png - - .svg - - .gif - - .jpeg - - .jpg - -development: - <<: *default - compile: true - - # Verifies that versions and hashed value of the package contents in the project's package.json - check_yarn_integrity: true - - # Reference: https://webpack.js.org/configuration/dev-server/ - dev_server: - https: false - host: localhost - port: 3035 - public: localhost:3035 - hmr: false - # Inline should be set to true if using HMR - inline: true - overlay: true - compress: true - disable_host_check: true - use_local_ip: false - quiet: false - headers: - 'Access-Control-Allow-Origin': '*' - watch_options: - ignored: '**/node_modules/**' - - -test: - <<: *default - compile: true - - # Compile test packs to a separate directory - public_output_path: packs-test - -production: - <<: *default - - # Production depends on precompilation of packs prior to booting for performance. - compile: false - - # Extract and emit a css file - extract_css: true - - # Cache manifest.json for performance - cache_manifest: true diff --git a/package.json b/package.json deleted file mode 100644 index cde4d03d..00000000 --- a/package.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "dependencies": { - "@babel/core": "^7.2.2", - "@babel/preset-env": "^7.3.1", - "@babel/preset-react": "^7.0.0", - "@rails/webpacker": "^4.0.0-rc.7", - "@types/react": "^16.9.9", - "@types/react-dom": "^16.9.2", - "babel-loader": "^8.0.5", - "babel-plugin-transform-react-remove-prop-types": "^0.4.24", - "prop-types": "^15.7.2", - "react": "^16.10.2", - "react-dom": "^16.10.2", - "react-table": "^6.10.3", - "ts-loader": "^6.2.0", - "typescript": "^3.6.3" - }, - "devDependencies": { - "jest": "^24.8.0", - "prettier": "1.18.2", - "webpack-dev-server": "^3.1.14" - }, - "scripts": { - "prettier": "prettier", - "test": "jest" - }, - "license": "AGPL-3.0", - "jest": { - "roots": [ - "spec/javascript" - ], - "moduleDirectories": [ - "node_modules", - "app/javascript" - ] - } -} diff --git a/postcss.config.js b/postcss.config.js deleted file mode 100644 index aa5998a8..00000000 --- a/postcss.config.js +++ /dev/null @@ -1,12 +0,0 @@ -module.exports = { - plugins: [ - require('postcss-import'), - require('postcss-flexbugs-fixes'), - require('postcss-preset-env')({ - autoprefixer: { - flexbox: 'no-2009' - }, - stage: 3 - }) - ] -} From 244e1ffb841a42793c1b147676e0be5e0e7fe548 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sat, 26 Oct 2019 16:47:17 -0500 Subject: [PATCH 012/103] restore webpacker, react, typescript, and a demo application.js --- .browserslistrc | 2 +- Gemfile | 2 +- Gemfile.lock | 5 + app/javascript/foo.ts | 4 +- app/javascript/packs/application.js | 8 + app/javascript/packs/hello_react.jsx | 26 + app/views/welcome/search.html.erb | 5 +- babel.config.js | 85 ++ config/webpack/development.js | 5 + config/webpack/environment.js | 5 + config/webpack/loaders/typescript.js | 11 + config/webpack/production.js | 5 + config/webpack/test.js | 5 + config/webpacker.yml | 98 ++ package.json | 17 + postcss.config.js | 12 + tsconfig.json | 5 +- yarn.lock | 1895 ++++---------------------- 18 files changed, 541 insertions(+), 1654 deletions(-) create mode 100644 app/javascript/packs/application.js create mode 100644 app/javascript/packs/hello_react.jsx create mode 100644 babel.config.js create mode 100644 config/webpack/development.js create mode 100644 config/webpack/environment.js create mode 100644 config/webpack/loaders/typescript.js create mode 100644 config/webpack/production.js create mode 100644 config/webpack/test.js create mode 100644 config/webpacker.yml create mode 100644 package.json create mode 100644 postcss.config.js diff --git a/.browserslistrc b/.browserslistrc index de555672..e94f8140 100644 --- a/.browserslistrc +++ b/.browserslistrc @@ -1 +1 @@ -> 1% +defaults diff --git a/Gemfile b/Gemfile index 93ddf443..0261f2bc 100644 --- a/Gemfile +++ b/Gemfile @@ -84,4 +84,4 @@ gem 'ajax-datatables-rails' gem 'actionview-encoded_mail_to' - +gem 'webpacker', '~> 4.x' diff --git a/Gemfile.lock b/Gemfile.lock index 17499fd5..7e6f48f4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -253,6 +253,10 @@ GEM activemodel (>= 5.0) bindex (>= 0.4.0) railties (>= 5.0) + webpacker (4.0.7) + activesupport (>= 4.2) + rack-proxy (>= 0.6.1) + railties (>= 4.2) websocket-driver (0.6.5) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.3) @@ -296,6 +300,7 @@ DEPENDENCIES uglifier (>= 1.3.0) unicorn web-console + webpacker (~> 4.x) BUNDLED WITH 2.0.2 diff --git a/app/javascript/foo.ts b/app/javascript/foo.ts index 4f224369..b7d8de0a 100644 --- a/app/javascript/foo.ts +++ b/app/javascript/foo.ts @@ -1,6 +1,6 @@ -export const foo = (x: integer, y: string) { - const z: integer [] = x+y; +export const foo = (x: string, y: string) => { + const z: string = x+y; return z; } diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js new file mode 100644 index 00000000..01fdfe6e --- /dev/null +++ b/app/javascript/packs/application.js @@ -0,0 +1,8 @@ +import "core-js/stable"; +import "regenerator-runtime/runtime"; + +import {foo} from "../foo.ts" + +const f = x => x+" robot"; + +console.log(foo("Hello space banana", "robot")) diff --git a/app/javascript/packs/hello_react.jsx b/app/javascript/packs/hello_react.jsx new file mode 100644 index 00000000..772fc97e --- /dev/null +++ b/app/javascript/packs/hello_react.jsx @@ -0,0 +1,26 @@ +// Run this example by adding <%= javascript_pack_tag 'hello_react' %> to the head of your layout file, +// like app/views/layouts/application.html.erb. All it does is render
Hello React
at the bottom +// of the page. + +import React from 'react' +import ReactDOM from 'react-dom' +import PropTypes from 'prop-types' + +const Hello = props => ( +
Hello {props.name}!
+) + +Hello.defaultProps = { + name: 'David' +} + +Hello.propTypes = { + name: PropTypes.string +} + +document.addEventListener('DOMContentLoaded', () => { + ReactDOM.render( + , + document.body.appendChild(document.createElement('div')), + ) +}) diff --git a/app/views/welcome/search.html.erb b/app/views/welcome/search.html.erb index 67840300..cc07ec18 100644 --- a/app/views/welcome/search.html.erb +++ b/app/views/welcome/search.html.erb @@ -1,4 +1,7 @@ -<%= javascript_pack_tag 'hello_react' %> +<%= javascript_pack_tag 'application' %> +<%= stylesheet_pack_tag 'application' %> +<%# javascript_pack_tag 'hello_react' %> +

Find Dances

diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 00000000..91a7b7c2 --- /dev/null +++ b/babel.config.js @@ -0,0 +1,85 @@ +module.exports = function(api) { + var validEnv = ['development', 'test', 'production'] + var currentEnv = api.env() + var isDevelopmentEnv = api.env('development') + var isProductionEnv = api.env('production') + var isTestEnv = api.env('test') + + if (!validEnv.includes(currentEnv)) { + throw new Error( + 'Please specify a valid `NODE_ENV` or ' + + '`BABEL_ENV` environment variables. Valid values are "development", ' + + '"test", and "production". Instead, received: ' + + JSON.stringify(currentEnv) + + '.' + ) + } + + return { + presets: [ + isTestEnv && [ + require('@babel/preset-env').default, + { + targets: { + node: 'current' + } + } + ], + (isProductionEnv || isDevelopmentEnv) && [ + require('@babel/preset-env').default, + { + forceAllTransforms: true, + useBuiltIns: 'entry', + corejs: 3, + modules: false, + exclude: ['transform-typeof-symbol'] + } + ], + [ + require('@babel/preset-react').default, + { + development: isDevelopmentEnv || isTestEnv, + useBuiltIns: true + } + ] + ].filter(Boolean), + plugins: [ + require('babel-plugin-macros'), + require('@babel/plugin-syntax-dynamic-import').default, + isTestEnv && require('babel-plugin-dynamic-import-node'), + require('@babel/plugin-transform-destructuring').default, + [ + require('@babel/plugin-proposal-class-properties').default, + { + loose: true + } + ], + [ + require('@babel/plugin-proposal-object-rest-spread').default, + { + useBuiltIns: true + } + ], + [ + require('@babel/plugin-transform-runtime').default, + { + helpers: false, + regenerator: true, + corejs: false + } + ], + [ + require('@babel/plugin-transform-regenerator').default, + { + async: false + } + ], + isProductionEnv && [ + require('babel-plugin-transform-react-remove-prop-types').default, + { + removeImport: true + } + ] + ].filter(Boolean) + } +} diff --git a/config/webpack/development.js b/config/webpack/development.js new file mode 100644 index 00000000..c5edff94 --- /dev/null +++ b/config/webpack/development.js @@ -0,0 +1,5 @@ +process.env.NODE_ENV = process.env.NODE_ENV || 'development' + +const environment = require('./environment') + +module.exports = environment.toWebpackConfig() diff --git a/config/webpack/environment.js b/config/webpack/environment.js new file mode 100644 index 00000000..f10aeb53 --- /dev/null +++ b/config/webpack/environment.js @@ -0,0 +1,5 @@ +const { environment } = require('@rails/webpacker') +const typescript = require('./loaders/typescript') + +environment.loaders.prepend('typescript', typescript) +module.exports = environment diff --git a/config/webpack/loaders/typescript.js b/config/webpack/loaders/typescript.js new file mode 100644 index 00000000..2f5e1790 --- /dev/null +++ b/config/webpack/loaders/typescript.js @@ -0,0 +1,11 @@ +const PnpWebpackPlugin = require('pnp-webpack-plugin') + +module.exports = { + test: /\.(ts|tsx)?(\.erb)?$/, + use: [ + { + loader: 'ts-loader', + options: PnpWebpackPlugin.tsLoaderOptions() + } + ] +} diff --git a/config/webpack/production.js b/config/webpack/production.js new file mode 100644 index 00000000..be0f53aa --- /dev/null +++ b/config/webpack/production.js @@ -0,0 +1,5 @@ +process.env.NODE_ENV = process.env.NODE_ENV || 'production' + +const environment = require('./environment') + +module.exports = environment.toWebpackConfig() diff --git a/config/webpack/test.js b/config/webpack/test.js new file mode 100644 index 00000000..c5edff94 --- /dev/null +++ b/config/webpack/test.js @@ -0,0 +1,5 @@ +process.env.NODE_ENV = process.env.NODE_ENV || 'development' + +const environment = require('./environment') + +module.exports = environment.toWebpackConfig() diff --git a/config/webpacker.yml b/config/webpacker.yml new file mode 100644 index 00000000..c42c2349 --- /dev/null +++ b/config/webpacker.yml @@ -0,0 +1,98 @@ +# Note: You must restart bin/webpack-dev-server for changes to take effect + +default: &default + source_path: app/javascript + source_entry_path: packs + public_root_path: public + public_output_path: packs + cache_path: tmp/cache/webpacker + check_yarn_integrity: false + webpack_compile_output: false + + # Additional paths webpack should lookup modules + # ['app/assets', 'engine/foo/app/assets'] + resolved_paths: [] + + # Reload manifest.json on all requests so we reload latest compiled packs + cache_manifest: false + + # Extract and emit a css file + extract_css: false + + static_assets_extensions: + - .jpg + - .jpeg + - .png + - .gif + - .tiff + - .ico + - .svg + - .eot + - .otf + - .ttf + - .woff + - .woff2 + + extensions: + - .tsx + - .ts + - .jsx + - .mjs + - .js + - .sass + - .scss + - .css + - .module.sass + - .module.scss + - .module.css + - .png + - .svg + - .gif + - .jpeg + - .jpg + +development: + <<: *default + compile: true + + # Verifies that correct packages and versions are installed by inspecting package.json, yarn.lock, and node_modules + check_yarn_integrity: true + + # Reference: https://webpack.js.org/configuration/dev-server/ + dev_server: + https: false + host: localhost + port: 3035 + public: localhost:3035 + hmr: false + # Inline should be set to true if using HMR + inline: true + overlay: true + compress: true + disable_host_check: true + use_local_ip: false + quiet: false + headers: + 'Access-Control-Allow-Origin': '*' + watch_options: + ignored: '**/node_modules/**' + + +test: + <<: *default + compile: true + + # Compile test packs to a separate directory + public_output_path: packs-test + +production: + <<: *default + + # Production depends on precompilation of packs prior to booting for performance. + compile: false + + # Extract and emit a css file + extract_css: true + + # Cache manifest.json for performance + cache_manifest: true diff --git a/package.json b/package.json new file mode 100644 index 00000000..4ca5375b --- /dev/null +++ b/package.json @@ -0,0 +1,17 @@ +{ + "dependencies": { + "@babel/preset-react": "^7.6.3", + "@rails/webpacker": "^4.0.7", + "@types/react": "^16.9.11", + "@types/react-dom": "^16.9.3", + "babel-plugin-transform-react-remove-prop-types": "^0.4.24", + "prop-types": "^15.7.2", + "react": "^16.11.0", + "react-dom": "^16.11.0", + "ts-loader": "^6.2.1", + "typescript": "^3.6.4" + }, + "devDependencies": { + "webpack-dev-server": "^3.9.0" + } +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 00000000..aa5998a8 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,12 @@ +module.exports = { + plugins: [ + require('postcss-import'), + require('postcss-flexbugs-fixes'), + require('postcss-preset-env')({ + autoprefixer: { + flexbox: 'no-2009' + }, + stage: 3 + }) + ] +} diff --git a/tsconfig.json b/tsconfig.json index 891af24c..4f30b682 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,8 +7,8 @@ "module": "es6", "moduleResolution": "node", "sourceMap": true, - "target": "es5", "strict": true, + "target": "es5", "jsx": "react" }, "exclude": [ @@ -16,5 +16,6 @@ "node_modules", "vendor", "public" - ] + ], + "compileOnSave": true } diff --git a/yarn.lock b/yarn.lock index 2284f6fd..9a00bc9b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,18 +9,18 @@ dependencies: "@babel/highlight" "^7.0.0" -"@babel/core@^7.1.0", "@babel/core@^7.2.2", "@babel/core@^7.4.5": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.6.2.tgz#069a776e8d5e9eefff76236bc8845566bd31dd91" - integrity sha512-l8zto/fuoZIbncm+01p8zPSDZu/VuuJhAfA7d/AbzM09WR7iVhavvfNDYCNpo1VvLk6E6xgAoP9P+/EMJHuRkQ== +"@babel/core@^7.4.5": + version "7.6.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.6.4.tgz#6ebd9fe00925f6c3e177bb726a188b5f578088ff" + integrity sha512-Rm0HGw101GY8FTzpWSyRbki/jzq+/PkNQJ+nSulrdY6gFGOsNseCqD6KHRYe2E+EdzuBdr2pxCp6s4Uk6eJ+XQ== dependencies: "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.6.2" + "@babel/generator" "^7.6.4" "@babel/helpers" "^7.6.2" - "@babel/parser" "^7.6.2" + "@babel/parser" "^7.6.4" "@babel/template" "^7.6.0" - "@babel/traverse" "^7.6.2" - "@babel/types" "^7.6.0" + "@babel/traverse" "^7.6.3" + "@babel/types" "^7.6.3" convert-source-map "^1.1.0" debug "^4.1.0" json5 "^2.1.0" @@ -29,12 +29,12 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.4.0", "@babel/generator@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.6.2.tgz#dac8a3c2df118334c2a29ff3446da1636a8f8c03" - integrity sha512-j8iHaIW4gGPnViaIHI7e9t/Hl8qLjERI6DcV9kEpAIDJsAOrcnXqRS7t+QbhL76pwbtqP+QCQLL0z1CyVmtjjQ== +"@babel/generator@^7.6.3", "@babel/generator@^7.6.4": + version "7.6.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.6.4.tgz#a4f8437287bf9671b07f483b76e3bb731bc97671" + integrity sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w== dependencies: - "@babel/types" "^7.6.0" + "@babel/types" "^7.6.3" jsesc "^2.5.1" lodash "^4.17.13" source-map "^0.5.0" @@ -54,12 +54,12 @@ "@babel/helper-explode-assignable-expression" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-builder-react-jsx@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.3.tgz#dee98d7d79cc1f003d80b76fe01c7f8945665ff6" - integrity sha512-JT8mfnpTkKNCboTqZsQTdGo3l3Ik3l7QIt9hh0O9DYiwVel37VoJpILKM4YFbP2euF32nkQSb+F9cUk9b7DDXQ== +"@babel/helper-builder-react-jsx@^7.3.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz#a1ac95a5d2b3e88ae5e54846bf462eeb81b318a4" + integrity sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.3.0" esutils "^2.0.0" "@babel/helper-call-delegate@^7.4.4": @@ -161,11 +161,6 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== -"@babel/helper-plugin-utils@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" - integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== - "@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.5.5.tgz#0aa6824f7100a2e0e89c1527c23936c152cab351" @@ -237,10 +232,10 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.6.0", "@babel/parser@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.2.tgz#205e9c95e16ba3b8b96090677a67c9d6075b70a1" - integrity sha512-mdFqWrSPCmikBoaBYMuBulzTIKuXVPtEISFbRRVNwMWpCms/hmE2kRq0bblUHaNRKrjRlmVbx1sDHmjmRgD2Xg== +"@babel/parser@^7.6.0", "@babel/parser@^7.6.3", "@babel/parser@^7.6.4": + version "7.6.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.4.tgz#cb9b36a7482110282d5cb6dd424ec9262b473d81" + integrity sha512-D8RHPW5qd0Vbyo3qb+YjO5nvUVRTXFLQ/FsDxJU2Nqz4uB5EnUN0ZQSEYpvTIbRuttig1XbHWU5oMeQwQSAA+A== "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" @@ -321,14 +316,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-jsx@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz#521b06c83c40480f1e58b4fd33b92eceb1d6ea94" - integrity sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A== +"@babel/plugin-syntax-jsx@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz#0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7" + integrity sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.2.0": +"@babel/plugin-syntax-object-rest-spread@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== @@ -365,10 +360,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-block-scoping@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.2.tgz#96c33ab97a9ae500cc6f5b19e04a7e6553360a79" - integrity sha512-zZT8ivau9LOQQaOGC7bQLQOT4XPkPXgN2ERfUgk1X8ql+mVkLc4E8eKk+FO3o0154kxzqenWCorfmEXpEZcrSQ== +"@babel/plugin-transform-block-scoping@^7.6.3": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.3.tgz#6e854e51fbbaa84351b15d4ddafe342f3a5d542a" + integrity sha512-7hvrg75dubcO3ZI2rjYTzUrEuh1E9IyDEhhB6qfcooxhDA33xx2MasuLVgdxzcP6R/lipAC6n9ub9maNW6RKdw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" lodash "^4.17.13" @@ -490,10 +485,10 @@ "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-named-capturing-groups-regex@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.2.tgz#c1ca0bb84b94f385ca302c3932e870b0fb0e522b" - integrity sha512-xBdB+XOs+lgbZc2/4F5BVDVcDNS4tcSKQc96KmlqLEAwz6tpYPEvPdmDfvVG0Ssn8lAhronaRs6Z6KSexIpK5g== +"@babel/plugin-transform-named-capturing-groups-regex@^7.6.3": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.3.tgz#aaa6e409dd4fb2e50b6e2a91f7e3a3149dbce0cf" + integrity sha512-jTkk7/uE6H2s5w6VlMHeWuH+Pcy2lmdwFoeWCVnvIrDUnB5gQqTVI8WfmEAhF2CDEarGrknZcmSFg1+bkfCoSw== dependencies: regexpu-core "^4.6.0" @@ -528,37 +523,37 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-react-display-name@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz#70ded987c91609f78353dd76d2fb2a0bb991e8e5" - integrity sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A== +"@babel/plugin-transform-react-display-name@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz#ebfaed87834ce8dc4279609a4f0c324c156e3eb0" + integrity sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-react-jsx-self@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.8.3.tgz#c4f178b2aa588ecfa8d077ea80d4194ee77ed702" - integrity sha512-01OT7s5oa0XTLf2I8XGsL8+KqV9lx3EZV+jxn/L2LQ97CGKila2YMroTkCEIE0HV/FF7CMSRsIAybopdN9NTdg== +"@babel/plugin-transform-react-jsx-self@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz#461e21ad9478f1031dd5e276108d027f1b5240ba" + integrity sha512-v6S5L/myicZEy+jr6ielB0OR8h+EH/1QFx/YJ7c7Ua+7lqsjj/vW6fD5FR9hB/6y7mGbfT4vAURn3xqBxsUcdg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" -"@babel/plugin-transform-react-jsx-source@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.8.3.tgz#951e75a8af47f9f120db731be095d2b2c34920e0" - integrity sha512-PLMgdMGuVDtRS/SzjNEQYUT8f4z1xb2BAT54vM1X5efkVuYBf5WyGUMbpmARcfq3NaglIwz08UVQK4HHHbC6ag== +"@babel/plugin-transform-react-jsx-source@^7.0.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.5.0.tgz#583b10c49cf057e237085bcbd8cc960bd83bd96b" + integrity sha512-58Q+Jsy4IDCZx7kqEZuSDdam/1oW8OdDX8f+Loo6xyxdfg1yF0GE2XNJQSTZCaMol93+FBzpWiPEwtbMloAcPg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" -"@babel/plugin-transform-react-jsx@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.3.tgz#4220349c0390fdefa505365f68c103562ab2fc4a" - integrity sha512-r0h+mUiyL595ikykci+fbwm9YzmuOrUBi0b+FDIKmi3fPQyFokWVEMJnRWHJPPQEjyFJyna9WZC6Viv6UHSv1g== +"@babel/plugin-transform-react-jsx@^7.0.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz#f2cab99026631c767e2745a5368b331cfe8f5290" + integrity sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg== dependencies: - "@babel/helper-builder-react-jsx" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" + "@babel/helper-builder-react-jsx" "^7.3.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" "@babel/plugin-transform-regenerator@^7.4.5": version "7.4.5" @@ -630,10 +625,10 @@ "@babel/helper-regex" "^7.4.4" regexpu-core "^4.6.0" -"@babel/preset-env@^7.3.1", "@babel/preset-env@^7.4.5": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.6.2.tgz#abbb3ed785c7fe4220d4c82a53621d71fc0c75d3" - integrity sha512-Ru7+mfzy9M1/YTEtlDS8CD45jd22ngb9tXnn64DvQK3ooyqSw9K4K9DUWmYknTTVk4TqygL9dqCrZgm1HMea/Q== +"@babel/preset-env@^7.4.5": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.6.3.tgz#9e1bf05a2e2d687036d24c40e4639dc46cef2271" + integrity sha512-CWQkn7EVnwzlOdR5NOm2+pfgSNEZmvGjOhlCHBDq0J8/EStr+G+FvPEiz9B56dR6MoiUFjXhfE4hjLoAKKJtIQ== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -651,7 +646,7 @@ "@babel/plugin-transform-arrow-functions" "^7.2.0" "@babel/plugin-transform-async-to-generator" "^7.5.0" "@babel/plugin-transform-block-scoped-functions" "^7.2.0" - "@babel/plugin-transform-block-scoping" "^7.6.2" + "@babel/plugin-transform-block-scoping" "^7.6.3" "@babel/plugin-transform-classes" "^7.5.5" "@babel/plugin-transform-computed-properties" "^7.2.0" "@babel/plugin-transform-destructuring" "^7.6.0" @@ -666,7 +661,7 @@ "@babel/plugin-transform-modules-commonjs" "^7.6.0" "@babel/plugin-transform-modules-systemjs" "^7.5.0" "@babel/plugin-transform-modules-umd" "^7.2.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.6.2" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.6.3" "@babel/plugin-transform-new-target" "^7.4.4" "@babel/plugin-transform-object-super" "^7.5.5" "@babel/plugin-transform-parameters" "^7.4.4" @@ -679,32 +674,32 @@ "@babel/plugin-transform-template-literals" "^7.4.4" "@babel/plugin-transform-typeof-symbol" "^7.2.0" "@babel/plugin-transform-unicode-regex" "^7.6.2" - "@babel/types" "^7.6.0" + "@babel/types" "^7.6.3" browserslist "^4.6.0" core-js-compat "^3.1.1" invariant "^2.2.2" js-levenshtein "^1.1.3" semver "^5.5.0" -"@babel/preset-react@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.8.3.tgz#23dc63f1b5b0751283e04252e78cf1d6589273d2" - integrity sha512-9hx0CwZg92jGb7iHYQVgi0tOEHP/kM60CtWJQnmbATSPIQQ2xYzfoCI3EdqAhFBeeJwYMdWQuDUHMsuDbH9hyQ== +"@babel/preset-react@^7.6.3": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.6.3.tgz#d5242c828322520205ae4eda5d4f4f618964e2f6" + integrity sha512-07yQhmkZmRAfwREYIQgW0HEwMY9GBJVuPY4Q12UC72AbfaawuupVWa8zQs2tlL+yun45Nv/1KreII/0PLfEsgA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-react-display-name" "^7.8.3" - "@babel/plugin-transform-react-jsx" "^7.8.3" - "@babel/plugin-transform-react-jsx-self" "^7.8.3" - "@babel/plugin-transform-react-jsx-source" "^7.8.3" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-self" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.5": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.6.2.tgz#c3d6e41b304ef10dcf13777a33e7694ec4a9a6dd" - integrity sha512-EXxN64agfUqqIGeEjI5dL5z0Sw0ZwWo1mLTi4mQowCZ42O59b7DRpZAnTC6OqdF28wMBMFKNb/4uFGrVaigSpg== + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.6.3.tgz#935122c74c73d2240cafd32ddb5fc2a6cd35cf1f" + integrity sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA== dependencies: regenerator-runtime "^0.13.2" -"@babel/template@^7.1.0", "@babel/template@^7.4.0", "@babel/template@^7.4.4", "@babel/template@^7.6.0": +"@babel/template@^7.1.0", "@babel/template@^7.4.4", "@babel/template@^7.6.0": version "7.6.0" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6" integrity sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ== @@ -713,201 +708,36 @@ "@babel/parser" "^7.6.0" "@babel/types" "^7.6.0" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5", "@babel/traverse@^7.6.2": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.2.tgz#b0e2bfd401d339ce0e6c05690206d1e11502ce2c" - integrity sha512-8fRE76xNwNttVEF2TwxJDGBLWthUkHWSldmfuBzVRmEDWOtu4XdINTgN7TDWzuLg4bbeIMLvfMFD9we5YcWkRQ== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5", "@babel/traverse@^7.6.2", "@babel/traverse@^7.6.3": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.3.tgz#66d7dba146b086703c0fb10dd588b7364cec47f9" + integrity sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw== dependencies: "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.6.2" + "@babel/generator" "^7.6.3" "@babel/helper-function-name" "^7.1.0" "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/parser" "^7.6.2" - "@babel/types" "^7.6.0" + "@babel/parser" "^7.6.3" + "@babel/types" "^7.6.3" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5", "@babel/types@^7.6.0": - version "7.6.1" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.6.1.tgz#53abf3308add3ac2a2884d539151c57c4b3ac648" - integrity sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g== +"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5", "@babel/types@^7.6.0", "@babel/types@^7.6.3": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.6.3.tgz#3f07d96f854f98e2fbd45c64b0cb942d11e8ba09" + integrity sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA== dependencies: esutils "^2.0.2" lodash "^4.17.13" to-fast-properties "^2.0.0" -"@babel/types@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c" - integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg== - dependencies: - esutils "^2.0.2" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - -"@cnakazawa/watch@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" - integrity sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA== - dependencies: - exec-sh "^0.3.2" - minimist "^1.2.0" - "@csstools/convert-colors@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== -"@jest/console@^24.7.1", "@jest/console@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" - integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== - dependencies: - "@jest/source-map" "^24.9.0" - chalk "^2.0.1" - slash "^2.0.0" - -"@jest/core@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.9.0.tgz#2ceccd0b93181f9c4850e74f2a9ad43d351369c4" - integrity sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A== - dependencies: - "@jest/console" "^24.7.1" - "@jest/reporters" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - ansi-escapes "^3.0.0" - chalk "^2.0.1" - exit "^0.1.2" - graceful-fs "^4.1.15" - jest-changed-files "^24.9.0" - jest-config "^24.9.0" - jest-haste-map "^24.9.0" - jest-message-util "^24.9.0" - jest-regex-util "^24.3.0" - jest-resolve "^24.9.0" - jest-resolve-dependencies "^24.9.0" - jest-runner "^24.9.0" - jest-runtime "^24.9.0" - jest-snapshot "^24.9.0" - jest-util "^24.9.0" - jest-validate "^24.9.0" - jest-watcher "^24.9.0" - micromatch "^3.1.10" - p-each-series "^1.0.0" - realpath-native "^1.1.0" - rimraf "^2.5.4" - slash "^2.0.0" - strip-ansi "^5.0.0" - -"@jest/environment@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.9.0.tgz#21e3afa2d65c0586cbd6cbefe208bafade44ab18" - integrity sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ== - dependencies: - "@jest/fake-timers" "^24.9.0" - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - jest-mock "^24.9.0" - -"@jest/fake-timers@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" - integrity sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A== - dependencies: - "@jest/types" "^24.9.0" - jest-message-util "^24.9.0" - jest-mock "^24.9.0" - -"@jest/reporters@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.9.0.tgz#86660eff8e2b9661d042a8e98a028b8d631a5b43" - integrity sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw== - dependencies: - "@jest/environment" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - chalk "^2.0.1" - exit "^0.1.2" - glob "^7.1.2" - istanbul-lib-coverage "^2.0.2" - istanbul-lib-instrument "^3.0.1" - istanbul-lib-report "^2.0.4" - istanbul-lib-source-maps "^3.0.1" - istanbul-reports "^2.2.6" - jest-haste-map "^24.9.0" - jest-resolve "^24.9.0" - jest-runtime "^24.9.0" - jest-util "^24.9.0" - jest-worker "^24.6.0" - node-notifier "^5.4.2" - slash "^2.0.0" - source-map "^0.6.0" - string-length "^2.0.0" - -"@jest/source-map@^24.3.0", "@jest/source-map@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" - integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== - dependencies: - callsites "^3.0.0" - graceful-fs "^4.1.15" - source-map "^0.6.0" - -"@jest/test-result@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" - integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA== - dependencies: - "@jest/console" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/istanbul-lib-coverage" "^2.0.0" - -"@jest/test-sequencer@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz#f8f334f35b625a4f2f355f2fe7e6036dad2e6b31" - integrity sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A== - dependencies: - "@jest/test-result" "^24.9.0" - jest-haste-map "^24.9.0" - jest-runner "^24.9.0" - jest-runtime "^24.9.0" - -"@jest/transform@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.9.0.tgz#4ae2768b296553fadab09e9ec119543c90b16c56" - integrity sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ== - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^24.9.0" - babel-plugin-istanbul "^5.1.0" - chalk "^2.0.1" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.1.15" - jest-haste-map "^24.9.0" - jest-regex-util "^24.9.0" - jest-util "^24.9.0" - micromatch "^3.1.10" - pirates "^4.0.1" - realpath-native "^1.1.0" - slash "^2.0.0" - source-map "^0.6.1" - write-file-atomic "2.4.1" - -"@jest/types@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" - integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^13.0.0" - -"@rails/webpacker@^4.0.0-rc.7": +"@rails/webpacker@^4.0.7": version "4.0.7" resolved "https://registry.yarnpkg.com/@rails/webpacker/-/webpacker-4.0.7.tgz#268571bf974e78ce57eca9fa478f5bd97fd5182c" integrity sha512-nx3inMv7euO0UsD0voJ+n3/z1u56PuprW322b67TLuDmOHRpT7yUjBJULMisVKA6PVJw4DwiG9Kbf8ZGu53+tw== @@ -951,39 +781,6 @@ webpack-cli "^3.3.2" webpack-sources "^1.3.0" -"@types/babel__core@^7.1.0": - version "7.1.3" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.3.tgz#e441ea7df63cd080dfcd02ab199e6d16a735fc30" - integrity sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.0.tgz#f1ec1c104d1bb463556ecb724018ab788d0c172a" - integrity sha512-c1mZUu4up5cp9KROs/QAw0gTeHrw/x7m52LcnvMxxOZ03DmLwPV0MlGmlgzV3cnSdjhJOZsj7E7FHeioai+egw== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" - integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.0.7" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.7.tgz#2496e9ff56196cc1429c72034e07eab6121b6f3f" - integrity sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw== - dependencies: - "@babel/types" "^7.3.0" - "@types/events@*": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" @@ -998,35 +795,15 @@ "@types/minimatch" "*" "@types/node" "*" -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" - integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== - -"@types/istanbul-lib-report@*": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#e5471e7fa33c61358dd38426189c037a58433b8c" - integrity sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#7a8cbf6a406f36c8add871625b278eaf0b0d255a" - integrity sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA== - dependencies: - "@types/istanbul-lib-coverage" "*" - "@types/istanbul-lib-report" "*" - "@types/minimatch@*": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== "@types/node@*": - version "12.7.11" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.11.tgz#be879b52031cfb5d295b047f5462d8ef1a716446" - integrity sha512-Otxmr2rrZLKRYIybtdG/sgeO+tHY20GxeDjcGmUnmmlCWyEnv2a2x1ZXBo3BTec4OiTXMQCiazB8NMBf0iRlFw== + version "12.11.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.11.7.tgz#57682a9771a3f7b09c2497f28129a0462966524a" + integrity sha512-JNbGaHFCLwgHn/iCckiGSOZ1XYHsKFwREtzPwSGCVld1SGhOlmZw2D4ZI94HQCrBHbADzW9m4LER/8olJTRGHA== "@types/prop-types@*": version "15.7.3" @@ -1038,46 +815,21 @@ resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== -"@types/react-dom@^16.9.2": - version "16.9.2" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.2.tgz#90f9e6c161850be1feb31d2f448121be2a4f3b47" - integrity sha512-hgPbBoI1aTSTvZwo8HYw35UaTldW6n2ETLvHAcfcg1FaOuBV3olmyCe5eMpx2WybWMBPv0MdU2t5GOcQhP+3zA== +"@types/react-dom@^16.9.3": + version "16.9.3" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.3.tgz#4006ff0e13958af91313869077c04cb20d9b9d04" + integrity sha512-FUuZKXPr9qlzUT9lhuzrZgLjH63TvNn28Ch3MvKG4B+F52zQtO8DtE0Opbncy3xaucNZM2WIPfuNTgkbKx5Brg== dependencies: "@types/react" "*" -"@types/react@*": - version "16.9.5" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.5.tgz#079dabd918b19b32118c25fd00a786bb6d0d5e51" - integrity sha512-jQ12VMiFOWYlp+j66dghOWcmDDwhca0bnlcTxS4Qz/fh5gi6wpaZDthPEu/Gc/YlAuO87vbiUXL8qKstFvuOaA== - dependencies: - "@types/prop-types" "*" - csstype "^2.2.0" - -"@types/react@^16.9.9": - version "16.9.9" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.9.tgz#a62c6f40f04bc7681be5e20975503a64fe783c3a" - integrity sha512-L+AudFJkDukk+ukInYvpoAPyJK5q1GanFOINOJnM0w6tUgITuWvJ4jyoBPFL7z4/L8hGLd+K/6xR5uUjXu0vVg== +"@types/react@*", "@types/react@^16.9.11": + version "16.9.11" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.11.tgz#70e0b7ad79058a7842f25ccf2999807076ada120" + integrity sha512-UBT4GZ3PokTXSWmdgC/GeCGEJXE5ofWyibCcecRLUVN2ZBpXQGVgQGtG2foS7CrTKFKlQVVswLvf7Js6XA/CVQ== dependencies: "@types/prop-types" "*" csstype "^2.2.0" -"@types/stack-utils@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" - integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== - -"@types/yargs-parser@*": - version "13.1.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-13.1.0.tgz#c563aa192f39350a1d18da36c5a8da382bbd8228" - integrity sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg== - -"@types/yargs@^13.0.0": - version "13.0.3" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.3.tgz#76482af3981d4412d65371a318f992d33464a380" - integrity sha512-K8/LfZq2duW33XW/tFwEAfnZlqIfVsoyRB3kfXdPXYhl0nfM8mmh7GS0jg7WrX2Dgq/0Ha/pR1PaR+BvmWwjiQ== - dependencies: - "@types/yargs-parser" "*" - "@webassemblyjs/ast@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" @@ -1234,11 +986,6 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -abab@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.2.tgz#a2fba1b122c69a85caa02d10f9270c7219709a9d" - integrity sha512-2scffjvioEmNz0OyDSLGWDfKCVwaKc6l9Pm9kOIREU13ClXZvHpg/nRL5xyjSSSLhOnXqft2HpsAzNEEA8cFFg== - abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -1252,25 +999,7 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: mime-types "~2.1.24" negotiator "0.6.2" -acorn-globals@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" - integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== - dependencies: - acorn "^6.0.1" - acorn-walk "^6.0.1" - -acorn-walk@^6.0.1: - version "6.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" - 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== - -acorn@^6.0.1, acorn@^6.2.1: +acorn@^6.2.1: version "6.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e" integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA== @@ -1310,11 +1039,6 @@ ansi-colors@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== -ansi-escapes@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - ansi-html@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" @@ -1330,7 +1054,7 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= -ansi-regex@^4.0.0, ansi-regex@^4.1.0: +ansi-regex@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== @@ -1390,11 +1114,6 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= -array-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" - integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= - array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" @@ -1461,11 +1180,6 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== - async-each@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" @@ -1481,10 +1195,12 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== -async@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= +async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" asynckit@^0.4.0: version "0.4.0" @@ -1497,16 +1213,16 @@ atob@^2.1.1: integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== autoprefixer@^9.6.1: - version "9.6.4" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.6.4.tgz#e6453be47af316b2923eaeaed87860f52ad4b7eb" - integrity sha512-Koz2cJU9dKOxG8P1f8uVaBntOv9lP4yz9ffWvWaicv9gHBPhpQB22nGijwd8gqW9CNT+UdkbQOQNLVI8jN1ZfQ== + version "9.7.0" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.0.tgz#905ec19e50f04545fe9ff131182cc9ab25246901" + integrity sha512-j2IRvaCfrUxIiZun9ba4mhJ2omhw4OY88/yVzLO+lHhGBumAAK72PgM6gkbSN8iregPOn1ZlxGkmZh2CQ7X4AQ== dependencies: - browserslist "^4.7.0" - caniuse-lite "^1.0.30000998" + browserslist "^4.7.2" + caniuse-lite "^1.0.30001004" chalk "^2.4.2" normalize-range "^0.1.2" num2fraction "^1.2.2" - postcss "^7.0.18" + postcss "^7.0.19" postcss-value-parser "^4.0.2" aws-sign2@~0.7.0: @@ -1519,20 +1235,7 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== -babel-jest@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.9.0.tgz#3fc327cb8467b89d14d7bc70e315104a783ccd54" - integrity sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw== - dependencies: - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/babel__core" "^7.1.0" - babel-plugin-istanbul "^5.1.0" - babel-preset-jest "^24.9.0" - chalk "^2.4.2" - slash "^2.0.0" - -babel-loader@^8.0.5, babel-loader@^8.0.6: +babel-loader@^8.0.6: version "8.0.6" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb" integrity sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw== @@ -1549,23 +1252,6 @@ babel-plugin-dynamic-import-node@^2.2.0, babel-plugin-dynamic-import-node@^2.3.0 dependencies: object.assign "^4.1.0" -babel-plugin-istanbul@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854" - integrity sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - find-up "^3.0.0" - istanbul-lib-instrument "^3.3.0" - test-exclude "^5.2.3" - -babel-plugin-jest-hoist@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz#4f837091eb407e01447c8843cbec546d0002d756" - integrity sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw== - dependencies: - "@types/babel__traverse" "^7.0.6" - babel-plugin-macros@^2.5.0: version "2.6.1" resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.6.1.tgz#41f7ead616fc36f6a93180e89697f69f51671181" @@ -1580,14 +1266,6 @@ babel-plugin-transform-react-remove-prop-types@^0.4.24: resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== -babel-preset-jest@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc" - integrity sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg== - dependencies: - "@babel/plugin-syntax-object-rest-spread" "^7.0.0" - babel-plugin-jest-hoist "^24.9.0" - balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -1641,9 +1319,9 @@ block-stream@*: inherits "~2.0.0" bluebird@^3.5.5: - version "3.7.0" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.0.tgz#56a6a886e03f6ae577cffedeb524f8f2450293cf" - integrity sha512-aBQ1FxIa7kSWCcmKHlcHFlT2jt6J/l4FzC7KcPELkOJOsPOb/bccdhmIrKDfXhwFrmc7vDoDrrepFvGqjyXGJg== + version "3.7.1" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.1.tgz#df70e302b471d7473489acf26a93d63b53f874de" + integrity sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg== bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.8" @@ -1719,18 +1397,6 @@ brorand@^1.0.1: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= -browser-process-hrtime@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" - integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== - -browser-resolve@^1.11.3: - version "1.11.3" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" - integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== - dependencies: - resolve "1.1.7" - browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" @@ -1790,30 +1456,14 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.6.4, browserslist@^4.6.6: - version "4.7.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.0.tgz#9ee89225ffc07db03409f2fee524dc8227458a17" - integrity sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA== - dependencies: - caniuse-lite "^1.0.30000989" - electron-to-chromium "^1.3.247" - node-releases "^1.1.29" - -browserslist@^4.7.0: - version "4.8.6" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.6.tgz#96406f3f5f0755d272e27a66f4163ca821590a7e" - integrity sha512-ZHao85gf0eZ0ESxLfCp73GG9O/VTytYDIkIiZDlURppLTI9wErSM/5yAKEq6rcUdxBLjMELmrYUJGg5sxGKMHg== - dependencies: - caniuse-lite "^1.0.30001023" - electron-to-chromium "^1.3.341" - node-releases "^1.1.47" - -bser@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.0.tgz#65fc784bf7f87c009b973c12db6546902fa9c7b5" - integrity sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg== +browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.6.4, browserslist@^4.7.2: + version "4.7.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.2.tgz#1bb984531a476b5d389cedecb195b2cd69fb1348" + integrity sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw== dependencies: - node-int64 "^0.4.0" + caniuse-lite "^1.0.30001004" + electron-to-chromium "^1.3.295" + node-releases "^1.1.38" buffer-from@^1.0.0: version "1.1.1" @@ -1929,11 +1579,6 @@ callsites@^2.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - camelcase-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" @@ -1952,7 +1597,7 @@ camelcase@^3.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= -camelcase@^5.0.0, camelcase@^5.2.0, camelcase@^5.3.1: +camelcase@^5.0.0, camelcase@^5.2.0: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== @@ -1967,22 +1612,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30000989: - version "1.0.30000998" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000998.tgz#7227a8046841e7d01e156ae7227a504d065f6744" - integrity sha512-8Tj5sPZR9kMHeDD9SZXIVr5m9ofufLLCG2Y4QwQrH18GIwG+kCc+zYdlR036ZRkuKjVVetyxeAgGA1xF7XdmzQ== - -caniuse-lite@^1.0.30000998, caniuse-lite@^1.0.30001023: - version "1.0.30001023" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001023.tgz#b82155827f3f5009077bdd2df3d8968bcbcc6fc4" - integrity sha512-C5TDMiYG11EOhVOA62W1p3UsJ2z4DsHtMBQtjzp3ZsUglcQn62WOUgW0y795c7A5uZ+GCEIvzkMatLIlAsbNTA== - -capture-exit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" - integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== - dependencies: - rsvp "^4.8.4" +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001004: + version "1.0.30001004" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001004.tgz#d879b73981b255488316da946c39327d8c00a586" + integrity sha512-3nfOR4O8Wa2RWoYfJkMtwRVOsK96TQ+eq57wd0iKaEWl8dwG4hKZ/g0MVBfCvysFvMLi9fQGR/DvozMdkEPl3g== case-sensitive-paths-webpack-plugin@^2.2.0: version "2.2.0" @@ -1994,7 +1627,7 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@2.4.2, chalk@^2.0, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@2.4.2, chalk@^2.0, chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2045,11 +1678,6 @@ chrome-trace-event@^1.0.2: dependencies: tslib "^1.9.0" -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -2068,11 +1696,6 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -classnames@^2.2.5: - version "2.2.6" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" - integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== - cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" @@ -2109,11 +1732,6 @@ clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= - coa@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" @@ -2176,10 +1794,10 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@^2.20.0, commander@~2.20.0: - version "2.20.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.1.tgz#3863ce3ca92d0831dcf2a102f5fb4b5926afd0f9" - integrity sha512-cCuLsMhJeWQ/ZpsFTbE765kvVfoeSddc4nU3up4fV+fDBcfUXnbITJ+JzhkdjzOqhURjZgujxaioam4RM9yGUg== +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== commondir@^1.0.1: version "1.0.1" @@ -2272,7 +1890,7 @@ content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -convert-source-map@^1.1.0, convert-source-map@^1.4.0: +convert-source-map@^1.1.0: version "1.6.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== @@ -2307,17 +1925,17 @@ copy-descriptor@^0.1.0: integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= core-js-compat@^3.1.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.2.1.tgz#0cbdbc2e386e8e00d3b85dc81c848effec5b8150" - integrity sha512-MwPZle5CF9dEaMYdDeWm73ao/IflDH+FjeJCWEADcEgFSE9TLimFKwJsfmkwzI8eC0Aj0mgvMDjeQjrElkz4/A== + version "3.3.4" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.3.4.tgz#a151c6cd754edbfe6a4a2a66b9382df2ae74fbcd" + integrity sha512-7OK3/LPP8R3Ovasf3GilEOp+o1w0ZKJ75FMou2RDfTwIV69G5RkKCGFnqgBv/ZhR6xo9GCzlfVALyHmydbE7DA== dependencies: - browserslist "^4.6.6" + browserslist "^4.7.2" semver "^6.3.0" core-js@^3.1.3: - version "3.2.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.2.1.tgz#cd41f38534da6cc59f7db050fe67307de9868b09" - integrity sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw== + version "3.3.4" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.3.4.tgz#6b0a23392958317bfb46e40b090529a923add669" + integrity sha512-BtibooaAmSOptGLRccsuX/dqgPtXwNgqcvYA6kOTTMzonRxZ+pJS4e+6mvVutESfXMeTnK8m3M+aBu3bkJbR+w== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -2584,18 +2202,6 @@ csso@^3.5.1: dependencies: css-tree "1.0.0-alpha.29" -cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" - integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== - dependencies: - cssom "0.3.x" - csstype@^2.2.0: version "2.6.7" resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.7.tgz#20b0024c20b6718f4eda3853a1f5a1cce7f5e4a5" @@ -2620,15 +2226,6 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -data-urls@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" - integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== - dependencies: - abab "^2.0.0" - whatwg-mimetype "^2.2.0" - whatwg-url "^7.0.0" - date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" @@ -2641,7 +2238,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" -debug@^3.0.0, debug@^3.2.5, debug@^3.2.6: +debug@^3.0.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -2682,11 +2279,6 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= - default-gateway@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" @@ -2775,21 +2367,11 @@ detect-libc@^1.0.2: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= -detect-newline@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" - integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= - detect-node@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== -diff-sequences@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" - integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== - diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" @@ -2842,13 +2424,6 @@ domelementtype@^2.0.1: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== -domexception@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" - integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== - dependencies: - webidl-conversions "^4.0.2" - domutils@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" @@ -2887,15 +2462,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.247: - version "1.3.273" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.273.tgz#94872d6823219f2812f2e35a2ce2a7d03c1eaa3f" - integrity sha512-0kUppiHQvHEENHh+nTtvTt4eXMwcPyWmMaj73GPrSEm3ldKhmmHuOH6IjrmuW6YmyS/fpXcLvMQLNVpqRhpNWw== - -electron-to-chromium@^1.3.341: - version "1.3.342" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.342.tgz#138317aa7399e268735b9269fe374a8566425090" - integrity sha512-An/MLhGLIG/g7lZ5vqs4lar96zv74agd3ZcADDHLpjAa16T7Y/pO/33Q31JOwpmHeyjithtHtUcn7XLuaz78lw== +electron-to-chromium@^1.3.295: + version "1.3.296" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.296.tgz#a1d4322d742317945285d3ba88966561b67f3ac8" + integrity sha512-s5hv+TSJSVRsxH190De66YHb50pBGTweT9XGWYu/LMR20KX6TsjFzObo36CjVAzM+PUeeKSBRtm/mISlCzeojQ== elliptic@^6.0.0: version "6.5.1" @@ -2932,7 +2502,7 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enhanced-resolve@4.1.0, enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: +enhanced-resolve@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== @@ -2941,7 +2511,7 @@ enhanced-resolve@4.1.0, enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: memory-fs "^0.4.0" tapable "^1.0.0" -enhanced-resolve@^4.0.0: +enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== @@ -2970,9 +2540,9 @@ error-ex@^1.2.0, error-ex@^1.3.1: is-arrayish "^0.2.1" es-abstract@^1.12.0, es-abstract@^1.5.1: - version "1.15.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.15.0.tgz#8884928ec7e40a79e3c9bc812d37d10c8b24cc57" - integrity sha512-bhkEqWJ2t2lMeaJDuk7okMkJWI/yqgH/EoGwpcvv0XW9RWQsRspI4wt6xuyuvMvvQE3gg/D9HXppgk21w78GyQ== + version "1.16.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.16.0.tgz#d3a26dc9c3283ac9750dca569586e976d9dcc06d" + integrity sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg== dependencies: es-to-primitive "^1.2.0" function-bind "^1.1.1" @@ -3004,18 +2574,6 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -escodegen@^1.9.1: - version "1.12.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.12.0.tgz#f763daf840af172bb3a2b6dd7219c0e17f7ff541" - integrity sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg== - dependencies: - esprima "^3.1.3" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" @@ -3024,11 +2582,6 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" -esprima@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= - esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" @@ -3041,7 +2594,7 @@ esrecurse@^4.1.0: dependencies: estraverse "^4.1.0" -estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.1.0, estraverse@^4.1.1: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== @@ -3081,11 +2634,6 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -exec-sh@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.2.tgz#6738de2eb7c8e671d0366aea0b0db8c6f7d7391b" - integrity sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg== - execa@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" @@ -3099,11 +2647,6 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= - expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -3124,18 +2667,6 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2: dependencies: homedir-polyfill "^1.0.1" -expect@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca" - integrity sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q== - dependencies: - "@jest/types" "^24.9.0" - ansi-styles "^3.2.0" - jest-get-type "^24.9.0" - jest-matcher-utils "^24.9.0" - jest-message-util "^24.9.0" - jest-regex-util "^24.9.0" - express@^4.17.1: version "4.17.1" resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" @@ -3226,11 +2757,6 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= -fast-levenshtein@~2.0.4: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - faye-websocket@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" @@ -3245,13 +2771,6 @@ faye-websocket@~0.11.1: dependencies: websocket-driver ">=0.5.1" -fb-watchman@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" - integrity sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg= - dependencies: - bser "^2.0.0" - figgy-pudding@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" @@ -3506,10 +3025,10 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@~7.1.1: - version "7.1.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" - integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== +glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@~7.1.1: + version "7.1.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.5.tgz#6714c69bee20f3c3e64c4dd905553e532b40cdc0" + integrity sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -3580,31 +3099,15 @@ globule@^1.0.0: minimatch "~3.0.2" graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" - integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== - -growly@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== handle-thing@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== -handlebars@^4.1.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.4.2.tgz#8810a9821a9d6d52cb2f57d326d6ce7c3dfe741d" - integrity sha512-cIv17+GhL8pHHnRJzGu2wwcthL5sb8uDKBHvZ2Dtu5s1YNt0ljbzKbamnc+gr69y7bzwQiBdr5+hOpRd5pnOdg== - dependencies: - neo-async "^2.6.0" - optimist "^0.6.1" - source-map "^0.6.1" - optionalDependencies: - uglify-js "^3.1.4" - har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -3716,9 +3219,9 @@ homedir-polyfill@^1.0.1: parse-passwd "^1.0.0" hosted-git-info@^2.1.4: - version "2.8.4" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.4.tgz#44119abaf4bc64692a16ace34700fed9c03e2546" - integrity sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ== + version "2.8.5" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" + integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== hpack.js@^2.1.6: version "2.1.6" @@ -3745,13 +3248,6 @@ html-comment-regex@^1.1.0: resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== -html-encoding-sniffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" - integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== - dependencies: - whatwg-encoding "^1.0.1" - html-entities@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" @@ -3862,9 +3358,9 @@ iferr@^0.1.5: integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= ignore-walk@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.2.tgz#99d83a246c196ea5c93ef9315ad7b0819c35069b" - integrity sha512-EXyErtpHbn75ZTsOADsfx6J/FPo6/5cjev46PXrcTpd8z3BoRkXgYu9/JVqrI7tusjmwCZutGeRJeU0Wo1e4Cw== + version "3.0.3" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" + integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== dependencies: minimatch "^3.0.4" @@ -3966,7 +3462,7 @@ interpret@1.2.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== -invariant@^2.2.2, invariant@^2.2.4: +invariant@^2.2.2: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -4059,13 +3555,6 @@ is-callable@^1.1.4: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - is-color-stop@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" @@ -4156,11 +3645,6 @@ is-fullwidth-code-point@^2.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" @@ -4301,405 +3785,6 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" - integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== - -istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" - integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA== - dependencies: - "@babel/generator" "^7.4.0" - "@babel/parser" "^7.4.3" - "@babel/template" "^7.4.0" - "@babel/traverse" "^7.4.3" - "@babel/types" "^7.4.0" - istanbul-lib-coverage "^2.0.5" - semver "^6.0.0" - -istanbul-lib-report@^2.0.4: - version "2.0.8" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" - integrity sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ== - dependencies: - istanbul-lib-coverage "^2.0.5" - make-dir "^2.1.0" - supports-color "^6.1.0" - -istanbul-lib-source-maps@^3.0.1: - version "3.0.6" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" - integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^2.0.5" - make-dir "^2.1.0" - rimraf "^2.6.3" - source-map "^0.6.1" - -istanbul-reports@^2.2.6: - version "2.2.6" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.6.tgz#7b4f2660d82b29303a8fe6091f8ca4bf058da1af" - integrity sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA== - dependencies: - handlebars "^4.1.2" - -jest-changed-files@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.9.0.tgz#08d8c15eb79a7fa3fc98269bc14b451ee82f8039" - integrity sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg== - dependencies: - "@jest/types" "^24.9.0" - execa "^1.0.0" - throat "^4.0.0" - -jest-cli@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.9.0.tgz#ad2de62d07472d419c6abc301fc432b98b10d2af" - integrity sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg== - dependencies: - "@jest/core" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - chalk "^2.0.1" - exit "^0.1.2" - import-local "^2.0.0" - is-ci "^2.0.0" - jest-config "^24.9.0" - jest-util "^24.9.0" - jest-validate "^24.9.0" - prompts "^2.0.1" - realpath-native "^1.1.0" - yargs "^13.3.0" - -jest-config@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.9.0.tgz#fb1bbc60c73a46af03590719efa4825e6e4dd1b5" - integrity sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ== - dependencies: - "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^24.9.0" - "@jest/types" "^24.9.0" - babel-jest "^24.9.0" - chalk "^2.0.1" - glob "^7.1.1" - jest-environment-jsdom "^24.9.0" - jest-environment-node "^24.9.0" - jest-get-type "^24.9.0" - jest-jasmine2 "^24.9.0" - jest-regex-util "^24.3.0" - jest-resolve "^24.9.0" - jest-util "^24.9.0" - jest-validate "^24.9.0" - micromatch "^3.1.10" - pretty-format "^24.9.0" - realpath-native "^1.1.0" - -jest-diff@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" - integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== - dependencies: - chalk "^2.0.1" - diff-sequences "^24.9.0" - jest-get-type "^24.9.0" - pretty-format "^24.9.0" - -jest-docblock@^24.3.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2" - integrity sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA== - dependencies: - detect-newline "^2.1.0" - -jest-each@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.9.0.tgz#eb2da602e2a610898dbc5f1f6df3ba86b55f8b05" - integrity sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog== - dependencies: - "@jest/types" "^24.9.0" - chalk "^2.0.1" - jest-get-type "^24.9.0" - jest-util "^24.9.0" - pretty-format "^24.9.0" - -jest-environment-jsdom@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz#4b0806c7fc94f95edb369a69cc2778eec2b7375b" - integrity sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA== - dependencies: - "@jest/environment" "^24.9.0" - "@jest/fake-timers" "^24.9.0" - "@jest/types" "^24.9.0" - jest-mock "^24.9.0" - jest-util "^24.9.0" - jsdom "^11.5.1" - -jest-environment-node@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.9.0.tgz#333d2d2796f9687f2aeebf0742b519f33c1cbfd3" - integrity sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA== - dependencies: - "@jest/environment" "^24.9.0" - "@jest/fake-timers" "^24.9.0" - "@jest/types" "^24.9.0" - jest-mock "^24.9.0" - jest-util "^24.9.0" - -jest-get-type@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" - integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== - -jest-haste-map@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" - integrity sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ== - dependencies: - "@jest/types" "^24.9.0" - anymatch "^2.0.0" - fb-watchman "^2.0.0" - graceful-fs "^4.1.15" - invariant "^2.2.4" - jest-serializer "^24.9.0" - jest-util "^24.9.0" - jest-worker "^24.9.0" - micromatch "^3.1.10" - sane "^4.0.3" - walker "^1.0.7" - optionalDependencies: - fsevents "^1.2.7" - -jest-jasmine2@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz#1f7b1bd3242c1774e62acabb3646d96afc3be6a0" - integrity sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw== - dependencies: - "@babel/traverse" "^7.1.0" - "@jest/environment" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - chalk "^2.0.1" - co "^4.6.0" - expect "^24.9.0" - is-generator-fn "^2.0.0" - jest-each "^24.9.0" - jest-matcher-utils "^24.9.0" - jest-message-util "^24.9.0" - jest-runtime "^24.9.0" - jest-snapshot "^24.9.0" - jest-util "^24.9.0" - pretty-format "^24.9.0" - throat "^4.0.0" - -jest-leak-detector@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz#b665dea7c77100c5c4f7dfcb153b65cf07dcf96a" - integrity sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA== - dependencies: - jest-get-type "^24.9.0" - pretty-format "^24.9.0" - -jest-matcher-utils@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" - integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA== - dependencies: - chalk "^2.0.1" - jest-diff "^24.9.0" - jest-get-type "^24.9.0" - pretty-format "^24.9.0" - -jest-message-util@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" - integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw== - dependencies: - "@babel/code-frame" "^7.0.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/stack-utils" "^1.0.1" - chalk "^2.0.1" - micromatch "^3.1.10" - slash "^2.0.0" - stack-utils "^1.0.1" - -jest-mock@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" - integrity sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w== - dependencies: - "@jest/types" "^24.9.0" - -jest-pnp-resolver@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" - integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== - -jest-regex-util@^24.3.0, jest-regex-util@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636" - integrity sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA== - -jest-resolve-dependencies@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz#ad055198959c4cfba8a4f066c673a3f0786507ab" - integrity sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g== - dependencies: - "@jest/types" "^24.9.0" - jest-regex-util "^24.3.0" - jest-snapshot "^24.9.0" - -jest-resolve@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.9.0.tgz#dff04c7687af34c4dd7e524892d9cf77e5d17321" - integrity sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ== - dependencies: - "@jest/types" "^24.9.0" - browser-resolve "^1.11.3" - chalk "^2.0.1" - jest-pnp-resolver "^1.2.1" - realpath-native "^1.1.0" - -jest-runner@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.9.0.tgz#574fafdbd54455c2b34b4bdf4365a23857fcdf42" - integrity sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg== - dependencies: - "@jest/console" "^24.7.1" - "@jest/environment" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - chalk "^2.4.2" - exit "^0.1.2" - graceful-fs "^4.1.15" - jest-config "^24.9.0" - jest-docblock "^24.3.0" - jest-haste-map "^24.9.0" - jest-jasmine2 "^24.9.0" - jest-leak-detector "^24.9.0" - jest-message-util "^24.9.0" - jest-resolve "^24.9.0" - jest-runtime "^24.9.0" - jest-util "^24.9.0" - jest-worker "^24.6.0" - source-map-support "^0.5.6" - throat "^4.0.0" - -jest-runtime@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.9.0.tgz#9f14583af6a4f7314a6a9d9f0226e1a781c8e4ac" - integrity sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw== - dependencies: - "@jest/console" "^24.7.1" - "@jest/environment" "^24.9.0" - "@jest/source-map" "^24.3.0" - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/yargs" "^13.0.0" - chalk "^2.0.1" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.1.15" - jest-config "^24.9.0" - jest-haste-map "^24.9.0" - jest-message-util "^24.9.0" - jest-mock "^24.9.0" - jest-regex-util "^24.3.0" - jest-resolve "^24.9.0" - jest-snapshot "^24.9.0" - jest-util "^24.9.0" - jest-validate "^24.9.0" - realpath-native "^1.1.0" - slash "^2.0.0" - strip-bom "^3.0.0" - yargs "^13.3.0" - -jest-serializer@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" - integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ== - -jest-snapshot@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.9.0.tgz#ec8e9ca4f2ec0c5c87ae8f925cf97497b0e951ba" - integrity sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew== - dependencies: - "@babel/types" "^7.0.0" - "@jest/types" "^24.9.0" - chalk "^2.0.1" - expect "^24.9.0" - jest-diff "^24.9.0" - jest-get-type "^24.9.0" - jest-matcher-utils "^24.9.0" - jest-message-util "^24.9.0" - jest-resolve "^24.9.0" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - pretty-format "^24.9.0" - semver "^6.2.0" - -jest-util@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" - integrity sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg== - dependencies: - "@jest/console" "^24.9.0" - "@jest/fake-timers" "^24.9.0" - "@jest/source-map" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - callsites "^3.0.0" - chalk "^2.0.1" - graceful-fs "^4.1.15" - is-ci "^2.0.0" - mkdirp "^0.5.1" - slash "^2.0.0" - source-map "^0.6.0" - -jest-validate@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab" - integrity sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ== - dependencies: - "@jest/types" "^24.9.0" - camelcase "^5.3.1" - chalk "^2.0.1" - jest-get-type "^24.9.0" - leven "^3.1.0" - pretty-format "^24.9.0" - -jest-watcher@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.9.0.tgz#4b56e5d1ceff005f5b88e528dc9afc8dd4ed2b3b" - integrity sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw== - dependencies: - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/yargs" "^13.0.0" - ansi-escapes "^3.0.0" - chalk "^2.0.1" - jest-util "^24.9.0" - string-length "^2.0.0" - -jest-worker@^24.6.0, jest-worker@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" - integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== - dependencies: - merge-stream "^2.0.0" - supports-color "^6.1.0" - -jest@^24.8.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-24.9.0.tgz#987d290c05a08b52c56188c1002e368edb007171" - integrity sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw== - dependencies: - import-local "^2.0.0" - jest-cli "^24.9.0" - js-base64@^2.1.8: version "2.5.1" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121" @@ -4728,38 +3813,6 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= -jsdom@^11.5.1: - version "11.12.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" - integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== - dependencies: - abab "^2.0.0" - acorn "^5.5.3" - acorn-globals "^4.1.0" - array-equal "^1.0.0" - cssom ">= 0.3.2 < 0.4.0" - cssstyle "^1.0.0" - data-urls "^1.0.0" - domexception "^1.0.1" - escodegen "^1.9.1" - html-encoding-sniffer "^1.0.2" - left-pad "^1.3.0" - nwsapi "^2.0.7" - parse5 "4.0.0" - pn "^1.1.0" - request "^2.87.0" - request-promise-native "^1.0.5" - sax "^1.2.4" - symbol-tree "^3.2.2" - tough-cookie "^2.3.4" - w3c-hr-time "^1.0.1" - webidl-conversions "^4.0.2" - whatwg-encoding "^1.0.3" - whatwg-mimetype "^2.1.0" - whatwg-url "^6.4.1" - ws "^5.2.0" - xml-name-validator "^3.0.0" - jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -4848,11 +3901,6 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - last-call-webpack-plugin@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" @@ -4875,24 +3923,6 @@ lcid@^2.0.0: dependencies: invert-kv "^2.0.0" -left-pad@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" - integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -4904,16 +3934,6 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - loader-runner@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" @@ -4956,11 +3976,6 @@ lodash.memoize@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= - lodash.template@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" @@ -4981,7 +3996,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.5, lodash@~4.17.10: +lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.5, lodash@~4.17.10: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -5021,7 +4036,7 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -make-dir@^2.0.0, make-dir@^2.1.0: +make-dir@^2.0.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== @@ -5029,13 +4044,6 @@ make-dir@^2.0.0, make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= - dependencies: - tmpl "1.0.x" - mamacro@^0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" @@ -5135,11 +4143,6 @@ merge-descriptors@1.0.1: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -5244,16 +4247,11 @@ minimist@0.0.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: +minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= - minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" @@ -5293,7 +4291,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: +"mkdirp@>=0.5 0", mkdirp@^0.5, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= @@ -5362,11 +4360,6 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - needle@^2.2.1: version "2.4.0" resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" @@ -5381,7 +4374,7 @@ negotiator@0.6.2: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== -neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1: +neo-async@^2.5.0, neo-async@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== @@ -5414,11 +4407,6 @@ node-gyp@^3.8.0: tar "^2.0.0" which "1" -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= - node-libs-browser@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" @@ -5448,22 +4436,6 @@ node-libs-browser@^2.2.1: util "^0.11.0" vm-browserify "^1.0.1" -node-modules-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" - integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= - -node-notifier@^5.4.2: - version "5.4.3" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50" - integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q== - dependencies: - growly "^1.3.0" - is-wsl "^1.1.0" - semver "^5.5.0" - shellwords "^0.1.1" - which "^1.3.0" - node-pre-gyp@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" @@ -5480,24 +4452,17 @@ node-pre-gyp@^0.12.0: semver "^5.3.0" tar "^4" -node-releases@^1.1.29: - version "1.1.34" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.34.tgz#ced4655ee1ba9c3a2c5dcbac385e19434155fd40" - integrity sha512-fNn12JTEfniTuCqo0r9jXgl44+KxRH/huV7zM/KAGOKxDKrHr6EbT7SSs4B+DNxyBE2mks28AD+Jw6PkfY5uwA== - dependencies: - semver "^6.3.0" - -node-releases@^1.1.47: - version "1.1.47" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.47.tgz#c59ef739a1fd7ecbd9f0b7cf5b7871e8a8b591e4" - integrity sha512-k4xjVPx5FpwBUj0Gw7uvFOTF4Ep8Hok1I6qjwL3pLfwe7Y0REQSAqOwwv9TWBCUtMHxcXfY4PgRLRozcChvTcA== +node-releases@^1.1.38: + version "1.1.39" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.39.tgz#c1011f30343aff5b633153b10ff691d278d08e8d" + integrity sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA== dependencies: semver "^6.3.0" node-sass@^4.12.0: - version "4.12.0" - resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.12.0.tgz#0914f531932380114a30cc5fa4fa63233a25f017" - integrity sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ== + version "4.13.0" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.13.0.tgz#b647288babdd6a1cb726de4545516b31f90da066" + integrity sha512-W1XBrvoJ1dy7VsvTAS5q1V45lREbTlZQqFbiHb3R3OTTCma0XBtuG6xZ6Z4506nR4lmHPTqVRwxT6KgtWC97CA== dependencies: async-foreach "^0.1.3" chalk "^1.1.1" @@ -5506,7 +4471,7 @@ node-sass@^4.12.0: get-stdin "^4.0.1" glob "^7.0.3" in-publish "^2.0.0" - lodash "^4.17.11" + lodash "^4.17.15" meow "^3.7.0" mkdirp "^0.5.1" nan "^2.13.2" @@ -5580,9 +4545,9 @@ npm-bundled@^1.0.1: integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== npm-packlist@^1.1.6: - version "1.4.4" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.4.tgz#866224233850ac534b63d1a6e76050092b5d2f44" - integrity sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw== + version "1.4.6" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.6.tgz#53ba3ed11f8523079f1457376dd379ee4ea42ff4" + integrity sha512-u65uQdb+qwtGvEJh/DgQgW1Xg7sqeNbmxYyrvlNznaVTjV3E5P6F/EFjM+BVHXl7JJlsdG8A64M0XI8FI/IOlg== dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" @@ -5621,11 +4586,6 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= -nwsapi@^2.0.7: - version "2.1.4" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.4.tgz#e006a878db23636f8e8a67d33ca0e4edf61a842f" - integrity sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw== - oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" @@ -5733,14 +4693,6 @@ opn@^5.5.0: dependencies: is-wsl "^1.1.0" -optimist@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= - dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" - optimize-css-assets-webpack-plugin@^5.0.1: version "5.0.3" resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz#e2f1d4d94ad8c0af8967ebd7cf138dcb1ef14572" @@ -5749,18 +4701,6 @@ optimize-css-assets-webpack-plugin@^5.0.1: cssnano "^4.1.10" last-call-webpack-plugin "^3.0.0" -optionator@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.4" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - wordwrap "~1.0.0" - original@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" @@ -5812,13 +4752,6 @@ p-defer@^1.0.0: resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= -p-each-series@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" - integrity sha1-kw89Et0fUOdDRFeiLNbwSsatf3E= - dependencies: - p-reduce "^1.0.0" - p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -5848,11 +4781,6 @@ p-map@^2.0.0: resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== -p-reduce@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" - integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= - p-retry@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" @@ -5911,11 +4839,6 @@ parse-passwd@^1.0.0: resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= -parse5@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" - integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== - parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -5987,13 +4910,6 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - pbkdf2@^3.0.3: version "3.0.17" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" @@ -6020,11 +4936,6 @@ pify@^2.0.0, pify@^2.3.0: resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" @@ -6042,13 +4953,6 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= -pirates@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" - integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== - dependencies: - node-modules-regexp "^1.0.0" - pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" @@ -6056,11 +4960,6 @@ pkg-dir@^3.0.0: dependencies: find-up "^3.0.0" -pn@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" - integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== - pnp-webpack-plugin@^1.4.3: version "1.5.0" resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.5.0.tgz#62a1cd3068f46d564bb33c56eb250e4d586676eb" @@ -6068,14 +4967,14 @@ pnp-webpack-plugin@^1.4.3: dependencies: ts-pnp "^1.1.2" -portfinder@^1.0.24: - version "1.0.24" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.24.tgz#11efbc6865f12f37624b6531ead1d809ed965cfa" - integrity sha512-ekRl7zD2qxYndYflwiryJwMioBI7LI7rVXg3EnLK3sjkouT5eOuhS3gS255XxBksa30VG8UPZYZCdgfGOfkSUg== +portfinder@^1.0.25: + version "1.0.25" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.25.tgz#254fd337ffba869f4b9d37edc298059cb4d35eca" + integrity sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg== dependencies: - async "^1.5.2" - debug "^2.2.0" - mkdirp "0.5.x" + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.1" posix-character-classes@^0.1.0: version "0.1.1" @@ -6717,49 +5616,20 @@ postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: indexes-of "^1.0.1" uniq "^1.0.1" -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.18" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.18.tgz#4b9cda95ae6c069c67a4d933029eddd4838ac233" - integrity sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g== - dependencies: - chalk "^2.4.2" - source-map "^0.6.1" - supports-color "^6.1.0" - -postcss@^7.0.18: - version "7.0.26" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.26.tgz#5ed615cfcab35ba9bbb82414a4fa88ea10429587" - integrity sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA== +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.19, postcss@^7.0.2, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.21" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.21.tgz#06bb07824c19c2021c5d056d5b10c35b989f7e17" + integrity sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ== dependencies: chalk "^2.4.2" source-map "^0.6.1" supports-color "^6.1.0" -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - prepend-http@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= -prettier@1.18.2: - version "1.18.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" - integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== - -pretty-format@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" - integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== - dependencies: - "@jest/types" "^24.9.0" - ansi-regex "^4.0.0" - ansi-styles "^3.2.0" - react-is "^16.8.4" - private@^0.1.6: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -6780,14 +5650,6 @@ promise-inflight@^1.0.1: resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= -prompts@^2.0.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.2.1.tgz#f901dd2a2dfee080359c0e20059b24188d75ad35" - integrity sha512-VObPvJiWPhpZI6C5m60XOzTfnYg/xc/an+r9VYymj9WJW3B/DIH+REzjpAACPf8brwPeP+7vz3bIim3S+AaMjw== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.3" - prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" @@ -6815,7 +5677,7 @@ pseudomap@^1.0.2: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= -psl@^1.1.24, psl@^1.1.28: +psl@^1.1.24: version "1.4.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.4.0.tgz#5dd26156cdb69fa1fdb8ab1991667d3f80ced7c2" integrity sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw== @@ -6867,7 +5729,7 @@ punycode@^1.2.4, punycode@^1.4.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= -punycode@^2.1.0, punycode@^2.1.1: +punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== @@ -6950,32 +5812,25 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-dom@^16.10.2: - version "16.10.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.10.2.tgz#4840bce5409176bc3a1f2bd8cb10b92db452fda6" - integrity sha512-kWGDcH3ItJK4+6Pl9DZB16BXYAZyrYQItU4OMy0jAkv5aNqc+mAKb4TpFtAteI6TJZu+9ZlNhaeNQSVQDHJzkw== +react-dom@^16.11.0: + version "16.11.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.11.0.tgz#7e7c4a5a85a569d565c2462f5d345da2dd849af5" + integrity sha512-nrRyIUE1e7j8PaXSPtyRKtz+2y9ubW/ghNgqKFHHAHaeP0fpF5uXR+sq8IMRHC+ZUxw7W9NyCDTBtwWxvkb0iA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" prop-types "^15.6.2" - scheduler "^0.16.2" + scheduler "^0.17.0" -react-is@^16.8.1, react-is@^16.8.4: - version "16.10.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.10.2.tgz#984120fd4d16800e9a738208ab1fba422d23b5ab" - integrity sha512-INBT1QEgtcCCgvccr5/86CfD71fw9EPmDxgiJX4I2Ddr6ZsV6iFXsuby+qWJPtmNuMY0zByTsG4468P7nHuNWA== +react-is@^16.8.1: + version "16.11.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.11.0.tgz#b85dfecd48ad1ce469ff558a882ca8e8313928fa" + integrity sha512-gbBVYR2p8mnriqAwWx9LbuUrShnAuSCNnuPGyc7GJrMVQtPDAh8iLpv7FRuMPFb56KkaVZIYSz1PrjI9q0QPCw== -react-table@^6.10.3: - version "6.10.3" - resolved "https://registry.yarnpkg.com/react-table/-/react-table-6.10.3.tgz#d085487a5a1b18b76486b71cf1d388d87c8c7362" - integrity sha512-sVlq2/rxVaQJywGD95+qGiMr/SMHFIFnXdx619BLOWE/Os5FOGtV6pQJNAjZixbQZiOu7dmBO1kME28uxh6wmA== - dependencies: - classnames "^2.2.5" - -react@^16.10.2: - version "16.10.2" - resolved "https://registry.yarnpkg.com/react/-/react-16.10.2.tgz#a5ede5cdd5c536f745173c8da47bda64797a4cf0" - integrity sha512-MFVIq0DpIhrHFyqLU0S3+4dIcBhhOvBE8bJ/5kHPVOVaGdo0KuiQzpcjCPsf585WvhypqtrMILyoE2th6dT+Lw== +react@^16.11.0: + version "16.11.0" + resolved "https://registry.yarnpkg.com/react/-/react-16.11.0.tgz#d294545fe62299ccee83363599bf904e4a07fdbb" + integrity sha512-M5Y8yITaLmU0ynd0r1Yvfq98Rmll6q8AxaEe88c8e7LxO8fZ2cNgmFt0aGAS9wzf1Ao32NKXtCl+/tVVtkxq6g== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -6996,14 +5851,6 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" -read-pkg-up@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" - integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== - dependencies: - find-up "^3.0.0" - read-pkg "^3.0.0" - read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" @@ -7013,15 +5860,6 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" @@ -7053,13 +5891,6 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" -realpath-native@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" - integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== - dependencies: - util.promisify "^1.0.0" - redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" @@ -7120,9 +5951,9 @@ regexpu-core@^4.6.0: unicode-match-property-value-ecmascript "^1.1.0" regjsgen@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" - integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== + version "0.5.1" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" + integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== regjsparser@^0.6.0: version "0.6.0" @@ -7153,22 +5984,6 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -request-promise-core@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346" - integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag== - dependencies: - lodash "^4.17.11" - -request-promise-native@^1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59" - integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w== - dependencies: - request-promise-core "1.1.2" - stealthy-require "^1.1.1" - tough-cookie "^2.3.3" - request@^2.87.0, request@^2.88.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" @@ -7240,11 +6055,6 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= - resolve@^1.1.7, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.8.1: version "1.12.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" @@ -7287,11 +6097,6 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -rsvp@^4.8.4: - version "4.8.5" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" - integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== - run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" @@ -7321,21 +6126,6 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sane@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" - integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== - dependencies: - "@cnakazawa/watch" "^1.0.3" - anymatch "^2.0.0" - capture-exit "^2.0.0" - exec-sh "^0.3.2" - execa "^1.0.0" - fb-watchman "^2.0.0" - micromatch "^3.1.4" - minimist "^1.1.1" - walker "~1.0.5" - sass-graph@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" @@ -7362,10 +6152,10 @@ sax@^1.2.4, sax@~1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -scheduler@^0.16.2: - version "0.16.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.16.2.tgz#f74cd9d33eff6fc554edfb79864868e4819132c1" - integrity sha512-BqYVWqwz6s1wZMhjFvLfVR5WXP7ZY32M/wYPo04CcuPM7XZEbV2TBNW7Z0UkguPTl0dWMA59VbNXxK6q+pHItg== +scheduler@^0.17.0: + version "0.17.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.17.0.tgz#7c9c673e4ec781fac853927916d1c426b6f3ddfe" + integrity sha512-7rro8Io3tnCPuY4la/NuI5F2yfESpnfZyT6TtkXnSWVkcu0BCDJ+8gk5ozUaFaxpIyNuWAPXrH0yFcSi28fnDA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -7404,7 +6194,7 @@ selfsigned@^1.10.7: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: +semver@^6.0.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -7518,12 +6308,7 @@ shebang-regex@^1.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= -shellwords@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" - integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== - -signal-exit@^3.0.0, signal-exit@^3.0.2: +signal-exit@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= @@ -7535,16 +6320,6 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" -sisteransi@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.3.tgz#98168d62b79e3a5e758e27ae63c4a053d748f4eb" - integrity sha512-SbEG75TzH8G7eVXFSN5f9EExILKfly7SUvVY5DhhYLvfhKqhDFY0OzevWa/zwak0RLRfWS5AvfMWpd9gJvr5Yg== - -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== - snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -7618,7 +6393,7 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.6, source-map-support@~0.5.12: +source-map-support@~0.5.12: version "0.5.13" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== @@ -7736,11 +6511,6 @@ stable@^0.1.8: resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== -stack-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" - integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== - static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -7761,11 +6531,6 @@ stdout-stream@^1.4.0: dependencies: readable-stream "^2.0.1" -stealthy-require@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= - stream-browserify@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" @@ -7803,14 +6568,6 @@ strict-uri-encode@^1.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= -string-length@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" - integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= - dependencies: - astral-regex "^1.0.0" - strip-ansi "^4.0.0" - string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -7895,11 +6652,6 @@ strip-bom@^2.0.0: dependencies: is-utf8 "^0.2.0" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" @@ -7972,11 +6724,6 @@ svgo@^1.0.0: unquote "~1.1.1" util.promisify "~1.0.0" -symbol-tree@^3.2.2: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" @@ -8020,29 +6767,14 @@ terser-webpack-plugin@^1.3.0, terser-webpack-plugin@^1.4.1: worker-farm "^1.7.0" terser@^4.1.2: - version "4.3.4" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.3.4.tgz#ad91bade95619e3434685d69efa621a5af5f877d" - integrity sha512-Kcrn3RiW8NtHBP0ssOAzwa2MsIRQ8lJWiBG/K7JgqPlomA3mtb2DEmp4/hrUA+Jujx+WZ02zqd7GYD+QRBB/2Q== + version "4.3.9" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.3.9.tgz#e4be37f80553d02645668727777687dad26bbca8" + integrity sha512-NFGMpHjlzmyOtPL+fDw3G7+6Ueh/sz4mkaUYa4lJCxOPTNzd0Uj0aZJOmsDYoSQyfuVoWDMSWTPU3huyOm2zdA== dependencies: commander "^2.20.0" source-map "~0.6.1" source-map-support "~0.5.12" -test-exclude@^5.2.3: - version "5.2.3" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" - integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g== - dependencies: - glob "^7.1.3" - minimatch "^3.0.4" - read-pkg-up "^4.0.0" - require-main-filename "^2.0.0" - -throat@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" - integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= - through2@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -8052,9 +6784,9 @@ through2@^2.0.0: xtend "~4.0.1" thunky@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.3.tgz#f5df732453407b09191dae73e2a8cc73f381a826" - integrity sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow== + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== timers-browserify@^2.0.4: version "2.0.11" @@ -8068,11 +6800,6 @@ timsort@^0.3.0: resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= -tmpl@1.0.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" - integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= - to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" @@ -8120,14 +6847,6 @@ toidentifier@1.0.0: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== -tough-cookie@^2.3.3, tough-cookie@^2.3.4: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - tough-cookie@~2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" @@ -8136,13 +6855,6 @@ tough-cookie@~2.4.3: psl "^1.1.24" punycode "^1.4.1" -tr46@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= - dependencies: - punycode "^2.1.0" - trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" @@ -8155,10 +6867,10 @@ trim-newlines@^1.0.0: dependencies: glob "^7.1.2" -ts-loader@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-6.2.0.tgz#52d3993ecbc5474c1513242388e1049da0fce880" - integrity sha512-Da8h3fD+HiZ9GvZJydqzk3mTC9nuOKYlJcpuk+Zv6Y1DPaMvBL+56GRzZFypx2cWrZFMsQr869+Ua2slGoLxvQ== +ts-loader@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-6.2.1.tgz#67939d5772e8a8c6bdaf6277ca023a4812da02ef" + integrity sha512-Dd9FekWuABGgjE1g0TlQJ+4dFUfYGbYcs52/HQObE0ZmUNjQlmLAS7xXsSzy23AMaMwipsx5sNHvoEpT2CZq1g== dependencies: chalk "^2.3.0" enhanced-resolve "^4.0.0" @@ -8193,13 +6905,6 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= - dependencies: - prelude-ls "~1.1.2" - type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -8213,18 +6918,10 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^3.6.3: - version "3.6.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.3.tgz#fea942fabb20f7e1ca7164ff626f1a9f3f70b4da" - integrity sha512-N7bceJL1CtRQ2RiG0AQME13ksR7DiuQh/QehubYcghzv20tnh+MQnQIuJddTmsbqYj+dztchykemz0zFzlvdQw== - -uglify-js@^3.1.4: - version "3.6.0" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.0.tgz#704681345c53a8b2079fb6cec294b05ead242ff5" - integrity sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg== - dependencies: - commander "~2.20.0" - source-map "~0.6.1" +typescript@^3.6.4: + version "3.6.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.4.tgz#b18752bb3792bc1a0281335f7f6ebf1bbfc5b91d" + integrity sha512-unoCll1+l+YK4i4F8f22TaNVPRHcD9PA3yCuZ8g5e0qGqlVlJ/8FSateOLLSagn+Yg5+ZwuPkL8LFUc0Jcvksg== unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" @@ -8344,7 +7041,7 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -util.promisify@^1.0.0, util.promisify@~1.0.0: +util.promisify@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== @@ -8413,20 +7110,6 @@ vm-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019" integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw== -w3c-hr-time@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" - integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= - dependencies: - browser-process-hrtime "^0.1.2" - -walker@^1.0.7, walker@~1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= - dependencies: - makeerror "1.0.x" - watchpack@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" @@ -8443,11 +7126,6 @@ wbuf@^1.1.0, wbuf@^1.7.3: dependencies: minimalistic-assert "^1.0.0" -webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== - webpack-assets-manifest@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/webpack-assets-manifest/-/webpack-assets-manifest-3.1.1.tgz#39bbc3bf2ee57fcd8ba07cda51c9ba4a3c6ae1de" @@ -8489,10 +7167,10 @@ webpack-dev-middleware@^3.7.2: range-parser "^1.2.1" webpack-log "^2.0.0" -webpack-dev-server@^3.1.14: - version "3.8.2" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.8.2.tgz#3292427bf6510da9a3ac2d500b924a4197667ff9" - integrity sha512-0xxogS7n5jHDQWy0WST0q6Ykp7UGj4YvWh+HVN71JoE7BwPxMZrwgraBvmdEMbDVMBzF0u+mEzn8TQzBm5NYJQ== +webpack-dev-server@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.9.0.tgz#27c3b5d0f6b6677c4304465ac817623c8b27b89c" + integrity sha512-E6uQ4kRrTX9URN9s/lIbqTAztwEPdvzVrcmHE8EQ9YnuT9J8Es5Wrd8n9BKg1a0oZ5EgEke/EQFgUsp18dSTBw== dependencies: ansi-html "0.0.7" bonjour "^3.5.0" @@ -8512,7 +7190,7 @@ webpack-dev-server@^3.1.14: loglevel "^1.6.4" opn "^5.5.0" p-retry "^3.0.1" - portfinder "^1.0.24" + portfinder "^1.0.25" schema-utils "^1.0.0" selfsigned "^1.10.7" semver "^6.3.0" @@ -8545,9 +7223,9 @@ webpack-sources@^1.0.0, webpack-sources@^1.0.1, webpack-sources@^1.1.0, webpack- source-map "~0.6.1" webpack@^4.32.2: - version "4.41.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.41.0.tgz#db6a254bde671769f7c14e90a1a55e73602fc70b" - integrity sha512-yNV98U4r7wX1VJAj5kyMsu36T8RPPQntcb5fJLOsMz/pt/WrKC0Vp1bAlqPLkA1LegSwQwf6P+kAbyhRKVQ72g== + version "4.41.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.41.2.tgz#c34ec76daa3a8468c9b61a50336d8e3303dce74e" + integrity sha512-Zhw69edTGfbz9/8JJoyRQ/pq8FYUoY0diOXqW0T6yhgdhCv6wr0hra5DwwWexNRns2Z2+gsnrNcbe9hbGBgk/A== dependencies: "@webassemblyjs/ast" "1.8.5" "@webassemblyjs/helper-module-context" "1.8.5" @@ -8587,36 +7265,6 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== -whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - -whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - -whatwg-url@^6.4.1: - version "6.5.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" - integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" - -whatwg-url@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd" - integrity sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" - which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" @@ -8627,7 +7275,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@1, which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1: +which@1, which@^1.2.14, which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -8641,16 +7289,6 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= - -wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= - worker-farm@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" @@ -8680,22 +7318,6 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -write-file-atomic@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" - integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg== - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - -ws@^5.2.0: - version "5.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" - integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== - dependencies: - async-limiter "~1.0.0" - ws@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" @@ -8703,11 +7325,6 @@ ws@^6.2.1: dependencies: async-limiter "~1.0.0" -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== - xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -8741,7 +7358,7 @@ yargs-parser@^11.1.1: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^13.1.0, yargs-parser@^13.1.1: +yargs-parser@^13.1.0: version "13.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== @@ -8791,22 +7408,6 @@ yargs@13.2.4: y18n "^4.0.0" yargs-parser "^13.1.0" -yargs@^13.3.0: - version "13.3.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" - integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.1" - yargs@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" From 5dc758c81678835c8cbdee211761f443d2f9d97e Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sat, 26 Oct 2019 17:39:29 -0500 Subject: [PATCH 013/103] restore react-table 6 and hello_react.tsx --- app/javascript/demo.tsx | 14 ++++----- app/javascript/foo.ts | 6 ---- app/javascript/packs/application.js | 8 ------ app/javascript/packs/hello_react.jsx | 26 ----------------- app/javascript/packs/hello_react.tsx | 30 ++++++++++---------- app/javascript/packs/hello_typescript.js | 4 --- app/javascript/packs/hello_typescript.js.map | 1 - app/javascript/packs/hello_typescript.ts | 4 --- app/views/welcome/search.html.erb | 5 ++-- package.json | 2 ++ yarn.lock | 19 +++++++++++++ 11 files changed, 45 insertions(+), 74 deletions(-) delete mode 100644 app/javascript/foo.ts delete mode 100644 app/javascript/packs/application.js delete mode 100644 app/javascript/packs/hello_react.jsx delete mode 100644 app/javascript/packs/hello_typescript.js delete mode 100644 app/javascript/packs/hello_typescript.js.map delete mode 100644 app/javascript/packs/hello_typescript.ts diff --git a/app/javascript/demo.tsx b/app/javascript/demo.tsx index c498dd1f..7f29a8e2 100644 --- a/app/javascript/demo.tsx +++ b/app/javascript/demo.tsx @@ -1,9 +1,9 @@ -import React from "react" +import { Component } from "react" +import * as React from "react" import ReactTable from "react-table" import "react-table/react-table.css" -import { foo } from "./foo.ts" -export class Demo extends React.Component { +export class Demo extends Component { render() { const data = [ { @@ -19,7 +19,7 @@ export class Demo extends React.Component { age: 22, friend: { name: "Jason Maurer", - age: foo(22, [17]), + age: 22, }, }, { @@ -40,15 +40,15 @@ export class Demo extends React.Component { { Header: "Age", accessor: "age", - Cell: props => {props.value}, // Custom cell components! + Cell: (props: {value: number}) => {props.value}, // Custom cell components! }, { id: "friendName", // Required because our accessor is not a string Header: "Friend Name", - accessor: d => d.friend.name, // Custom value accessors! + accessor: (d: {friend: {name: string}}) => d.friend.name, // Custom value accessors! }, { - Header: props => Friend Age, // Custom header components! + Header: (props: any) => Friend Age, // Custom header components! accessor: "friend.age", }, ] diff --git a/app/javascript/foo.ts b/app/javascript/foo.ts deleted file mode 100644 index b7d8de0a..00000000 --- a/app/javascript/foo.ts +++ /dev/null @@ -1,6 +0,0 @@ - -export const foo = (x: string, y: string) => { - const z: string = x+y; - return z; -} - diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js deleted file mode 100644 index 01fdfe6e..00000000 --- a/app/javascript/packs/application.js +++ /dev/null @@ -1,8 +0,0 @@ -import "core-js/stable"; -import "regenerator-runtime/runtime"; - -import {foo} from "../foo.ts" - -const f = x => x+" robot"; - -console.log(foo("Hello space banana", "robot")) diff --git a/app/javascript/packs/hello_react.jsx b/app/javascript/packs/hello_react.jsx deleted file mode 100644 index 772fc97e..00000000 --- a/app/javascript/packs/hello_react.jsx +++ /dev/null @@ -1,26 +0,0 @@ -// Run this example by adding <%= javascript_pack_tag 'hello_react' %> to the head of your layout file, -// like app/views/layouts/application.html.erb. All it does is render
Hello React
at the bottom -// of the page. - -import React from 'react' -import ReactDOM from 'react-dom' -import PropTypes from 'prop-types' - -const Hello = props => ( -
Hello {props.name}!
-) - -Hello.defaultProps = { - name: 'David' -} - -Hello.propTypes = { - name: PropTypes.string -} - -document.addEventListener('DOMContentLoaded', () => { - ReactDOM.render( - , - document.body.appendChild(document.createElement('div')), - ) -}) diff --git a/app/javascript/packs/hello_react.tsx b/app/javascript/packs/hello_react.tsx index c8d3f9ac..20eea99f 100644 --- a/app/javascript/packs/hello_react.tsx +++ b/app/javascript/packs/hello_react.tsx @@ -1,34 +1,34 @@ + + // Run this example by adding <%= javascript_pack_tag 'hello_react' %> to the head of your layout file, // like app/views/layouts/application.html.erb. All it does is render
Hello React
at the bottom // of the page. -import React from "react" -import ReactDOM from "react-dom" -import PropTypes from "prop-types" -import ReactTable from "react-table" -import "react-table/react-table.css" +import "core-js/stable"; +import "regenerator-runtime/runtime"; + +import * as React from "react" +import * as ReactDOM from "react-dom" +import * as PropTypes from "prop-types" import { Demo } from "../demo" -import { foo } from "../foo.ts" -const Hello = props => ( +const Hello = (props: {name: string}) => (
Hello {props.name}!
) -Hello.defaultProps = { - name: "David", -} +// Hello.defaultProps = { +// name: "David", +// } -Hello.propTypes = { - name: PropTypes.string, -} +// Hello.propTypes = { +// name: PropTypes.string, +// } document.addEventListener("DOMContentLoaded", () => { ReactDOM.render( , document.body.appendChild(document.createElement("div")) ) - - foo(5, "wombat") }) diff --git a/app/javascript/packs/hello_typescript.js b/app/javascript/packs/hello_typescript.js deleted file mode 100644 index 8d2797f2..00000000 --- a/app/javascript/packs/hello_typescript.js +++ /dev/null @@ -1,4 +0,0 @@ -// Run this example by adding <%= javascript_pack_tag 'hello_typescript' %> to the head of your layout file, -// like app/views/layouts/application.html.erb. -console.log('Hello world from typescript'); -//# sourceMappingURL=hello_typescript.js.map \ No newline at end of file diff --git a/app/javascript/packs/hello_typescript.js.map b/app/javascript/packs/hello_typescript.js.map deleted file mode 100644 index 1945d0ed..00000000 --- a/app/javascript/packs/hello_typescript.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"hello_typescript.js","sourceRoot":"","sources":["hello_typescript.ts"],"names":[],"mappings":"AAAA,4GAA4G;AAC5G,+CAA+C;AAE/C,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC"} \ No newline at end of file diff --git a/app/javascript/packs/hello_typescript.ts b/app/javascript/packs/hello_typescript.ts deleted file mode 100644 index 95a72cf0..00000000 --- a/app/javascript/packs/hello_typescript.ts +++ /dev/null @@ -1,4 +0,0 @@ -// Run this example by adding <%= javascript_pack_tag 'hello_typescript' %> to the head of your layout file, -// like app/views/layouts/application.html.erb. - -console.log('Hello world from typescript'); diff --git a/app/views/welcome/search.html.erb b/app/views/welcome/search.html.erb index cc07ec18..1dde43cc 100644 --- a/app/views/welcome/search.html.erb +++ b/app/views/welcome/search.html.erb @@ -1,6 +1,5 @@ -<%= javascript_pack_tag 'application' %> -<%= stylesheet_pack_tag 'application' %> -<%# javascript_pack_tag 'hello_react' %> +<%= javascript_pack_tag 'hello_react' %> +<%= stylesheet_pack_tag 'hello_react' %>

Find Dances

diff --git a/package.json b/package.json index 4ca5375b..26e35928 100644 --- a/package.json +++ b/package.json @@ -8,10 +8,12 @@ "prop-types": "^15.7.2", "react": "^16.11.0", "react-dom": "^16.11.0", + "react-table": "^6.10.3", "ts-loader": "^6.2.1", "typescript": "^3.6.4" }, "devDependencies": { + "@types/react-table": "^6.8.5", "webpack-dev-server": "^3.9.0" } } diff --git a/yarn.lock b/yarn.lock index 9a00bc9b..51f549e1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -822,6 +822,13 @@ dependencies: "@types/react" "*" +"@types/react-table@^6.8.5": + version "6.8.5" + resolved "https://registry.yarnpkg.com/@types/react-table/-/react-table-6.8.5.tgz#deb2bf2fcedcfb81e9020edbb7df0d8459ca348b" + integrity sha512-ueCsAadG1IwuuAZM+MWf2SoxbccSWweyQa9YG6xGN5cOVK3SayPOJW4MsUHGpY0V/Q+iZWgohpasliiao29O6g== + dependencies: + "@types/react" "*" + "@types/react@*", "@types/react@^16.9.11": version "16.9.11" resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.11.tgz#70e0b7ad79058a7842f25ccf2999807076ada120" @@ -1696,6 +1703,11 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" +classnames@^2.2.5: + version "2.2.6" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" + integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== + cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" @@ -5827,6 +5839,13 @@ react-is@^16.8.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.11.0.tgz#b85dfecd48ad1ce469ff558a882ca8e8313928fa" integrity sha512-gbBVYR2p8mnriqAwWx9LbuUrShnAuSCNnuPGyc7GJrMVQtPDAh8iLpv7FRuMPFb56KkaVZIYSz1PrjI9q0QPCw== +react-table@^6.10.3: + version "6.10.3" + resolved "https://registry.yarnpkg.com/react-table/-/react-table-6.10.3.tgz#d085487a5a1b18b76486b71cf1d388d87c8c7362" + integrity sha512-sVlq2/rxVaQJywGD95+qGiMr/SMHFIFnXdx619BLOWE/Os5FOGtV6pQJNAjZixbQZiOu7dmBO1kME28uxh6wmA== + dependencies: + classnames "^2.2.5" + react@^16.11.0: version "16.11.0" resolved "https://registry.yarnpkg.com/react/-/react-16.11.0.tgz#d294545fe62299ccee83363599bf904e4a07fdbb" From bf29007a06cc1cb63a09b08908787f37a6af11f2 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sat, 2 Nov 2019 21:27:10 -0500 Subject: [PATCH 014/103] react-table to 7.0.0-beta.12 --- app/javascript/packs/hello_react.tsx | 50 +++++++++------------------- app/views/welcome/search.html.erb | 5 ++- package.json | 3 +- yarn.lock | 20 +++++------ 4 files changed, 31 insertions(+), 47 deletions(-) diff --git a/app/javascript/packs/hello_react.tsx b/app/javascript/packs/hello_react.tsx index 20eea99f..e118e782 100644 --- a/app/javascript/packs/hello_react.tsx +++ b/app/javascript/packs/hello_react.tsx @@ -1,34 +1,16 @@ - - -// Run this example by adding <%= javascript_pack_tag 'hello_react' %> to the head of your layout file, -// like app/views/layouts/application.html.erb. All it does is render
Hello React
at the bottom -// of the page. - -import "core-js/stable"; -import "regenerator-runtime/runtime"; - -import * as React from "react" -import * as ReactDOM from "react-dom" -import * as PropTypes from "prop-types" -import { Demo } from "../demo" - -const Hello = (props: {name: string}) => ( -
- Hello {props.name}! -
-) - -// Hello.defaultProps = { -// name: "David", -// } - -// Hello.propTypes = { -// name: PropTypes.string, -// } - -document.addEventListener("DOMContentLoaded", () => { - ReactDOM.render( - , - document.body.appendChild(document.createElement("div")) - ) -}) +///////////////////////////////////////////////////////////////// + +import React from 'react'; +import ReactDOM from 'react-dom'; +// import './index.css'; +import App from '../app'; +// import * as serviceWorker from './serviceWorker'; +const root = document.getElementById('root') + +console.log("root = ", root) +ReactDOM.render(, root); + +// If you want your app to work offline and load faster, you can change +// unregister() to register() below. Note this comes with some pitfalls. +// Learn more about service workers: https://bit.ly/CRA-PWA +// serviceWorker.unregister(); diff --git a/app/views/welcome/search.html.erb b/app/views/welcome/search.html.erb index 1dde43cc..87f81245 100644 --- a/app/views/welcome/search.html.erb +++ b/app/views/welcome/search.html.erb @@ -1,8 +1,11 @@ -<%= javascript_pack_tag 'hello_react' %> +<%= javascript_pack_tag 'hello_react', defer: true %> <%= stylesheet_pack_tag 'hello_react' %>

Find Dances

+ +
+
<%= @dialect_json %>
diff --git a/package.json b/package.json index 26e35928..096d3f7d 100644 --- a/package.json +++ b/package.json @@ -5,10 +5,11 @@ "@types/react": "^16.9.11", "@types/react-dom": "^16.9.3", "babel-plugin-transform-react-remove-prop-types": "^0.4.24", + "namor": "^1.1.3", "prop-types": "^15.7.2", "react": "^16.11.0", "react-dom": "^16.11.0", - "react-table": "^6.10.3", + "react-table": "^7.0.0-beta.12", "ts-loader": "^6.2.1", "typescript": "^3.6.4" }, diff --git a/yarn.lock b/yarn.lock index 51f549e1..0b55a954 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1703,11 +1703,6 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -classnames@^2.2.5: - version "2.2.6" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" - integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== - cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" @@ -4350,6 +4345,11 @@ multicast-dns@^6.0.1: dns-packet "^1.3.1" thunky "^1.0.2" +namor@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/namor/-/namor-1.1.3.tgz#e7b2a94d7e6e9b7438a3db10314fe0fded6b96c1" + integrity sha512-KCw02Mto4yquFTPUxFAY5ZJMBweClBrDrJXQTdN8dNSb3BHzhRlTLzJ0TTj0cG9n4ApkWJEOqEisCzsodFEvbA== + nan@^2.12.1, nan@^2.13.2: version "2.14.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" @@ -5839,12 +5839,10 @@ react-is@^16.8.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.11.0.tgz#b85dfecd48ad1ce469ff558a882ca8e8313928fa" integrity sha512-gbBVYR2p8mnriqAwWx9LbuUrShnAuSCNnuPGyc7GJrMVQtPDAh8iLpv7FRuMPFb56KkaVZIYSz1PrjI9q0QPCw== -react-table@^6.10.3: - version "6.10.3" - resolved "https://registry.yarnpkg.com/react-table/-/react-table-6.10.3.tgz#d085487a5a1b18b76486b71cf1d388d87c8c7362" - integrity sha512-sVlq2/rxVaQJywGD95+qGiMr/SMHFIFnXdx619BLOWE/Os5FOGtV6pQJNAjZixbQZiOu7dmBO1kME28uxh6wmA== - dependencies: - classnames "^2.2.5" +react-table@^7.0.0-beta.12: + version "7.0.0-beta.12" + resolved "https://registry.yarnpkg.com/react-table/-/react-table-7.0.0-beta.12.tgz#ae54b398fbdb527b9fad82e52c4d829c00fdd5dc" + integrity sha512-h1c0KNTBRPAMgZumaNixr3X0w7kFTuqk6pHwia12LsMgnTHNEEeqp7+tQ5fTPwwMArp1/OHXeOdSKEes1C83iw== react@^16.11.0: version "16.11.0" From 30b064eaba93108f7030361877cfc8c5a14919cd Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sat, 2 Nov 2019 22:15:03 -0500 Subject: [PATCH 015/103] convert files forgotten in last commit to have rougly dance-related random content --- app/javascript/app.js | 76 ++++++++++++++++++++++++++++++++++++++ app/javascript/makeData.js | 38 +++++++++++++++++++ 2 files changed, 114 insertions(+) create mode 100644 app/javascript/app.js create mode 100644 app/javascript/makeData.js diff --git a/app/javascript/app.js b/app/javascript/app.js new file mode 100644 index 00000000..0e4862ba --- /dev/null +++ b/app/javascript/app.js @@ -0,0 +1,76 @@ +import React from 'react' +import { useTable } from 'react-table' + +import makeData from './makeData' + + +function Table({ columns, data }) { + // Use the state and functions returned from useTable to build your UI + const { + getTableProps, + getTableBodyProps, + headerGroups, + rows, + prepareRow, + } = useTable({ + columns, + data, + }) + + // Render the UI for your table + return ( + + + {headerGroups.map(headerGroup => ( + + {headerGroup.headers.map(column => ( + + ))} + + ))} + + + {rows.map( + (row, i) => + prepareRow(row) || ( + + {row.cells.map(cell => { + return + })} + + ) + )} + +
{column.render('Header')}
{cell.render('Cell')}
+ ) +} + +function App() { + const columns = React.useMemo( + () => ['Title', + 'Choreographer', + 'Hook', + 'Formation', + 'User', + 'Entered', + 'Updated', + 'Sharing', + 'Figures', + ].map(x => { + return { + Header: x, + accessor: x.toLowerCase(), + }}), + [] + ) + + const data = React.useMemo(() => makeData(20), []) + + return ( + + + + ) +} + +export default App diff --git a/app/javascript/makeData.js b/app/javascript/makeData.js new file mode 100644 index 00000000..a10036d2 --- /dev/null +++ b/app/javascript/makeData.js @@ -0,0 +1,38 @@ +import namor from 'namor' + +const range = len => { + const arr = [] + for (let i = 0; i < len; i++) { + arr.push(i) + } + return arr +} + +const newDance = () => { + const statusChance = Math.random() + return { + title: namor.generate({ words: 1, numbers: 0 }), + choreographer: namor.generate({ words: 2, numbers: 0 }), + hook: namor.generate({ words: 3, numbers: 0 }), + formation: 'improper', + user: namor.generate({ words: 2, numbers: 0 }), + entered: namor.generate({ numbers: 1 }), + updated: namor.generate({ numbers: 1 }), + sharing: 'everyone', + figures: 'whole dance', + } +} + +export default function makeData(...lens) { + const makeDataLevel = (depth = 0) => { + const len = lens[depth] + return range(len).map(d => { + return { + ...newDance(), + subRows: lens[depth + 1] ? makeDataLevel(depth + 1) : undefined, + } + }) + } + + return makeDataLevel() +} From 9f2494c4df0e9751a9b6985ab98bf93213b3b2f6 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 6 Oct 2019 21:31:23 -0500 Subject: [PATCH 016/103] reinstall prettier --- package.json | 18 +- yarn.lock | 1396 +++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 1385 insertions(+), 29 deletions(-) diff --git a/package.json b/package.json index 096d3f7d..cac62773 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,22 @@ }, "devDependencies": { "@types/react-table": "^6.8.5", - "webpack-dev-server": "^3.9.0" + "webpack-dev-server": "^3.9.0", + "jest": "^24.8.0", + "prettier": "1.18.2", + "webpack-dev-server": "^3.1.14" + }, + "scripts": { + "prettier": "prettier", + "test": "jest" + }, + "jest": { + "roots": [ + "spec/javascript" + ], + "moduleDirectories": [ + "node_modules", + "app/javascript" + ] } } diff --git a/yarn.lock b/yarn.lock index 0b55a954..2400053f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,7 +9,7 @@ dependencies: "@babel/highlight" "^7.0.0" -"@babel/core@^7.4.5": +"@babel/core@^7.1.0", "@babel/core@^7.4.5": version "7.6.4" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.6.4.tgz#6ebd9fe00925f6c3e177bb726a188b5f578088ff" integrity sha512-Rm0HGw101GY8FTzpWSyRbki/jzq+/PkNQJ+nSulrdY6gFGOsNseCqD6KHRYe2E+EdzuBdr2pxCp6s4Uk6eJ+XQ== @@ -29,7 +29,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.6.3", "@babel/generator@^7.6.4": +"@babel/generator@^7.4.0", "@babel/generator@^7.6.3", "@babel/generator@^7.6.4": version "7.6.4" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.6.4.tgz#a4f8437287bf9671b07f483b76e3bb731bc97671" integrity sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w== @@ -232,7 +232,7 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.6.0", "@babel/parser@^7.6.3", "@babel/parser@^7.6.4": +"@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.6.0", "@babel/parser@^7.6.3", "@babel/parser@^7.6.4": version "7.6.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.4.tgz#cb9b36a7482110282d5cb6dd424ec9262b473d81" integrity sha512-D8RHPW5qd0Vbyo3qb+YjO5nvUVRTXFLQ/FsDxJU2Nqz4uB5EnUN0ZQSEYpvTIbRuttig1XbHWU5oMeQwQSAA+A== @@ -323,7 +323,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-object-rest-spread@^7.2.0": +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== @@ -699,7 +699,7 @@ dependencies: regenerator-runtime "^0.13.2" -"@babel/template@^7.1.0", "@babel/template@^7.4.4", "@babel/template@^7.6.0": +"@babel/template@^7.1.0", "@babel/template@^7.4.0", "@babel/template@^7.4.4", "@babel/template@^7.6.0": version "7.6.0" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6" integrity sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ== @@ -708,7 +708,7 @@ "@babel/parser" "^7.6.0" "@babel/types" "^7.6.0" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5", "@babel/traverse@^7.6.2", "@babel/traverse@^7.6.3": +"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5", "@babel/traverse@^7.6.2", "@babel/traverse@^7.6.3": version "7.6.3" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.3.tgz#66d7dba146b086703c0fb10dd588b7364cec47f9" integrity sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw== @@ -723,7 +723,7 @@ globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5", "@babel/types@^7.6.0", "@babel/types@^7.6.3": +"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5", "@babel/types@^7.6.0", "@babel/types@^7.6.3": version "7.6.3" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.6.3.tgz#3f07d96f854f98e2fbd45c64b0cb942d11e8ba09" integrity sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA== @@ -732,11 +732,167 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" +"@cnakazawa/watch@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" + integrity sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + "@csstools/convert-colors@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== +"@jest/console@^24.7.1", "@jest/console@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" + integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== + dependencies: + "@jest/source-map" "^24.9.0" + chalk "^2.0.1" + slash "^2.0.0" + +"@jest/core@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.9.0.tgz#2ceccd0b93181f9c4850e74f2a9ad43d351369c4" + integrity sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A== + dependencies: + "@jest/console" "^24.7.1" + "@jest/reporters" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-changed-files "^24.9.0" + jest-config "^24.9.0" + jest-haste-map "^24.9.0" + jest-message-util "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-resolve-dependencies "^24.9.0" + jest-runner "^24.9.0" + jest-runtime "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + jest-watcher "^24.9.0" + micromatch "^3.1.10" + p-each-series "^1.0.0" + realpath-native "^1.1.0" + rimraf "^2.5.4" + slash "^2.0.0" + strip-ansi "^5.0.0" + +"@jest/environment@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.9.0.tgz#21e3afa2d65c0586cbd6cbefe208bafade44ab18" + integrity sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ== + dependencies: + "@jest/fake-timers" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + +"@jest/fake-timers@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" + integrity sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A== + dependencies: + "@jest/types" "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + +"@jest/reporters@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.9.0.tgz#86660eff8e2b9661d042a8e98a028b8d631a5b43" + integrity sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" + istanbul-lib-coverage "^2.0.2" + istanbul-lib-instrument "^3.0.1" + istanbul-lib-report "^2.0.4" + istanbul-lib-source-maps "^3.0.1" + istanbul-reports "^2.2.6" + jest-haste-map "^24.9.0" + jest-resolve "^24.9.0" + jest-runtime "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.6.0" + node-notifier "^5.4.2" + slash "^2.0.0" + source-map "^0.6.0" + string-length "^2.0.0" + +"@jest/source-map@^24.3.0", "@jest/source-map@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" + integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.1.15" + source-map "^0.6.0" + +"@jest/test-result@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" + integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA== + dependencies: + "@jest/console" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/istanbul-lib-coverage" "^2.0.0" + +"@jest/test-sequencer@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz#f8f334f35b625a4f2f355f2fe7e6036dad2e6b31" + integrity sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A== + dependencies: + "@jest/test-result" "^24.9.0" + jest-haste-map "^24.9.0" + jest-runner "^24.9.0" + jest-runtime "^24.9.0" + +"@jest/transform@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.9.0.tgz#4ae2768b296553fadab09e9ec119543c90b16c56" + integrity sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^24.9.0" + babel-plugin-istanbul "^5.1.0" + chalk "^2.0.1" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.1.15" + jest-haste-map "^24.9.0" + jest-regex-util "^24.9.0" + jest-util "^24.9.0" + micromatch "^3.1.10" + pirates "^4.0.1" + realpath-native "^1.1.0" + slash "^2.0.0" + source-map "^0.6.1" + write-file-atomic "2.4.1" + +"@jest/types@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" + integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^13.0.0" + "@rails/webpacker@^4.0.7": version "4.0.7" resolved "https://registry.yarnpkg.com/@rails/webpacker/-/webpacker-4.0.7.tgz#268571bf974e78ce57eca9fa478f5bd97fd5182c" @@ -781,6 +937,39 @@ webpack-cli "^3.3.2" webpack-sources "^1.3.0" +"@types/babel__core@^7.1.0": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.3.tgz#e441ea7df63cd080dfcd02ab199e6d16a735fc30" + integrity sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.0.tgz#f1ec1c104d1bb463556ecb724018ab788d0c172a" + integrity sha512-c1mZUu4up5cp9KROs/QAw0gTeHrw/x7m52LcnvMxxOZ03DmLwPV0MlGmlgzV3cnSdjhJOZsj7E7FHeioai+egw== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" + integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.0.7" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.7.tgz#2496e9ff56196cc1429c72034e07eab6121b6f3f" + integrity sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw== + dependencies: + "@babel/types" "^7.3.0" + "@types/events@*": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" @@ -795,6 +984,26 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" + integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== + +"@types/istanbul-lib-report@*": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#e5471e7fa33c61358dd38426189c037a58433b8c" + integrity sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#7a8cbf6a406f36c8add871625b278eaf0b0d255a" + integrity sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA== + dependencies: + "@types/istanbul-lib-coverage" "*" + "@types/istanbul-lib-report" "*" + "@types/minimatch@*": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" @@ -837,6 +1046,23 @@ "@types/prop-types" "*" csstype "^2.2.0" +"@types/stack-utils@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" + integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== + +"@types/yargs-parser@*": + version "13.1.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-13.1.0.tgz#c563aa192f39350a1d18da36c5a8da382bbd8228" + integrity sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg== + +"@types/yargs@^13.0.0": + version "13.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.3.tgz#76482af3981d4412d65371a318f992d33464a380" + integrity sha512-K8/LfZq2duW33XW/tFwEAfnZlqIfVsoyRB3kfXdPXYhl0nfM8mmh7GS0jg7WrX2Dgq/0Ha/pR1PaR+BvmWwjiQ== + dependencies: + "@types/yargs-parser" "*" + "@webassemblyjs/ast@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" @@ -993,6 +1219,11 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +abab@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.2.tgz#a2fba1b122c69a85caa02d10f9270c7219709a9d" + integrity sha512-2scffjvioEmNz0OyDSLGWDfKCVwaKc6l9Pm9kOIREU13ClXZvHpg/nRL5xyjSSSLhOnXqft2HpsAzNEEA8cFFg== + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -1006,7 +1237,25 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: mime-types "~2.1.24" negotiator "0.6.2" -acorn@^6.2.1: +acorn-globals@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" + integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" + +acorn-walk@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" + 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== + +acorn@^6.0.1, acorn@^6.2.1: version "6.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e" integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA== @@ -1046,6 +1295,11 @@ ansi-colors@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== +ansi-escapes@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + ansi-html@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" @@ -1061,7 +1315,7 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= -ansi-regex@^4.1.0: +ansi-regex@^4.0.0, ansi-regex@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== @@ -1121,6 +1375,11 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= + array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" @@ -1187,6 +1446,11 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + async-each@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" @@ -1242,6 +1506,19 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== +babel-jest@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.9.0.tgz#3fc327cb8467b89d14d7bc70e315104a783ccd54" + integrity sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw== + dependencies: + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/babel__core" "^7.1.0" + babel-plugin-istanbul "^5.1.0" + babel-preset-jest "^24.9.0" + chalk "^2.4.2" + slash "^2.0.0" + babel-loader@^8.0.6: version "8.0.6" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb" @@ -1259,6 +1536,23 @@ babel-plugin-dynamic-import-node@^2.2.0, babel-plugin-dynamic-import-node@^2.3.0 dependencies: object.assign "^4.1.0" +babel-plugin-istanbul@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854" + integrity sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + find-up "^3.0.0" + istanbul-lib-instrument "^3.3.0" + test-exclude "^5.2.3" + +babel-plugin-jest-hoist@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz#4f837091eb407e01447c8843cbec546d0002d756" + integrity sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw== + dependencies: + "@types/babel__traverse" "^7.0.6" + babel-plugin-macros@^2.5.0: version "2.6.1" resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.6.1.tgz#41f7ead616fc36f6a93180e89697f69f51671181" @@ -1273,6 +1567,14 @@ babel-plugin-transform-react-remove-prop-types@^0.4.24: resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== +babel-preset-jest@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc" + integrity sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg== + dependencies: + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + babel-plugin-jest-hoist "^24.9.0" + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -1404,6 +1706,18 @@ brorand@^1.0.1: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= +browser-process-hrtime@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" + integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== + +browser-resolve@^1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== + dependencies: + resolve "1.1.7" + browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" @@ -1472,6 +1786,13 @@ browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.6.4, browserslist@^4.7 electron-to-chromium "^1.3.295" node-releases "^1.1.38" +bser@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -1586,6 +1907,11 @@ callsites@^2.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + camelcase-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" @@ -1604,7 +1930,7 @@ camelcase@^3.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= -camelcase@^5.0.0, camelcase@^5.2.0: +camelcase@^5.0.0, camelcase@^5.2.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== @@ -1624,6 +1950,13 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001004: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001004.tgz#d879b73981b255488316da946c39327d8c00a586" integrity sha512-3nfOR4O8Wa2RWoYfJkMtwRVOsK96TQ+eq57wd0iKaEWl8dwG4hKZ/g0MVBfCvysFvMLi9fQGR/DvozMdkEPl3g== +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" + case-sensitive-paths-webpack-plugin@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.2.0.tgz#3371ef6365ef9c25fa4b81c16ace0e9c7dc58c3e" @@ -1634,7 +1967,7 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@2.4.2, chalk@^2.0, chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@2.4.2, chalk@^2.0, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1685,6 +2018,11 @@ chrome-trace-event@^1.0.2: dependencies: tslib "^1.9.0" +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -1739,6 +2077,11 @@ clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + coa@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" @@ -1801,7 +2144,7 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@^2.20.0: +commander@^2.20.0, commander@~2.20.3: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -1897,7 +2240,7 @@ content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -convert-source-map@^1.1.0: +convert-source-map@^1.1.0, convert-source-map@^1.4.0: version "1.6.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== @@ -2209,6 +2552,18 @@ csso@^3.5.1: dependencies: css-tree "1.0.0-alpha.29" +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" + integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== + dependencies: + cssom "0.3.x" + csstype@^2.2.0: version "2.6.7" resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.7.tgz#20b0024c20b6718f4eda3853a1f5a1cce7f5e4a5" @@ -2233,6 +2588,15 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +data-urls@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" + date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" @@ -2286,6 +2650,11 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + default-gateway@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" @@ -2374,11 +2743,21 @@ detect-libc@^1.0.2: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= +detect-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= + detect-node@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== +diff-sequences@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" + integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== + diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" @@ -2431,6 +2810,13 @@ domelementtype@^2.0.1: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + domutils@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" @@ -2581,6 +2967,18 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escodegen@^1.9.1: + version "1.12.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.12.0.tgz#f763daf840af172bb3a2b6dd7219c0e17f7ff541" + integrity sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg== + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" @@ -2589,6 +2987,11 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= + esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" @@ -2601,7 +3004,7 @@ esrecurse@^4.1.0: dependencies: estraverse "^4.1.0" -estraverse@^4.1.0, estraverse@^4.1.1: +estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== @@ -2641,6 +3044,11 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" +exec-sh@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.2.tgz#6738de2eb7c8e671d0366aea0b0db8c6f7d7391b" + integrity sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg== + execa@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" @@ -2654,6 +3062,11 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -2674,6 +3087,18 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2: dependencies: homedir-polyfill "^1.0.1" +expect@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca" + integrity sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q== + dependencies: + "@jest/types" "^24.9.0" + ansi-styles "^3.2.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-regex-util "^24.9.0" + express@^4.17.1: version "4.17.1" resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" @@ -2764,6 +3189,11 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + faye-websocket@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" @@ -2778,6 +3208,13 @@ faye-websocket@~0.11.1: dependencies: websocket-driver ">=0.5.1" +fb-watchman@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" + integrity sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg= + dependencies: + bser "^2.0.0" + figgy-pudding@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" @@ -3032,7 +3469,7 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@~7.1.1: +glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@~7.1.1: version "7.1.5" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.5.tgz#6714c69bee20f3c3e64c4dd905553e532b40cdc0" integrity sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ== @@ -3110,11 +3547,27 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + handle-thing@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== +handlebars@^4.1.2: + version "4.5.1" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.5.1.tgz#8a01c382c180272260d07f2d1aa3ae745715c7ba" + integrity sha512-C29UoFzHe9yM61lOsIlCE5/mQVGrnIOrOq7maQl76L7tYPCgC1og0Ajt6uWnX4ZTxBPnjw+CUvawphwCfJgUnA== + dependencies: + neo-async "^2.6.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -3255,6 +3708,13 @@ html-comment-regex@^1.1.0: resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== + dependencies: + whatwg-encoding "^1.0.1" + html-entities@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" @@ -3469,7 +3929,7 @@ interpret@1.2.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== -invariant@^2.2.2: +invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -3562,6 +4022,13 @@ is-callable@^1.1.4: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + is-color-stop@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" @@ -3652,6 +4119,11 @@ is-fullwidth-code-point@^2.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" @@ -3792,6 +4264,405 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= +istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" + integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== + +istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" + integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA== + dependencies: + "@babel/generator" "^7.4.0" + "@babel/parser" "^7.4.3" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" + istanbul-lib-coverage "^2.0.5" + semver "^6.0.0" + +istanbul-lib-report@^2.0.4: + version "2.0.8" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" + integrity sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ== + dependencies: + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + supports-color "^6.1.0" + +istanbul-lib-source-maps@^3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" + integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + rimraf "^2.6.3" + source-map "^0.6.1" + +istanbul-reports@^2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.6.tgz#7b4f2660d82b29303a8fe6091f8ca4bf058da1af" + integrity sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA== + dependencies: + handlebars "^4.1.2" + +jest-changed-files@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.9.0.tgz#08d8c15eb79a7fa3fc98269bc14b451ee82f8039" + integrity sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg== + dependencies: + "@jest/types" "^24.9.0" + execa "^1.0.0" + throat "^4.0.0" + +jest-cli@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.9.0.tgz#ad2de62d07472d419c6abc301fc432b98b10d2af" + integrity sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg== + dependencies: + "@jest/core" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + exit "^0.1.2" + import-local "^2.0.0" + is-ci "^2.0.0" + jest-config "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + prompts "^2.0.1" + realpath-native "^1.1.0" + yargs "^13.3.0" + +jest-config@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.9.0.tgz#fb1bbc60c73a46af03590719efa4825e6e4dd1b5" + integrity sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ== + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^24.9.0" + "@jest/types" "^24.9.0" + babel-jest "^24.9.0" + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^24.9.0" + jest-environment-node "^24.9.0" + jest-get-type "^24.9.0" + jest-jasmine2 "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + micromatch "^3.1.10" + pretty-format "^24.9.0" + realpath-native "^1.1.0" + +jest-diff@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" + integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== + dependencies: + chalk "^2.0.1" + diff-sequences "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-docblock@^24.3.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2" + integrity sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA== + dependencies: + detect-newline "^2.1.0" + +jest-each@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.9.0.tgz#eb2da602e2a610898dbc5f1f6df3ba86b55f8b05" + integrity sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog== + dependencies: + "@jest/types" "^24.9.0" + chalk "^2.0.1" + jest-get-type "^24.9.0" + jest-util "^24.9.0" + pretty-format "^24.9.0" + +jest-environment-jsdom@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz#4b0806c7fc94f95edb369a69cc2778eec2b7375b" + integrity sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" + jsdom "^11.5.1" + +jest-environment-node@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.9.0.tgz#333d2d2796f9687f2aeebf0742b519f33c1cbfd3" + integrity sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" + +jest-get-type@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" + integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== + +jest-haste-map@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" + integrity sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ== + dependencies: + "@jest/types" "^24.9.0" + anymatch "^2.0.0" + fb-watchman "^2.0.0" + graceful-fs "^4.1.15" + invariant "^2.2.4" + jest-serializer "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.9.0" + micromatch "^3.1.10" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^1.2.7" + +jest-jasmine2@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz#1f7b1bd3242c1774e62acabb3646d96afc3be6a0" + integrity sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + co "^4.6.0" + expect "^24.9.0" + is-generator-fn "^2.0.0" + jest-each "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-runtime "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + pretty-format "^24.9.0" + throat "^4.0.0" + +jest-leak-detector@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz#b665dea7c77100c5c4f7dfcb153b65cf07dcf96a" + integrity sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA== + dependencies: + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-matcher-utils@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" + integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA== + dependencies: + chalk "^2.0.1" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-message-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" + integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/stack-utils" "^1.0.1" + chalk "^2.0.1" + micromatch "^3.1.10" + slash "^2.0.0" + stack-utils "^1.0.1" + +jest-mock@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" + integrity sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w== + dependencies: + "@jest/types" "^24.9.0" + +jest-pnp-resolver@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" + integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== + +jest-regex-util@^24.3.0, jest-regex-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636" + integrity sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA== + +jest-resolve-dependencies@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz#ad055198959c4cfba8a4f066c673a3f0786507ab" + integrity sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g== + dependencies: + "@jest/types" "^24.9.0" + jest-regex-util "^24.3.0" + jest-snapshot "^24.9.0" + +jest-resolve@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.9.0.tgz#dff04c7687af34c4dd7e524892d9cf77e5d17321" + integrity sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ== + dependencies: + "@jest/types" "^24.9.0" + browser-resolve "^1.11.3" + chalk "^2.0.1" + jest-pnp-resolver "^1.2.1" + realpath-native "^1.1.0" + +jest-runner@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.9.0.tgz#574fafdbd54455c2b34b4bdf4365a23857fcdf42" + integrity sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.4.2" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-config "^24.9.0" + jest-docblock "^24.3.0" + jest-haste-map "^24.9.0" + jest-jasmine2 "^24.9.0" + jest-leak-detector "^24.9.0" + jest-message-util "^24.9.0" + jest-resolve "^24.9.0" + jest-runtime "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.6.0" + source-map-support "^0.5.6" + throat "^4.0.0" + +jest-runtime@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.9.0.tgz#9f14583af6a4f7314a6a9d9f0226e1a781c8e4ac" + integrity sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.9.0" + "@jest/source-map" "^24.3.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/yargs" "^13.0.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.1.15" + jest-config "^24.9.0" + jest-haste-map "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + realpath-native "^1.1.0" + slash "^2.0.0" + strip-bom "^3.0.0" + yargs "^13.3.0" + +jest-serializer@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" + integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ== + +jest-snapshot@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.9.0.tgz#ec8e9ca4f2ec0c5c87ae8f925cf97497b0e951ba" + integrity sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew== + dependencies: + "@babel/types" "^7.0.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + expect "^24.9.0" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-resolve "^24.9.0" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^24.9.0" + semver "^6.2.0" + +jest-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" + integrity sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg== + dependencies: + "@jest/console" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/source-map" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + callsites "^3.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.15" + is-ci "^2.0.0" + mkdirp "^0.5.1" + slash "^2.0.0" + source-map "^0.6.0" + +jest-validate@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab" + integrity sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ== + dependencies: + "@jest/types" "^24.9.0" + camelcase "^5.3.1" + chalk "^2.0.1" + jest-get-type "^24.9.0" + leven "^3.1.0" + pretty-format "^24.9.0" + +jest-watcher@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.9.0.tgz#4b56e5d1ceff005f5b88e528dc9afc8dd4ed2b3b" + integrity sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw== + dependencies: + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/yargs" "^13.0.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + jest-util "^24.9.0" + string-length "^2.0.0" + +jest-worker@^24.6.0, jest-worker@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" + integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== + dependencies: + merge-stream "^2.0.0" + supports-color "^6.1.0" + +jest@^24.8.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-24.9.0.tgz#987d290c05a08b52c56188c1002e368edb007171" + integrity sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw== + dependencies: + import-local "^2.0.0" + jest-cli "^24.9.0" + js-base64@^2.1.8: version "2.5.1" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121" @@ -3820,6 +4691,38 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= +jsdom@^11.5.1: + version "11.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== + dependencies: + abab "^2.0.0" + acorn "^5.5.3" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle "^1.0.0" + data-urls "^1.0.0" + domexception "^1.0.1" + escodegen "^1.9.1" + html-encoding-sniffer "^1.0.2" + left-pad "^1.3.0" + nwsapi "^2.0.7" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.87.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.4" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^5.2.0" + xml-name-validator "^3.0.0" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -3908,6 +4811,11 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + last-call-webpack-plugin@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" @@ -3930,6 +4838,24 @@ lcid@^2.0.0: dependencies: invert-kv "^2.0.0" +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -3941,6 +4867,16 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + loader-runner@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" @@ -3983,6 +4919,11 @@ lodash.memoize@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + lodash.template@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" @@ -4043,7 +4984,7 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -make-dir@^2.0.0: +make-dir@^2.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== @@ -4051,6 +4992,13 @@ make-dir@^2.0.0: pify "^4.0.1" semver "^5.6.0" +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= + dependencies: + tmpl "1.0.x" + mamacro@^0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" @@ -4150,6 +5098,11 @@ merge-descriptors@1.0.1: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -4254,11 +5207,16 @@ minimist@0.0.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@^1.1.3, minimist@^1.2.0: +minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= + minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" @@ -4372,6 +5330,11 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + needle@^2.2.1: version "2.4.0" resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" @@ -4386,7 +5349,7 @@ negotiator@0.6.2: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== -neo-async@^2.5.0, neo-async@^2.6.1: +neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== @@ -4419,6 +5382,11 @@ node-gyp@^3.8.0: tar "^2.0.0" which "1" +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + node-libs-browser@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" @@ -4448,6 +5416,22 @@ node-libs-browser@^2.2.1: util "^0.11.0" vm-browserify "^1.0.1" +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + +node-notifier@^5.4.2: + version "5.4.3" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50" + integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q== + dependencies: + growly "^1.3.0" + is-wsl "^1.1.0" + semver "^5.5.0" + shellwords "^0.1.1" + which "^1.3.0" + node-pre-gyp@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" @@ -4598,6 +5582,11 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= +nwsapi@^2.0.7: + version "2.1.4" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.4.tgz#e006a878db23636f8e8a67d33ca0e4edf61a842f" + integrity sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw== + oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" @@ -4705,6 +5694,14 @@ opn@^5.5.0: dependencies: is-wsl "^1.1.0" +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + optimize-css-assets-webpack-plugin@^5.0.1: version "5.0.3" resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz#e2f1d4d94ad8c0af8967ebd7cf138dcb1ef14572" @@ -4713,6 +5710,18 @@ optimize-css-assets-webpack-plugin@^5.0.1: cssnano "^4.1.10" last-call-webpack-plugin "^3.0.0" +optionator@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + original@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" @@ -4764,6 +5773,13 @@ p-defer@^1.0.0: resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= +p-each-series@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" + integrity sha1-kw89Et0fUOdDRFeiLNbwSsatf3E= + dependencies: + p-reduce "^1.0.0" + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -4793,6 +5809,11 @@ p-map@^2.0.0: resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== +p-reduce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" + integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= + p-retry@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" @@ -4851,6 +5872,11 @@ parse-passwd@^1.0.0: resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== + parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -4922,6 +5948,13 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + pbkdf2@^3.0.3: version "3.0.17" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" @@ -4948,6 +5981,11 @@ pify@^2.0.0, pify@^2.3.0: resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" @@ -4965,6 +6003,13 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= +pirates@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== + dependencies: + node-modules-regexp "^1.0.0" + pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" @@ -4972,6 +6017,11 @@ pkg-dir@^3.0.0: dependencies: find-up "^3.0.0" +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== + pnp-webpack-plugin@^1.4.3: version "1.5.0" resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.5.0.tgz#62a1cd3068f46d564bb33c56eb250e4d586676eb" @@ -5637,11 +6687,31 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.1 source-map "^0.6.1" supports-color "^6.1.0" +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + prepend-http@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= +prettier@1.18.2: + version "1.18.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" + integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== + +pretty-format@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" + integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== + dependencies: + "@jest/types" "^24.9.0" + ansi-regex "^4.0.0" + ansi-styles "^3.2.0" + react-is "^16.8.4" + private@^0.1.6: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -5662,6 +6732,14 @@ promise-inflight@^1.0.1: resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= +prompts@^2.0.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.2.1.tgz#f901dd2a2dfee080359c0e20059b24188d75ad35" + integrity sha512-VObPvJiWPhpZI6C5m60XOzTfnYg/xc/an+r9VYymj9WJW3B/DIH+REzjpAACPf8brwPeP+7vz3bIim3S+AaMjw== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.3" + prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" @@ -5689,7 +6767,7 @@ pseudomap@^1.0.2: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= -psl@^1.1.24: +psl@^1.1.24, psl@^1.1.28: version "1.4.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.4.0.tgz#5dd26156cdb69fa1fdb8ab1991667d3f80ced7c2" integrity sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw== @@ -5741,7 +6819,7 @@ punycode@^1.2.4, punycode@^1.4.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= -punycode@^2.1.0: +punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== @@ -5834,7 +6912,7 @@ react-dom@^16.11.0: prop-types "^15.6.2" scheduler "^0.17.0" -react-is@^16.8.1: +react-is@^16.8.1, react-is@^16.8.4: version "16.11.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.11.0.tgz#b85dfecd48ad1ce469ff558a882ca8e8313928fa" integrity sha512-gbBVYR2p8mnriqAwWx9LbuUrShnAuSCNnuPGyc7GJrMVQtPDAh8iLpv7FRuMPFb56KkaVZIYSz1PrjI9q0QPCw== @@ -5868,6 +6946,14 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" +read-pkg-up@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" + integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== + dependencies: + find-up "^3.0.0" + read-pkg "^3.0.0" + read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" @@ -5877,6 +6963,15 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" @@ -5908,6 +7003,13 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" +realpath-native@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" + integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== + dependencies: + util.promisify "^1.0.0" + redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" @@ -6001,6 +7103,22 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" +request-promise-core@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346" + integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag== + dependencies: + lodash "^4.17.11" + +request-promise-native@^1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59" + integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w== + dependencies: + request-promise-core "1.1.2" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + request@^2.87.0, request@^2.88.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" @@ -6072,6 +7190,11 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + resolve@^1.1.7, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.8.1: version "1.12.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" @@ -6114,6 +7237,11 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" +rsvp@^4.8.4: + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== + run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" @@ -6143,6 +7271,21 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== + dependencies: + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + sass-graph@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" @@ -6211,7 +7354,7 @@ selfsigned@^1.10.7: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.0.0, semver@^6.3.0: +semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -6325,7 +7468,12 @@ shebang-regex@^1.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= -signal-exit@^3.0.0: +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== + +signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= @@ -6337,6 +7485,16 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" +sisteransi@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.3.tgz#98168d62b79e3a5e758e27ae63c4a053d748f4eb" + integrity sha512-SbEG75TzH8G7eVXFSN5f9EExILKfly7SUvVY5DhhYLvfhKqhDFY0OzevWa/zwak0RLRfWS5AvfMWpd9gJvr5Yg== + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -6410,6 +7568,14 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" +source-map-support@^0.5.6: + version "0.5.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" + integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-support@~0.5.12: version "0.5.13" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" @@ -6528,6 +7694,11 @@ stable@^0.1.8: resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== +stack-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" + integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -6548,6 +7719,11 @@ stdout-stream@^1.4.0: dependencies: readable-stream "^2.0.1" +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + stream-browserify@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" @@ -6585,6 +7761,14 @@ strict-uri-encode@^1.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= + dependencies: + astral-regex "^1.0.0" + strip-ansi "^4.0.0" + string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -6669,6 +7853,11 @@ strip-bom@^2.0.0: dependencies: is-utf8 "^0.2.0" +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" @@ -6741,6 +7930,11 @@ svgo@^1.0.0: unquote "~1.1.1" util.promisify "~1.0.0" +symbol-tree@^3.2.2: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" @@ -6792,6 +7986,21 @@ terser@^4.1.2: source-map "~0.6.1" source-map-support "~0.5.12" +test-exclude@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" + integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g== + dependencies: + glob "^7.1.3" + minimatch "^3.0.4" + read-pkg-up "^4.0.0" + require-main-filename "^2.0.0" + +throat@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= + through2@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -6817,6 +8026,11 @@ timsort@^0.3.0: resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= + to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" @@ -6864,6 +8078,14 @@ toidentifier@1.0.0: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== +tough-cookie@^2.3.3, tough-cookie@^2.3.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + tough-cookie@~2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" @@ -6872,6 +8094,13 @@ tough-cookie@~2.4.3: psl "^1.1.24" punycode "^1.4.1" +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" @@ -6922,6 +8151,13 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -6940,6 +8176,14 @@ typescript@^3.6.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.4.tgz#b18752bb3792bc1a0281335f7f6ebf1bbfc5b91d" integrity sha512-unoCll1+l+YK4i4F8f22TaNVPRHcD9PA3yCuZ8g5e0qGqlVlJ/8FSateOLLSagn+Yg5+ZwuPkL8LFUc0Jcvksg== +uglify-js@^3.1.4: + version "3.6.7" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.7.tgz#15f49211df6b8a01ee91322bbe46fa33223175dc" + integrity sha512-4sXQDzmdnoXiO+xvmTzQsfIiwrjUCSA95rSP4SEd8tDb51W2TiDOlL76Hl+Kw0Ie42PSItCW8/t6pBNCF2R48A== + dependencies: + commander "~2.20.3" + source-map "~0.6.1" + unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" @@ -7058,7 +8302,7 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -util.promisify@~1.0.0: +util.promisify@^1.0.0, util.promisify@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== @@ -7127,6 +8371,20 @@ vm-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019" integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw== +w3c-hr-time@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" + integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= + dependencies: + browser-process-hrtime "^0.1.2" + +walker@^1.0.7, walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + dependencies: + makeerror "1.0.x" + watchpack@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" @@ -7143,6 +8401,11 @@ wbuf@^1.1.0, wbuf@^1.7.3: dependencies: minimalistic-assert "^1.0.0" +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + webpack-assets-manifest@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/webpack-assets-manifest/-/webpack-assets-manifest-3.1.1.tgz#39bbc3bf2ee57fcd8ba07cda51c9ba4a3c6ae1de" @@ -7184,7 +8447,7 @@ webpack-dev-middleware@^3.7.2: range-parser "^1.2.1" webpack-log "^2.0.0" -webpack-dev-server@^3.9.0: +webpack-dev-server@^3.1.14: version "3.9.0" resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.9.0.tgz#27c3b5d0f6b6677c4304465ac817623c8b27b89c" integrity sha512-E6uQ4kRrTX9URN9s/lIbqTAztwEPdvzVrcmHE8EQ9YnuT9J8Es5Wrd8n9BKg1a0oZ5EgEke/EQFgUsp18dSTBw== @@ -7282,6 +8545,36 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" @@ -7292,7 +8585,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@1, which@^1.2.14, which@^1.2.9, which@^1.3.1: +which@1, which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -7306,6 +8599,16 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + worker-farm@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" @@ -7335,6 +8638,22 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= +write-file-atomic@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" + integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +ws@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== + dependencies: + async-limiter "~1.0.0" + ws@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" @@ -7342,6 +8661,11 @@ ws@^6.2.1: dependencies: async-limiter "~1.0.0" +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -7375,7 +8699,7 @@ yargs-parser@^11.1.1: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^13.1.0: +yargs-parser@^13.1.0, yargs-parser@^13.1.1: version "13.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== @@ -7425,6 +8749,22 @@ yargs@13.2.4: y18n "^4.0.0" yargs-parser "^13.1.0" +yargs@^13.3.0: + version "13.3.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" + integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.1" + yargs@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" From 05cb96cdd3615a444a7b6d7ccd63bd5d1cea3fdc Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sat, 2 Nov 2019 22:23:41 -0500 Subject: [PATCH 017/103] run prettier on some new files --- app/javascript/app.js | 48 ++++++++++++++++++-------------------- app/javascript/makeData.js | 8 +++---- 2 files changed, 27 insertions(+), 29 deletions(-) diff --git a/app/javascript/app.js b/app/javascript/app.js index 0e4862ba..813d0f8a 100644 --- a/app/javascript/app.js +++ b/app/javascript/app.js @@ -1,8 +1,7 @@ -import React from 'react' -import { useTable } from 'react-table' - -import makeData from './makeData' +import React from "react" +import { useTable } from "react-table" +import makeData from "./makeData" function Table({ columns, data }) { // Use the state and functions returned from useTable to build your UI @@ -24,7 +23,7 @@ function Table({ columns, data }) { {headerGroups.map(headerGroup => ( {headerGroup.headers.map(column => ( - + ))} ))} @@ -35,7 +34,7 @@ function Table({ columns, data }) { prepareRow(row) || ( {row.cells.map(cell => { - return + return })} ) @@ -47,30 +46,29 @@ function Table({ columns, data }) { function App() { const columns = React.useMemo( - () => ['Title', - 'Choreographer', - 'Hook', - 'Formation', - 'User', - 'Entered', - 'Updated', - 'Sharing', - 'Figures', - ].map(x => { - return { - Header: x, - accessor: x.toLowerCase(), - }}), + () => + [ + "Title", + "Choreographer", + "Hook", + "Formation", + "User", + "Entered", + "Updated", + "Sharing", + "Figures", + ].map(x => { + return { + Header: x, + accessor: x.toLowerCase(), + } + }), [] ) const data = React.useMemo(() => makeData(20), []) - return ( - -
{column.render('Header')}{column.render("Header")}
{cell.render('Cell')}{cell.render("Cell")}
- - ) + return
} export default App diff --git a/app/javascript/makeData.js b/app/javascript/makeData.js index a10036d2..393545de 100644 --- a/app/javascript/makeData.js +++ b/app/javascript/makeData.js @@ -1,4 +1,4 @@ -import namor from 'namor' +import namor from "namor" const range = len => { const arr = [] @@ -14,12 +14,12 @@ const newDance = () => { title: namor.generate({ words: 1, numbers: 0 }), choreographer: namor.generate({ words: 2, numbers: 0 }), hook: namor.generate({ words: 3, numbers: 0 }), - formation: 'improper', + formation: "improper", user: namor.generate({ words: 2, numbers: 0 }), entered: namor.generate({ numbers: 1 }), updated: namor.generate({ numbers: 1 }), - sharing: 'everyone', - figures: 'whole dance', + sharing: "everyone", + figures: "whole dance", } } From fe3b88fad74f18b6e1c63abe88f30b514b24f9d1 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 3 Nov 2019 10:41:25 -0600 Subject: [PATCH 018/103] /api/v1/dances GET endpoint - first pass --- app/controllers/api/v1/dances_controller.rb | 5 +++ app/models/dance.rb | 16 +++++++ config/routes.rb | 5 +++ spec/models/dance_spec.rb | 44 +++++++------------ .../requests/api/v1/dances_controller_spec.rb | 18 ++++++++ 5 files changed, 61 insertions(+), 27 deletions(-) create mode 100644 app/controllers/api/v1/dances_controller.rb create mode 100644 spec/requests/api/v1/dances_controller_spec.rb diff --git a/app/controllers/api/v1/dances_controller.rb b/app/controllers/api/v1/dances_controller.rb new file mode 100644 index 00000000..b9c79f1e --- /dev/null +++ b/app/controllers/api/v1/dances_controller.rb @@ -0,0 +1,5 @@ +class Api::V1::DancesController < ApplicationController + def index + render json: Dance.all.limit(10).map(&:to_search_result) + end +end diff --git a/app/models/dance.rb b/app/models/dance.rb index bf61ce7f..970ea578 100644 --- a/app/models/dance.rb +++ b/app/models/dance.rb @@ -137,4 +137,20 @@ def set_text_to_dialect(dialect) # def fsnapshot(dir, tag) # File.open("#{dir}/#{id}-#{tag}.txt", 'w') {|f| f.write(to_s_dump)} # end + + def to_search_result + { + "id" => id, + "title" => title, + "choreographer_id" => choreographer_id, + "choreographer_name" => choreographer.name, + "formation" => start_type, + "hook" => hook, + "user_id" => user_id, + "user_name" => user.name, + "created_at" => created_at.as_json, + "updated_at" => updated_at.as_json, + "publish" => publish, + } + end end diff --git a/config/routes.rb b/config/routes.rb index 77a82cd0..4b623d22 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -73,4 +73,9 @@ # # (app/controllers/admin/products_controller.rb) # resources :products # end + namespace :api do + namespace :v1 do + resources :dances, only: [:index] + end + end end diff --git a/spec/models/dance_spec.rb b/spec/models/dance_spec.rb index 6a9e5ce5..e7388673 100644 --- a/spec/models/dance_spec.rb +++ b/spec/models/dance_spec.rb @@ -184,31 +184,21 @@ end end -# it "#to_s_dump" do -# choreographer = FactoryGirl.build(:choreographer, name: 'Bob') -# s = FactoryGirl.build(:dance, choreographer: choreographer).to_s_dump -# expected = <<-HEREDOC -# -# Nate Rockstraw -# The Rendevouz -# Bob -# improper -# notes: "" -# 0. neighbors balance & swing -# 1. long lines forward & back -# 2. ladles do si do 1½ -# 3. partners balance & swing -# 4. circle left 4 places -# 5. slide left along set to new neighbors -# 6. circle left 3 places -# published -# preamble: "a preamble appears here" -# hook: "pioneered slide progression" -# HEREDOC -# (0...(s.length/10)).each do |i| -# # if the strings aren't equal, this helpfully localizes it to be more specific than a 340 character string -# expect(s[i*10,10]).to eq(expected[i*10,10]) -# end -# expect(s.strip).to eq(expected.strip) -# end + it '#to_search_result' do + dance = FactoryGirl.create(:dance) + result = { + id: dance.id, + title: dance.title, + choreographer_id: dance.choreographer_id, + choreographer_name: dance.choreographer.name, + formation: dance.start_type, + hook: dance.hook, + user_id: dance.user_id, + user_name: dance.user.name, + created_at: dance.created_at.as_json, + updated_at: dance.updated_at.as_json, + publish: dance.publish, + }.stringify_keys + expect(dance.to_search_result).to eq(result) + end end diff --git a/spec/requests/api/v1/dances_controller_spec.rb b/spec/requests/api/v1/dances_controller_spec.rb new file mode 100644 index 00000000..adb9ff97 --- /dev/null +++ b/spec/requests/api/v1/dances_controller_spec.rb @@ -0,0 +1,18 @@ +require 'rails_helper' + +RSpec.describe Api::V1::DancesController do + describe "GET #index" do + it "returns json of all dances" do + dance = FactoryGirl.create(:call_me) + get api_v1_dances_path + expect(response).to have_http_status(200) + expect(JSON.parse(response.body)).to eq([dance.to_search_result]) + end + + it 'only performs one query' + + it 'understands index and offset' + + it 'takes other dance search parameters' + end +end From 681badffab79354804d19a707aed0b56a5216370 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 10 Nov 2019 11:09:10 -0600 Subject: [PATCH 019/103] remove obsolete typing information for react-table v6 --- package.json | 2 -- yarn.lock | 7 ------- 2 files changed, 9 deletions(-) diff --git a/package.json b/package.json index cac62773..52ffdf3a 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,6 @@ "typescript": "^3.6.4" }, "devDependencies": { - "@types/react-table": "^6.8.5", - "webpack-dev-server": "^3.9.0", "jest": "^24.8.0", "prettier": "1.18.2", "webpack-dev-server": "^3.1.14" diff --git a/yarn.lock b/yarn.lock index 2400053f..56eab2f5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1031,13 +1031,6 @@ dependencies: "@types/react" "*" -"@types/react-table@^6.8.5": - version "6.8.5" - resolved "https://registry.yarnpkg.com/@types/react-table/-/react-table-6.8.5.tgz#deb2bf2fcedcfb81e9020edbb7df0d8459ca348b" - integrity sha512-ueCsAadG1IwuuAZM+MWf2SoxbccSWweyQa9YG6xGN5cOVK3SayPOJW4MsUHGpY0V/Q+iZWgohpasliiao29O6g== - dependencies: - "@types/react" "*" - "@types/react@*", "@types/react@^16.9.11": version "16.9.11" resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.11.tgz#70e0b7ad79058a7842f25ccf2999807076ada120" From ed47477e3c6d08500da3d66050ffce1890d5085e Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 10 Nov 2019 14:33:40 -0600 Subject: [PATCH 020/103] Port to typescript. Remove old stuff. Temporarily turn off strict ts compile --- app/javascript/{app.js => app.tsx} | 24 ++++----- app/javascript/demo.tsx | 58 --------------------- app/javascript/{makeData.js => makeData.ts} | 2 +- app/javascript/packs/hello_react.tsx | 10 ++-- tsconfig.json | 2 +- 5 files changed, 19 insertions(+), 77 deletions(-) rename app/javascript/{app.js => app.tsx} (75%) delete mode 100644 app/javascript/demo.tsx rename app/javascript/{makeData.js => makeData.ts} (96%) diff --git a/app/javascript/app.js b/app/javascript/app.tsx similarity index 75% rename from app/javascript/app.js rename to app/javascript/app.tsx index 813d0f8a..dd771057 100644 --- a/app/javascript/app.js +++ b/app/javascript/app.tsx @@ -1,9 +1,9 @@ -import React from "react" +import * as React from "react" import { useTable } from "react-table" import makeData from "./makeData" -function Table({ columns, data }) { +function Table({ columns, data }: { columns: any; data: any }) { // Use the state and functions returned from useTable to build your UI const { getTableProps, @@ -29,16 +29,16 @@ function Table({ columns, data }) { ))} - {rows.map( - (row, i) => - prepareRow(row) || ( - - {row.cells.map(cell => { - return - })} - - ) - )} + {rows.map((row, i) => { + prepareRow(row) + return ( + + {row.cells.map(cell => { + return + })} + + ) + })}
{cell.render("Cell")}
{cell.render("Cell")}
) diff --git a/app/javascript/demo.tsx b/app/javascript/demo.tsx deleted file mode 100644 index 7f29a8e2..00000000 --- a/app/javascript/demo.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import { Component } from "react" -import * as React from "react" -import ReactTable from "react-table" -import "react-table/react-table.css" - -export class Demo extends Component { - render() { - const data = [ - { - name: "Tanner Linsley", - age: 26, - friend: { - name: "Jason Maurer", - age: 23, - }, - }, - { - name: "Arbor Warmber", - age: 22, - friend: { - name: "Jason Maurer", - age: 22, - }, - }, - { - name: "Commisioner Cordwood", - age: 26, - friend: { - name: "Bobby Berman", - age: 32, - }, - }, - ] - - const columns = [ - { - Header: "Name", - accessor: "name", // String-based value accessors! - }, - { - Header: "Age", - accessor: "age", - Cell: (props: {value: number}) => {props.value}, // Custom cell components! - }, - { - id: "friendName", // Required because our accessor is not a string - Header: "Friend Name", - accessor: (d: {friend: {name: string}}) => d.friend.name, // Custom value accessors! - }, - { - Header: (props: any) => Friend Age, // Custom header components! - accessor: "friend.age", - }, - ] - - return - } -} diff --git a/app/javascript/makeData.js b/app/javascript/makeData.ts similarity index 96% rename from app/javascript/makeData.js rename to app/javascript/makeData.ts index 393545de..c1706501 100644 --- a/app/javascript/makeData.js +++ b/app/javascript/makeData.ts @@ -1,4 +1,4 @@ -import namor from "namor" +import * as namor from "namor" const range = len => { const arr = [] diff --git a/app/javascript/packs/hello_react.tsx b/app/javascript/packs/hello_react.tsx index e118e782..baef11e8 100644 --- a/app/javascript/packs/hello_react.tsx +++ b/app/javascript/packs/hello_react.tsx @@ -1,14 +1,14 @@ ///////////////////////////////////////////////////////////////// -import React from 'react'; -import ReactDOM from 'react-dom'; +import * as React from "react" +import * as ReactDOM from "react-dom" // import './index.css'; -import App from '../app'; +import App from "../app" // import * as serviceWorker from './serviceWorker'; -const root = document.getElementById('root') +const root = document.getElementById("root") console.log("root = ", root) -ReactDOM.render(, root); +ReactDOM.render(, root) // If you want your app to work offline and load faster, you can change // unregister() to register() below. Note this comes with some pitfalls. diff --git a/tsconfig.json b/tsconfig.json index 4f30b682..278fc308 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,7 +7,7 @@ "module": "es6", "moduleResolution": "node", "sourceMap": true, - "strict": true, + "strict": false, "target": "es5", "jsx": "react" }, From 3b50b8fcce52fb90b4063aa4873c928891bcc848 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 10 Nov 2019 18:07:43 -0600 Subject: [PATCH 021/103] use dances endpoint in react-table --- app/javascript/app.tsx | 51 +++--- spec/features/welcome/search_spe_vue_old.rb | 193 ++++++++++++++++++++ spec/features/welcome/search_spec.rb | 192 +------------------ 3 files changed, 231 insertions(+), 205 deletions(-) create mode 100644 spec/features/welcome/search_spe_vue_old.rb diff --git a/app/javascript/app.tsx b/app/javascript/app.tsx index dd771057..ab5b60ae 100644 --- a/app/javascript/app.tsx +++ b/app/javascript/app.tsx @@ -1,4 +1,5 @@ import * as React from "react" +import { useState, useEffect, useMemo } from "react" import { useTable } from "react-table" import makeData from "./makeData" @@ -45,30 +46,38 @@ function Table({ columns, data }: { columns: any; data: any }) { } function App() { - const columns = React.useMemo( - () => - [ - "Title", - "Choreographer", - "Hook", - "Formation", - "User", - "Entered", - "Updated", - "Sharing", - "Figures", - ].map(x => { - return { - Header: x, - accessor: x.toLowerCase(), - } - }), + const [dances, setDances] = useState([]) + + useEffect(() => { + let used = true + async function fetchData() { + if (used) { + const r = await fetch("/api/v1/dances") + const json = await r.json() + setDances(json) + } + } + fetchData() + return () => { + used = false + } + }, []) + + const columns = useMemo( + () => [ + { Header: "Title", accessor: "title" }, + { Header: "Choreographer", accessor: "choreographer_name" }, + { Header: "Hook", accessor: "hook" }, + { Header: "Formation", accessor: "formation" }, + { Header: "User", accessor: "user_name" }, + { Header: "Entered", accessor: "created_at" }, + { Header: "Updated", accessor: "updated_at" }, + { Header: "Sharing", accessor: "publish" }, + ], [] ) - const data = React.useMemo(() => makeData(20), []) - - return + return
} export default App diff --git a/spec/features/welcome/search_spe_vue_old.rb b/spec/features/welcome/search_spe_vue_old.rb new file mode 100644 index 00000000..ab675039 --- /dev/null +++ b/spec/features/welcome/search_spe_vue_old.rb @@ -0,0 +1,193 @@ +# coding: utf-8 + +require 'rails_helper' + +describe 'Search page', js: true do + it 'exercise formation filter' do + visit '/s' + expect(page).to have_css('.figure-filter-op', count: 3) + all('.figure-filter-op')[1].select('formation') + select('proper') + expect(page).to have_text('state.lisp: [ "and", [ "formation", "proper" ], [ "progression" ] ]') + end + + describe 'casts' do + it "cast from 'and' to 'or'" do + visit '/s' + expect(page).to have_css('.figure-filter-op', count: 3) + first('.figure-filter-op').select('or') + expect(page).to have_text('state.lisp: [ "or", [ "figure", "*" ], [ "progression" ] ]') + end + + it "cast to 'not'" do + visit '/s' + expect(page).to have_css('.figure-filter-op', count: 3) + first('.figure-filter-op').select('not') + expect(page).to have_text('state.lisp: [ "not", [ "and", [ "figure", "*" ], [ "progression" ] ] ]') + expect(page).to have_css('.figure-filter-op', count: 4) + end + end + + describe 'deletion' do + it "works" do + visit '/s' + expect(page).to have_css('.figure-filter-op', count: 3) + all('.figure-filter-menu-hamburger')[-1].click + find('a.figure-filter-menu-delete').click + expect(page).to have_text('[ "and", [ "figure", "*" ] ]') + end + + it "menu item isn't visible for the root node" do + visit '/s' + expect(page).to have_css('.figure-filter-op', count: 3) + first('.figure-filter-menu-hamburger').click + expect(page).to_not have_css('.figure-filter-menu-delete') + end + + it "menu item isn't visible for a subexpression that's required" do + visit '/s' + expect(page).to have_css('.figure-filter-op', count: 3) + first('.figure-filter-op').select('not') + expect(page).to have_css('.figure-filter-op', count: 4) + expect(page).to have_text('state.lisp: [ "not", [ "and", [ "figure", "*" ], [ "progression" ] ] ]') + all('.figure-filter-menu-hamburger')[1].click + expect(page).to have_css('.figure-filter-menu') + expect(page).to_not have_css('.figure-filter-menu-delete') + end + end + + describe 'datatable' do + let (:dances) {[:dance, :box_the_gnat_contra, :call_me, :you_cant_get_there_from_here].map {|d| FactoryGirl.create(d)}} + + it 'works (and test formation filter)' do + dances + visit '/s' + dances.each {|dance| + expect(page).to have_link(dance.title, href: dance_path(dance)) + } + expect(page).to have_css('.figure-filter-op', count: 3) + all('.figure-filter-op')[1].select('formation') + select('Becket *') + dances.each do |dance| + to_or_to_not = dance.start_type.include?("Becket") ? :to : :to_not + expect(page).send(to_or_to_not, have_link(dance.title, href: dance_path(dance))) + end + end + + it 'count filter' do + dances + visit '/s' + first('.figure-filter-op').select('figure') + first('.figure-filter-op').select('number of') + select('≠') + select('7') + matches = 0 + dances.each do |dance| + not_seven = dance.figures.length != 7 + matches += 1 if not_seven + to_or_to_not = not_seven ? :to : :to_not + expect(page).send(to_or_to_not, have_link(dance.title, href: dance_path(dance))) + end + expect(matches).to eq(1) + end + + it 'tag and compare filters' do + verified = FactoryGirl.create(:tag, :verified) + broken = FactoryGirl.create(:tag, :please_review) + call_me = dances.find {|dance| dance.title == "Call Me"} + the_rendevouz = dances.find {|dance| dance.title == "The Rendevouz"} + 1.times { FactoryGirl.create(:dut, tag: verified, dance: call_me) } + 2.times { FactoryGirl.create(:dut, tag: broken, dance: the_rendevouz) } + visit '/s' + first('.figure-filter-op').select('compare') + find_all('.figure-filter-op', count: 3)[1].select('tag') + dances.each do |dance| + if dance.id == call_me.id + expect(page).to have_link(dance.title) + else + expect(page).to_not have_link(dance.title) + end + end + select '1' + dances.each do |dance| + expect(page).to_not have_link(dance.title) + end + select 'please review' + dances.each do |dance| + if dance.id == the_rendevouz.id + expect(page).to have_link(dance.title) + else + expect(page).to_not have_link(dance.title) + end + end + end + + it 'count-matches and compare filters' do + dances + visit '/s' + first('.figure-filter-op').select('compare') + find_all('.figure-filter-op', count: 3)[1].select('count matches') + select('≠') + select('7') + matches = 0 + dances.each do |dance| + not_seven = dance.figures.length != 7 + matches += 1 if not_seven + to_or_to_not = not_seven ? :to : :to_not + expect(page).send(to_or_to_not, have_link(dance.title, href: dance_path(dance))) + end + expect(matches).to eq(1) + end + + it '& filter' do + dances + visit '/s' + expect(page).to have_css('.figure-filter-op', count: 3) + first('.figure-filter-op').select('&') + select('chain') + expect(page).to have_text('state.lisp: [ "&", [ "figure", "chain" ], [ "progression" ] ]') + expect(page).to_not have_link('The Rendevouz') + expect(page).to_not have_link('Call Me') + expect(page).to_not have_link("You Can't Get There From Here") + expect(page).to have_link('Box the Gnat Contra') + end + + describe 'figure filter' do + it 'move works' do + dances + visit '/s' + select 'chain' + expect(page).to_not have_link('The Rendevouz') + expect(page).to have_link('Call Me') + expect(page).to have_link('Box the Gnat Contra') + expect(page).to_not have_link("You Can't Get There From Here") + end + + it 'parameters' do + dances + visit '/s' + select 'circle' + open_ellipsis + select('4 places') + + expect(page).to_not have_content('Box the Gnat Contra') # no circles + expect(page).to_not have_content('Call Me') # has circle left 3 places + expect(page).to have_content('The Rendevouz') # has circle left 3 & 4 places + expect(page).to_not have_content("You Can't Get There From Here") # circles 3 places + + select('do si do') + select('neighbors') + + expect(page).to have_content('[ "figure", "do si do", "neighbors", "*", "*", "*" ]') + expect(page).to_not have_content('The Rendevouz') + expect(page).to_not have_content('Box the Gnat Contra') + expect(page).to_not have_content('Call Me') + expect(page).to have_content("You Can't Get There From Here") + end + end + end + + def open_ellipsis + find('.toggle-off').click + end +end diff --git a/spec/features/welcome/search_spec.rb b/spec/features/welcome/search_spec.rb index ab675039..ea838882 100644 --- a/spec/features/welcome/search_spec.rb +++ b/spec/features/welcome/search_spec.rb @@ -3,191 +3,15 @@ require 'rails_helper' describe 'Search page', js: true do - it 'exercise formation filter' do - visit '/s' - expect(page).to have_css('.figure-filter-op', count: 3) - all('.figure-filter-op')[1].select('formation') - select('proper') - expect(page).to have_text('state.lisp: [ "and", [ "formation", "proper" ], [ "progression" ] ]') - end - - describe 'casts' do - it "cast from 'and' to 'or'" do - visit '/s' - expect(page).to have_css('.figure-filter-op', count: 3) - first('.figure-filter-op').select('or') - expect(page).to have_text('state.lisp: [ "or", [ "figure", "*" ], [ "progression" ] ]') - end - - it "cast to 'not'" do - visit '/s' - expect(page).to have_css('.figure-filter-op', count: 3) - first('.figure-filter-op').select('not') - expect(page).to have_text('state.lisp: [ "not", [ "and", [ "figure", "*" ], [ "progression" ] ] ]') - expect(page).to have_css('.figure-filter-op', count: 4) - end - end - - describe 'deletion' do - it "works" do - visit '/s' - expect(page).to have_css('.figure-filter-op', count: 3) - all('.figure-filter-menu-hamburger')[-1].click - find('a.figure-filter-menu-delete').click - expect(page).to have_text('[ "and", [ "figure", "*" ] ]') - end - - it "menu item isn't visible for the root node" do - visit '/s' - expect(page).to have_css('.figure-filter-op', count: 3) - first('.figure-filter-menu-hamburger').click - expect(page).to_not have_css('.figure-filter-menu-delete') - end - - it "menu item isn't visible for a subexpression that's required" do - visit '/s' - expect(page).to have_css('.figure-filter-op', count: 3) - first('.figure-filter-op').select('not') - expect(page).to have_css('.figure-filter-op', count: 4) - expect(page).to have_text('state.lisp: [ "not", [ "and", [ "figure", "*" ], [ "progression" ] ] ]') - all('.figure-filter-menu-hamburger')[1].click - expect(page).to have_css('.figure-filter-menu') - expect(page).to_not have_css('.figure-filter-menu-delete') - end - end - - describe 'datatable' do - let (:dances) {[:dance, :box_the_gnat_contra, :call_me, :you_cant_get_there_from_here].map {|d| FactoryGirl.create(d)}} - - it 'works (and test formation filter)' do - dances - visit '/s' - dances.each {|dance| - expect(page).to have_link(dance.title, href: dance_path(dance)) - } - expect(page).to have_css('.figure-filter-op', count: 3) - all('.figure-filter-op')[1].select('formation') - select('Becket *') - dances.each do |dance| - to_or_to_not = dance.start_type.include?("Becket") ? :to : :to_not - expect(page).send(to_or_to_not, have_link(dance.title, href: dance_path(dance))) - end - end - - it 'count filter' do - dances - visit '/s' - first('.figure-filter-op').select('figure') - first('.figure-filter-op').select('number of') - select('≠') - select('7') - matches = 0 - dances.each do |dance| - not_seven = dance.figures.length != 7 - matches += 1 if not_seven - to_or_to_not = not_seven ? :to : :to_not - expect(page).send(to_or_to_not, have_link(dance.title, href: dance_path(dance))) - end - expect(matches).to eq(1) - end - - it 'tag and compare filters' do - verified = FactoryGirl.create(:tag, :verified) - broken = FactoryGirl.create(:tag, :please_review) - call_me = dances.find {|dance| dance.title == "Call Me"} - the_rendevouz = dances.find {|dance| dance.title == "The Rendevouz"} - 1.times { FactoryGirl.create(:dut, tag: verified, dance: call_me) } - 2.times { FactoryGirl.create(:dut, tag: broken, dance: the_rendevouz) } - visit '/s' - first('.figure-filter-op').select('compare') - find_all('.figure-filter-op', count: 3)[1].select('tag') - dances.each do |dance| - if dance.id == call_me.id - expect(page).to have_link(dance.title) - else - expect(page).to_not have_link(dance.title) - end - end - select '1' - dances.each do |dance| - expect(page).to_not have_link(dance.title) - end - select 'please review' - dances.each do |dance| - if dance.id == the_rendevouz.id - expect(page).to have_link(dance.title) - else - expect(page).to_not have_link(dance.title) - end - end - end - - it 'count-matches and compare filters' do - dances - visit '/s' - first('.figure-filter-op').select('compare') - find_all('.figure-filter-op', count: 3)[1].select('count matches') - select('≠') - select('7') - matches = 0 - dances.each do |dance| - not_seven = dance.figures.length != 7 - matches += 1 if not_seven - to_or_to_not = not_seven ? :to : :to_not - expect(page).send(to_or_to_not, have_link(dance.title, href: dance_path(dance))) + it "works" do + dances = 12.times.map {|i| FactoryGirl.create(:dance, title: "Dance #{i}.")} + visit(s_path) + dances.each_with_index do |dance, i| + if i < 10 + expect(page).to have_text(dance.title) + else + expect(page).to_not have_text(dance.title) end - expect(matches).to eq(1) end - - it '& filter' do - dances - visit '/s' - expect(page).to have_css('.figure-filter-op', count: 3) - first('.figure-filter-op').select('&') - select('chain') - expect(page).to have_text('state.lisp: [ "&", [ "figure", "chain" ], [ "progression" ] ]') - expect(page).to_not have_link('The Rendevouz') - expect(page).to_not have_link('Call Me') - expect(page).to_not have_link("You Can't Get There From Here") - expect(page).to have_link('Box the Gnat Contra') - end - - describe 'figure filter' do - it 'move works' do - dances - visit '/s' - select 'chain' - expect(page).to_not have_link('The Rendevouz') - expect(page).to have_link('Call Me') - expect(page).to have_link('Box the Gnat Contra') - expect(page).to_not have_link("You Can't Get There From Here") - end - - it 'parameters' do - dances - visit '/s' - select 'circle' - open_ellipsis - select('4 places') - - expect(page).to_not have_content('Box the Gnat Contra') # no circles - expect(page).to_not have_content('Call Me') # has circle left 3 places - expect(page).to have_content('The Rendevouz') # has circle left 3 & 4 places - expect(page).to_not have_content("You Can't Get There From Here") # circles 3 places - - select('do si do') - select('neighbors') - - expect(page).to have_content('[ "figure", "do si do", "neighbors", "*", "*", "*" ]') - expect(page).to_not have_content('The Rendevouz') - expect(page).to_not have_content('Box the Gnat Contra') - expect(page).to_not have_content('Call Me') - expect(page).to have_content("You Can't Get There From Here") - end - end - end - - def open_ellipsis - find('.toggle-off').click end end From 2618947a9372b0f9e156152195dace812f559436 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Tue, 12 Nov 2019 07:59:52 -0600 Subject: [PATCH 022/103] hyperlink choreographer cells --- app/javascript/app.tsx | 34 +++++++++++++++++++++++++++- spec/features/welcome/search_spec.rb | 8 +++---- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/app/javascript/app.tsx b/app/javascript/app.tsx index ab5b60ae..d201c9dd 100644 --- a/app/javascript/app.tsx +++ b/app/javascript/app.tsx @@ -45,6 +45,34 @@ function Table({ columns, data }: { columns: any; data: any }) { ) } +interface DanceSearchResult { + id: number + title: string + choreographer_id: number + choreographer_name: string + formation: string + hook: string + user_id: number + user_name: string + created_at: string + updated_at: string + figures?: string +} + +// TODO: use rails route helpers +const choreographerPath = (cid: number) => { + return "/choreographers/" + cid +} + +const ChoreographerCell = props => { + const values: DanceSearchResult = props.row.original // shouldn't I be looking at props.row.values? It only has the accessor'd field in the column definition. + return ( + + {values.choreographer_name} + + ) +} + function App() { const [dances, setDances] = useState([]) @@ -66,7 +94,11 @@ function App() { const columns = useMemo( () => [ { Header: "Title", accessor: "title" }, - { Header: "Choreographer", accessor: "choreographer_name" }, + { + Header: "Choreographer", + accessor: "choreographer_name", + Cell: ChoreographerCell, + }, { Header: "Hook", accessor: "hook" }, { Header: "Formation", accessor: "formation" }, { Header: "User", accessor: "user_name" }, diff --git a/spec/features/welcome/search_spec.rb b/spec/features/welcome/search_spec.rb index ea838882..2825bf14 100644 --- a/spec/features/welcome/search_spec.rb +++ b/spec/features/welcome/search_spec.rb @@ -7,11 +7,9 @@ dances = 12.times.map {|i| FactoryGirl.create(:dance, title: "Dance #{i}.")} visit(s_path) dances.each_with_index do |dance, i| - if i < 10 - expect(page).to have_text(dance.title) - else - expect(page).to_not have_text(dance.title) - end + to_probably = i < 10 ? :to : :to_not + expect(page).send to_probably, have_text(dance.title) + expect(page).send to_probably, have_link(dance.choreographer.name, href: choreographer_path(dance.choreographer_id)) end end end From 0cd1a60c837ab19b8da50bfbf84399fc7dc2d4e1 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sat, 16 Nov 2019 12:51:28 -0600 Subject: [PATCH 023/103] remove old file. reenable strict ts compilation --- app/javascript/app.tsx | 4 +--- app/javascript/makeData.ts | 38 -------------------------------------- tsconfig.json | 2 +- 3 files changed, 2 insertions(+), 42 deletions(-) delete mode 100644 app/javascript/makeData.ts diff --git a/app/javascript/app.tsx b/app/javascript/app.tsx index d201c9dd..cd7875c0 100644 --- a/app/javascript/app.tsx +++ b/app/javascript/app.tsx @@ -2,8 +2,6 @@ import * as React from "react" import { useState, useEffect, useMemo } from "react" import { useTable } from "react-table" -import makeData from "./makeData" - function Table({ columns, data }: { columns: any; data: any }) { // Use the state and functions returned from useTable to build your UI const { @@ -64,7 +62,7 @@ const choreographerPath = (cid: number) => { return "/choreographers/" + cid } -const ChoreographerCell = props => { +const ChoreographerCell = (props: any) => { const values: DanceSearchResult = props.row.original // shouldn't I be looking at props.row.values? It only has the accessor'd field in the column definition. return ( diff --git a/app/javascript/makeData.ts b/app/javascript/makeData.ts deleted file mode 100644 index c1706501..00000000 --- a/app/javascript/makeData.ts +++ /dev/null @@ -1,38 +0,0 @@ -import * as namor from "namor" - -const range = len => { - const arr = [] - for (let i = 0; i < len; i++) { - arr.push(i) - } - return arr -} - -const newDance = () => { - const statusChance = Math.random() - return { - title: namor.generate({ words: 1, numbers: 0 }), - choreographer: namor.generate({ words: 2, numbers: 0 }), - hook: namor.generate({ words: 3, numbers: 0 }), - formation: "improper", - user: namor.generate({ words: 2, numbers: 0 }), - entered: namor.generate({ numbers: 1 }), - updated: namor.generate({ numbers: 1 }), - sharing: "everyone", - figures: "whole dance", - } -} - -export default function makeData(...lens) { - const makeDataLevel = (depth = 0) => { - const len = lens[depth] - return range(len).map(d => { - return { - ...newDance(), - subRows: lens[depth + 1] ? makeDataLevel(depth + 1) : undefined, - } - }) - } - - return makeDataLevel() -} diff --git a/tsconfig.json b/tsconfig.json index 278fc308..4f30b682 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,7 +7,7 @@ "module": "es6", "moduleResolution": "node", "sourceMap": true, - "strict": false, + "strict": true, "target": "es5", "jsx": "react" }, From e2b336be6dd1557b94999df975ea2372c9c35724 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sat, 16 Nov 2019 13:05:18 -0600 Subject: [PATCH 024/103] link dance title to dance --- app/javascript/app.tsx | 10 +++++++++- spec/features/welcome/search_spec.rb | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/javascript/app.tsx b/app/javascript/app.tsx index cd7875c0..d2d3f29c 100644 --- a/app/javascript/app.tsx +++ b/app/javascript/app.tsx @@ -61,6 +61,9 @@ interface DanceSearchResult { const choreographerPath = (cid: number) => { return "/choreographers/" + cid } +const dancePath = (dance_id: number) => { + return "/dances/" + dance_id +} const ChoreographerCell = (props: any) => { const values: DanceSearchResult = props.row.original // shouldn't I be looking at props.row.values? It only has the accessor'd field in the column definition. @@ -71,6 +74,11 @@ const ChoreographerCell = (props: any) => { ) } +const DanceTitleCell = (props: any) => { + const values: DanceSearchResult = props.row.original // shouldn't I be looking at props.row.values? It only has the accessor'd field in the column definition. + return {values.title} +} + function App() { const [dances, setDances] = useState([]) @@ -91,7 +99,7 @@ function App() { const columns = useMemo( () => [ - { Header: "Title", accessor: "title" }, + { Header: "Title", accessor: "title", Cell: DanceTitleCell }, { Header: "Choreographer", accessor: "choreographer_name", diff --git a/spec/features/welcome/search_spec.rb b/spec/features/welcome/search_spec.rb index 2825bf14..97e25a5a 100644 --- a/spec/features/welcome/search_spec.rb +++ b/spec/features/welcome/search_spec.rb @@ -8,7 +8,7 @@ visit(s_path) dances.each_with_index do |dance, i| to_probably = i < 10 ? :to : :to_not - expect(page).send to_probably, have_text(dance.title) + expect(page).send to_probably, have_link(dance.title, href: dance_path(dance)) expect(page).send to_probably, have_link(dance.choreographer.name, href: choreographer_path(dance.choreographer_id)) end end From 6c8be41e44f58cdc0489c157fd5e9ffa77a29490 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sat, 16 Nov 2019 13:11:30 -0600 Subject: [PATCH 025/103] css --- app/assets/stylesheets/application.scss | 2 +- app/javascript/app.tsx | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index e03797a3..34f2c0d3 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -54,7 +54,7 @@ body { background-color: $contra-bg; } -#dances-table, #dances-table-vue { +#dances-table, #dances-table-vue, .dances-table-react { background-color: white; } diff --git a/app/javascript/app.tsx b/app/javascript/app.tsx index d2d3f29c..eee090df 100644 --- a/app/javascript/app.tsx +++ b/app/javascript/app.tsx @@ -17,7 +17,10 @@ function Table({ columns, data }: { columns: any; data: any }) { // Render the UI for your table return ( -
+
{headerGroups.map(headerGroup => ( From aeb00bdf241631920d624a83d59bfe5f506d0ba9 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sat, 16 Nov 2019 14:37:11 -0600 Subject: [PATCH 026/103] css margins --- app/views/welcome/search.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/welcome/search.html.erb b/app/views/welcome/search.html.erb index 87f81245..36890a6e 100644 --- a/app/views/welcome/search.html.erb +++ b/app/views/welcome/search.html.erb @@ -1,7 +1,7 @@ <%= javascript_pack_tag 'hello_react', defer: true %> <%= stylesheet_pack_tag 'hello_react' %> -
+

Find Dances

From 722467a78a2272502b2f8e6847a6fe9535951e36 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sat, 16 Nov 2019 16:09:20 -0600 Subject: [PATCH 027/103] react-table typescript connection - install react-table-config.d.ts and comment out a bunch of it --- app/javascript/types/react-table-config.d.ts | 96 ++++++++++++++++++++ tsconfig.json | 2 +- 2 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 app/javascript/types/react-table-config.d.ts diff --git a/app/javascript/types/react-table-config.d.ts b/app/javascript/types/react-table-config.d.ts new file mode 100644 index 00000000..c1593f48 --- /dev/null +++ b/app/javascript/types/react-table-config.d.ts @@ -0,0 +1,96 @@ +// import { +// UseColumnOrderInstanceProps, +// UseColumnOrderState, +// UseExpandedInstanceProps, +// UseExpandedOptions, +// UseExpandedRowProps, +// UseExpandedState, +// UseFiltersColumnOptions, +// UseFiltersColumnProps, +// UseFiltersInstanceProps, +// UseFiltersOptions, +// UseFiltersState, +// UseGroupByCellProps, +// UseGroupByColumnOptions, +// UseGroupByColumnProps, +// UseGroupByInstanceProps, +// UseGroupByOptions, +// UseGroupByRowProps, +// UseGroupByState, +// UsePaginationInstanceProps, +// UsePaginationOptions, +// UsePaginationState, +// UseResizeColumnsColumnOptions, +// UseResizeColumnsHeaderProps, +// UseResizeColumnsOptions, +// UseRowSelectInstanceProps, +// UseRowSelectOptions, +// UseRowSelectRowProps, +// UseRowSelectState, +// UseRowStateCellProps, +// UseRowStateInstanceProps, +// UseRowStateRowProps, +// UseSortByColumnOptions, +// UseSortByColumnProps, +// UseSortByInstanceProps, +// UseSortByOptions, +// UseSortByState, +// UseTableCellProps, +// } from "react-table" +import {} from "react-table" + +declare module "react-table" { + // take this file as-is, or comment out the sections that don't apply to your plugin configuration + + export interface TableOptions // UseExpandedOptions, // UseFiltersOptions, // UseGroupByOptions, // UsePaginationOptions, + extends // UseRowSelectOptions, + // UseSortByOptions, + // UseFiltersOptions, + // UseResizeColumnsOptions, + // note that having Record here allows you to add anything to the options, this matches the spirit of the + // underlying js library, but might be cleaner if it's replaced by a more specific type that matches your + // feature set, this is a safe default. + Record {} + + export interface TableInstance {} + // UseColumnOrderInstanceProps, + // UseExpandedInstanceProps, + // UseFiltersInstanceProps, + // UseGroupByInstanceProps, + // UsePaginationInstanceProps, + // UseRowSelectInstanceProps, + // UseRowStateInstanceProps, + // UseSortByInstanceProps + + export interface TableState {} + // UseColumnOrderState, + // UseExpandedState, + // UseFiltersState, + // UseGroupByState, + // UsePaginationState, + // UseRowSelectState, + // UseSortByState {} + + export interface Column {} + // UseFiltersColumnOptions, + // UseGroupByColumnOptions, + // UseSortByColumnOptions, + // UseResizeColumnsColumnOptions {} + + export interface ColumnInstance {} + // UseFiltersColumnProps, + // UseGroupByColumnProps, + // UseSortByColumnProps, + // UseResizeColumnsHeaderProps {} + + export interface Cell {} + // UseTableCellProps, + // UseGroupByCellProps, + // UseRowStateCellProps {} + + export interface Row {} + // UseExpandedRowProps, + // UseGroupByRowProps, + // UseRowSelectRowProps, + // UseRowStateRowProps {} +} diff --git a/tsconfig.json b/tsconfig.json index 4f30b682..6ea97ab3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,7 +9,7 @@ "sourceMap": true, "strict": true, "target": "es5", - "jsx": "react" + "jsx": "react", }, "exclude": [ "**/*.spec.ts", From 9fa107bb8e130f9970e8e994d9185cdfd2940d0c Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sat, 16 Nov 2019 16:18:59 -0600 Subject: [PATCH 028/103] hide Entered/Updated/Sharing columns by default --- app/javascript/app.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/javascript/app.tsx b/app/javascript/app.tsx index eee090df..404fc4fd 100644 --- a/app/javascript/app.tsx +++ b/app/javascript/app.tsx @@ -111,9 +111,9 @@ function App() { { Header: "Hook", accessor: "hook" }, { Header: "Formation", accessor: "formation" }, { Header: "User", accessor: "user_name" }, - { Header: "Entered", accessor: "created_at" }, - { Header: "Updated", accessor: "updated_at" }, - { Header: "Sharing", accessor: "publish" }, + { Header: "Entered", accessor: "created_at", show: false }, + { Header: "Updated", accessor: "updated_at", show: false }, + { Header: "Sharing", accessor: "publish", show: false }, ], [] ) From 42fe5680655818eac2a70e3ce476eab41548839c Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sat, 16 Nov 2019 16:24:02 -0600 Subject: [PATCH 029/103] embed react-table in fragment --- app/javascript/app.tsx | 52 ++++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/app/javascript/app.tsx b/app/javascript/app.tsx index 404fc4fd..80308008 100644 --- a/app/javascript/app.tsx +++ b/app/javascript/app.tsx @@ -17,32 +17,34 @@ function Table({ columns, data }: { columns: any; data: any }) { // Render the UI for your table return ( -
- - {headerGroups.map(headerGroup => ( - - {headerGroup.headers.map(column => ( - - ))} - - ))} - - - {rows.map((row, i) => { - prepareRow(row) - return ( - - {row.cells.map(cell => { - return - })} + <> +
{column.render("Header")}
{cell.render("Cell")}
+ + {headerGroups.map(headerGroup => ( + + {headerGroup.headers.map(column => ( + + ))} - ) - })} - -
{column.render("Header")}
+ ))} + + + {rows.map((row, i) => { + prepareRow(row) + return ( + + {row.cells.map(cell => { + return {cell.render("Cell")} + })} + + ) + })} + + + ) } From 5380d92c5a980c6c9e4d4718442c6c0f9d9ffba4 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sat, 16 Nov 2019 16:29:08 -0600 Subject: [PATCH 030/103] rename component to 'DanceTable' from 'App' --- app/javascript/{app.tsx => dance-table.tsx} | 4 ++-- app/javascript/packs/hello_react.tsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) rename app/javascript/{app.tsx => dance-table.tsx} (98%) diff --git a/app/javascript/app.tsx b/app/javascript/dance-table.tsx similarity index 98% rename from app/javascript/app.tsx rename to app/javascript/dance-table.tsx index 80308008..6ee419ac 100644 --- a/app/javascript/app.tsx +++ b/app/javascript/dance-table.tsx @@ -84,7 +84,7 @@ const DanceTitleCell = (props: any) => { return {values.title} } -function App() { +function DanceTable() { const [dances, setDances] = useState([]) useEffect(() => { @@ -123,4 +123,4 @@ function App() { return } -export default App +export default DanceTable diff --git a/app/javascript/packs/hello_react.tsx b/app/javascript/packs/hello_react.tsx index baef11e8..5ae69d38 100644 --- a/app/javascript/packs/hello_react.tsx +++ b/app/javascript/packs/hello_react.tsx @@ -3,12 +3,12 @@ import * as React from "react" import * as ReactDOM from "react-dom" // import './index.css'; -import App from "../app" +import DanceTable from "../dance-table" // import * as serviceWorker from './serviceWorker'; const root = document.getElementById("root") console.log("root = ", root) -ReactDOM.render(, root) +ReactDOM.render(, root) // If you want your app to work offline and load faster, you can change // unregister() to register() below. Note this comes with some pitfalls. From b9d7c64824968e191b1cb19b398cc73c882c29ee Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 17 Nov 2019 09:20:50 -0600 Subject: [PATCH 031/103] proof-of-concept column hide/show for dance title --- app/javascript/dance-table.tsx | 72 ++++++++++++++++++++-------------- 1 file changed, 42 insertions(+), 30 deletions(-) diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index 6ee419ac..9890f3ed 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -17,34 +17,32 @@ function Table({ columns, data }: { columns: any; data: any }) { // Render the UI for your table return ( - <> -
- - {headerGroups.map(headerGroup => ( - - {headerGroup.headers.map(column => ( - - ))} +
{column.render("Header")}
+ + {headerGroups.map(headerGroup => ( + + {headerGroup.headers.map(column => ( + + ))} + + ))} + + + {rows.map((row, i) => { + prepareRow(row) + return ( + + {row.cells.map(cell => { + return + })} - ))} - - - {rows.map((row, i) => { - prepareRow(row) - return ( - - {row.cells.map(cell => { - return - })} - - ) - })} - -
{column.render("Header")}
{cell.render("Cell")}
{cell.render("Cell")}
- + ) + })} + + ) } @@ -86,13 +84,17 @@ const DanceTitleCell = (props: any) => { function DanceTable() { const [dances, setDances] = useState([]) + const [titleVisible, setTitleVisible] = useState(true) + const toggleTitleVisible = () => setTitleVisible(!titleVisible) + // download data from web api useEffect(() => { let used = true async function fetchData() { if (used) { const r = await fetch("/api/v1/dances") const json = await r.json() + console.log('fetch("/api/v1/dances")') setDances(json) } } @@ -104,7 +106,12 @@ function DanceTable() { const columns = useMemo( () => [ - { Header: "Title", accessor: "title", Cell: DanceTitleCell }, + { + Header: "Title", + accessor: "title", + Cell: DanceTitleCell, + show: () => titleVisible, + }, { Header: "Choreographer", accessor: "choreographer_name", @@ -117,10 +124,15 @@ function DanceTable() { { Header: "Updated", accessor: "updated_at", show: false }, { Header: "Sharing", accessor: "publish", show: false }, ], - [] + [titleVisible] ) - return + return ( + <> + +
+ + ) } export default DanceTable From 2d6097ecca7fb51fd7476de42ab976872d21d6bd Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 17 Nov 2019 21:54:06 -0600 Subject: [PATCH 032/103] wip column visible buttons change style of visbile-button (also on welcome-index) toggle columns on and off 1 test passes --- app/assets/stylesheets/welcome.scss | 3 +- app/javascript/dance-table.tsx | 67 ++++++++++++++++++---------- spec/features/welcome/search_spec.rb | 60 +++++++++++++++++++++++++ 3 files changed, 106 insertions(+), 24 deletions(-) diff --git a/app/assets/stylesheets/welcome.scss b/app/assets/stylesheets/welcome.scss index 9157a51a..059be4dd 100644 --- a/app/assets/stylesheets/welcome.scss +++ b/app/assets/stylesheets/welcome.scss @@ -136,11 +136,12 @@ select.chooser-argument { .toggle-vis-active { @extend .btn-default; + background-color: white !important; } .toggle-vis-inactive { - background-color: $contra-grey; @extend .btn-default; + background-color: $contra-grey; } // Position radios and checkboxes better diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index 9890f3ed..662284e9 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -84,8 +84,6 @@ const DanceTitleCell = (props: any) => { function DanceTable() { const [dances, setDances] = useState([]) - const [titleVisible, setTitleVisible] = useState(true) - const toggleTitleVisible = () => setTitleVisible(!titleVisible) // download data from web api useEffect(() => { @@ -104,32 +102,55 @@ function DanceTable() { } }, []) + const columnsArr = [ + { + Header: "Title", + accessor: "title", + Cell: DanceTitleCell, + // show: () => titleVisible, + }, + { + Header: "Choreographer", + accessor: "choreographer_name", + Cell: ChoreographerCell, + }, + { Header: "Hook", accessor: "hook" }, + { Header: "Formation", accessor: "formation" }, + { Header: "User", accessor: "user_name" }, + { Header: "Entered", accessor: "created_at" }, + { Header: "Updated", accessor: "updated_at", show: false }, + { Header: "Sharing", accessor: "publish", show: false }, + ] + const [visibleToggles, setVisibleToggles] = useState( + columnsArr.map(ca => ca.show || !ca.hasOwnProperty("show")) + ) + // const toggleTitleVisible = () => setTitleVisible(!titleVisible) const columns = useMemo( - () => [ - { - Header: "Title", - accessor: "title", - Cell: DanceTitleCell, - show: () => titleVisible, - }, - { - Header: "Choreographer", - accessor: "choreographer_name", - Cell: ChoreographerCell, - }, - { Header: "Hook", accessor: "hook" }, - { Header: "Formation", accessor: "formation" }, - { Header: "User", accessor: "user_name" }, - { Header: "Entered", accessor: "created_at", show: false }, - { Header: "Updated", accessor: "updated_at", show: false }, - { Header: "Sharing", accessor: "publish", show: false }, - ], - [titleVisible] + () => + columnsArr.map((ca, i) => { + return { ...ca, show: () => visibleToggles[i] } + }), + visibleToggles ) return ( <> - + {columnsArr.map((ca, i) => { + const toggleVisFn = () => + setVisibleToggles(visibleToggles.map((vis, j) => (i === j) !== vis)) + const toggleVisClass = visibleToggles[i] + ? "toggle-vis-active" + : "toggle-vis-inactive" + return ( + + ) + })}
) diff --git a/spec/features/welcome/search_spec.rb b/spec/features/welcome/search_spec.rb index 97e25a5a..e9f18781 100644 --- a/spec/features/welcome/search_spec.rb +++ b/spec/features/welcome/search_spec.rb @@ -12,4 +12,64 @@ expect(page).send to_probably, have_link(dance.choreographer.name, href: choreographer_path(dance.choreographer_id)) end end + describe 'columns' do + let (:dances) {[:dance, :box_the_gnat_contra, :call_me].map {|d| FactoryGirl.create(d)}} + it "Clicking vis toggles buttons cause columns to disappear" do + dances + visit(s_path) + %w[Title Choreographer Formation Hook User Entered].each do |col| + puts col + expect(page).to have_css('.dances-table-react th', text: col) + expect(page).to have_css('button.toggle-vis-active', text: col) + expect(page).to_not have_css('button.toggle-vis-inactive', text: col) + click_button col + expect(page).to_not have_css('.dances-table-react th', text: col) + expect(page).to have_css('button.toggle-vis-inactive', text: col) + expect(page).to_not have_css('button.toggle-vis-active', text: col) + click_button col + expect(page).to have_css('.dances-table-react th', text: col) + expect(page).to have_css('button.toggle-vis-active', text: col) + expect(page).to_not have_css('button.toggle-vis-inactive', text: col) + end + %w[Updated Sharing].each do |col| + expect(page).to_not have_css('.dances-table-react th', text: col) + expect(page).to_not have_css('button.toggle-vis-active', text: col) + expect(page).to have_css('button.toggle-vis-inactive', text: col) + click_button col + expect(page).to have_css('.dances-table-react th', text: col) + expect(page).to_not have_css('button.toggle-vis-inactive', text: col) + expect(page).to have_css('button.toggle-vis-active', text: col) + click_button col + expect(page).to_not have_css('.dances-table-react th', text: col) + expect(page).to have_css('button.toggle-vis-inactive', text: col) + expect(page).to_not have_css('button.toggle-vis-active', text: col) + end + end + + + it 'published column cells' do + with_login do |user| + dances.each_with_index do |dance, i| + publish = [:off, :link, :all][i] + publish_string = ['myself', 'link', 'everyone'][i] + dance.update!(publish: publish, user: user) + visit(s_path) + click_button 'Sharing' + expect(page).to have_css('tr', text: /#{dance.title}.*#{publish_string}/) + end + end + end + + it 'figures column' do + dances + visit(s_path) + expect(page).to_not have_content('whole dance') + click_button 'Figures' + expect(page).to have_content('whole dance', count: 3) + select('circle') + expect(page).to have_css('tr', text: /The Rendevouz.*circle left 4 places\ncircle left 3 places/) + expect(page).to have_css('tr', text: /Call Me.*circle left 3 places/) + end + end + end From dbc7b41a4530bea20b32f2dfe6fe03c3a5c76d32 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Mon, 18 Nov 2019 23:07:10 -0600 Subject: [PATCH 033/103] Figures column works, with noxious copypasta from DanceDatatable --- app/controllers/api/v1/dances_controller.rb | 43 +++- app/javascript/dance-table.tsx | 14 + app/models/dance.rb | 16 -- lib/filter_dances.rb | 267 ++++++++++++++++++++ spec/features/welcome/search_spec.rb | 34 ++- 5 files changed, 344 insertions(+), 30 deletions(-) create mode 100644 lib/filter_dances.rb diff --git a/app/controllers/api/v1/dances_controller.rb b/app/controllers/api/v1/dances_controller.rb index b9c79f1e..5c9f63cd 100644 --- a/app/controllers/api/v1/dances_controller.rb +++ b/app/controllers/api/v1/dances_controller.rb @@ -1,5 +1,46 @@ +require 'filter_dances' + class Api::V1::DancesController < ApplicationController def index - render json: Dance.all.limit(10).map(&:to_search_result) + json = FilterDances.filter_dances(Dance.all.limit(10), filter, dialect).map do |filter_result| + dance_to_search_result(filter_result.dance, + filter_result.matching_figures_html) + end + render json: json + end + + private + def filter + ['figure', '*'] + end + + def dance_to_search_result(dance, matching_figures_html) + { + "id" => dance.id, + "title" => dance.title, + "choreographer_id" => dance.choreographer_id, + "choreographer_name" => dance.choreographer.name, + "formation" => dance.start_type, + "hook" => dance.hook, + "user_id" => dance.user_id, + "user_name" => dance.user.name, + "created_at" => dance.created_at.as_json, + "updated_at" => dance.updated_at.as_json, + "publish" => dance_publish_cell(dance.publish), + "matching_figures_html" => matching_figures_html + } + end + + def dance_publish_cell(enum_value) + case enum_value.to_s + when 'all' + 'everyone' + when 'link' + 'link' + when 'off' + 'myself' + else + raise 'Fell through enum case statement' + end end end diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index 662284e9..97efceb4 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -82,6 +82,14 @@ const DanceTitleCell = (props: any) => { return {values.title} } +const MatchingFiguresHtmlCell = (props: any) => ( +
+) + function DanceTable() { const [dances, setDances] = useState([]) @@ -120,6 +128,12 @@ function DanceTable() { { Header: "Entered", accessor: "created_at" }, { Header: "Updated", accessor: "updated_at", show: false }, { Header: "Sharing", accessor: "publish", show: false }, + { + Header: "Figures", + accessor: "matching_figures_html", + show: false, + Cell: MatchingFiguresHtmlCell, + }, ] const [visibleToggles, setVisibleToggles] = useState( columnsArr.map(ca => ca.show || !ca.hasOwnProperty("show")) diff --git a/app/models/dance.rb b/app/models/dance.rb index 970ea578..bf61ce7f 100644 --- a/app/models/dance.rb +++ b/app/models/dance.rb @@ -137,20 +137,4 @@ def set_text_to_dialect(dialect) # def fsnapshot(dir, tag) # File.open("#{dir}/#{id}-#{tag}.txt", 'w') {|f| f.write(to_s_dump)} # end - - def to_search_result - { - "id" => id, - "title" => title, - "choreographer_id" => choreographer_id, - "choreographer_name" => choreographer.name, - "formation" => start_type, - "hook" => hook, - "user_id" => user_id, - "user_name" => user.name, - "created_at" => created_at.as_json, - "updated_at" => updated_at.as_json, - "publish" => publish, - } - end end diff --git a/lib/filter_dances.rb b/lib/filter_dances.rb new file mode 100644 index 00000000..273d22b8 --- /dev/null +++ b/lib/filter_dances.rb @@ -0,0 +1,267 @@ +# coding: utf-8 +require 'set' +require 'search_match' + +FilterResult = Struct.new(:dance, :matching_figures_html) + +module FilterDances + def self.filter_dances(dances, filter, dialect) + filter.is_a?(Array) or raise "filter must be an array, but got #{filter.inspect} of class #{filter.class}" + dances.reduce([]) do |acc, dance| + mf = matching_figures(filter, dance) + acc << FilterResult.new(dance, matching_figures_html(mf, dance, dialect)) + acc + end + end + + # TODO: render this client-side. Send JSON of matching figures + def self.matching_figures_html(matching_figures, dance, dialect) + matching_indicies = SearchMatch.flatten_set_to_index_a(matching_figures) + if matching_indicies.length === dance.figures.length + 'whole dance' + else + matching_indicies.map {|i| JSLibFigure.figure_to_html(dance.figures[i], dialect)}.join('
').html_safe + end + end + + # matching_figures and matching_figures_* functions return either nil (failure) or a set of SearchMatches + # + # The set may have zero elements, which means a successful match, but no specific index matches all criteria. + # To see an example of that, think of the dance (and (figure 'chain') (figure 'right left through')), which can + # match because it has a chain, and a right left through, but no figure satisfies both of those exactly. + + def self.matching_figures(filter, dance) + operator = filter.first + nm = case operator + when '&' + 'figurewise_and' + else + operator.gsub(' ', '_') + end + fn = :"matching_figures_for_#{nm}" + raise "#{operator.inspect} is not a valid operator in #{filter.inspect}" unless self.respond_to?(fn, true) + matches = send(fn, filter, dance) + # puts "matching_figures #{dance.title} #{filter.inspect} = #{matches.inspect}" + matches + end + + def self.matching_figures_for_figure(filter, dance) + filter_move = filter[1] + nfigures = dance.figures.length + if '*' == filter_move # wildcard + nfigures > 0 ? all_figures_match(nfigures) : nil + else + formals = JSLibFigure.is_move?(filter_move) ? JSLibFigure.formal_parameters(filter_move) : [] + search_matches = Set[] + dance.figures.each_with_index do |figure, figure_index| + actuals = JSLibFigure.parameter_values(figure) + filter_canonical = JSLibFigure.de_alias_move(filter_move) + filter_is_alias = filter_canonical != filter_move + param_filters = filter.drop(2) + param_filters = JSLibFigure.alias_filter(filter_move) if filter_is_alias && param_filters.empty? + it_matches = JSLibFigure.move(figure) == filter_canonical && + param_filters.each_with_index.all? {|param_filter, i| param_passes_filter?(formals[i], actuals[i], param_filter)} + search_matches << SearchMatch.new(figure_index, nfigures) if it_matches + end + search_matches.present? ? search_matches : nil + end + end + + def self.param_passes_filter?(formal_param, dance_param, param_filter) + if JSLibFigure.parameter_uses_chooser(formal_param, JSLibFigure.chooser('chooser_text')) + # substring search + keywords = param_filter.split(' ') + keywords.any? {|keyword| dance_param.include?(keyword)} + elsif JSLibFigure.parameter_uses_chooser(formal_param, JSLibFigure.chooser('chooser_half_or_full')) + param_filter == '*' || param_filter.to_f === dance_param.to_f + elsif JSLibFigure.formal_param_is_dancers(formal_param) + param_filter == '*' || JSLibFigure.dancers_category(dance_param) === param_filter + elsif param_filter == '*' || param_filter.to_s === dance_param.to_s + # DEFUALT CASE: asterisk always matches, or exact match + true + elsif JSLibFigure.parameter_uses_chooser(formal_param, JSLibFigure.chooser('chooser_hey_length')) + # some easy hey length cases - half/full exact match - are already handled above. + meet_times = JSLibFigure.hey_length_meet_times(dance_param) + if dance_param.in?(%w(half full)) + false + else + param_filter === 'less than half' && meet_times <= 1 or + param_filter === 'between half and full' && meet_times == 2 + end + else + false + end + end + + def self.matching_figures_for_formation(filter, dance) + filter_formation = filter[1] + if filter_formation == 'everything else' + FILTER_FORMATION_TO_RE.values.none? {|re| re =~ dance.start_type} ? Set[] : nil + else + filter_re = FILTER_FORMATION_TO_RE[filter_formation] + filter_re or raise "unrecognised formation filter #{filter_formation.inspect}" + filter_re =~ dance.start_type ? Set[] : nil + end + end + + FILTER_FORMATION_TO_RE = {'improper' => /improper/i, + 'Becket *' => /Becket/i, + 'Becket cw' => /Becket(?!.*ccw).*$/i, + 'Becket ccw' => /Becket ccw/i, + 'proper' => /^proper/i} + + def self.matching_figures_for_progression(filter, dance) + nfigures = dance.figures.length + s = Set[] + dance.figures.each_with_index {|f,i| s << SearchMatch.new(i, nfigures) if JSLibFigure.progression(f)} + s.present? ? s : nil + end + + def self.matching_figures_for_no(filter, dance) + subfilter = filter[1] + if matching_figures(subfilter, dance) + nil + else + all_figures_match(dance.figures.length) + end + end + + def self.matching_figures_for_all(filter, dance) + subfilter = filter[1] + matches = matching_figures(subfilter, dance) + if dance.figures.length == 0 + Set[] + elsif matches && dance.figures.length.times.all? {|i| matches.any? {|search_match| search_match.include?(i)}} + matches + else + nil + end + end + + def self.matching_figures_for_or(filter, dance) + subfilters = filter.drop(1) + matches = Set[] + subfilters.each do |subfilter| + matches |= matching_figures(subfilter, dance) || Set[] + end + matches.present? ? matches : nil + end + + def self.matching_figures_for_and(filter, dance) + subfilters = filter.drop(1) + if subfilters.empty? + Set[] # should arguably return the infinitely large set of all searchmatches instead + else + matches = subfilters.map {|subfilter| matching_figures(subfilter, dance) or return nil} + m = matches.first + matches.drop(1).each {|x| m &= x} # naive intersection, treating SearchMatch(1,8) as not intersecting with SearchMatch(1,8, count: 2) + m + end + end + + def self.matching_figures_for_figurewise_and(filter, dance) + a = matching_figures_for_and(filter, dance) + a.present? ? a : nil + end + + # figurewise_not + def self.matching_figures_for_not(filter, dance) + subfilter = filter[1] + matches = all_figures_match(dance.figures.length) - dice_search_matches(matching_figures(subfilter, dance) || Set[]) + matches.present? ? matches : nil + end + + def self.matching_figures_for_then(filter, dance) + going_concerns = all_empty_matches(dance.figures.length) + subfilters = filter.drop(1) + subfilters.each do |subfilter| + m = matching_figures(subfilter, dance) + m or return nil + new_concerns = Set[] + going_concerns.each do |search_match_head| + m.each do |search_match_tail| + new_concern = search_match_head.abut(search_match_tail) + new_concerns << new_concern if new_concern + end + end + going_concerns = new_concerns + return nil unless going_concerns.present? + end + going_concerns + end + + COMPARISON_STRING_TO_RUBY_OP = {'≥' => :'>=', + '≤' => :'<=', + '≠' => :'!=', + '=' => :'==', + '>' => :'>', + '<' => :'<'}.freeze + + def self.matching_figures_for_count(filter, dance) + _filter, subfilter, comparison_str, number_string = filter + m = matching_figures(subfilter, dance) + m_count = m.nil? ? 0 : m.length + comparison = COMPARISON_STRING_TO_RUBY_OP.fetch(comparison_str) + number = number_string.to_i + if m_count.public_send(comparison, number) # for example 'count >= 3' + m || Set[] + else + nil + end + end + + def self.matching_figures_for_compare(filter, dance) + _filter, left, comparison_str, right = filter + l = eval_numeric_ex(left, dance) + r = eval_numeric_ex(right, dance) + comparison = COMPARISON_STRING_TO_RUBY_OP.fetch(comparison_str) + l.public_send(comparison, r) ? Set[] : nil + end + + def self.eval_numeric_ex(nex, dance) + case nex.first + when 'constant' + Integer(nex.second) # Hm, is THIS the place to parse this string? + when 'tag' + tag_id = Tag.where(name: nex.second).pluck(:id).first + tag_id ? Dut.where(tag_id: tag_id, dance_id: dance.id).count : 0 + when 'count-matches' + subfilter = nex.second + matches = matching_figures(subfilter, dance) + matches ? matches.length : 0 + else + raise "I do not know how to evaluate #{nex.first} expressions." + end + end + + def self.all_empty_matches(nfigures) + Set.new(nfigures.times.map{|i| SearchMatch.new(i, nfigures, count: 0)}) + end + + def self.all_figures_match(nfigures) + Set.new(nfigures.times.map{|i| SearchMatch.new(i, nfigures)}) + end + + # given a set of search matches, return a set of new search matches with count: 1 search matches for every index anywhere in the set + def self.dice_search_matches(set) + Set.new( + set.map {|search_match| search_match.map {|i| SearchMatch.new(i, search_match.nfigures)}}.flatten) + end + + def self.hash_to_array(h) + h = h.to_h if h.instance_of?(ActionController::Parameters) + if !(h.instance_of?(Hash) || h.instance_of?(ActiveSupport::HashWithIndifferentAccess)) + h + elsif !h['faux_array'] + h + else + i = 0 + arr = [] + while h.key?(i.to_s) + arr << hash_to_array(h[i.to_s]) + i += 1 + end + arr + end + end +end diff --git a/spec/features/welcome/search_spec.rb b/spec/features/welcome/search_spec.rb index e9f18781..75ae1485 100644 --- a/spec/features/welcome/search_spec.rb +++ b/spec/features/welcome/search_spec.rb @@ -18,7 +18,6 @@ dances visit(s_path) %w[Title Choreographer Formation Hook User Entered].each do |col| - puts col expect(page).to have_css('.dances-table-react th', text: col) expect(page).to have_css('button.toggle-vis-active', text: col) expect(page).to_not have_css('button.toggle-vis-inactive', text: col) @@ -31,7 +30,7 @@ expect(page).to have_css('button.toggle-vis-active', text: col) expect(page).to_not have_css('button.toggle-vis-inactive', text: col) end - %w[Updated Sharing].each do |col| + %w[Updated Sharing Figures].each do |col| expect(page).to_not have_css('.dances-table-react th', text: col) expect(page).to_not have_css('button.toggle-vis-active', text: col) expect(page).to have_css('button.toggle-vis-inactive', text: col) @@ -46,7 +45,6 @@ end end - it 'published column cells' do with_login do |user| dances.each_with_index do |dance, i| @@ -60,16 +58,26 @@ end end - it 'figures column' do - dances - visit(s_path) - expect(page).to_not have_content('whole dance') - click_button 'Figures' - expect(page).to have_content('whole dance', count: 3) - select('circle') - expect(page).to have_css('tr', text: /The Rendevouz.*circle left 4 places\ncircle left 3 places/) - expect(page).to have_css('tr', text: /Call Me.*circle left 3 places/) + describe 'figures column' do + it 'whole dance' do + dances + visit(s_path) + expect(page).to_not have_css(:th, text: "Figures") + expect(page).to_not have_content('whole dance') + click_button 'Figures' + expect(page).to have_css(:th, text: "Figures") # js wait + expect(page).to have_content('whole dance', count: 3) + end + + it 'some matches prints figures' do + expect_any_instance_of(Api::V1::DancesController).to receive(:filter).and_return(['figure', 'circle']) + # mock + dances + visit(s_path) + click_button 'Figures' + expect(page).to have_css('tr', text: /The Rendevouz.*\n?circle left 4 places\ncircle left 3 places/) + expect(page).to have_css('tr', text: /Call Me.*\n?circle left 3 places/) + end end end - end From 8f067c6104767f96686b7414e4996369fe7c93db Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Tue, 19 Nov 2019 22:34:21 -0600 Subject: [PATCH 034/103] fix specs, refactor --- app/controllers/api/v1/dances_controller.rb | 35 +--------------- lib/filter_dances.rb | 40 ++++++++++++++++++- spec/lib/filter_dances_spec.rb | 24 +++++++++++ spec/models/dance_spec.rb | 18 --------- .../requests/api/v1/dances_controller_spec.rb | 14 ++++++- 5 files changed, 77 insertions(+), 54 deletions(-) create mode 100644 spec/lib/filter_dances_spec.rb diff --git a/app/controllers/api/v1/dances_controller.rb b/app/controllers/api/v1/dances_controller.rb index 5c9f63cd..d82fd5ec 100644 --- a/app/controllers/api/v1/dances_controller.rb +++ b/app/controllers/api/v1/dances_controller.rb @@ -2,10 +2,7 @@ class Api::V1::DancesController < ApplicationController def index - json = FilterDances.filter_dances(Dance.all.limit(10), filter, dialect).map do |filter_result| - dance_to_search_result(filter_result.dance, - filter_result.matching_figures_html) - end + json = FilterDances.filter_dances_to_json(10, filter, dialect) render json: json end @@ -13,34 +10,4 @@ def index def filter ['figure', '*'] end - - def dance_to_search_result(dance, matching_figures_html) - { - "id" => dance.id, - "title" => dance.title, - "choreographer_id" => dance.choreographer_id, - "choreographer_name" => dance.choreographer.name, - "formation" => dance.start_type, - "hook" => dance.hook, - "user_id" => dance.user_id, - "user_name" => dance.user.name, - "created_at" => dance.created_at.as_json, - "updated_at" => dance.updated_at.as_json, - "publish" => dance_publish_cell(dance.publish), - "matching_figures_html" => matching_figures_html - } - end - - def dance_publish_cell(enum_value) - case enum_value.to_s - when 'all' - 'everyone' - when 'link' - 'link' - when 'off' - 'myself' - else - raise 'Fell through enum case statement' - end - end end diff --git a/lib/filter_dances.rb b/lib/filter_dances.rb index 273d22b8..af2f4f6c 100644 --- a/lib/filter_dances.rb +++ b/lib/filter_dances.rb @@ -5,6 +5,14 @@ FilterResult = Struct.new(:dance, :matching_figures_html) module FilterDances + def self.filter_dances_to_json(count, filter, dialect) + arr = Dance.all.limit(count) + filter_dances(arr, filter, dialect).map do |filter_result| + filter_result_to_json(filter_result.dance, + filter_result.matching_figures_html) + end + end + def self.filter_dances(dances, filter, dialect) filter.is_a?(Array) or raise "filter must be an array, but got #{filter.inspect} of class #{filter.class}" dances.reduce([]) do |acc, dance| @@ -14,7 +22,6 @@ def self.filter_dances(dances, filter, dialect) end end - # TODO: render this client-side. Send JSON of matching figures def self.matching_figures_html(matching_figures, dance, dialect) matching_indicies = SearchMatch.flatten_set_to_index_a(matching_figures) if matching_indicies.length === dance.figures.length @@ -24,6 +31,37 @@ def self.matching_figures_html(matching_figures, dance, dialect) end end + def self.filter_result_to_json(dance, matching_figures_html) + { + "id" => dance.id, + "title" => dance.title, + "choreographer_id" => dance.choreographer_id, + "choreographer_name" => dance.choreographer.name, + "formation" => dance.start_type, + "hook" => dance.hook, + "user_id" => dance.user_id, + "user_name" => dance.user.name, + "created_at" => dance.created_at.as_json, + "updated_at" => dance.updated_at.as_json, + "publish" => dance_publish_cell(dance.publish), + # TODO: render this client-side. Send JSON of matching figures: + "matching_figures_html" => matching_figures_html + } + end + + def self.dance_publish_cell(enum_value) + case enum_value.to_s + when 'all' + 'everyone' + when 'link' + 'link' + when 'off' + 'myself' + else + raise 'Fell through enum case statement' + end + end + # matching_figures and matching_figures_* functions return either nil (failure) or a set of SearchMatches # # The set may have zero elements, which means a successful match, but no specific index matches all criteria. diff --git a/spec/lib/filter_dances_spec.rb b/spec/lib/filter_dances_spec.rb new file mode 100644 index 00000000..91bd1b2d --- /dev/null +++ b/spec/lib/filter_dances_spec.rb @@ -0,0 +1,24 @@ +require 'rails_helper' +require 'filter_dances' + + +describe FilterDances do + it 'filter_result_to_json' do + dance = FactoryGirl.build(:dance) + result = { + id: dance.id, + title: dance.title, + choreographer_id: dance.choreographer_id, + choreographer_name: dance.choreographer.name, + formation: dance.start_type, + hook: dance.hook, + user_id: dance.user_id, + user_name: dance.user.name, + created_at: dance.created_at.as_json, + updated_at: dance.updated_at.as_json, + publish: dance.publish == 'all' && 'everyone', + matching_figures_html: 'whole dance', + }.stringify_keys + expect(FilterDances.filter_result_to_json(dance, 'whole dance')).to eq(result) + end +end diff --git a/spec/models/dance_spec.rb b/spec/models/dance_spec.rb index e7388673..fd676855 100644 --- a/spec/models/dance_spec.rb +++ b/spec/models/dance_spec.rb @@ -183,22 +183,4 @@ expect(dut.dance.tags.to_a).to eq([dut.tag]) end end - - it '#to_search_result' do - dance = FactoryGirl.create(:dance) - result = { - id: dance.id, - title: dance.title, - choreographer_id: dance.choreographer_id, - choreographer_name: dance.choreographer.name, - formation: dance.start_type, - hook: dance.hook, - user_id: dance.user_id, - user_name: dance.user.name, - created_at: dance.created_at.as_json, - updated_at: dance.updated_at.as_json, - publish: dance.publish, - }.stringify_keys - expect(dance.to_search_result).to eq(result) - end end diff --git a/spec/requests/api/v1/dances_controller_spec.rb b/spec/requests/api/v1/dances_controller_spec.rb index adb9ff97..cd6425c4 100644 --- a/spec/requests/api/v1/dances_controller_spec.rb +++ b/spec/requests/api/v1/dances_controller_spec.rb @@ -4,9 +4,21 @@ describe "GET #index" do it "returns json of all dances" do dance = FactoryGirl.create(:call_me) + dance.reload get api_v1_dances_path expect(response).to have_http_status(200) - expect(JSON.parse(response.body)).to eq([dance.to_search_result]) + expect(JSON.parse(response.body)).to eq([{"id"=>dance.id, + "title"=>dance.title, + "choreographer_id"=>dance.choreographer_id, + "choreographer_name"=>dance.choreographer.name, + "formation" => dance.start_type, + "hook" => dance.hook, + "user_id" => dance.user_id, + "user_name" => dance.user.name, + "created_at"=>dance.created_at.as_json, + "updated_at"=>dance.updated_at.as_json, + "publish"=>"everyone", + "matching_figures_html"=>"whole dance"}]) end it 'only performs one query' From bea1e32b5193a4b67546dfbdac1bc253fec38ed5 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Wed, 20 Nov 2019 08:00:58 -0600 Subject: [PATCH 035/103] ruby performance optimization for querying dances --- lib/filter_dances.rb | 30 ++++++++++++++++++++++----- spec/lib/filter_dances_spec.rb | 37 ++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 5 deletions(-) diff --git a/lib/filter_dances.rb b/lib/filter_dances.rb index af2f4f6c..f0c667e4 100644 --- a/lib/filter_dances.rb +++ b/lib/filter_dances.rb @@ -6,20 +6,40 @@ module FilterDances def self.filter_dances_to_json(count, filter, dialect) - arr = Dance.all.limit(count) - filter_dances(arr, filter, dialect).map do |filter_result| + filter_dances(count, filter, dialect).map do |filter_result| filter_result_to_json(filter_result.dance, filter_result.matching_figures_html) end end - def self.filter_dances(dances, filter, dialect) + # into is destructively appended! + def self.filter_dances(desired_match_count, filter, dialect, offset: 0, into: []) filter.is_a?(Array) or raise "filter must be an array, but got #{filter.inspect} of class #{filter.class}" - dances.reduce([]) do |acc, dance| + query = Dance.all.offset(offset) + if desired_match_count.finite? + query_size = (2 * desired_match_count / estimated_matchiness(filter)).ceil + query = query.limit(query_size) + end + query.reduce(into) do |acc, dance| + return acc if acc.length >= desired_match_count mf = matching_figures(filter, dance) - acc << FilterResult.new(dance, matching_figures_html(mf, dance, dialect)) + acc << FilterResult.new(dance, matching_figures_html(mf, dance, dialect)) if mf acc end + if into.length >= desired_match_count || desired_match_count.infinite? + into + else + query_size.is_a?(Integer) or raise "This should not happen" + filter_dances(Float::INFINITY, filter, dialect, offset: query_size, into: into) + end + end + + def self.estimated_matchiness(filter) + if filter == ['figure', '*'] # a very common and very matchy filter + 1.0 + else + 0.1 + end end def self.matching_figures_html(matching_figures, dance, dialect) diff --git a/spec/lib/filter_dances_spec.rb b/spec/lib/filter_dances_spec.rb index 91bd1b2d..e2d52e67 100644 --- a/spec/lib/filter_dances_spec.rb +++ b/spec/lib/filter_dances_spec.rb @@ -3,6 +3,43 @@ describe FilterDances do + # describe 'filter_dances_to_json' do + + describe "filter_dances" do + it 'works with a matchy filter and plenty of dances' do + dances = 20.times.map { FactoryGirl.create(:dance) } + filter_results = FilterDances.filter_dances(10, ['figure', '*'], JSLibFigure.default_dialect) + expect(filter_results.length).to eq(10) + filter_results.each_with_index do |filter_result, i| + dance = dances[i] + expect(filter_result.dance.id).to eq(dance.id) + end + end + + it 'works with an unexpectedly unmatchy filter and not enough dances' do + dance1 = FactoryGirl.create(:dance) + 30.times.each { FactoryGirl.create(:dance_with_zero_figures) } + dance2 = FactoryGirl.create(:dance) + dances = [dance1, dance2] + filter_results = FilterDances.filter_dances(10, ['figure', '*'], JSLibFigure.default_dialect) + expect(filter_results.length).to eq(2) + filter_results.each_with_index do |filter_result, i| + dance = dances[i] + expect(filter_result.dance.id).to eq(dance.id) + end + end + + it 'works with an unexpectedly matchy filter' do + dances = 30.times.map { FactoryGirl.create(:dance_with_a_swing) } + filter_results = FilterDances.filter_dances(10, ['figure', 'swing'], JSLibFigure.default_dialect) + expect(filter_results.length).to eq(10) + filter_results.each_with_index do |filter_result, i| + dance = dances[i] + expect(filter_result.dance.id).to eq(dance.id) + end + end + end + it 'filter_result_to_json' do dance = FactoryGirl.build(:dance) result = { From d36dc85952fb4ae10f3e887616bb9bc13b396c12 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Wed, 20 Nov 2019 20:02:17 -0600 Subject: [PATCH 036/103] styles for column visibility toggles --- app/javascript/dance-table.tsx | 39 ++++++++++++++++++++-------------- spec/lib/filter_dances_spec.rb | 2 -- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index 97efceb4..7ed09876 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -149,22 +149,29 @@ function DanceTable() { return ( <> - {columnsArr.map((ca, i) => { - const toggleVisFn = () => - setVisibleToggles(visibleToggles.map((vis, j) => (i === j) !== vis)) - const toggleVisClass = visibleToggles[i] - ? "toggle-vis-active" - : "toggle-vis-inactive" - return ( - - ) - })} +
+ +
+ {columnsArr.map((ca, i) => { + const toggleVisFn = () => + setVisibleToggles( + visibleToggles.map((vis, j) => (i === j) !== vis) + ) + const toggleVisClass = visibleToggles[i] + ? "toggle-vis-active" + : "toggle-vis-inactive" + return ( + + ) + })} +
+
) diff --git a/spec/lib/filter_dances_spec.rb b/spec/lib/filter_dances_spec.rb index e2d52e67..5e892c9c 100644 --- a/spec/lib/filter_dances_spec.rb +++ b/spec/lib/filter_dances_spec.rb @@ -3,8 +3,6 @@ describe FilterDances do - # describe 'filter_dances_to_json' do - describe "filter_dances" do it 'works with a matchy filter and plenty of dances' do dances = 20.times.map { FactoryGirl.create(:dance) } From 5ab802930aa04133f48efd9cde47bb829adcab5e Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Thu, 21 Nov 2019 07:35:02 -0600 Subject: [PATCH 037/103] add broken spec to show db size --- spec/features/welcome/search_spec.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/spec/features/welcome/search_spec.rb b/spec/features/welcome/search_spec.rb index 75ae1485..944a94ee 100644 --- a/spec/features/welcome/search_spec.rb +++ b/spec/features/welcome/search_spec.rb @@ -80,4 +80,11 @@ end end end + + it "entries count displays how many search results match" do + dbsize = 12 + dbsize.times.map {FactoryGirl.create(:dance)} + visit(s_path) + expect(page).to have_content("Showing 1 to 10 of #{dbsize} entries") + end end From cafd6db316d80dbaf9ee9f99abd9dfd35da529fc Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Thu, 21 Nov 2019 07:35:21 -0600 Subject: [PATCH 038/103] reindent --- app/javascript/dance-table.tsx | 52 ++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index 7ed09876..5b7153cd 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -17,32 +17,34 @@ function Table({ columns, data }: { columns: any; data: any }) { // Render the UI for your table return ( -
- - {headerGroups.map(headerGroup => ( - - {headerGroup.headers.map(column => ( - - ))} - - ))} - - - {rows.map((row, i) => { - prepareRow(row) - return ( - - {row.cells.map(cell => { - return - })} + <> +
{column.render("Header")}
{cell.render("Cell")}
+ + {headerGroups.map(headerGroup => ( + + {headerGroup.headers.map(column => ( + + ))} - ) - })} - -
{column.render("Header")}
+ ))} + + + {rows.map((row, i) => { + prepareRow(row) + return ( + + {row.cells.map(cell => { + return {cell.render("Cell")} + })} + + ) + })} + + + ) } From 540a7718e071df563a957cda694289b5db677c66 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Thu, 21 Nov 2019 22:12:22 -0600 Subject: [PATCH 039/103] optimize active record dance query --- lib/filter_dances.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/filter_dances.rb b/lib/filter_dances.rb index f0c667e4..cbb47d6f 100644 --- a/lib/filter_dances.rb +++ b/lib/filter_dances.rb @@ -15,7 +15,7 @@ def self.filter_dances_to_json(count, filter, dialect) # into is destructively appended! def self.filter_dances(desired_match_count, filter, dialect, offset: 0, into: []) filter.is_a?(Array) or raise "filter must be an array, but got #{filter.inspect} of class #{filter.class}" - query = Dance.all.offset(offset) + query = Dance.includes(:choreographer, :user).references(:choreographer, :user).offset(offset) if desired_match_count.finite? query_size = (2 * desired_match_count / estimated_matchiness(filter)).ceil query = query.limit(query_size) From 65ee8b0733c8796f28d4f8c76d7636619cd997e6 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sat, 23 Nov 2019 09:21:31 -0600 Subject: [PATCH 040/103] list dances in most-recently-created-first order --- lib/filter_dances.rb | 2 +- spec/features/welcome/search_spec.rb | 3 ++- spec/lib/filter_dances_spec.rb | 27 +++++++++++++++++++++++---- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/lib/filter_dances.rb b/lib/filter_dances.rb index cbb47d6f..1ebd582e 100644 --- a/lib/filter_dances.rb +++ b/lib/filter_dances.rb @@ -15,7 +15,7 @@ def self.filter_dances_to_json(count, filter, dialect) # into is destructively appended! def self.filter_dances(desired_match_count, filter, dialect, offset: 0, into: []) filter.is_a?(Array) or raise "filter must be an array, but got #{filter.inspect} of class #{filter.class}" - query = Dance.includes(:choreographer, :user).references(:choreographer, :user).offset(offset) + query = Dance.includes(:choreographer, :user).references(:choreographer, :user).order('dances.created_at DESC').offset(offset) if desired_match_count.finite? query_size = (2 * desired_match_count / estimated_matchiness(filter)).ceil query = query.limit(query_size) diff --git a/spec/features/welcome/search_spec.rb b/spec/features/welcome/search_spec.rb index 944a94ee..ce0dfd11 100644 --- a/spec/features/welcome/search_spec.rb +++ b/spec/features/welcome/search_spec.rb @@ -3,8 +3,9 @@ require 'rails_helper' describe 'Search page', js: true do + let (:now) { DateTime.now } it "works" do - dances = 12.times.map {|i| FactoryGirl.create(:dance, title: "Dance #{i}.")} + dances = 12.times.map {|i| FactoryGirl.create(:dance, title: "Dance #{i}.", created_at: now - i.hours)} visit(s_path) dances.each_with_index do |dance, i| to_probably = i < 10 ? :to : :to_not diff --git a/spec/lib/filter_dances_spec.rb b/spec/lib/filter_dances_spec.rb index 5e892c9c..342ff8ec 100644 --- a/spec/lib/filter_dances_spec.rb +++ b/spec/lib/filter_dances_spec.rb @@ -4,8 +4,9 @@ describe FilterDances do describe "filter_dances" do + let (:now) { DateTime.now } it 'works with a matchy filter and plenty of dances' do - dances = 20.times.map { FactoryGirl.create(:dance) } + dances = 20.times.map {|i| FactoryGirl.create(:dance, created_at: now - i.hours) } filter_results = FilterDances.filter_dances(10, ['figure', '*'], JSLibFigure.default_dialect) expect(filter_results.length).to eq(10) filter_results.each_with_index do |filter_result, i| @@ -16,8 +17,8 @@ it 'works with an unexpectedly unmatchy filter and not enough dances' do dance1 = FactoryGirl.create(:dance) - 30.times.each { FactoryGirl.create(:dance_with_zero_figures) } - dance2 = FactoryGirl.create(:dance) + 30.times.each {|i| FactoryGirl.create(:dance_with_zero_figures, created_at: now - i.hours) } + dance2 = FactoryGirl.create(:dance, created_at: now - 100.hours) dances = [dance1, dance2] filter_results = FilterDances.filter_dances(10, ['figure', '*'], JSLibFigure.default_dialect) expect(filter_results.length).to eq(2) @@ -28,7 +29,10 @@ end it 'works with an unexpectedly matchy filter' do - dances = 30.times.map { FactoryGirl.create(:dance_with_a_swing) } + dances = 30.times.map do |i| + t = now - i.hours + FactoryGirl.create(:dance_with_a_swing, created_at: t, updated_at: t) + end filter_results = FilterDances.filter_dances(10, ['figure', 'swing'], JSLibFigure.default_dialect) expect(filter_results.length).to eq(10) filter_results.each_with_index do |filter_result, i| @@ -36,6 +40,21 @@ expect(filter_result.dance.id).to eq(dance.id) end end + + it 'returns dances in most-recently-created order' do + random = Random.new(1000) # repeatable seed. + dances = 10.times.map do |i| + t = now - random.rand(100).hours + FactoryGirl.create(:dance, created_at: t) + end + filter_results = FilterDances.filter_dances(10, ['figure', '*'], JSLibFigure.default_dialect) + dances_sorted = dances.sort_by(&:created_at).reverse + filter_results.each_with_index do |filter_result, i| + dance = dances_sorted[i] + expect(filter_result.dance.id).to eq(dance.id) + end + + end end it 'filter_result_to_json' do From 8f355f4196a82c970930a935797bf87906bb5863 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sat, 23 Nov 2019 11:15:58 -0600 Subject: [PATCH 041/103] api/v1/dances returns a hash with numberSearched and numberMatched info, as well as match info on specific dances --- app/controllers/api/v1/dances_controller.rb | 3 +- app/javascript/dance-table.tsx | 22 ++++++-- lib/filter_dances.rb | 51 +++++++------------ spec/features/welcome/search_spec.rb | 2 +- spec/lib/filter_dances_spec.rb | 21 ++++---- .../requests/api/v1/dances_controller_spec.rb | 29 ++++++----- 6 files changed, 68 insertions(+), 60 deletions(-) diff --git a/app/controllers/api/v1/dances_controller.rb b/app/controllers/api/v1/dances_controller.rb index d82fd5ec..0fa3dbc0 100644 --- a/app/controllers/api/v1/dances_controller.rb +++ b/app/controllers/api/v1/dances_controller.rb @@ -2,8 +2,7 @@ class Api::V1::DancesController < ApplicationController def index - json = FilterDances.filter_dances_to_json(10, filter, dialect) - render json: json + render json: FilterDances.filter_dances(filter, count: 10, offset: 0, dialect: dialect) end private diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index 5b7153cd..ec7df8f1 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -62,6 +62,12 @@ interface DanceSearchResult { figures?: string } +interface DancesGetJson { + numberSearched: number + numberMatching: number + dances: Array +} + // TODO: use rails route helpers const choreographerPath = (cid: number) => { return "/choreographers/" + cid @@ -93,7 +99,17 @@ const MatchingFiguresHtmlCell = (props: any) => ( ) function DanceTable() { - const [dances, setDances] = useState([]) + const nullDances: DanceSearchResult[] = [] + const [dancesGetJson, setDancesGetJson] = useState({ + dances: nullDances, + numberSearched: 0, + numberMatching: 0, + }) + const { + dances, + numberSearched, + numberMatching, + }: DancesGetJson = dancesGetJson // download data from web api useEffect(() => { @@ -101,9 +117,9 @@ function DanceTable() { async function fetchData() { if (used) { const r = await fetch("/api/v1/dances") - const json = await r.json() + const json: DancesGetJson = await r.json() console.log('fetch("/api/v1/dances")') - setDances(json) + setDancesGetJson(json) } } fetchData() diff --git a/lib/filter_dances.rb b/lib/filter_dances.rb index 1ebd582e..9fc125dc 100644 --- a/lib/filter_dances.rb +++ b/lib/filter_dances.rb @@ -2,44 +2,29 @@ require 'set' require 'search_match' -FilterResult = Struct.new(:dance, :matching_figures_html) - module FilterDances - def self.filter_dances_to_json(count, filter, dialect) - filter_dances(count, filter, dialect).map do |filter_result| - filter_result_to_json(filter_result.dance, - filter_result.matching_figures_html) - end - end - # into is destructively appended! - def self.filter_dances(desired_match_count, filter, dialect, offset: 0, into: []) + def self.filter_dances(filter, dialect:, count: 10, offset: 0) filter.is_a?(Array) or raise "filter must be an array, but got #{filter.inspect} of class #{filter.class}" - query = Dance.includes(:choreographer, :user).references(:choreographer, :user).order('dances.created_at DESC').offset(offset) - if desired_match_count.finite? - query_size = (2 * desired_match_count / estimated_matchiness(filter)).ceil - query = query.limit(query_size) - end - query.reduce(into) do |acc, dance| - return acc if acc.length >= desired_match_count + query = Dance.includes(:choreographer, :user).references(:choreographer, :user).order('dances.created_at DESC') + number_searched = 0 + number_matching = 0 + filter_results = [] + query.map do |dance| + number_searched += 1 mf = matching_figures(filter, dance) - acc << FilterResult.new(dance, matching_figures_html(mf, dance, dialect)) if mf - acc - end - if into.length >= desired_match_count || desired_match_count.infinite? - into - else - query_size.is_a?(Integer) or raise "This should not happen" - filter_dances(Float::INFINITY, filter, dialect, offset: query_size, into: into) - end - end - - def self.estimated_matchiness(filter) - if filter == ['figure', '*'] # a very common and very matchy filter - 1.0 - else - 0.1 + if mf + number_matching += 1 + send_this_dance = offset < number_matching && number_matching <= offset + count + dance_json = filter_result_to_json(dance, matching_figures_html(mf, dance, dialect)) + filter_results << dance_json if send_this_dance + end end + { + numberSearched: number_searched, + numberMatching: number_matching, + dances: filter_results + } end def self.matching_figures_html(matching_figures, dance, dialect) diff --git a/spec/features/welcome/search_spec.rb b/spec/features/welcome/search_spec.rb index ce0dfd11..7f7cd865 100644 --- a/spec/features/welcome/search_spec.rb +++ b/spec/features/welcome/search_spec.rb @@ -84,7 +84,7 @@ it "entries count displays how many search results match" do dbsize = 12 - dbsize.times.map {FactoryGirl.create(:dance)} + dbsize.times.map {|i| FactoryGirl.create(:dance, created_at: now - i.hours)} visit(s_path) expect(page).to have_content("Showing 1 to 10 of #{dbsize} entries") end diff --git a/spec/lib/filter_dances_spec.rb b/spec/lib/filter_dances_spec.rb index 342ff8ec..64a165ef 100644 --- a/spec/lib/filter_dances_spec.rb +++ b/spec/lib/filter_dances_spec.rb @@ -5,13 +5,14 @@ describe FilterDances do describe "filter_dances" do let (:now) { DateTime.now } + let (:dialect) { JSLibFigure.default_dialect } it 'works with a matchy filter and plenty of dances' do dances = 20.times.map {|i| FactoryGirl.create(:dance, created_at: now - i.hours) } - filter_results = FilterDances.filter_dances(10, ['figure', '*'], JSLibFigure.default_dialect) + filter_results = FilterDances.filter_dances(['figure', '*'], count: 10, dialect: dialect)[:dances] expect(filter_results.length).to eq(10) filter_results.each_with_index do |filter_result, i| dance = dances[i] - expect(filter_result.dance.id).to eq(dance.id) + expect(filter_result['id']).to eq(dance.id) end end @@ -20,11 +21,11 @@ 30.times.each {|i| FactoryGirl.create(:dance_with_zero_figures, created_at: now - i.hours) } dance2 = FactoryGirl.create(:dance, created_at: now - 100.hours) dances = [dance1, dance2] - filter_results = FilterDances.filter_dances(10, ['figure', '*'], JSLibFigure.default_dialect) + filter_results = FilterDances.filter_dances(['figure', '*'], count: 10, dialect: dialect)[:dances] expect(filter_results.length).to eq(2) filter_results.each_with_index do |filter_result, i| dance = dances[i] - expect(filter_result.dance.id).to eq(dance.id) + expect(filter_result['id']).to eq(dance.id) end end @@ -33,11 +34,11 @@ t = now - i.hours FactoryGirl.create(:dance_with_a_swing, created_at: t, updated_at: t) end - filter_results = FilterDances.filter_dances(10, ['figure', 'swing'], JSLibFigure.default_dialect) + filter_results = FilterDances.filter_dances(['figure', 'swing'], count: 10, dialect: dialect)[:dances] expect(filter_results.length).to eq(10) filter_results.each_with_index do |filter_result, i| dance = dances[i] - expect(filter_result.dance.id).to eq(dance.id) + expect(filter_result['id']).to eq(dance.id) end end @@ -47,14 +48,16 @@ t = now - random.rand(100).hours FactoryGirl.create(:dance, created_at: t) end - filter_results = FilterDances.filter_dances(10, ['figure', '*'], JSLibFigure.default_dialect) + filter_results = FilterDances.filter_dances(['figure', '*'], count: 10, dialect: dialect)[:dances] dances_sorted = dances.sort_by(&:created_at).reverse filter_results.each_with_index do |filter_result, i| dance = dances_sorted[i] - expect(filter_result.dance.id).to eq(dance.id) + expect(filter_result['id']).to eq(dance.id) end - end + + it 'honors count and offset' + it 'checks the numberSearched and numberMatching fields' end it 'filter_result_to_json' do diff --git a/spec/requests/api/v1/dances_controller_spec.rb b/spec/requests/api/v1/dances_controller_spec.rb index cd6425c4..15fc5120 100644 --- a/spec/requests/api/v1/dances_controller_spec.rb +++ b/spec/requests/api/v1/dances_controller_spec.rb @@ -7,18 +7,23 @@ dance.reload get api_v1_dances_path expect(response).to have_http_status(200) - expect(JSON.parse(response.body)).to eq([{"id"=>dance.id, - "title"=>dance.title, - "choreographer_id"=>dance.choreographer_id, - "choreographer_name"=>dance.choreographer.name, - "formation" => dance.start_type, - "hook" => dance.hook, - "user_id" => dance.user_id, - "user_name" => dance.user.name, - "created_at"=>dance.created_at.as_json, - "updated_at"=>dance.updated_at.as_json, - "publish"=>"everyone", - "matching_figures_html"=>"whole dance"}]) + expect(JSON.parse(response.body)).to eq({ + "numberSearched" => 1, + "numberMatching" => 1, + "dances" => + [{"id"=>dance.id, + "title"=>dance.title, + "choreographer_id"=>dance.choreographer_id, + "choreographer_name"=>dance.choreographer.name, + "formation" => dance.start_type, + "hook" => dance.hook, + "user_id" => dance.user_id, + "user_name" => dance.user.name, + "created_at"=>dance.created_at.as_json, + "updated_at"=>dance.updated_at.as_json, + "publish"=>"everyone", + "matching_figures_html"=>"whole dance"}] + }) end it 'only performs one query' From 2bf03729ec7494ddc6e33491fb03798cc279d31b Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sat, 23 Nov 2019 22:58:45 -0600 Subject: [PATCH 042/103] filter_dances offset spec, delete old spec --- spec/lib/filter_dances_spec.rb | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/spec/lib/filter_dances_spec.rb b/spec/lib/filter_dances_spec.rb index 64a165ef..cf463aea 100644 --- a/spec/lib/filter_dances_spec.rb +++ b/spec/lib/filter_dances_spec.rb @@ -6,6 +6,7 @@ describe "filter_dances" do let (:now) { DateTime.now } let (:dialect) { JSLibFigure.default_dialect } + it 'works with a matchy filter and plenty of dances' do dances = 20.times.map {|i| FactoryGirl.create(:dance, created_at: now - i.hours) } filter_results = FilterDances.filter_dances(['figure', '*'], count: 10, dialect: dialect)[:dances] @@ -29,19 +30,6 @@ end end - it 'works with an unexpectedly matchy filter' do - dances = 30.times.map do |i| - t = now - i.hours - FactoryGirl.create(:dance_with_a_swing, created_at: t, updated_at: t) - end - filter_results = FilterDances.filter_dances(['figure', 'swing'], count: 10, dialect: dialect)[:dances] - expect(filter_results.length).to eq(10) - filter_results.each_with_index do |filter_result, i| - dance = dances[i] - expect(filter_result['id']).to eq(dance.id) - end - end - it 'returns dances in most-recently-created order' do random = Random.new(1000) # repeatable seed. dances = 10.times.map do |i| @@ -56,7 +44,13 @@ end end - it 'honors count and offset' + it 'honors count and offset' do + dances = 3.times.map {|i| FactoryGirl.create(:dance, created_at: now - i.hours) } + filter_results = FilterDances.filter_dances(['figure', '*'], count: 1, offset: 1, dialect: dialect)[:dances] + expect(filter_results.length).to eq(1) + expect(filter_results.first['id']).to eq(dances.second.id) + end + it 'checks the numberSearched and numberMatching fields' end From 69d2b2bed5eb7f5d84ce6884dca1200474ff661f Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sat, 23 Nov 2019 23:15:04 -0600 Subject: [PATCH 043/103] table has the sentence 'Showing 1 to 10 of 1012 dances.' after it --- app/javascript/dance-table.tsx | 6 ++++++ lib/filter_dances.rb | 7 ++++--- spec/features/welcome/search_spec.rb | 5 +++-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index ec7df8f1..57aad17a 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -99,6 +99,7 @@ const MatchingFiguresHtmlCell = (props: any) => ( ) function DanceTable() { + const offset = 0 const nullDances: DanceSearchResult[] = [] const [dancesGetJson, setDancesGetJson] = useState({ dances: nullDances, @@ -191,6 +192,11 @@ function DanceTable() { +
+ Showing {offset + 1} to {offset + dances.length} of + {" " + numberMatching + " "} + {numberMatching === numberSearched || "filtered"} dances. +
) } diff --git a/lib/filter_dances.rb b/lib/filter_dances.rb index 9fc125dc..bd015a05 100644 --- a/lib/filter_dances.rb +++ b/lib/filter_dances.rb @@ -3,7 +3,6 @@ require 'search_match' module FilterDances - # into is destructively appended! def self.filter_dances(filter, dialect:, count: 10, offset: 0) filter.is_a?(Array) or raise "filter must be an array, but got #{filter.inspect} of class #{filter.class}" query = Dance.includes(:choreographer, :user).references(:choreographer, :user).order('dances.created_at DESC') @@ -16,8 +15,10 @@ def self.filter_dances(filter, dialect:, count: 10, offset: 0) if mf number_matching += 1 send_this_dance = offset < number_matching && number_matching <= offset + count - dance_json = filter_result_to_json(dance, matching_figures_html(mf, dance, dialect)) - filter_results << dance_json if send_this_dance + if send_this_dance + mf_html = matching_figures_html(mf, dance, dialect) + filter_results << filter_result_to_json(dance, mf_html) + end end end { diff --git a/spec/features/welcome/search_spec.rb b/spec/features/welcome/search_spec.rb index 7f7cd865..5c313104 100644 --- a/spec/features/welcome/search_spec.rb +++ b/spec/features/welcome/search_spec.rb @@ -82,10 +82,11 @@ end end - it "entries count displays how many search results match" do + it "sentence displays how many search results match" do dbsize = 12 dbsize.times.map {|i| FactoryGirl.create(:dance, created_at: now - i.hours)} visit(s_path) - expect(page).to have_content("Showing 1 to 10 of #{dbsize} entries") + expect(page).to have_content("Showing 1 to 10 of #{dbsize} dances.") + # TODO add more tests around changing the offset and count end end From 3c37973b1353011c892cea9545ecf24f81dbc4b2 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 24 Nov 2019 13:03:51 -0600 Subject: [PATCH 044/103] seemingly successful, but sketchy, refactor on the way to pagination --- app/javascript/dance-table.tsx | 79 ++++++++++++++++++++++++++-------- 1 file changed, 62 insertions(+), 17 deletions(-) diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index 57aad17a..fcc7ddf4 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -1,20 +1,44 @@ import * as React from "react" -import { useState, useEffect, useMemo } from "react" -import { useTable } from "react-table" +import { useState, useEffect, useMemo, useCallback } from "react" +import { useTable, usePagination } from "react-table" + +function Table({ + columns, + data, + fetchData, + loading, + pageCount: controlledPageCount, +}: { + columns: any + data: any + fetchData: Function + loading: boolean + pageCount: number +}) { + // const tableState = useTableState({ pageIndex: 0 }) + // const [{ pageIndex, pageSize }] = tableState -function Table({ columns, data }: { columns: any; data: any }) { - // Use the state and functions returned from useTable to build your UI const { getTableProps, getTableBodyProps, headerGroups, rows, prepareRow, + pageIndex, + pageSize, } = useTable({ columns, data, + manualPagination: true, + pageCount: controlledPageCount, }) + useEffect(() => fetchData({ pageIndex, pageSize }), [ + fetchData, + pageIndex, + pageSize, + ]) + // Render the UI for your table return ( <> @@ -112,23 +136,38 @@ function DanceTable() { numberMatching, }: DancesGetJson = dancesGetJson - // download data from web api - useEffect(() => { - let used = true + const [pageCount, setPageCount] = React.useState(0) + const [loading, setLoading] = React.useState(false) + const fetchData = useCallback(({ pageSize, pageIndex }) => { + setLoading(true) async function fetchData() { - if (used) { - const r = await fetch("/api/v1/dances") - const json: DancesGetJson = await r.json() - console.log('fetch("/api/v1/dances")') - setDancesGetJson(json) - } + console.log('fetch("/api/v1/dances")') + const response = await fetch("/api/v1/dances") + const json: DancesGetJson = await response.json() + setDancesGetJson(json) + setPageCount(Math.ceil(json.numberMatching / pageSize)) + setLoading(false) } fetchData() - return () => { - used = false - } + // maybe return in-use-ness to prevent a memory leak here? }, []) + // useEffect(() => { + // let used = true + // async function fetchData() { + // if (used) { + // const r = await fetch("/api/v1/dances") + // const json: DancesGetJson = await r.json() + // console.log('fetch("/api/v1/dances")') + // setDancesGetJson(json) + // } + // } + // fetchData() + // return () => { + // used = false + // } + // }, []) + const columnsArr = [ { Header: "Title", @@ -191,7 +230,13 @@ function DanceTable() { })} -
+
Showing {offset + 1} to {offset + dances.length} of {" " + numberMatching + " "} From 0340c8606f42f31b80dd58d86b0f8ef1e4b46196 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 24 Nov 2019 18:57:01 -0600 Subject: [PATCH 045/103] add pagination controls --- app/javascript/dance-table.tsx | 73 ++++++++++++++++++++++++++++++---- 1 file changed, 65 insertions(+), 8 deletions(-) diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index fcc7ddf4..84a4f89d 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -20,19 +20,32 @@ function Table({ const { getTableProps, - getTableBodyProps, headerGroups, - rows, prepareRow, + page, // new + canPreviousPage, // new + canNextPage, // new + pageOptions, // new + pageCount, // new + gotoPage, // new + nextPage, // new + previousPage, // new + setPageSize, // new + getTableBodyProps, + rows, pageIndex, pageSize, - } = useTable({ - columns, - data, - manualPagination: true, - pageCount: controlledPageCount, - }) + } = useTable( + { + columns, + data, + manualPagination: true, + pageCount: controlledPageCount, + }, + usePagination + ) + // again, need to worry about the return value of this first arg to useEffect useEffect(() => fetchData({ pageIndex, pageSize }), [ fetchData, pageIndex, @@ -68,6 +81,50 @@ function Table({ })}
+
+ {" "} + {" "} + {" "} + {" "} + + Page{" "} + + {pageIndex + 1} of {pageOptions.length} + {" "} + + + | Go to page:{" "} + { + const page = e.target.value ? Number(e.target.value) - 1 : 0 + gotoPage(page) + }} + style={{ width: "100px" }} + /> + {" "} + +
) } From d45a4f7e7fecadf90217b86295cbb190bbbd349a Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 24 Nov 2019 23:30:16 -0600 Subject: [PATCH 046/103] pagination --- app/controllers/api/v1/dances_controller.rb | 14 ++++- app/javascript/dance-table.tsx | 10 ++-- spec/features/welcome/search_spec.rb | 59 +++++++++++++++++++ .../requests/api/v1/dances_controller_spec.rb | 57 ++++++++++++------ 4 files changed, 116 insertions(+), 24 deletions(-) diff --git a/app/controllers/api/v1/dances_controller.rb b/app/controllers/api/v1/dances_controller.rb index 0fa3dbc0..f375482f 100644 --- a/app/controllers/api/v1/dances_controller.rb +++ b/app/controllers/api/v1/dances_controller.rb @@ -2,11 +2,23 @@ class Api::V1::DancesController < ApplicationController def index - render json: FilterDances.filter_dances(filter, count: 10, offset: 0, dialect: dialect) + render json: FilterDances.filter_dances(filter, count: count, offset: offset, dialect: dialect) end private def filter ['figure', '*'] end + + def count + parseIntWithDefault(params[:count], 10) + end + + def offset + parseIntWithDefault(params[:offset], 0) + end + + def parseIntWithDefault(s, default) + s =~ /^[0-9]+$/ ? Integer(s) : default + end end diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index 84a4f89d..8676da5f 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -103,6 +103,7 @@ function Table({ | Go to page:{" "} { @@ -181,9 +182,8 @@ const MatchingFiguresHtmlCell = (props: any) => ( function DanceTable() { const offset = 0 - const nullDances: DanceSearchResult[] = [] const [dancesGetJson, setDancesGetJson] = useState({ - dances: nullDances, + dances: [] as DanceSearchResult[], numberSearched: 0, numberMatching: 0, }) @@ -198,8 +198,10 @@ function DanceTable() { const fetchData = useCallback(({ pageSize, pageIndex }) => { setLoading(true) async function fetchData() { - console.log('fetch("/api/v1/dances")') - const response = await fetch("/api/v1/dances") + const url = `/api/v1/dances?count=${pageSize}&offset=${pageIndex * + pageSize}` + console.log(`fetch("${url}")`) + const response = await fetch(url) const json: DancesGetJson = await response.json() setDancesGetJson(json) setPageCount(Math.ceil(json.numberMatching / pageSize)) diff --git a/spec/features/welcome/search_spec.rb b/spec/features/welcome/search_spec.rb index 5c313104..45775266 100644 --- a/spec/features/welcome/search_spec.rb +++ b/spec/features/welcome/search_spec.rb @@ -13,6 +13,65 @@ expect(page).send to_probably, have_link(dance.choreographer.name, href: choreographer_path(dance.choreographer_id)) end end + + describe 'pagination' do + let! (:dances) { 52.times.map {|i| FactoryGirl.create(:dance, title: "dance-#{i}.", created_at: now - i.hours)} } + it "turning pages" do + visit(s_path) + # first page + 10.times {|i| expect(page).to have_link("dance-#{i}.")} + expect(page).to have_button('<<', disabled: true) + expect(page).to have_button('<', disabled: true) + expect(page).to have_button('>') + expect(page).to have_button('>>') + click_on '>' + # second page + 10.times {|i| expect(page).to have_link("dance-#{i+10}.")} + expect(page).to have_button('<<') + expect(page).to have_button('<') + expect(page).to have_button('>') + expect(page).to have_button('>>') + click_on '<' + # first page + 10.times {|i| expect(page).to have_link("dance-#{i}.")} + expect(page).to have_button('<<', disabled: true) + expect(page).to have_button('<', disabled: true) + expect(page).to have_button('>') + expect(page).to have_button('>>') + find('.page-number-entry').fill_in(with: '3') # third page + 10.times {|i| expect(page).to have_link("dance-#{i+20}.")} + expect(page).to have_button('<<') + expect(page).to have_button('<') + expect(page).to have_button('>') + expect(page).to have_button('>>') + click_on '>>' + # last (partial) page + 2.times {|i| expect(page).to have_link("dance-#{i+50}.")} + expect(page).to have_button('<<') + expect(page).to have_button('<') + expect(page).to have_button('>', disabled: true) + expect(page).to have_button('>>', disabled: true) + click_on '<<' + # first page + 10.times {|i| expect(page).to have_link("dance-#{i}.")} + expect(page).to have_button('<<', disabled: true) + expect(page).to have_button('<', disabled: true) + expect(page).to have_button('>') + expect(page).to have_button('>>') + end + + it "page size select menu" do + visit(s_path) + expect(page).to have_text("Page 1 of 6") + select('30') + expect(page).to have_text("Page 1 of 2") + click_on '>' + (dances.length-30).times do |i| + expect(page).to have_link("dance-#{i+30}.") + end + end + end + describe 'columns' do let (:dances) {[:dance, :box_the_gnat_contra, :call_me].map {|d| FactoryGirl.create(d)}} it "Clicking vis toggles buttons cause columns to disappear" do diff --git a/spec/requests/api/v1/dances_controller_spec.rb b/spec/requests/api/v1/dances_controller_spec.rb index 15fc5120..236584da 100644 --- a/spec/requests/api/v1/dances_controller_spec.rb +++ b/spec/requests/api/v1/dances_controller_spec.rb @@ -7,28 +7,47 @@ dance.reload get api_v1_dances_path expect(response).to have_http_status(200) - expect(JSON.parse(response.body)).to eq({ - "numberSearched" => 1, - "numberMatching" => 1, - "dances" => - [{"id"=>dance.id, - "title"=>dance.title, - "choreographer_id"=>dance.choreographer_id, - "choreographer_name"=>dance.choreographer.name, - "formation" => dance.start_type, - "hook" => dance.hook, - "user_id" => dance.user_id, - "user_name" => dance.user.name, - "created_at"=>dance.created_at.as_json, - "updated_at"=>dance.updated_at.as_json, - "publish"=>"everyone", - "matching_figures_html"=>"whole dance"}] - }) + expect(JSON.parse(response.body)) + .to eq({ + "numberSearched" => 1, + "numberMatching" => 1, + "dances" => + [{"id"=>dance.id, + "title"=>dance.title, + "choreographer_id"=>dance.choreographer_id, + "choreographer_name"=>dance.choreographer.name, + "formation" => dance.start_type, + "hook" => dance.hook, + "user_id" => dance.user_id, + "user_name" => dance.user.name, + "created_at"=>dance.created_at.as_json, + "updated_at"=>dance.updated_at.as_json, + "publish"=>"everyone", + "matching_figures_html"=>"whole dance"} + ]}) end - it 'only performs one query' + it 'understands count and offset' do + pageSize = 4 + pages = 3 + now = DateTime.now + dances = (pages*pageSize).times.map {|i| FactoryGirl.create(:dance, title: "dance-#{i}", created_at: now - i.hours)} + pages.times do |pageIndex| + pageSize.times do |rowIndex| + get api_v1_dances_path(count: pageSize, offset: pageIndex*pageSize) + expect(response).to have_http_status(200) + rendered = JSON.parse(response.body) + expect(rendered['numberMatching']).to eq(12) + expect(rendered['dances'].length).to eq(pageSize) + d1 = dances[pageSize * pageIndex + rowIndex] + d2 = rendered.dig('dances', rowIndex) + expect(d1.id).to eq(d2['id']) + end + end + end - it 'understands index and offset' + + it 'only performs one query' it 'takes other dance search parameters' end From 64688fb25d7ffe308bd763927e5e3b7260b1120c Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Thu, 28 Nov 2019 18:53:07 -0600 Subject: [PATCH 047/103] move PaginationSentence into its own component, hung off the Table component --- app/javascript/dance-table.tsx | 40 +++++++++++++++++++++------- spec/features/welcome/search_spec.rb | 6 +++++ 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index 8676da5f..bbeb3ba2 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -2,15 +2,34 @@ import * as React from "react" import { useState, useEffect, useMemo, useCallback } from "react" import { useTable, usePagination } from "react-table" +function PaginationSentence({ + pageOffset, + pageCount, + matchCount, + isFiltered, +}: { + pageOffset: number + pageCount: number + matchCount: number + isFiltered: boolean +}) { + return ( +
+ Showing {pageOffset + 1} to {pageOffset + pageCount} of {matchCount}{" "} + {isFiltered && "filtered"} dances. +
+ ) +} + function Table({ columns, - data, + dancesGetJson, fetchData, loading, pageCount: controlledPageCount, }: { columns: any - data: any + dancesGetJson: DancesGetJson fetchData: Function loading: boolean pageCount: number @@ -38,7 +57,7 @@ function Table({ } = useTable( { columns, - data, + data: dancesGetJson.dances, manualPagination: true, pageCount: controlledPageCount, }, @@ -81,6 +100,14 @@ function Table({ })} +
-
- Showing {offset + 1} to {offset + dances.length} of - {" " + numberMatching + " "} - {numberMatching === numberSearched || "filtered"} dances. -
) } diff --git a/spec/features/welcome/search_spec.rb b/spec/features/welcome/search_spec.rb index 45775266..f139440b 100644 --- a/spec/features/welcome/search_spec.rb +++ b/spec/features/welcome/search_spec.rb @@ -20,6 +20,7 @@ visit(s_path) # first page 10.times {|i| expect(page).to have_link("dance-#{i}.")} + expect(page).to have_text('Showing 1 to 10 of 52 dances') expect(page).to have_button('<<', disabled: true) expect(page).to have_button('<', disabled: true) expect(page).to have_button('>') @@ -27,6 +28,7 @@ click_on '>' # second page 10.times {|i| expect(page).to have_link("dance-#{i+10}.")} + expect(page).to have_text('Showing 11 to 20 of 52 dances') expect(page).to have_button('<<') expect(page).to have_button('<') expect(page).to have_button('>') @@ -34,12 +36,14 @@ click_on '<' # first page 10.times {|i| expect(page).to have_link("dance-#{i}.")} + expect(page).to have_text('Showing 1 to 10 of 52 dances') expect(page).to have_button('<<', disabled: true) expect(page).to have_button('<', disabled: true) expect(page).to have_button('>') expect(page).to have_button('>>') find('.page-number-entry').fill_in(with: '3') # third page 10.times {|i| expect(page).to have_link("dance-#{i+20}.")} + expect(page).to have_text('Showing 21 to 30 of 52 dances') expect(page).to have_button('<<') expect(page).to have_button('<') expect(page).to have_button('>') @@ -47,6 +51,7 @@ click_on '>>' # last (partial) page 2.times {|i| expect(page).to have_link("dance-#{i+50}.")} + expect(page).to have_text('Showing 51 to 52 of 52 dances') expect(page).to have_button('<<') expect(page).to have_button('<') expect(page).to have_button('>', disabled: true) @@ -54,6 +59,7 @@ click_on '<<' # first page 10.times {|i| expect(page).to have_link("dance-#{i}.")} + expect(page).to have_text('Showing 1 to 10 of 52 dances') expect(page).to have_button('<<', disabled: true) expect(page).to have_button('<', disabled: true) expect(page).to have_button('>') From 62df15a3af9c538c9d7d0f6d910d911ff2430364 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Thu, 28 Nov 2019 21:42:16 -0600 Subject: [PATCH 048/103] style pagination buttons --- app/assets/stylesheets/welcome.scss | 8 +++ app/javascript/dance-table.tsx | 80 ++++++++++++++++------------- 2 files changed, 53 insertions(+), 35 deletions(-) diff --git a/app/assets/stylesheets/welcome.scss b/app/assets/stylesheets/welcome.scss index 059be4dd..c4975852 100644 --- a/app/assets/stylesheets/welcome.scss +++ b/app/assets/stylesheets/welcome.scss @@ -149,3 +149,11 @@ select.chooser-argument { .chooser-argument input[type="checkbox"] { margin-top: 0px; /* override 4px in bootstrap */ } + +.pagination { + @extend .btn-group; +} + +.flipped-glyphicon { + transform: scaleX(-1); +} diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index bbeb3ba2..ef2cef85 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -109,26 +109,33 @@ function Table({ } />
- {" "} - {" "} - {" "} - {" "} - - Page{" "} - - {pageIndex + 1} of {pageOptions.length} - {" "} - + { + gotoPage(0) + }} + isDisabled={!canPreviousPage} + glyphicon="glyphicon-fast-backward" + />{" "} + {" "} + {" "} + { + gotoPage(pageCount - 1) + }} + isDisabled={!canNextPage} + glyphicon="glyphicon-fast-forward" + />{" "} - | Go to page:{" "} + Go to page:{" "} void + isDisabled?: boolean + glyphicon: string + iconIsFlipped?: boolean +}) { + const flipClass: string | false = iconIsFlipped && "flipped-glyphicon" + return ( + + ) +} + interface DanceSearchResult { id: number title: string @@ -238,22 +264,6 @@ function DanceTable() { // maybe return in-use-ness to prevent a memory leak here? }, []) - // useEffect(() => { - // let used = true - // async function fetchData() { - // if (used) { - // const r = await fetch("/api/v1/dances") - // const json: DancesGetJson = await r.json() - // console.log('fetch("/api/v1/dances")') - // setDancesGetJson(json) - // } - // } - // fetchData() - // return () => { - // used = false - // } - // }, []) - const columnsArr = [ { Header: "Title", From cf69deac6d296bab186d289b92aaddc0e5020c97 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Fri, 29 Nov 2019 15:14:31 -0600 Subject: [PATCH 049/103] natural-number-editor component for goto-page text entry --- app/javascript/dance-table.tsx | 18 +++++++-------- app/javascript/natural-number-editor.tsx | 29 ++++++++++++++++++++++++ spec/features/welcome/search_spec.rb | 1 + 3 files changed, 39 insertions(+), 9 deletions(-) create mode 100644 app/javascript/natural-number-editor.tsx diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index ef2cef85..82d2eaf2 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -1,6 +1,7 @@ import * as React from "react" import { useState, useEffect, useMemo, useCallback } from "react" import { useTable, usePagination } from "react-table" +import { NaturalNumberEditor } from "./natural-number-editor" function PaginationSentence({ pageOffset, @@ -71,7 +72,8 @@ function Table({ pageSize, ]) - // Render the UI for your table + console.log("render table") + return ( <>
{" "} Go to page:{" "} - { - const page = e.target.value ? Number(e.target.value) - 1 : 0 - gotoPage(page) + gotoPage(n - 1)} + inputProperties={{ + className: "page-number-entry", + style: { width: "100px" }, }} - style={{ width: "100px" }} /> {" "} { + const sv = e.target.value.replace(/[^0-9]/g, "") + setStringValue(sv) + if (sv) setValue(Number(sv)) + }} + {...inputProperties} + /> + ) +} +export default NaturalNumberEditor diff --git a/spec/features/welcome/search_spec.rb b/spec/features/welcome/search_spec.rb index f139440b..f0bb9b8e 100644 --- a/spec/features/welcome/search_spec.rb +++ b/spec/features/welcome/search_spec.rb @@ -41,6 +41,7 @@ expect(page).to have_button('<', disabled: true) expect(page).to have_button('>') expect(page).to have_button('>>') + # third page via numeric input find('.page-number-entry').fill_in(with: '3') # third page 10.times {|i| expect(page).to have_link("dance-#{i+20}.")} expect(page).to have_text('Showing 21 to 30 of 52 dances') From ae0779f21ed7ff1227ab9c00da9d0ae425cbe319 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Mon, 2 Dec 2019 08:03:42 -0600 Subject: [PATCH 050/103] bring in react-testing-library to test components in jest --- package.json | 14 +++- tsconfig.json | 1 + yarn.lock | 216 ++++++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 213 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index 52ffdf3a..66bfcbec 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,12 @@ "typescript": "^3.6.4" }, "devDependencies": { + "@testing-library/jest-dom": "^4.2.4", + "@testing-library/react": "^9.3.2", + "@types/jest": "^24.0.23", "jest": "^24.8.0", "prettier": "1.18.2", + "ts-jest": "^24.2.0", "webpack-dev-server": "^3.1.14" }, "scripts": { @@ -23,12 +27,20 @@ "test": "jest" }, "jest": { + "preset": "ts-jest", "roots": [ "spec/javascript" ], + "transform": { + "^.+\\.(ts|tsx)$": "ts-jest", + "^.+\\.(js|jsx)$": "babel-jest" + }, + "testMatch": [ + "**/*.spec.(ts|tsx|js|jsx)" + ], "moduleDirectories": [ "node_modules", "app/javascript" - ] + ] } } diff --git a/tsconfig.json b/tsconfig.json index 6ea97ab3..f3057f18 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,6 +10,7 @@ "strict": true, "target": "es5", "jsx": "react", + "esModuleInterop": true }, "exclude": [ "**/*.spec.ts", diff --git a/yarn.lock b/yarn.lock index 56eab2f5..333f14a2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -699,6 +699,13 @@ dependencies: regenerator-runtime "^0.13.2" +"@babel/runtime@^7.5.1", "@babel/runtime@^7.6.0", "@babel/runtime@^7.6.2": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.7.4.tgz#b23a856751e4bf099262f867767889c0e3fe175b" + integrity sha512-r24eVUUr0QqNZa+qrImUk8fn5SPhHq+IfYvIoIMg0do3GdK9sMdiLKP3GYVVaxpPKORgm8KRKaNTEhAjgIpLMw== + dependencies: + regenerator-runtime "^0.13.2" + "@babel/template@^7.1.0", "@babel/template@^7.4.0", "@babel/template@^7.4.4", "@babel/template@^7.6.0": version "7.6.0" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6" @@ -937,6 +944,47 @@ webpack-cli "^3.3.2" webpack-sources "^1.3.0" +"@sheerun/mutationobserver-shim@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.2.tgz#8013f2af54a2b7d735f71560ff360d3a8176a87b" + integrity sha512-vTCdPp/T/Q3oSqwHmZ5Kpa9oI7iLtGl3RQaA/NyLHikvcrPxACkkKVr/XzkSPJWXHRhKGzVvb0urJsbMlRxi1Q== + +"@testing-library/dom@^6.3.0": + version "6.10.1" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-6.10.1.tgz#da5bf5065d3f9e484aef4cc495f4e1a5bea6df2e" + integrity sha512-5BPKxaO+zSJDUbVZBRNf9KrmDkm/EcjjaHSg3F9+031VZyPACKXlwLBjVzZxheunT9m72DoIq7WvyE457/Xweg== + dependencies: + "@babel/runtime" "^7.6.2" + "@sheerun/mutationobserver-shim" "^0.3.2" + "@types/testing-library__dom" "^6.0.0" + aria-query "3.0.0" + pretty-format "^24.9.0" + wait-for-expect "^3.0.0" + +"@testing-library/jest-dom@^4.2.4": + version "4.2.4" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-4.2.4.tgz#00dfa0cbdd837d9a3c2a7f3f0a248ea6e7b89742" + integrity sha512-j31Bn0rQo12fhCWOUWy9fl7wtqkp7In/YP2p5ZFyRuiiB9Qs3g+hS4gAmDWONbAHcRmVooNJ5eOHQDCOmUFXHg== + dependencies: + "@babel/runtime" "^7.5.1" + chalk "^2.4.1" + css "^2.2.3" + css.escape "^1.5.1" + jest-diff "^24.0.0" + jest-matcher-utils "^24.0.0" + lodash "^4.17.11" + pretty-format "^24.0.0" + redent "^3.0.0" + +"@testing-library/react@^9.3.2": + version "9.3.2" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-9.3.2.tgz#418000daa980dafd2d9420cc733d661daece9aa0" + integrity sha512-J6ftWtm218tOLS175MF9eWCxGp+X+cUXCpkPIin8KAXWtyZbr9CbqJ8M8QNd6spZxJDAGlw+leLG4MJWLlqVgg== + dependencies: + "@babel/runtime" "^7.6.0" + "@testing-library/dom" "^6.3.0" + "@types/testing-library__react" "^9.1.0" + "@types/babel__core@^7.1.0": version "7.1.3" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.3.tgz#e441ea7df63cd080dfcd02ab199e6d16a735fc30" @@ -1004,6 +1052,13 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" +"@types/jest@^24.0.23": + version "24.0.23" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.0.23.tgz#046f8e2ade026fe831623e361a36b6fb9a4463e4" + integrity sha512-L7MBvwfNpe7yVPTXLn32df/EK+AMBFAFvZrRuArGs7npEWnlziUXK+5GMIUTI4NIuwok3XibsjXCs5HxviYXjg== + dependencies: + jest-diff "^24.3.0" + "@types/minimatch@*": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" @@ -1024,6 +1079,13 @@ resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== +"@types/react-dom@*": + version "16.9.4" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.4.tgz#0b58df09a60961dcb77f62d4f1832427513420df" + integrity sha512-fya9xteU/n90tda0s+FtN5Ym4tbgxpq/hb/Af24dvs6uYnYn+fspaxw5USlw0R8apDNwxsqumdRoCoKitckQqw== + dependencies: + "@types/react" "*" + "@types/react-dom@^16.9.3": version "16.9.3" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.3.tgz#4006ff0e13958af91313869077c04cb20d9b9d04" @@ -1044,6 +1106,21 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== +"@types/testing-library__dom@*", "@types/testing-library__dom@^6.0.0": + version "6.10.0" + resolved "https://registry.yarnpkg.com/@types/testing-library__dom/-/testing-library__dom-6.10.0.tgz#590d76e3875a7c536dc744eb530cbf51b6483404" + integrity sha512-mL/GMlyQxiZplbUuFNwA0vAI3k3uJNSf6slr5AVve9TXmfLfyefNT0uHHnxwdYuPMxYD5gI/+dgAvc/5opW9JQ== + dependencies: + pretty-format "^24.3.0" + +"@types/testing-library__react@^9.1.0": + version "9.1.2" + resolved "https://registry.yarnpkg.com/@types/testing-library__react/-/testing-library__react-9.1.2.tgz#e33af9124c60a010fc03a34eff8f8a34a75c4351" + integrity sha512-CYaMqrswQ+cJACy268jsLAw355DZtPZGt3Jwmmotlcu8O/tkoXBI6AeZ84oZBJsIsesozPKzWzmv/0TIU+1E9Q== + dependencies: + "@types/react-dom" "*" + "@types/testing-library__dom" "*" + "@types/yargs-parser@*": version "13.1.0" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-13.1.0.tgz#c563aa192f39350a1d18da36c5a8da382bbd8228" @@ -1353,6 +1430,14 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +aria-query@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" + integrity sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w= + dependencies: + ast-types-flow "0.0.7" + commander "^2.11.0" + arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" @@ -1439,6 +1524,11 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= +ast-types-flow@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= + astral-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" @@ -1779,6 +1869,13 @@ browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.6.4, browserslist@^4.7 electron-to-chromium "^1.3.295" node-releases "^1.1.38" +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + bser@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -1786,7 +1883,7 @@ bser@^2.0.0: dependencies: node-int64 "^0.4.0" -buffer-from@^1.0.0: +buffer-from@1.x, buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== @@ -1923,6 +2020,11 @@ camelcase@^3.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + camelcase@^5.0.0, camelcase@^5.2.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" @@ -2137,7 +2239,7 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@^2.20.0, commander@~2.20.3: +commander@^2.11.0, commander@^2.20.0, commander@~2.20.3: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -2455,6 +2557,21 @@ css-what@^2.1.2: resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== +css.escape@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= + +css@^2.2.3: + version "2.2.4" + resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" + integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== + dependencies: + inherits "^2.0.3" + source-map "^0.6.1" + source-map-resolve "^0.5.2" + urix "^0.1.0" + cssdb@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" @@ -3177,7 +3294,7 @@ fast-deep-equal@^2.0.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= -fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= @@ -3871,6 +3988,11 @@ indent-string@^2.1.0: dependencies: repeating "^2.0.0" +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" @@ -4353,7 +4475,7 @@ jest-config@^24.9.0: pretty-format "^24.9.0" realpath-native "^1.1.0" -jest-diff@^24.9.0: +jest-diff@^24.0.0, jest-diff@^24.3.0, jest-diff@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== @@ -4458,7 +4580,7 @@ jest-leak-detector@^24.9.0: jest-get-type "^24.9.0" pretty-format "^24.9.0" -jest-matcher-utils@^24.9.0: +jest-matcher-utils@^24.0.0, jest-matcher-utils@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA== @@ -4751,6 +4873,13 @@ json3@^3.3.2: resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== +json5@2.x, json5@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" + integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== + dependencies: + minimist "^1.2.0" + json5@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" @@ -4758,13 +4887,6 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" - integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== - dependencies: - minimist "^1.2.0" - jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -4907,7 +5029,7 @@ lodash.has@^4.0: resolved "https://registry.yarnpkg.com/lodash.has/-/lodash.has-4.5.2.tgz#d19f4dc1095058cccbe2b0cdf4ee0fe4aa37c862" integrity sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI= -lodash.memoize@^4.1.2: +lodash.memoize@4.x, lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= @@ -4985,6 +5107,11 @@ make-dir@^2.0.0, make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" +make-error@1.x: + version "1.3.5" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" + integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== + makeerror@1.0.x: version "1.0.11" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" @@ -5168,6 +5295,11 @@ mimic-fn@^2.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +min-indent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.0.tgz#cfc45c37e9ec0d8f0a0ec3dd4ef7f7c3abe39256" + integrity sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY= + mini-css-extract-plugin@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.7.0.tgz#5ba8290fbb4179a43dd27cca444ba150bee743a0" @@ -5249,7 +5381,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -"mkdirp@>=0.5 0", mkdirp@^0.5, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: +mkdirp@0.x, "mkdirp@>=0.5 0", mkdirp@^0.5, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= @@ -6695,7 +6827,7 @@ prettier@1.18.2: resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== -pretty-format@^24.9.0: +pretty-format@^24.0.0, pretty-format@^24.3.0, pretty-format@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== @@ -7011,6 +7143,14 @@ redent@^1.0.0: indent-string "^2.1.0" strip-indent "^1.0.1" +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + regenerate-unicode-properties@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" @@ -7188,6 +7328,13 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= +resolve@1.x: + version "1.13.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.13.1.tgz#be0aa4c06acd53083505abb35f4d66932ab35d16" + integrity sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w== + dependencies: + path-parse "^1.0.6" + resolve@^1.1.7, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.8.1: version "1.12.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" @@ -7342,7 +7489,7 @@ selfsigned@^1.10.7: dependencies: node-forge "0.9.0" -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -7550,7 +7697,7 @@ source-list-map@^2.0.0: resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -source-map-resolve@^0.5.0: +source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== @@ -7863,6 +8010,13 @@ strip-indent@^1.0.1: dependencies: get-stdin "^4.0.1" +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -8106,6 +8260,22 @@ trim-newlines@^1.0.0: dependencies: glob "^7.1.2" +ts-jest@^24.2.0: + version "24.2.0" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-24.2.0.tgz#7abca28c2b4b0a1fdd715cd667d65d047ea4e768" + integrity sha512-Yc+HLyldlIC9iIK8xEN7tV960Or56N49MDP7hubCZUeI7EbIOTsas6rXCMB4kQjLACJ7eDOF4xWEO5qumpKsag== + dependencies: + bs-logger "0.x" + buffer-from "1.x" + fast-json-stable-stringify "2.x" + json5 "2.x" + lodash.memoize "4.x" + make-error "1.x" + mkdirp "0.x" + resolve "1.x" + semver "^5.5" + yargs-parser "10.x" + ts-loader@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-6.2.1.tgz#67939d5772e8a8c6bdaf6277ca023a4812da02ef" @@ -8371,6 +8541,11 @@ w3c-hr-time@^1.0.1: dependencies: browser-process-hrtime "^0.1.2" +wait-for-expect@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/wait-for-expect/-/wait-for-expect-3.0.1.tgz#ec204a76b0038f17711e575720aaf28505ac7185" + integrity sha512-3Ha7lu+zshEG/CeHdcpmQsZnnZpPj/UsG3DuKO8FskjuDbkx3jE3845H+CuwZjA2YWYDfKMU2KhnCaXMLd3wVw== + walker@^1.0.7, walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" @@ -8684,6 +8859,13 @@ yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yargs-parser@10.x: + version "10.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== + dependencies: + camelcase "^4.1.0" + yargs-parser@^11.1.1: version "11.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" From 1b1655b37704d16658dd5781eaeb30416c93a38e Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Mon, 2 Dec 2019 08:04:26 -0600 Subject: [PATCH 051/103] new spec for natural-number-editor --- app/javascript/natural-number-editor.tsx | 2 +- .../javascript/natural-number-editor.spec.tsx | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 spec/javascript/natural-number-editor.spec.tsx diff --git a/app/javascript/natural-number-editor.tsx b/app/javascript/natural-number-editor.tsx index 6fb9dc5a..d47ca2ee 100644 --- a/app/javascript/natural-number-editor.tsx +++ b/app/javascript/natural-number-editor.tsx @@ -10,7 +10,7 @@ export function NaturalNumberEditor({ }: { value: number setValue: (n: number) => void - inputProperties: object + inputProperties?: object }) { const [stringValue, setStringValue] = useState(value.toString()) return ( diff --git a/spec/javascript/natural-number-editor.spec.tsx b/spec/javascript/natural-number-editor.spec.tsx new file mode 100644 index 00000000..c02666c8 --- /dev/null +++ b/spec/javascript/natural-number-editor.spec.tsx @@ -0,0 +1,24 @@ +import React from "react" +import { render, fireEvent } from "@testing-library/react" + +// these imports are something you'd normally configure Jest to import for you +// automatically. Learn more in the setup docs: https://testing-library.com/docs/react-testing-library/setup#cleanup +import "@testing-library/jest-dom/extend-expect" +// NOTE: jest-dom adds handy assertions to Jest and is recommended, but not required + +import NaturalNumberEditor from "../../app/javascript/natural-number-editor" + +it("works", () => { + const testMessage = "Test Message" + let value: number = 250624 + const setValue = jest.fn((x: number) => { + value = x + }) + const { getByDisplayValue } = render( + + ) + const field = getByDisplayValue("250624") + fireEvent.change(field, { target: { value: 36 } }) + expect(setValue).toHaveBeenCalledWith(36) + expect(setValue).toHaveBeenCalledTimes(1) +}) From 2acfa7bdb01066acb5f7d0bea88ad614d363e1d3 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 8 Dec 2019 09:01:56 -0600 Subject: [PATCH 052/103] always import jest-dom/extend-expect --- package.json | 5 ++++- spec/javascript/natural-number-editor.spec.tsx | 5 ----- spec/jest-setup.ts | 1 + 3 files changed, 5 insertions(+), 6 deletions(-) create mode 100644 spec/jest-setup.ts diff --git a/package.json b/package.json index 66bfcbec..da0f094f 100644 --- a/package.json +++ b/package.json @@ -38,9 +38,12 @@ "testMatch": [ "**/*.spec.(ts|tsx|js|jsx)" ], + "setupFilesAfterEnv": [ + "/spec/jest-setup.ts" + ], "moduleDirectories": [ "node_modules", "app/javascript" - ] + ] } } diff --git a/spec/javascript/natural-number-editor.spec.tsx b/spec/javascript/natural-number-editor.spec.tsx index c02666c8..fafb8d2d 100644 --- a/spec/javascript/natural-number-editor.spec.tsx +++ b/spec/javascript/natural-number-editor.spec.tsx @@ -1,11 +1,6 @@ import React from "react" import { render, fireEvent } from "@testing-library/react" -// these imports are something you'd normally configure Jest to import for you -// automatically. Learn more in the setup docs: https://testing-library.com/docs/react-testing-library/setup#cleanup -import "@testing-library/jest-dom/extend-expect" -// NOTE: jest-dom adds handy assertions to Jest and is recommended, but not required - import NaturalNumberEditor from "../../app/javascript/natural-number-editor" it("works", () => { diff --git a/spec/jest-setup.ts b/spec/jest-setup.ts new file mode 100644 index 00000000..fd3b1f80 --- /dev/null +++ b/spec/jest-setup.ts @@ -0,0 +1 @@ +import "@testing-library/jest-dom/extend-expect" From 684914cbe0614cd7befb7ca8eb4c0e01e9c7b8f1 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 8 Dec 2019 10:35:36 -0600 Subject: [PATCH 053/103] NaturalNumberEditor has a class of 'form-control' --- app/javascript/natural-number-editor.tsx | 18 +++++-- .../javascript/natural-number-editor.spec.tsx | 52 ++++++++++++++----- 2 files changed, 55 insertions(+), 15 deletions(-) diff --git a/app/javascript/natural-number-editor.tsx b/app/javascript/natural-number-editor.tsx index d47ca2ee..51a5c2d4 100644 --- a/app/javascript/natural-number-editor.tsx +++ b/app/javascript/natural-number-editor.tsx @@ -6,13 +6,24 @@ import { useState } from "react" export function NaturalNumberEditor({ value, setValue, - inputProperties, + inputProperties = {}, }: { value: number setValue: (n: number) => void - inputProperties?: object + inputProperties?: { className?: string; [others: string]: any } }) { const [stringValue, setStringValue] = useState(value.toString()) + let className: string + let inputPropertiesWithoutClassName + if (inputProperties.className) { + className = inputProperties.className + " form-control" + inputPropertiesWithoutClassName = { ...inputProperties } + delete inputPropertiesWithoutClassName.className + } else { + className = "form-control" + inputPropertiesWithoutClassName = inputProperties + } + return ( ) } diff --git a/spec/javascript/natural-number-editor.spec.tsx b/spec/javascript/natural-number-editor.spec.tsx index fafb8d2d..b7786f66 100644 --- a/spec/javascript/natural-number-editor.spec.tsx +++ b/spec/javascript/natural-number-editor.spec.tsx @@ -3,17 +3,45 @@ import { render, fireEvent } from "@testing-library/react" import NaturalNumberEditor from "../../app/javascript/natural-number-editor" -it("works", () => { - const testMessage = "Test Message" - let value: number = 250624 - const setValue = jest.fn((x: number) => { - value = x +describe("NaturalNumberEditor", () => { + let value: number + let setValue: any + + beforeEach(() => { + value = 250624 + setValue = jest.fn((x: number) => { + value = x + }) + }) + + it("works", () => { + const { getByDisplayValue } = render( + + ) + const field = getByDisplayValue(value.toString()) + fireEvent.change(field, { target: { value: 36 } }) + expect(setValue).toHaveBeenCalledWith(36) + expect(setValue).toHaveBeenCalledTimes(1) + }) + + describe("className", () => { + it("renders with .form-control", () => { + const field = render( + + ).getByDisplayValue(value.toString()) + expect(field).toHaveClass("form-control") + }) + + it("appends .form-control to whatever they pass in in inputProperties", () => { + const field = render( + + ).getByDisplayValue(value.toString()) + expect(field).toHaveClass("fuzzy-wuzzy") + expect(field).toHaveClass("form-control") + }) }) - const { getByDisplayValue } = render( - - ) - const field = getByDisplayValue("250624") - fireEvent.change(field, { target: { value: 36 } }) - expect(setValue).toHaveBeenCalledWith(36) - expect(setValue).toHaveBeenCalledTimes(1) }) From c6bfad21e8b8ee3ee16ae333c36eca0404b58779 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 8 Dec 2019 11:36:37 -0600 Subject: [PATCH 054/103] fix specs, change page sizes from 10,20,30,40,50 to 10,30,100, improve styles --- app/javascript/dance-table.tsx | 41 ++++++++++------ spec/features/welcome/search_spec.rb | 71 ++++++++++++++++------------ 2 files changed, 67 insertions(+), 45 deletions(-) diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index 82d2eaf2..2790b990 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -116,25 +116,24 @@ function Table({ gotoPage(0) }} isDisabled={!canPreviousPage} - glyphicon="glyphicon-fast-backward" + label="<<" />{" "} {" "} {" "} { gotoPage(pageCount - 1) }} isDisabled={!canNextPage} - glyphicon="glyphicon-fast-forward" + label=">>" />{" "} Go to page:{" "} @@ -152,8 +151,9 @@ function Table({ onChange={e => { setPageSize(Number(e.target.value)) }} + className="form-control" > - {[10, 20, 30, 40, 50].map(pageSize => ( + {[10, 30, 100].map(pageSize => ( @@ -165,20 +165,33 @@ function Table({ } function TurnPageButton({ + label, onClick, isDisabled = false, - glyphicon, - iconIsFlipped = false, -}: { +}: // glyphicon, +// iconIsFlipped = false, +{ + label: "<<" | "<" | ">" | ">>" onClick: () => void isDisabled?: boolean - glyphicon: string - iconIsFlipped?: boolean + // glyphicon: string + // iconIsFlipped?: boolean }) { - const flipClass: string | false = iconIsFlipped && "flipped-glyphicon" + let glyphicon: string + if (label === "<<") glyphicon = "glyphicon-fast-backward" + else if (label === "<" || label === ">") glyphicon = "glyphicon-play" + else if (label === ">>") glyphicon = "glyphicon-fast-forward" + else throw new Error("unexpected label " + label) + const flipClass: string = label === "<" ? " flipped-glyphicon" : "" + return ( - ) } diff --git a/spec/features/welcome/search_spec.rb b/spec/features/welcome/search_spec.rb index f0bb9b8e..fef64e17 100644 --- a/spec/features/welcome/search_spec.rb +++ b/spec/features/welcome/search_spec.rb @@ -15,64 +15,73 @@ end describe 'pagination' do + def have_turn_page_button(*args) + have_css(turn_page_button_css(*args)) + end + + def turn_page_button_css(label, disabled=false) + "button[data-testid=#{label.inspect}]#{disabled ? '[disabled]' : ''}" + end + let! (:dances) { 52.times.map {|i| FactoryGirl.create(:dance, title: "dance-#{i}.", created_at: now - i.hours)} } it "turning pages" do visit(s_path) # first page 10.times {|i| expect(page).to have_link("dance-#{i}.")} expect(page).to have_text('Showing 1 to 10 of 52 dances') - expect(page).to have_button('<<', disabled: true) - expect(page).to have_button('<', disabled: true) - expect(page).to have_button('>') - expect(page).to have_button('>>') - click_on '>' + expect(page).to have_turn_page_button('<<', disabled: true)# have_css('button[data-testid="<<"][disabled]') + expect(page).to have_turn_page_button('<', disabled: true) + expect(page).to have_turn_page_button('>') + expect(page).to have_turn_page_button('>>') + page.find(turn_page_button_css('>')).click # second page 10.times {|i| expect(page).to have_link("dance-#{i+10}.")} expect(page).to have_text('Showing 11 to 20 of 52 dances') - expect(page).to have_button('<<') - expect(page).to have_button('<') - expect(page).to have_button('>') - expect(page).to have_button('>>') - click_on '<' + expect(page).to have_turn_page_button('<<') + expect(page).to have_turn_page_button('<') + expect(page).to have_turn_page_button('>') + expect(page).to have_turn_page_button('>>') + page.find(turn_page_button_css('<')).click # first page 10.times {|i| expect(page).to have_link("dance-#{i}.")} expect(page).to have_text('Showing 1 to 10 of 52 dances') - expect(page).to have_button('<<', disabled: true) - expect(page).to have_button('<', disabled: true) - expect(page).to have_button('>') - expect(page).to have_button('>>') + expect(page).to have_turn_page_button('<<', disabled: true) + expect(page).to have_turn_page_button('<', disabled: true) + expect(page).to have_turn_page_button('>') + expect(page).to have_turn_page_button('>>') # third page via numeric input find('.page-number-entry').fill_in(with: '3') # third page 10.times {|i| expect(page).to have_link("dance-#{i+20}.")} expect(page).to have_text('Showing 21 to 30 of 52 dances') - expect(page).to have_button('<<') - expect(page).to have_button('<') - expect(page).to have_button('>') - expect(page).to have_button('>>') - click_on '>>' + expect(page).to have_turn_page_button('<<') + expect(page).to have_turn_page_button('<') + expect(page).to have_turn_page_button('>') + expect(page).to have_turn_page_button('>>') + page.find(turn_page_button_css('>>')).click # last (partial) page 2.times {|i| expect(page).to have_link("dance-#{i+50}.")} expect(page).to have_text('Showing 51 to 52 of 52 dances') - expect(page).to have_button('<<') - expect(page).to have_button('<') - expect(page).to have_button('>', disabled: true) - expect(page).to have_button('>>', disabled: true) - click_on '<<' + expect(page).to have_turn_page_button('<<') + expect(page).to have_turn_page_button('<') + expect(page).to have_turn_page_button('>', disabled: true) + expect(page).to have_turn_page_button('>>', disabled: true) + page.find(turn_page_button_css('<<')).click # first page 10.times {|i| expect(page).to have_link("dance-#{i}.")} expect(page).to have_text('Showing 1 to 10 of 52 dances') - expect(page).to have_button('<<', disabled: true) - expect(page).to have_button('<', disabled: true) - expect(page).to have_button('>') - expect(page).to have_button('>>') + expect(page).to have_turn_page_button('<<', disabled: true) + expect(page).to have_turn_page_button('<', disabled: true) + expect(page).to have_turn_page_button('>') + expect(page).to have_turn_page_button('>>') end it "page size select menu" do visit(s_path) - expect(page).to have_text("Page 1 of 6") + expect(page).to have_text("Showing 1 to 10 of 52 dances.") select('30') - expect(page).to have_text("Page 1 of 2") - click_on '>' + expect(page).to have_text("Showing 1 to 30 of 52 dances.") + page.find(turn_page_button_css('>')).click + expect(page).to have_text("Showing 31 to 52 of 52 dances.") (dances.length-30).times do |i| expect(page).to have_link("dance-#{i+30}.") end From 30782e205511d65a8652cc1b000e15935db550ef Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 8 Dec 2019 12:24:33 -0600 Subject: [PATCH 055/103] wip on styling table bottom pagination controls --- app/assets/stylesheets/welcome.scss | 2 + app/javascript/dance-table.tsx | 131 ++++++++++++++++------------ 2 files changed, 75 insertions(+), 58 deletions(-) diff --git a/app/assets/stylesheets/welcome.scss b/app/assets/stylesheets/welcome.scss index c4975852..cbe3f004 100644 --- a/app/assets/stylesheets/welcome.scss +++ b/app/assets/stylesheets/welcome.scss @@ -152,6 +152,8 @@ select.chooser-argument { .pagination { @extend .btn-group; + margin-top: 0; + margin-bottom: 0; } .flipped-glyphicon { diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index 2790b990..4a40f647 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -15,10 +15,10 @@ function PaginationSentence({ isFiltered: boolean }) { return ( -
+ Showing {pageOffset + 1} to {pageOffset + pageCount} of {matchCount}{" "} {isFiltered && "filtered"} dances. -
+
) } @@ -102,63 +102,78 @@ function Table({ })}
- -
- { - gotoPage(0) - }} - isDisabled={!canPreviousPage} - label="<<" - />{" "} - {" "} - {" "} - { - gotoPage(pageCount - 1) - }} - isDisabled={!canNextPage} - label=">>" - />{" "} - - Go to page:{" "} - gotoPage(n - 1)} - inputProperties={{ - className: "page-number-entry", - style: { width: "100px" }, - }} +
+
+ - {" "} - +
+
+
+ +
+
+
+
+ {" "} +
+
+
+
+ { + gotoPage(0) + }} + isDisabled={!canPreviousPage} + label="<<" + />{" "} + {" "} + {" "} + { + gotoPage(pageCount - 1) + }} + isDisabled={!canNextPage} + label=">>" + /> +
+
) From d3307f796147ac364a8b37f1a27831c05fe0b185 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 8 Dec 2019 18:33:55 -0600 Subject: [PATCH 056/103] flexbox styling table bottom pagination controls --- app/assets/stylesheets/welcome.scss | 7 ++++ app/javascript/dance-table.tsx | 64 ++++++++++++++--------------- 2 files changed, 37 insertions(+), 34 deletions(-) diff --git a/app/assets/stylesheets/welcome.scss b/app/assets/stylesheets/welcome.scss index cbe3f004..6d77b807 100644 --- a/app/assets/stylesheets/welcome.scss +++ b/app/assets/stylesheets/welcome.scss @@ -159,3 +159,10 @@ select.chooser-argument { .flipped-glyphicon { transform: scaleX(-1); } + +.dance-table-footer { + display: flex; + justify-content: space-between; + align-items: baseline; + flex-wrap: wrap; +} diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index 4a40f647..083074b0 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -102,8 +102,8 @@ function Table({ })} -
-
+
+
-
-
- -
+
+
-
-
- {" "} -
+
+ {" "}
-
+
{ From edf9a952b4cd115f4bf5e2f460204638a8c14d36 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 8 Dec 2019 21:15:20 -0600 Subject: [PATCH 057/103] add test for column sorting --- spec/features/welcome/search_spec.rb | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/spec/features/welcome/search_spec.rb b/spec/features/welcome/search_spec.rb index fef64e17..d2d2b0b1 100644 --- a/spec/features/welcome/search_spec.rb +++ b/spec/features/welcome/search_spec.rb @@ -162,6 +162,22 @@ def turn_page_button_css(label, disabled=false) dbsize.times.map {|i| FactoryGirl.create(:dance, created_at: now - i.hours)} visit(s_path) expect(page).to have_content("Showing 1 to 10 of #{dbsize} dances.") - # TODO add more tests around changing the offset and count + end + + describe "sorting" do + let (:shuffled_ints) { [7, 0, 10, 8, 9, 2, 11, 6, 3, 5, 1, 4] } + let (:dances) { shuffled_ints.map.with_index {|shuffled_int, i| FactoryGirl.create(:dance, title: "dance-#{shuffled_int.to_s.rjust(2, '0')}", created_at: now - i.hours)} } + let (:dances_sorted) { dances.dup.sort_by(&:title) } + it "clicking a header displays that column in descending order" do + dances + visit(s_path) + find('th', text: 'Title').click + dances_sorted.drop(10).each do |dance| + expect(page).to_not have_text(dance.title) + end + # have the dances in order dance-00, dance-01, ... dance-09 + first_ten_dances_titles_regex = Regexp.new(dances_sorted.take(10).map(&:title).join('[^..]*')) + expect(page).to have_text(first_ten_dances_titles_regex) + end end end From e8b63e2adf48208f6ee85cc221bd2ce30698297a Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sat, 14 Dec 2019 16:36:46 -0600 Subject: [PATCH 058/103] WIP column sorting --- app/javascript/dance-table.tsx | 47 +++++++++++++++----- app/javascript/types/react-table-config.d.ts | 24 +++++----- 2 files changed, 47 insertions(+), 24 deletions(-) diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index 083074b0..aaed9691 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -1,6 +1,6 @@ import * as React from "react" import { useState, useEffect, useMemo, useCallback } from "react" -import { useTable, usePagination } from "react-table" +import { useTable, usePagination, useSortBy } from "react-table" import { NaturalNumberEditor } from "./natural-number-editor" function PaginationSentence({ @@ -22,22 +22,42 @@ function PaginationSentence({ ) } +type SortByElement = + | "title" + | "choreographer_name" + | "user_name" + | "created_at" + | "updated_at" + +type SortBy = SortByElement + function Table({ columns, dancesGetJson, fetchData, loading, pageCount: controlledPageCount, + initialSortBy, // = 'title' + onSortByChange, }: { columns: any dancesGetJson: DancesGetJson fetchData: Function loading: boolean pageCount: number + initialSortBy: any // SortBy + onSortByChange: (sortBy: any) => void }) { // const tableState = useTableState({ pageIndex: 0 }) // const [{ pageIndex, pageSize }] = tableState + const tableOptions = { + columns, + data: dancesGetJson.dances, + manualPagination: true, + pageCount: controlledPageCount, + initialState: { sortBy: initialSortBy }, + } const { getTableProps, headerGroups, @@ -55,15 +75,8 @@ function Table({ rows, pageIndex, pageSize, - } = useTable( - { - columns, - data: dancesGetJson.dances, - manualPagination: true, - pageCount: controlledPageCount, - }, - usePagination - ) + state: { sortBy }, + } = useTable(tableOptions, useSortBy, usePagination) // again, need to worry about the return value of this first arg to useEffect useEffect(() => fetchData({ pageIndex, pageSize }), [ @@ -84,7 +97,17 @@ function Table({ {headerGroups.map(headerGroup => ( {headerGroup.headers.map(column => ( - {column.render("Header")} + + {column.render("Header")} + {/* Add a sort direction indicator */} + + {column.isSorted + ? column.isSortedDesc + ? " 🔽" + : " 🔼" + : ""} + + ))} ))} @@ -356,6 +379,8 @@ function DanceTable() { fetchData={fetchData} loading={loading} pageCount={pageCount} + initialSortBy={["title"]} + onSortByChange={x => console.log(x)} /> ) diff --git a/app/javascript/types/react-table-config.d.ts b/app/javascript/types/react-table-config.d.ts index c1593f48..5dfdfe76 100644 --- a/app/javascript/types/react-table-config.d.ts +++ b/app/javascript/types/react-table-config.d.ts @@ -42,10 +42,8 @@ import {} from "react-table" declare module "react-table" { // take this file as-is, or comment out the sections that don't apply to your plugin configuration - export interface TableOptions // UseExpandedOptions, // UseFiltersOptions, // UseGroupByOptions, // UsePaginationOptions, - extends // UseRowSelectOptions, - // UseSortByOptions, - // UseFiltersOptions, + export interface TableOptions // UseExpandedOptions, // UseFiltersOptions, // UseGroupByOptions, // UsePaginationOptions, // UseRowSelectOptions, // UseSortByOptions, + extends // UseFiltersOptions, // UseResizeColumnsOptions, // note that having Record here allows you to add anything to the options, this matches the spirit of the // underlying js library, but might be cleaner if it's replaced by a more specific type that matches your @@ -62,14 +60,14 @@ declare module "react-table" { // UseRowStateInstanceProps, // UseSortByInstanceProps - export interface TableState {} - // UseColumnOrderState, - // UseExpandedState, - // UseFiltersState, + export interface TableState + extends UseSortByState {} // UseGroupByState, + // UseFiltersState, + // UseExpandedState, + // UseColumnOrderState, // UsePaginationState, - // UseRowSelectState, - // UseSortByState {} + // UseRowSelectState export interface Column {} // UseFiltersColumnOptions, @@ -77,11 +75,11 @@ declare module "react-table" { // UseSortByColumnOptions, // UseResizeColumnsColumnOptions {} - export interface ColumnInstance {} + export interface ColumnInstance + extends UseSortByColumnProps {} // UseFiltersColumnProps, // UseGroupByColumnProps, - // UseSortByColumnProps, - // UseResizeColumnsHeaderProps {} + // UseResizeColumnsHeaderProps, export interface Cell {} // UseTableCellProps, From e1bdd3a4e078057114ed699810d63385426a29be Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 15 Dec 2019 06:48:43 -0600 Subject: [PATCH 059/103] sorting direction glyphicons --- app/javascript/dance-table.tsx | 35 +++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index aaed9691..93197dcf 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -98,15 +98,32 @@ function Table({ {headerGroup.headers.map(column => ( - {column.render("Header")} - {/* Add a sort direction indicator */} - - {column.isSorted - ? column.isSortedDesc - ? " 🔽" - : " 🔼" - : ""} - +
+ {column.render("Header")}{" "} + {/* Add a sort direction indicator */} + {column.isSorted ? ( + + ) : ( + + )} +
))} From 641dd842878b926ad30c1edfc5136a09eb750d80 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 15 Dec 2019 12:36:21 -0600 Subject: [PATCH 060/103] sort_parser (early version with its own array-of-openstructs return value) --- lib/sort_parser.rb | 20 ++++++++++++++++++++ spec/lib/sort_parser_spec.rb | 25 +++++++++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 lib/sort_parser.rb create mode 100644 spec/lib/sort_parser_spec.rb diff --git a/lib/sort_parser.rb b/lib/sort_parser.rb new file mode 100644 index 00000000..aff25248 --- /dev/null +++ b/lib/sort_parser.rb @@ -0,0 +1,20 @@ +module SortParser + def self.parse(p) + if p.match?(/\A([a-z_]+[AD])*\z/) + a = parse_valid(p) + a.empty? ? DEFAULT : a + else + raise "SortParser could not read #{p.inspect}" + end + end + + private + def self.parse_valid(p) + p.split(/(?<=[AD])/).map do |s| + column, a_or_d = s.match(/^([a-z_]*)([AD])$/).to_a.drop(1) + OpenStruct.new(column: column, ascending: a_or_d == 'A') + end + end + + DEFAULT = [OpenStruct.new(column: 'created_at', ascending: false)] +end diff --git a/spec/lib/sort_parser_spec.rb b/spec/lib/sort_parser_spec.rb new file mode 100644 index 00000000..c6122f2c --- /dev/null +++ b/spec/lib/sort_parser_spec.rb @@ -0,0 +1,25 @@ +require 'ostruct' +require 'spec_helper' +require 'sort_parser' + +describe SortParser do + describe 'parse' do + it 'works' do + expected = [ + OpenStruct.new(column: 'title', ascending: true), + OpenStruct.new(column: 'hook', ascending: false), + OpenStruct.new(column: 'choreographer_name', ascending: true), + ] + expect(SortParser.parse("titleAhookDchoreographer_nameA")).to eq(expected) + end + + it 'throws an error on bogus input' do + bogus = 'ti[tleA' + expect {SortParser.parse(bogus)}.to raise_error("SortParser could not read #{bogus.inspect}") + end + + it 'if the input is empty, returns a default' do + expect(SortParser.parse("")).to eq([OpenStruct.new(column: 'created_at', ascending: false)]) + end + end +end From 14d82a240c439c84276852fd9cd03fb60d50fec2 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Mon, 16 Dec 2019 08:52:46 -0600 Subject: [PATCH 061/103] mysteriously working sorting - what's with the console.log in onSortByChange? - needs code review --- app/controllers/api/v1/dances_controller.rb | 11 +++- app/javascript/dance-table.tsx | 57 +++++++++++-------- lib/filter_dances.rb | 9 ++- lib/sort_parser.rb | 23 ++++++-- spec/features/welcome/search_spec.rb | 44 ++++++++++++-- spec/javascript/dance-table.spec.tsx | 15 +++++ spec/lib/sort_parser_spec.rb | 47 ++++++++++++--- .../requests/api/v1/dances_controller_spec.rb | 14 ++++- 8 files changed, 175 insertions(+), 45 deletions(-) create mode 100644 spec/javascript/dance-table.spec.tsx diff --git a/app/controllers/api/v1/dances_controller.rb b/app/controllers/api/v1/dances_controller.rb index f375482f..a0b53fb7 100644 --- a/app/controllers/api/v1/dances_controller.rb +++ b/app/controllers/api/v1/dances_controller.rb @@ -1,8 +1,13 @@ require 'filter_dances' +require 'sort_parser' class Api::V1::DancesController < ApplicationController def index - render json: FilterDances.filter_dances(filter, count: count, offset: offset, dialect: dialect) + render json:FilterDances.filter_dances(filter, + count: count, + offset: offset, + dialect: dialect, + sort_by: sort_by) end private @@ -10,6 +15,10 @@ def filter ['figure', '*'] end + def sort_by + params[:sort_by] || "" + end + def count parseIntWithDefault(params[:count], 10) end diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index 93197dcf..1c4410af 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -22,14 +22,20 @@ function PaginationSentence({ ) } -type SortByElement = - | "title" - | "choreographer_name" - | "user_name" - | "created_at" - | "updated_at" +// see allso the type SortingRule +type SortByElement = { + id: string // "title" | "choreographer_name" | "hook" | "formation" | "user_name" | "created_at" | "updated_at" + desc?: boolean +} +export type SortBy = Array -type SortBy = SortByElement +export const sortByParam = (sortBy: SortBy): string => { + const x = sortBy + .map(sbe => (sbe.id ? sbe.id + (sbe.desc ? "D" : "A") : sbe + "A")) + .join("") + console.log(`sortByParam`, sortBy, " => ", x) + return x +} function Table({ columns, @@ -37,7 +43,7 @@ function Table({ fetchData, loading, pageCount: controlledPageCount, - initialSortBy, // = 'title' + initialSortBy, onSortByChange, }: { columns: any @@ -46,7 +52,7 @@ function Table({ loading: boolean pageCount: number initialSortBy: any // SortBy - onSortByChange: (sortBy: any) => void + onSortByChange: (sortBy: SortBy) => void }) { // const tableState = useTableState({ pageIndex: 0 }) // const [{ pageIndex, pageSize }] = tableState @@ -62,15 +68,15 @@ function Table({ getTableProps, headerGroups, prepareRow, - page, // new - canPreviousPage, // new - canNextPage, // new - pageOptions, // new - pageCount, // new - gotoPage, // new - nextPage, // new - previousPage, // new - setPageSize, // new + page, + canPreviousPage, + canNextPage, + pageOptions, + pageCount, + gotoPage, + nextPage, + previousPage, + setPageSize, getTableBodyProps, rows, pageIndex, @@ -79,10 +85,11 @@ function Table({ } = useTable(tableOptions, useSortBy, usePagination) // again, need to worry about the return value of this first arg to useEffect - useEffect(() => fetchData({ pageIndex, pageSize }), [ + useEffect(() => fetchData({ pageIndex, pageSize, sortBy }), [ fetchData, pageIndex, pageSize, + sortBy, ]) console.log("render table") @@ -258,7 +265,8 @@ interface DanceSearchResult { user_name: string created_at: string updated_at: string - figures?: string + publish: string // "myself" | "everyone" | "link" + figures: string } interface DancesGetJson { @@ -312,11 +320,12 @@ function DanceTable() { const [pageCount, setPageCount] = React.useState(0) const [loading, setLoading] = React.useState(false) - const fetchData = useCallback(({ pageSize, pageIndex }) => { + const fetchData = useCallback(({ pageSize, pageIndex, sortBy }) => { setLoading(true) async function fetchData() { - const url = `/api/v1/dances?count=${pageSize}&offset=${pageIndex * - pageSize}` + const offset = pageIndex * pageSize + const sort = sortByParam(sortBy) + const url = `/api/v1/dances?count=${pageSize}&offset=${offset}&sort_by=${sort}` console.log(`fetch("${url}")`) const response = await fetch(url) const json: DancesGetJson = await response.json() @@ -396,7 +405,7 @@ function DanceTable() { fetchData={fetchData} loading={loading} pageCount={pageCount} - initialSortBy={["title"]} + initialSortBy={[]} onSortByChange={x => console.log(x)} /> diff --git a/lib/filter_dances.rb b/lib/filter_dances.rb index bd015a05..1d9c2304 100644 --- a/lib/filter_dances.rb +++ b/lib/filter_dances.rb @@ -1,11 +1,16 @@ # coding: utf-8 require 'set' require 'search_match' +require 'sort_parser' module FilterDances - def self.filter_dances(filter, dialect:, count: 10, offset: 0) + def self.filter_dances(filter, + dialect:, + count: 10, + offset: 0, + sort_by: "") filter.is_a?(Array) or raise "filter must be an array, but got #{filter.inspect} of class #{filter.class}" - query = Dance.includes(:choreographer, :user).references(:choreographer, :user).order('dances.created_at DESC') + query = Dance.includes(:choreographer, :user).references(:choreographer, :user).order(*SortParser.parse(sort_by)) number_searched = 0 number_matching = 0 filter_results = [] diff --git a/lib/sort_parser.rb b/lib/sort_parser.rb index aff25248..41da2034 100644 --- a/lib/sort_parser.rb +++ b/lib/sort_parser.rb @@ -1,20 +1,35 @@ module SortParser def self.parse(p) - if p.match?(/\A([a-z_]+[AD])*\z/) + raise "unpossible" if p == ['title'] + if p.match?(/\A((?:title|choreographer_name|hook|formation|user_name|created_at|updated_at|publish)[AD])*\z/) a = parse_valid(p) a.empty? ? DEFAULT : a else raise "SortParser could not read #{p.inspect}" end end - + # "title", + # {hook: :desc}, + # Choreographer.arel_table[:name].desc private def self.parse_valid(p) p.split(/(?<=[AD])/).map do |s| column, a_or_d = s.match(/^([a-z_]*)([AD])$/).to_a.drop(1) - OpenStruct.new(column: column, ascending: a_or_d == 'A') + is_ascending = a_or_d == 'A' + case column + when 'choreographer_name' + is_ascending ? 'choreographers.name' : Choreographer.arel_table[:name].desc + when 'user_name' + is_ascending ? 'users.name' : User.arel_table[:name].desc + when 'formation' + is_ascending ? 'start_type' : {'start_type' => :desc} + when 'created_at', 'updated_at' + is_ascending ? "dances.#{column}" : Dance.arel_table[column.to_sym].desc + else + is_ascending ? column : {column => :desc} + end end end - DEFAULT = [OpenStruct.new(column: 'created_at', ascending: false)] + DEFAULT = [{created_at: :desc}] end diff --git a/spec/features/welcome/search_spec.rb b/spec/features/welcome/search_spec.rb index d2d2b0b1..e625b0cd 100644 --- a/spec/features/welcome/search_spec.rb +++ b/spec/features/welcome/search_spec.rb @@ -166,18 +166,52 @@ def turn_page_button_css(label, disabled=false) describe "sorting" do let (:shuffled_ints) { [7, 0, 10, 8, 9, 2, 11, 6, 3, 5, 1, 4] } - let (:dances) { shuffled_ints.map.with_index {|shuffled_int, i| FactoryGirl.create(:dance, title: "dance-#{shuffled_int.to_s.rjust(2, '0')}", created_at: now - i.hours)} } + let (:dances) { shuffled_ints.map.with_index {|shuffled_int, i| + FactoryGirl.create(:dance, title: "dance-#{shuffled_int.to_s.rjust(2, '0')}", created_at: now - i.hours) + }} let (:dances_sorted) { dances.dup.sort_by(&:title) } it "clicking a header displays that column in descending order" do dances visit(s_path) + dances.each_with_index do |dance, i| + expect(page).send(i < 10 ? :to : :to_not, have_text(dance.title)) + end + expect(page).to_not have_css('th .glyphicon-sort-by-attributes') + expect(page).to_not have_css('th .glyphicon-sort-by-attributes-alt') + unsorted_dances_titles_regex = Regexp.new(dances.take(10).map(&:title).join('.*\n')) + expect(page).to have_text(unsorted_dances_titles_regex) + + # first click makes it sort descending find('th', text: 'Title').click - dances_sorted.drop(10).each do |dance| - expect(page).to_not have_text(dance.title) + expect(page).to have_css('th .glyphicon-sort-by-attributes') + expect(page).to_not have_css('th .glyphicon-sort-by-attributes-alt') + dances_sorted.each_with_index do |dance, i| + expect(page).send(i < 10 ? :to : :to_not, have_text(dance.title)) end - # have the dances in order dance-00, dance-01, ... dance-09 - first_ten_dances_titles_regex = Regexp.new(dances_sorted.take(10).map(&:title).join('[^..]*')) + # we see we have the dances, but do we have them in order? dance-00, dance-01, ... dance-09 + first_ten_dances_titles_regex = Regexp.new(dances_sorted.take(10).map(&:title).join('.*\n')) expect(page).to have_text(first_ten_dances_titles_regex) + + # second click makes it sort ascending + find('th', text: 'Title').click + expect(page).to have_css('th .glyphicon-sort-by-attributes-alt') + expect(page).to_not have_css('th .glyphicon-sort-by-attributes') + dances_sorted.each_with_index do |dance, i| + expect(page).send(i >= dances.length-10 ? :to : :to_not, have_text(dance.title)) + end + # we see we have the dances, but do we have them in order? dance-12, dance-11, ... dance-02 + last_ten_dances_titles_regex = Regexp.new(dances_sorted.reverse.take(10).map(&:title).join('.*\n')) + expect(page).to have_text(last_ten_dances_titles_regex) + + # third click returns to default sort (which is by descending created_at) + find('th', text: 'Title').click + expect(page).to_not have_css('th .glyphicon-sort-by-attributes-alt') + expect(page).to_not have_css('th .glyphicon-sort-by-attributes') + page.save_screenshot('/tmp/foo.png') + dances.each_with_index do |dance, i| + expect(page).send(i < 10 ? :to : :to_not, have_text(dance.title)) + end + expect(page).to have_text(unsorted_dances_titles_regex) end end end diff --git a/spec/javascript/dance-table.spec.tsx b/spec/javascript/dance-table.spec.tsx new file mode 100644 index 00000000..7e92947a --- /dev/null +++ b/spec/javascript/dance-table.spec.tsx @@ -0,0 +1,15 @@ +import React from "react" +// import { render, fireEvent } from "@testing-library/react" + +import { sortByParam } from "../../app/javascript/dance-table" + +describe("sortByParam", () => { + it("works", () => { + const sortBy = [ + { id: "title" }, + { id: "choreographer_name", desc: false }, + { id: "hook", desc: true }, + ] + expect(sortByParam(sortBy)).toBe("titleAchoreographer_nameAhookD") + }) +}) diff --git a/spec/lib/sort_parser_spec.rb b/spec/lib/sort_parser_spec.rb index c6122f2c..aa203506 100644 --- a/spec/lib/sort_parser_spec.rb +++ b/spec/lib/sort_parser_spec.rb @@ -4,22 +4,55 @@ describe SortParser do describe 'parse' do - it 'works' do + it 'works part 1' do + input = "titleAhookDchoreographer_nameAuser_nameD" expected = [ - OpenStruct.new(column: 'title', ascending: true), - OpenStruct.new(column: 'hook', ascending: false), - OpenStruct.new(column: 'choreographer_name', ascending: true), + "title", + {"hook" => :desc}, + "choreographers.name", + User.arel_table[:name].desc ] - expect(SortParser.parse("titleAhookDchoreographer_nameA")).to eq(expected) + expect(SortParser.parse(input)).to eq(expected) end + it 'works part 2' do + input = "formationDchoreographer_nameDuser_nameApublishD" + expected = [ + {"start_type" => :desc}, + Choreographer.arel_table[:name].desc, + "users.name", + {"publish" => :desc} + ] + expect(SortParser.parse(input)).to eq(expected) + end + + describe "created_at and updated_at" do + it 'ascending' do + input = "created_atAupdated_atA" + expected = [ + "dances.created_at", + "dances.updated_at", + ] + expect(SortParser.parse(input)).to eq(expected) + end + + it 'descending' do + input = "created_atDupdated_atD" + expected = [ + Dance.arel_table[:created_at].desc, + Dance.arel_table[:updated_at].desc, + ] + expect(SortParser.parse(input)).to eq(expected) + end + + end it 'throws an error on bogus input' do - bogus = 'ti[tleA' + bogus = 'titlehookA' expect {SortParser.parse(bogus)}.to raise_error("SortParser could not read #{bogus.inspect}") end it 'if the input is empty, returns a default' do - expect(SortParser.parse("")).to eq([OpenStruct.new(column: 'created_at', ascending: false)]) + expect(SortParser.parse("")).to eq([{created_at: :desc}]) end end end diff --git a/spec/requests/api/v1/dances_controller_spec.rb b/spec/requests/api/v1/dances_controller_spec.rb index 236584da..82f17f7a 100644 --- a/spec/requests/api/v1/dances_controller_spec.rb +++ b/spec/requests/api/v1/dances_controller_spec.rb @@ -2,6 +2,7 @@ RSpec.describe Api::V1::DancesController do describe "GET #index" do + let (:now) { DateTime.now } it "returns json of all dances" do dance = FactoryGirl.create(:call_me) dance.reload @@ -30,8 +31,9 @@ it 'understands count and offset' do pageSize = 4 pages = 3 - now = DateTime.now - dances = (pages*pageSize).times.map {|i| FactoryGirl.create(:dance, title: "dance-#{i}", created_at: now - i.hours)} + dances = (pages*pageSize).times.map do |i| + FactoryGirl.create(:dance, title: "dance-#{i}", created_at: now - i.hours) + end pages.times do |pageIndex| pageSize.times do |rowIndex| get api_v1_dances_path(count: pageSize, offset: pageIndex*pageSize) @@ -46,6 +48,14 @@ end end + it 'understands sort' do + dances = "cab".chars.each_with_index.map do |char, i| + FactoryGirl.create(:dance, title: char*3, created_at: now - i.hours) + end + get api_v1_dances_path(sort_by: 'titleA') + dances_received = JSON.parse(response.body)['dances'] + expect(dances_received.map{|json| json['title']}).to eq(dances.dup.sort_by(&:title).map(&:title)) + end it 'only performs one query' From bac51eae88653387a91b4caa3c20c9a7175620fa Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Mon, 16 Dec 2019 17:42:03 -0600 Subject: [PATCH 062/103] remove unused onSortByChange --- app/javascript/dance-table.tsx | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index 1c4410af..3bafa52f 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -29,13 +29,10 @@ type SortByElement = { } export type SortBy = Array -export const sortByParam = (sortBy: SortBy): string => { - const x = sortBy +export const sortByParam = (sortBy: SortBy): string => + sortBy .map(sbe => (sbe.id ? sbe.id + (sbe.desc ? "D" : "A") : sbe + "A")) .join("") - console.log(`sortByParam`, sortBy, " => ", x) - return x -} function Table({ columns, @@ -44,7 +41,6 @@ function Table({ loading, pageCount: controlledPageCount, initialSortBy, - onSortByChange, }: { columns: any dancesGetJson: DancesGetJson @@ -52,7 +48,6 @@ function Table({ loading: boolean pageCount: number initialSortBy: any // SortBy - onSortByChange: (sortBy: SortBy) => void }) { // const tableState = useTableState({ pageIndex: 0 }) // const [{ pageIndex, pageSize }] = tableState @@ -326,7 +321,7 @@ function DanceTable() { const offset = pageIndex * pageSize const sort = sortByParam(sortBy) const url = `/api/v1/dances?count=${pageSize}&offset=${offset}&sort_by=${sort}` - console.log(`fetch("${url}")`) + console.log(`fetch("${url}")`, pageSize, pageIndex, sortBy) const response = await fetch(url) const json: DancesGetJson = await response.json() setDancesGetJson(json) @@ -406,7 +401,6 @@ function DanceTable() { loading={loading} pageCount={pageCount} initialSortBy={[]} - onSortByChange={x => console.log(x)} /> ) From 577c8a5ec737fb933ea0f5b4d7582e3fa991f2de Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Fri, 20 Dec 2019 21:50:08 -0600 Subject: [PATCH 063/103] add console.log --- app/javascript/dance-table.tsx | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index 3bafa52f..318c07ff 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -34,14 +34,7 @@ export const sortByParam = (sortBy: SortBy): string => .map(sbe => (sbe.id ? sbe.id + (sbe.desc ? "D" : "A") : sbe + "A")) .join("") -function Table({ - columns, - dancesGetJson, - fetchData, - loading, - pageCount: controlledPageCount, - initialSortBy, -}: { +function Table(args: { columns: any dancesGetJson: DancesGetJson fetchData: Function @@ -49,6 +42,14 @@ function Table({ pageCount: number initialSortBy: any // SortBy }) { + const { + columns, + dancesGetJson, + fetchData, + loading, + pageCount: controlledPageCount, + initialSortBy, + } = args // const tableState = useTableState({ pageIndex: 0 }) // const [{ pageIndex, pageSize }] = tableState @@ -87,7 +88,10 @@ function Table({ sortBy, ]) - console.log("render table") + console.log("render table", args) + if (dancesGetJson.numberMatching > 100) { + // debugger + } return ( <> @@ -317,7 +321,7 @@ function DanceTable() { const [loading, setLoading] = React.useState(false) const fetchData = useCallback(({ pageSize, pageIndex, sortBy }) => { setLoading(true) - async function fetchData() { + async function fetchData1() { const offset = pageIndex * pageSize const sort = sortByParam(sortBy) const url = `/api/v1/dances?count=${pageSize}&offset=${offset}&sort_by=${sort}` @@ -328,7 +332,7 @@ function DanceTable() { setPageCount(Math.ceil(json.numberMatching / pageSize)) setLoading(false) } - fetchData() + fetchData1() // maybe return in-use-ness to prevent a memory leak here? }, []) @@ -362,11 +366,8 @@ function DanceTable() { ) // const toggleTitleVisible = () => setTitleVisible(!titleVisible) const columns = useMemo( - () => - columnsArr.map((ca, i) => { - return { ...ca, show: () => visibleToggles[i] } - }), - visibleToggles + () => columnsArr.map((ca, i) => ({ ...ca, show: () => visibleToggles[i] })), + [visibleToggles] ) return ( From b154326a14230b1b92bb81032960c1736797e586 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Fri, 20 Dec 2019 21:51:30 -0600 Subject: [PATCH 064/103] add eslint --- .eslintignore | 2 + .eslintrc.js | 26 +++ package.json | 5 + yarn.lock | 507 ++++++++++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 527 insertions(+), 13 deletions(-) create mode 100644 .eslintignore create mode 100644 .eslintrc.js diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 00000000..022b9885 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,2 @@ +node_modules +vendor diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 00000000..43a0c3a8 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,26 @@ +module.exports = { + root: true, + parser: "@typescript-eslint/parser", + plugins: ["@typescript-eslint"], + extends: [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + "prettier", + ], + rules: { + "@typescript-eslint/member-delimiter-style": [ + "error", + { + multiline: { + delimiter: "none", + requireLast: true, + }, + singleline: { + delimiter: "semi", + requireLast: false, + }, + }, + ], + }, +} diff --git a/package.json b/package.json index da0f094f..18bea240 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,11 @@ "@testing-library/jest-dom": "^4.2.4", "@testing-library/react": "^9.3.2", "@types/jest": "^24.0.23", + "@typescript-eslint/eslint-plugin": "^2.12.0", + "@typescript-eslint/parser": "^2.12.0", + "eslint": "^6.8.0", + "eslint-config-prettier": "^6.7.0", + "eslint-plugin-react-hooks": "^2.3.0", "jest": "^24.8.0", "prettier": "1.18.2", "ts-jest": "^24.2.0", diff --git a/yarn.lock b/yarn.lock index 333f14a2..dc3c12e7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1018,6 +1018,11 @@ dependencies: "@babel/types" "^7.3.0" +"@types/eslint-visitor-keys@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" + integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== + "@types/events@*": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" @@ -1059,6 +1064,11 @@ dependencies: jest-diff "^24.3.0" +"@types/json-schema@^7.0.3": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636" + integrity sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A== + "@types/minimatch@*": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" @@ -1133,6 +1143,49 @@ dependencies: "@types/yargs-parser" "*" +"@typescript-eslint/eslint-plugin@^2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.12.0.tgz#0da7cbca7b24f4c6919e9eb31c704bfb126f90ad" + integrity sha512-1t4r9rpLuEwl3hgt90jY18wJHSyb0E3orVL3DaqwmpiSDHmHiSspVsvsFF78BJ/3NNG3qmeso836jpuBWYziAA== + dependencies: + "@typescript-eslint/experimental-utils" "2.12.0" + eslint-utils "^1.4.3" + functional-red-black-tree "^1.0.1" + regexpp "^3.0.0" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.12.0.tgz#e0a76ffb6293e058748408a191921e453c31d40d" + integrity sha512-jv4gYpw5N5BrWF3ntROvCuLe1IjRenLy5+U57J24NbPGwZFAjhnM45qpq0nDH1y/AZMb3Br25YiNVwyPbz6RkA== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/typescript-estree" "2.12.0" + eslint-scope "^5.0.0" + +"@typescript-eslint/parser@^2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.12.0.tgz#393f1604943a4ca570bb1a45bc8834e9b9158884" + integrity sha512-lPdkwpdzxEfjI8TyTzZqPatkrswLSVu4bqUgnB03fHSOwpC7KSerPgJRgIAf11UGNf7HKjJV6oaPZI4AghLU6g== + dependencies: + "@types/eslint-visitor-keys" "^1.0.0" + "@typescript-eslint/experimental-utils" "2.12.0" + "@typescript-eslint/typescript-estree" "2.12.0" + eslint-visitor-keys "^1.1.0" + +"@typescript-eslint/typescript-estree@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.12.0.tgz#bd9e547ccffd17dfab0c3ab0947c80c8e2eb914c" + integrity sha512-rGehVfjHEn8Frh9UW02ZZIfJs6SIIxIu/K1bbci8rFfDE/1lQ8krIJy5OXOV3DVnNdDPtoiPOdEANkLMrwXbiQ== + dependencies: + debug "^4.1.1" + eslint-visitor-keys "^1.1.0" + glob "^7.1.6" + is-glob "^4.0.1" + lodash.unescape "4.0.1" + semver "^6.3.0" + tsutils "^3.17.1" + "@webassemblyjs/ast@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" @@ -1315,6 +1368,11 @@ acorn-globals@^4.1.0: acorn "^6.0.1" acorn-walk "^6.0.1" +acorn-jsx@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" + integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== + acorn-walk@^6.0.1: version "6.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" @@ -1330,6 +1388,11 @@ acorn@^6.0.1, acorn@^6.2.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e" integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA== +acorn@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" + integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== + ajv-errors@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" @@ -1340,7 +1403,7 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== -ajv@^6.1.0, ajv@^6.10.2, ajv@^6.5.5: +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5: version "6.10.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== @@ -1370,6 +1433,13 @@ ansi-escapes@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== +ansi-escapes@^4.2.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.0.tgz#a4ce2b33d6b214b7950d8595c212f12ac9cc569d" + integrity sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg== + dependencies: + type-fest "^0.8.1" + ansi-html@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" @@ -1390,6 +1460,11 @@ ansi-regex@^4.0.0, ansi-regex@^4.1.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -2062,7 +2137,7 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@2.4.2, chalk@^2.0, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@2.4.2, chalk@^2.0, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2082,6 +2157,11 @@ chalk@^1.1.1: strip-ansi "^3.0.0" supports-color "^2.0.0" +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + chokidar@^2.0.2, chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" @@ -2136,6 +2216,18 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" @@ -2428,7 +2520,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" -cross-spawn@6.0.5, cross-spawn@^6.0.0: +cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -2726,7 +2818,7 @@ debug@^3.0.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6: dependencies: ms "^2.1.1" -debug@^4.1.0, debug@^4.1.1: +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== @@ -2897,6 +2989,13 @@ dns-txt@^2.0.2: dependencies: buffer-indexof "^1.0.0" +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + dom-serializer@0: version "0.2.1" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.1.tgz#13650c850daffea35d8b626a4cfc4d3a17643fdb" @@ -2988,6 +3087,11 @@ emoji-regex@^7.0.1: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" @@ -3089,6 +3193,18 @@ escodegen@^1.9.1: optionalDependencies: source-map "~0.6.1" +eslint-config-prettier@^6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.7.0.tgz#9a876952e12df2b284adbd3440994bf1f39dfbb9" + integrity sha512-FamQVKM3jjUVwhG4hEMnbtsq7xOIDm+SY5iBPfR8gKsJoAB2IQnNF+bk1+8Fy44Nq7PPJaLvkRxILYdJWoguKQ== + dependencies: + get-stdin "^6.0.0" + +eslint-plugin-react-hooks@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-2.3.0.tgz#53e073961f1f5ccf8dd19558036c1fac8c29d99a" + integrity sha512-gLKCa52G4ee7uXzdLiorca7JIQZPPXRAQDXV83J4bUEeUuc5pIEyZYAZ45Xnxe5IuupxEqHS+hUhSLIimK1EMw== + eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" @@ -3097,6 +3213,78 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" +eslint-scope@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" + integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" + integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== + +eslint@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" + integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.10.0" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^5.0.0" + eslint-utils "^1.4.3" + eslint-visitor-keys "^1.1.0" + espree "^6.1.2" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^7.0.0" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.14" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.3" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^6.1.2" + strip-ansi "^5.2.0" + strip-json-comments "^3.0.1" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" + integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA== + dependencies: + acorn "^7.1.0" + acorn-jsx "^5.1.0" + eslint-visitor-keys "^1.1.0" + esprima@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" @@ -3107,6 +3295,13 @@ esprima@^4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== +esquery@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== + dependencies: + estraverse "^4.0.0" + esrecurse@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" @@ -3114,7 +3309,7 @@ esrecurse@^4.1.0: dependencies: estraverse "^4.1.0" -estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== @@ -3265,6 +3460,15 @@ extend@~3.0.2: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -3299,7 +3503,7 @@ fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= -fast-levenshtein@~2.0.4: +fast-levenshtein@~2.0.4, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= @@ -3330,6 +3534,20 @@ figgy-pudding@^3.5.1: resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== +figures@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec" + integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + file-loader@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-3.0.1.tgz#f8e0ba0b599918b51adfe45d66d1e771ad560faa" @@ -3402,6 +3620,15 @@ findup-sync@3.0.0: micromatch "^3.0.4" resolve-dir "^1.0.1" +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + flatted@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" @@ -3516,6 +3743,11 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -3552,6 +3784,11 @@ get-stdin@^4.0.1: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= +get-stdin@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" + integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== + get-stream@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -3579,6 +3816,13 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" +glob-parent@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" + integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + dependencies: + is-glob "^4.0.1" + glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@~7.1.1: version "7.1.5" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.5.tgz#6714c69bee20f3c3e64c4dd905553e532b40cdc0" @@ -3591,6 +3835,18 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, gl once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + global-modules@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" @@ -3632,6 +3888,13 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +globals@^12.1.0: + version "12.3.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.3.0.tgz#1e564ee5c4dded2ab098b0f88f24702a3c56be13" + integrity sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw== + dependencies: + type-fest "^0.8.1" + globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" @@ -3905,7 +4168,7 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -iconv-lite@0.4.24, iconv-lite@^0.4.4: +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== @@ -3941,6 +4204,11 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + import-cwd@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" @@ -3956,6 +4224,14 @@ import-fresh@^2.0.0: caller-path "^2.0.0" resolve-from "^3.0.0" +import-fresh@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + import-from@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" @@ -4031,6 +4307,25 @@ ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== +inquirer@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.1.tgz#13f7980eedc73c689feff3994b109c4e799c6ebb" + integrity sha512-V1FFQ3TIO15det8PijPLFR9M9baSlnRs9nL7zWu1MNVA2T9YVl9ZbrHJhYs7e9X8jeMZ3lr2JH/rdHFgNCBdYw== + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.2" + cli-cursor "^3.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.2.0" + rxjs "^6.5.3" + string-width "^4.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + internal-ip@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" @@ -4234,6 +4529,11 @@ is-fullwidth-code-point@^2.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + is-generator-fn@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" @@ -4246,7 +4546,7 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" -is-glob@^4.0.0: +is-glob@^4.0.0, is-glob@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== @@ -4301,6 +4601,11 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + is-regex@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" @@ -4863,6 +5168,11 @@ json-schema@0.2.3: resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -4963,7 +5273,7 @@ leven@^3.1.0: resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== -levn@~0.3.0: +levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= @@ -5054,6 +5364,11 @@ lodash.templatesettings@^4.0.0: dependencies: lodash._reinterpolate "^3.0.0" +lodash.unescape@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" + integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw= + lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" @@ -5290,7 +5605,7 @@ mime@^2.4.4: resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== -mimic-fn@^2.0.0: +mimic-fn@^2.0.0, mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== @@ -5428,6 +5743,11 @@ multicast-dns@^6.0.1: dns-packet "^1.3.1" thunky "^1.0.2" +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + namor@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/namor/-/namor-1.1.3.tgz#e7b2a94d7e6e9b7438a3db10314fe0fded6b96c1" @@ -5812,6 +6132,13 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" +onetime@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" + integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== + dependencies: + mimic-fn "^2.1.0" + opn@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" @@ -5847,6 +6174,18 @@ optionator@^0.8.1: type-check "~0.3.2" wordwrap "~1.0.0" +optionator@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + original@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" @@ -5880,7 +6219,7 @@ os-locale@^3.0.0, os-locale@^3.1.0: lcid "^2.0.0" mem "^4.0.0" -os-tmpdir@^1.0.0: +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= @@ -5965,6 +6304,13 @@ parallel-transform@^1.1.0: inherits "^2.0.3" readable-stream "^2.1.5" +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + parse-asn1@^5.0.0: version "5.1.5" resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" @@ -6852,6 +7198,11 @@ process@^0.11.10: resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" @@ -7190,6 +7541,16 @@ regexp.prototype.flags@^1.2.0: dependencies: define-properties "^1.1.2" +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + +regexpp@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" + integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g== + regexpu-core@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6" @@ -7318,6 +7679,11 @@ resolve-from@^3.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" integrity sha1-six699nWiBvItuZTM17rywoYh0g= +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -7342,6 +7708,14 @@ resolve@^1.1.7, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.8.1: dependencies: path-parse "^1.0.6" +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -7369,6 +7743,13 @@ rimraf@2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: dependencies: glob "^7.1.3" +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -7382,6 +7763,13 @@ rsvp@^4.8.4: resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= + dependencies: + is-promise "^2.1.0" + run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" @@ -7389,6 +7777,13 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" +rxjs@^6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" + integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== + dependencies: + tslib "^1.9.0" + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -7494,7 +7889,7 @@ selfsigned@^1.10.7: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: +semver@^6.0.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -7635,6 +8030,15 @@ slash@^2.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -7935,6 +8339,15 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" +string-width@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + string.prototype.trimleft@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz#6cc47f0d7eb8d62b0f3701611715a3954591d634" @@ -7986,6 +8399,13 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -8017,6 +8437,11 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" +strip-json-comments@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" + integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== + strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -8082,6 +8507,16 @@ symbol-tree@^3.2.2: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== +table@^5.2.3: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" @@ -8143,6 +8578,11 @@ test-exclude@^5.2.3: read-pkg-up "^4.0.0" require-main-filename "^2.0.0" +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + throat@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" @@ -8156,6 +8596,11 @@ through2@^2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + thunky@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" @@ -8173,6 +8618,13 @@ timsort@^0.3.0: resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" @@ -8292,11 +8744,18 @@ ts-pnp@^1.1.2: resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.4.tgz#ae27126960ebaefb874c6d7fa4729729ab200d90" integrity sha512-1J/vefLC+BWSo+qe8OnJQfWTYRS6ingxjwqmHMqaMxXMj7kFtKLgAaYW3JeX3mktjgUL+etlU8/B4VUAUI9QGw== -tslib@^1.9.0: +tslib@^1.8.1, tslib@^1.9.0: version "1.10.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== +tsutils@^3.17.1: + version "3.17.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" + integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== + dependencies: + tslib "^1.8.1" + tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" @@ -8321,6 +8780,11 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -8502,6 +8966,11 @@ v8-compile-cache@2.0.3: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe" integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w== +v8-compile-cache@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" + integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== + validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -8767,6 +9236,11 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" @@ -8815,6 +9289,13 @@ write-file-atomic@2.4.1: imurmurhash "^0.1.4" signal-exit "^3.0.2" +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + ws@^5.2.0: version "5.2.2" resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" From da82bea5d45e8a3e1a421563e4a5604286c39dd2 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sat, 21 Dec 2019 07:28:57 -0600 Subject: [PATCH 065/103] fix some eslint issues in dance-table.tsx --- .eslintrc.js | 29 +++++++ app/javascript/dance-table.tsx | 39 +++++----- package.json | 1 + yarn.lock | 135 +++++++++++++++++++++++++++++++++ 4 files changed, 182 insertions(+), 22 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 43a0c3a8..6985fd8a 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,9 +1,17 @@ module.exports = { root: true, parser: "@typescript-eslint/parser", + parserOptions: { + ecmaVersion: 2018, + sourceType: "module", + ecmaFeatures: { + jsx: true, + }, + }, plugins: ["@typescript-eslint"], extends: [ "eslint:recommended", + "plugin:react/recommended", "plugin:@typescript-eslint/eslint-recommended", "plugin:@typescript-eslint/recommended", "prettier", @@ -22,5 +30,26 @@ module.exports = { }, }, ], + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/explicit-function-return-type": "off", + }, + overrides: [ + { + files: ["*.ts", "*.tsx"], + rules: { + "@typescript-eslint/explicit-function-return-type": [ + "error", + { + allowExpressions: true, + allowTypedFunctionExpressions: true, + }, + ], + }, + }, + ], + settings: { + react: { + version: "detect", + }, }, } diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index 318c07ff..b62e4209 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -13,7 +13,7 @@ function PaginationSentence({ pageCount: number matchCount: number isFiltered: boolean -}) { +}): JSX.Element { return ( Showing {pageOffset + 1} to {pageOffset + pageCount} of {matchCount}{" "} @@ -41,7 +41,7 @@ function Table(args: { loading: boolean pageCount: number initialSortBy: any // SortBy -}) { +}): JSX.Element { const { columns, dancesGetJson, @@ -64,10 +64,8 @@ function Table(args: { getTableProps, headerGroups, prepareRow, - page, canPreviousPage, canNextPage, - pageOptions, pageCount, gotoPage, nextPage, @@ -136,7 +134,7 @@ function Table(args: { ))} - {rows.map((row, i) => { + {rows.map(row => { prepareRow(row) return ( @@ -233,7 +231,7 @@ function TurnPageButton({ isDisabled?: boolean // glyphicon: string // iconIsFlipped?: boolean -}) { +}): JSX.Element { let glyphicon: string if (label === "<<") glyphicon = "glyphicon-fast-backward" else if (label === "<" || label === ">") glyphicon = "glyphicon-play" @@ -275,14 +273,14 @@ interface DancesGetJson { } // TODO: use rails route helpers -const choreographerPath = (cid: number) => { +const choreographerPath = (cid: number): string => { return "/choreographers/" + cid } -const dancePath = (dance_id: number) => { - return "/dances/" + dance_id +const dancePath = (danceId: number): string => { + return "/dances/" + danceId } -const ChoreographerCell = (props: any) => { +const ChoreographerCell = (props: any): JSX.Element => { const values: DanceSearchResult = props.row.original // shouldn't I be looking at props.row.values? It only has the accessor'd field in the column definition. return ( @@ -291,12 +289,12 @@ const ChoreographerCell = (props: any) => { ) } -const DanceTitleCell = (props: any) => { +const DanceTitleCell = (props: any): JSX.Element => { const values: DanceSearchResult = props.row.original // shouldn't I be looking at props.row.values? It only has the accessor'd field in the column definition. return {values.title} } -const MatchingFiguresHtmlCell = (props: any) => ( +const MatchingFiguresHtmlCell = (props: any): JSX.Element => (
( /> ) -function DanceTable() { - const offset = 0 +function DanceTable(): JSX.Element { const [dancesGetJson, setDancesGetJson] = useState({ dances: [] as DanceSearchResult[], numberSearched: 0, numberMatching: 0, }) - const { - dances, - numberSearched, - numberMatching, - }: DancesGetJson = dancesGetJson const [pageCount, setPageCount] = React.useState(0) const [loading, setLoading] = React.useState(false) const fetchData = useCallback(({ pageSize, pageIndex, sortBy }) => { setLoading(true) - async function fetchData1() { + async function fetchData1(): Promise { const offset = pageIndex * pageSize const sort = sortByParam(sortBy) const url = `/api/v1/dances?count=${pageSize}&offset=${offset}&sort_by=${sort}` @@ -362,7 +354,9 @@ function DanceTable() { }, ] const [visibleToggles, setVisibleToggles] = useState( - columnsArr.map(ca => ca.show || !ca.hasOwnProperty("show")) + columnsArr.map( + ca => ca.show || !Object.prototype.hasOwnProperty.call(ca, "show") + ) ) // const toggleTitleVisible = () => setTitleVisible(!titleVisible) const columns = useMemo( @@ -376,10 +370,11 @@ function DanceTable() {
{columnsArr.map((ca, i) => { - const toggleVisFn = () => + const toggleVisFn = (): void => { setVisibleToggles( visibleToggles.map((vis, j) => (i === j) !== vis) ) + } const toggleVisClass = visibleToggles[i] ? "toggle-vis-active" : "toggle-vis-inactive" diff --git a/package.json b/package.json index 18bea240..bfb49302 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "@typescript-eslint/parser": "^2.12.0", "eslint": "^6.8.0", "eslint-config-prettier": "^6.7.0", + "eslint-plugin-react": "^7.17.0", "eslint-plugin-react-hooks": "^2.3.0", "jest": "^24.8.0", "prettier": "1.18.2", diff --git a/yarn.lock b/yarn.lock index dc3c12e7..be1e5e0d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1548,6 +1548,14 @@ array-flatten@^2.1.0: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== +array-includes@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.0.tgz#48a929ef4c6bb1fa6dc4a92c9b023a261b0ca404" + integrity sha512-ONOEQoKrvXPKk7Su92Co0YMqYO32FfqJTzkKU9u2UpIXyYZIzLSvpdg4AwvSw4mSUW0czu6inK+zby6Oj6gDjQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.0" + array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -2989,6 +2997,13 @@ dns-txt@^2.0.2: dependencies: buffer-indexof "^1.0.0" +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + doctrine@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" @@ -3162,6 +3177,23 @@ es-abstract@^1.12.0, es-abstract@^1.5.1: string.prototype.trimleft "^2.1.0" string.prototype.trimright "^2.1.0" +es-abstract@^1.17.0-next.0, es-abstract@^1.17.0-next.1: + version "1.17.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.0.tgz#f42a517d0036a5591dbb2c463591dc8bb50309b1" + integrity sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.1.5" + is-regex "^1.0.5" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimleft "^2.1.1" + string.prototype.trimright "^2.1.1" + es-to-primitive@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" @@ -3171,6 +3203,15 @@ es-to-primitive@^1.2.0: is-date-object "^1.0.1" is-symbol "^1.0.2" +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -3200,11 +3241,32 @@ eslint-config-prettier@^6.7.0: dependencies: get-stdin "^6.0.0" +eslint-plugin-eslint-plugin@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-plugin/-/eslint-plugin-eslint-plugin-2.1.0.tgz#a7a00f15a886957d855feacaafee264f039e62d5" + integrity sha512-kT3A/ZJftt28gbl/Cv04qezb/NQ1dwYIbi8lyf806XMxkus7DvOVCLIfTXMrorp322Pnoez7+zabXH29tADIDg== + eslint-plugin-react-hooks@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-2.3.0.tgz#53e073961f1f5ccf8dd19558036c1fac8c29d99a" integrity sha512-gLKCa52G4ee7uXzdLiorca7JIQZPPXRAQDXV83J4bUEeUuc5pIEyZYAZ45Xnxe5IuupxEqHS+hUhSLIimK1EMw== +eslint-plugin-react@^7.17.0: + version "7.17.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.17.0.tgz#a31b3e134b76046abe3cd278e7482bd35a1d12d7" + integrity sha512-ODB7yg6lxhBVMeiH1c7E95FLD4E/TwmFjltiU+ethv7KPdCwgiFuOZg9zNRHyufStTDLl/dEFqI2Q1VPmCd78A== + dependencies: + array-includes "^3.0.3" + doctrine "^2.1.0" + eslint-plugin-eslint-plugin "^2.1.0" + has "^1.0.3" + jsx-ast-utils "^2.2.3" + object.entries "^1.1.0" + object.fromentries "^2.0.1" + object.values "^1.1.0" + prop-types "^15.7.2" + resolve "^1.13.1" + eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" @@ -3971,6 +4033,11 @@ has-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= +has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -4432,6 +4499,11 @@ is-callable@^1.1.4: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== +is-callable@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" + integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== + is-ci@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" @@ -4613,6 +4685,13 @@ is-regex@^1.0.4: dependencies: has "^1.0.1" +is-regex@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" + integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== + dependencies: + has "^1.0.3" + is-resolvable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" @@ -5207,6 +5286,14 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +jsx-ast-utils@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz#8a9364e402448a3ce7f14d357738310d9248054f" + integrity sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA== + dependencies: + array-includes "^3.0.3" + object.assign "^4.1.0" + killable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" @@ -6056,6 +6143,11 @@ object-inspect@^1.6.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== +object-inspect@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== + object-is@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.1.tgz#0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b6" @@ -6083,6 +6175,26 @@ object.assign@^4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" +object.entries@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.1.tgz#ee1cf04153de02bb093fec33683900f57ce5399b" + integrity sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + +object.fromentries@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" + integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + object.getownpropertydescriptors@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" @@ -7708,6 +7820,13 @@ resolve@^1.1.7, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.8.1: dependencies: path-parse "^1.0.6" +resolve@^1.13.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.14.1.tgz#9e018c540fcf0c427d678b9931cbf45e984bcaff" + integrity sha512-fn5Wobh4cxbLzuHaE+nphztHy43/b++4M6SsGFC2gB8uYwf0C8LcarfCz1un7UTW8OFQg9iNjZ4xpcFVGebDPg== + dependencies: + path-parse "^1.0.6" + restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -8356,6 +8475,14 @@ string.prototype.trimleft@^2.1.0: define-properties "^1.1.3" function-bind "^1.1.1" +string.prototype.trimleft@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" + integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + string.prototype.trimright@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz#669d164be9df9b6f7559fa8e89945b168a5a6c58" @@ -8364,6 +8491,14 @@ string.prototype.trimright@^2.1.0: define-properties "^1.1.3" function-bind "^1.1.1" +string.prototype.trimright@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" + integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" From 7c48c5fdb9a8457faa16b4e3b11e5932ffa97f3b Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sat, 21 Dec 2019 09:30:03 -0600 Subject: [PATCH 066/103] abstract DanceTableThLabel into component --- app/javascript/dance-table.tsx | 63 +++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 27 deletions(-) diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index b62e4209..32749638 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -1,6 +1,6 @@ import * as React from "react" import { useState, useEffect, useMemo, useCallback } from "react" -import { useTable, usePagination, useSortBy } from "react-table" +import { useTable, usePagination, useSortBy, ColumnInstance } from "react-table" import { NaturalNumberEditor } from "./natural-number-editor" function PaginationSentence({ @@ -22,6 +22,40 @@ function PaginationSentence({ ) } +function DanceTableThLabel({ + column, +}: { + column: ColumnInstance +}): JSX.Element { + return ( +
+ {column.render("Header")} {/* Add a sort direction indicator */} + {column.isSorted ? ( + + ) : ( + + )} +
+ ) +} + // see allso the type SortingRule type SortByElement = { id: string // "title" | "choreographer_name" | "hook" | "formation" | "user_name" | "created_at" | "updated_at" @@ -102,32 +136,7 @@ function Table(args: { {headerGroup.headers.map(column => ( -
- {column.render("Header")}{" "} - {/* Add a sort direction indicator */} - {column.isSorted ? ( - - ) : ( - - )} -
+ ))} From 50daadcd2df52aa1c4fc4b2069a9fb90dc8bbf6d Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sat, 21 Dec 2019 09:30:33 -0600 Subject: [PATCH 067/103] configure react-hooks eslint --- .eslintrc.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.eslintrc.js b/.eslintrc.js index 6985fd8a..ccfcf30e 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -8,7 +8,7 @@ module.exports = { jsx: true, }, }, - plugins: ["@typescript-eslint"], + plugins: ["@typescript-eslint", "react-hooks"], extends: [ "eslint:recommended", "plugin:react/recommended", @@ -32,6 +32,8 @@ module.exports = { ], "@typescript-eslint/no-explicit-any": "off", "@typescript-eslint/explicit-function-return-type": "off", + "react-hooks/rules-of-hooks": "error", + "react-hooks/exhaustive-deps": "warn", }, overrides: [ { From eb8a64962456e358b803b68b87d2e176c297891d Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sat, 21 Dec 2019 09:43:07 -0600 Subject: [PATCH 068/103] update README.md 'testing' section with more information about linting --- README.md | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 79db2037..83a5a0b2 100644 --- a/README.md +++ b/README.md @@ -54,8 +54,23 @@ Then: ``` bin/rspec ``` -will run ruby tests. +will run lots of ruby tests. + + ``` yarn test ``` -will run js tests +will run a few js tests. + + +``` +yarn eslint app/javascript/dance-table.tsx +``` +will run the js linter on `app/javascript/dance-table.tsx`. This is currently the only file that is even remotely lintable. + + +``` +yarn run tsc --watch +``` +This will run the typescript compiler - for some reason ts compile errors don't stop the main build, so I keep an eye on this. +Unfortunately, it barfs compilation artifacts in the soruce tree. If those are the only new files, I carefully clean them with `git clean -fd`. \ No newline at end of file From 5bda32db6a5d3e74d189ea9af2fbc768b4190dfa Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sat, 21 Dec 2019 10:13:20 -0600 Subject: [PATCH 069/103] fix react hooks linter issue by busting columnsArr out to global scope --- app/javascript/dance-table.tsx | 67 ++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 31 deletions(-) diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index 32749638..631e7693 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -147,9 +147,9 @@ function Table(args: { prepareRow(row) return ( - {row.cells.map(cell => { - return {cell.render("Cell")} - })} + {row.cells.map(cell => ( + {cell.render("Cell")} + ))} ) })} @@ -311,6 +311,38 @@ const MatchingFiguresHtmlCell = (props: any): JSX.Element => ( /> ) +const columnsArr: Array<{ + Header: string + accessor: string + Cell?: (props: any) => JSX.Element + show: boolean +}> = [ + { + Header: "Title", + accessor: "title", + Cell: DanceTitleCell, + show: true, + }, + { + Header: "Choreographer", + accessor: "choreographer_name", + Cell: ChoreographerCell, + show: true, + }, + { Header: "Hook", accessor: "hook", show: true }, + { Header: "Formation", accessor: "formation", show: true }, + { Header: "User", accessor: "user_name", show: true }, + { Header: "Entered", accessor: "created_at", show: true }, + { Header: "Updated", accessor: "updated_at", show: false }, + { Header: "Sharing", accessor: "publish", show: false }, + { + Header: "Figures", + accessor: "matching_figures_html", + show: false, + Cell: MatchingFiguresHtmlCell, + }, +] + function DanceTable(): JSX.Element { const [dancesGetJson, setDancesGetJson] = useState({ dances: [] as DanceSearchResult[], @@ -337,35 +369,8 @@ function DanceTable(): JSX.Element { // maybe return in-use-ness to prevent a memory leak here? }, []) - const columnsArr = [ - { - Header: "Title", - accessor: "title", - Cell: DanceTitleCell, - // show: () => titleVisible, - }, - { - Header: "Choreographer", - accessor: "choreographer_name", - Cell: ChoreographerCell, - }, - { Header: "Hook", accessor: "hook" }, - { Header: "Formation", accessor: "formation" }, - { Header: "User", accessor: "user_name" }, - { Header: "Entered", accessor: "created_at" }, - { Header: "Updated", accessor: "updated_at", show: false }, - { Header: "Sharing", accessor: "publish", show: false }, - { - Header: "Figures", - accessor: "matching_figures_html", - show: false, - Cell: MatchingFiguresHtmlCell, - }, - ] const [visibleToggles, setVisibleToggles] = useState( - columnsArr.map( - ca => ca.show || !Object.prototype.hasOwnProperty.call(ca, "show") - ) + columnsArr.map(ca => ca.show) ) // const toggleTitleVisible = () => setTitleVisible(!titleVisible) const columns = useMemo( From c8c775880e0e1b08c6f49259dacf5c6a5e8cc864 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sat, 21 Dec 2019 11:27:42 -0600 Subject: [PATCH 070/103] add loading indicator to dance table --- app/assets/stylesheets/welcome.scss | 12 ++++++++++++ app/javascript/dance-table.tsx | 1 + 2 files changed, 13 insertions(+) diff --git a/app/assets/stylesheets/welcome.scss b/app/assets/stylesheets/welcome.scss index 6d77b807..d0671af9 100644 --- a/app/assets/stylesheets/welcome.scss +++ b/app/assets/stylesheets/welcome.scss @@ -166,3 +166,15 @@ select.chooser-argument { align-items: baseline; flex-wrap: wrap; } + +.floating-loading-indicator { + background-color: rgba(255, 255, 255, 0.5); + font-size: 300%; + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + padding: 0.5em; + border-radius: 0.5em; + border: 3px dashed black; +} diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index 631e7693..36d45508 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -127,6 +127,7 @@ function Table(args: { return ( <> + {loading &&
loading...
} Date: Sat, 21 Dec 2019 12:34:47 -0600 Subject: [PATCH 071/103] Legible dates. Rachet up cell typing. --- app/javascript/dance-table.tsx | 35 ++++++++++++++++++++++++---- spec/features/welcome/search_spec.rb | 3 ++- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index 36d45508..284abcf7 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -1,6 +1,12 @@ import * as React from "react" import { useState, useEffect, useMemo, useCallback } from "react" -import { useTable, usePagination, useSortBy, ColumnInstance } from "react-table" +import { + useTable, + usePagination, + useSortBy, + ColumnInstance, + Cell, +} from "react-table" import { NaturalNumberEditor } from "./natural-number-editor" function PaginationSentence({ @@ -304,7 +310,18 @@ const DanceTitleCell = (props: any): JSX.Element => { return {values.title} } -const MatchingFiguresHtmlCell = (props: any): JSX.Element => ( +const CreatedAtDateCell = (props: Cell): JSX.Element => + DateCell(props.row.values.created_at) + +const UpdatedAtDateCell = (props: Cell): JSX.Element => { + return DateCell(props.row.values.updated_at) +} +// time looks like: '2019-10-13T06:22:08.818Z' +const DateCell = (time: string): JSX.Element => ( + <>{new Date(time).toLocaleDateString()} +) + +const MatchingFiguresHtmlCell = (props: Cell): JSX.Element => (
Date: Sun, 22 Dec 2019 09:31:22 -0600 Subject: [PATCH 072/103] chasing weird client-side sorting issue - have broken spec but no solution --- lib/sort_parser.rb | 2 ++ spec/features/welcome/search_spec.rb | 20 +++++++++++++------ .../requests/api/v1/dances_controller_spec.rb | 10 +++++----- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/lib/sort_parser.rb b/lib/sort_parser.rb index 41da2034..530dcc6c 100644 --- a/lib/sort_parser.rb +++ b/lib/sort_parser.rb @@ -26,6 +26,8 @@ def self.parse_valid(p) when 'created_at', 'updated_at' is_ascending ? "dances.#{column}" : Dance.arel_table[column.to_sym].desc else + # is_ascending ? User.arel_table[:name].lower.asc : User.arel_table[:name].lower.desc + is_ascending ? column : {column => :desc} end end diff --git a/spec/features/welcome/search_spec.rb b/spec/features/welcome/search_spec.rb index f321b208..10bfa716 100644 --- a/spec/features/welcome/search_spec.rb +++ b/spec/features/welcome/search_spec.rb @@ -166,13 +166,12 @@ def turn_page_button_css(label, disabled=false) end describe "sorting" do - let (:shuffled_ints) { [7, 0, 10, 8, 9, 2, 11, 6, 3, 5, 1, 4] } - let (:dances) { shuffled_ints.map.with_index {|shuffled_int, i| - FactoryGirl.create(:dance, title: "dance-#{shuffled_int.to_s.rjust(2, '0')}", created_at: now - i.hours) - }} - let (:dances_sorted) { dances.dup.sort_by(&:title) } it "clicking a header displays that column in descending order" do - dances + shuffled_ints = [7, 0, 10, 8, 9, 2, 11, 6, 3, 5, 1, 4] + dances = shuffled_ints.map.with_index {|shuffled_int, i| + FactoryGirl.create(:dance, title: "dance-#{shuffled_int.to_s.rjust(2, '0')}", created_at: now - i.hours) + } + dances_sorted = dances.dup.sort_by(&:title) visit(s_path) dances.each_with_index do |dance, i| expect(page).send(i < 10 ? :to : :to_not, have_text(dance.title)) @@ -214,5 +213,14 @@ def turn_page_button_css(label, disabled=false) end expect(page).to have_text(unsorted_dances_titles_regex) end + + it "no weird monkey business with client side sorting" do + titles = ['40 Years of Penguin Pam', "A Crafty Wave", "24th of June"] + dances = titles.map {|title| FactoryGirl.create(:dance, title: title)} + titles_sorted = titles.dup.sort + visit(s_path) + find('th', text: 'Title').click + expect(page).to have_text(Regexp.new(titles_sorted.join('.*\n'))) + end end end diff --git a/spec/requests/api/v1/dances_controller_spec.rb b/spec/requests/api/v1/dances_controller_spec.rb index 82f17f7a..85274ac4 100644 --- a/spec/requests/api/v1/dances_controller_spec.rb +++ b/spec/requests/api/v1/dances_controller_spec.rb @@ -48,17 +48,17 @@ end end - it 'understands sort' do - dances = "cab".chars.each_with_index.map do |char, i| + it 'heeds sorting' do + dances = "caB".chars.each_with_index.map do |char, i| FactoryGirl.create(:dance, title: char*3, created_at: now - i.hours) end get api_v1_dances_path(sort_by: 'titleA') dances_received = JSON.parse(response.body)['dances'] - expect(dances_received.map{|json| json['title']}).to eq(dances.dup.sort_by(&:title).map(&:title)) + aaaBBBccc = ['aaa', 'BBB', 'ccc'] + expect(aaaBBBccc).to eq(dances.dup.sort_by {|d| d.title.downcase }.map(&:title)) + expect(dances_received.map{|json| json['title']}).to eq(aaaBBBccc) end it 'only performs one query' - - it 'takes other dance search parameters' end end From cdfd02eda138ea4a83d3dee5cc92756aa69901ab Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 22 Dec 2019 09:48:44 -0600 Subject: [PATCH 073/103] fix client-side sorting bug --- app/javascript/dance-table.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index 284abcf7..492663d4 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -97,6 +97,8 @@ function Table(args: { columns, data: dancesGetJson.dances, manualPagination: true, + manualSortBy: true, // after 7.0.0-rc2 + manualSorting: true, // before 7.0.0-rc2 pageCount: controlledPageCount, initialState: { sortBy: initialSortBy }, } From e6d68f1fd2d869aa3d1d2a3cdd289a161f68af8e Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 22 Dec 2019 12:25:25 -0600 Subject: [PATCH 074/103] remove console.logs --- app/javascript/dance-table.tsx | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index 492663d4..ca693c24 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -74,7 +74,14 @@ export const sortByParam = (sortBy: SortBy): string => .map(sbe => (sbe.id ? sbe.id + (sbe.desc ? "D" : "A") : sbe + "A")) .join("") -function Table(args: { +function Table({ + columns, + dancesGetJson, + fetchData, + loading, + pageCount: controlledPageCount, + initialSortBy, +}: { columns: any dancesGetJson: DancesGetJson fetchData: Function @@ -82,14 +89,6 @@ function Table(args: { pageCount: number initialSortBy: any // SortBy }): JSX.Element { - const { - columns, - dancesGetJson, - fetchData, - loading, - pageCount: controlledPageCount, - initialSortBy, - } = args // const tableState = useTableState({ pageIndex: 0 }) // const [{ pageIndex, pageSize }] = tableState @@ -128,7 +127,6 @@ function Table(args: { sortBy, ]) - console.log("render table", args) if (dancesGetJson.numberMatching > 100) { // debugger } @@ -388,7 +386,6 @@ function DanceTable(): JSX.Element { const offset = pageIndex * pageSize const sort = sortByParam(sortBy) const url = `/api/v1/dances?count=${pageSize}&offset=${offset}&sort_by=${sort}` - console.log(`fetch("${url}")`, pageSize, pageIndex, sortBy) const response = await fetch(url) const json: DancesGetJson = await response.json() setDancesGetJson(json) From dbd91e537f0f8764575e79cfbbf8992aa754053b Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 29 Dec 2019 10:27:14 -0600 Subject: [PATCH 075/103] 'upgrade' to react-table 7.0.0-rc.15 - breaks lots of things --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index bfb49302..e11ac8e9 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "prop-types": "^15.7.2", "react": "^16.11.0", "react-dom": "^16.11.0", - "react-table": "^7.0.0-beta.12", + "react-table": "^7.0.0-rc.15", "ts-loader": "^6.2.1", "typescript": "^3.6.4" }, diff --git a/yarn.lock b/yarn.lock index be1e5e0d..3eaec8fd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7505,10 +7505,10 @@ react-is@^16.8.1, react-is@^16.8.4: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.11.0.tgz#b85dfecd48ad1ce469ff558a882ca8e8313928fa" integrity sha512-gbBVYR2p8mnriqAwWx9LbuUrShnAuSCNnuPGyc7GJrMVQtPDAh8iLpv7FRuMPFb56KkaVZIYSz1PrjI9q0QPCw== -react-table@^7.0.0-beta.12: - version "7.0.0-beta.12" - resolved "https://registry.yarnpkg.com/react-table/-/react-table-7.0.0-beta.12.tgz#ae54b398fbdb527b9fad82e52c4d829c00fdd5dc" - integrity sha512-h1c0KNTBRPAMgZumaNixr3X0w7kFTuqk6pHwia12LsMgnTHNEEeqp7+tQ5fTPwwMArp1/OHXeOdSKEes1C83iw== +react-table@^7.0.0-rc.15: + version "7.0.0-rc.15" + resolved "https://registry.yarnpkg.com/react-table/-/react-table-7.0.0-rc.15.tgz#bb855e4e2abbb4aaf0ed2334404a41f3ada8e13a" + integrity sha512-ofMOlgrioHhhvHjvjsQkxvfQzU98cqwy6BjPGNwhLN1vhgXeWi0mUGreaCPvRenEbTiXsQbMl4k3Xmx3Mut8Rw== react@^16.11.0: version "16.11.0" From e1967692e8deaed285896e61ebd6e9886945c8b9 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 29 Dec 2019 10:39:49 -0600 Subject: [PATCH 076/103] Fix column visibile toggle issues caused by upgrade of react-table. Remove most typescript declarations from react-table touching code, since they're not supported currently. --- app/javascript/dance-table.tsx | 300 ++++++++++--------- app/javascript/types/react-table-config.d.ts | 95 +++--- spec/features/welcome/search_spec.rb | 4 +- 3 files changed, 211 insertions(+), 188 deletions(-) diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index ca693c24..fc385a16 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -1,14 +1,94 @@ import * as React from "react" -import { useState, useEffect, useMemo, useCallback } from "react" -import { - useTable, - usePagination, - useSortBy, - ColumnInstance, - Cell, -} from "react-table" +import { useState, useEffect, useCallback } from "react" +import { useTable, usePagination, useSortBy } from "react-table" import { NaturalNumberEditor } from "./natural-number-editor" +// TODO: use rails route helpers +const choreographerPath = (cid: number): string => { + return "/choreographers/" + cid +} +const dancePath = (danceId: number): string => { + return "/dances/" + danceId +} + +const ChoreographerCell = (props: any): JSX.Element => { + const values: DanceSearchResult = props.row.original // shouldn't I be looking at props.row.values? It only has the accessor'd field in the column definition. + return ( + + {values.choreographer_name} + + ) +} + +const DanceTitleCell = (props: any): JSX.Element => { + const values: DanceSearchResult = props.row.original // shouldn't I be looking at props.row.values? It only has the accessor'd field in the column definition. + return {values.title} +} + +// time looks like: '2019-10-13T06:22:08.818Z' +const DateCell = (time: string): JSX.Element => ( + <>{new Date(time).toLocaleDateString()} +) + +const CreatedAtDateCell = (props: any /* Cell */): JSX.Element => + DateCell(props.row.values.created_at) + +const UpdatedAtDateCell = (props: any /* Cell */): JSX.Element => { + return DateCell(props.row.values.updated_at) +} + +const MatchingFiguresHtmlCell = (props: any /* Cell */): JSX.Element => ( +
+) + +type ColumnDefinition = { + Header: string + accessor: string + Cell?: (props: any) => JSX.Element + show: boolean +} + +const columnDefinitions: Array = [ + { + Header: "Title", + accessor: "title", + Cell: DanceTitleCell, + show: true, + }, + { + Header: "Choreographer", + accessor: "choreographer_name", + Cell: ChoreographerCell, + show: true, + }, + { Header: "Hook", accessor: "hook", show: true }, + { Header: "Formation", accessor: "formation", show: true }, + { Header: "User", accessor: "user_name", show: true }, + { + Header: "Entered", + accessor: "created_at", + Cell: CreatedAtDateCell, + show: true, + }, + { + Header: "Updated", + accessor: "updated_at", + Cell: UpdatedAtDateCell, + show: false, + }, + { Header: "Sharing", accessor: "publish", show: false }, + { + Header: "Figures", + accessor: "matching_figures_html", + show: false, + Cell: MatchingFiguresHtmlCell, + }, +] + function PaginationSentence({ pageOffset, pageCount, @@ -31,7 +111,7 @@ function PaginationSentence({ function DanceTableThLabel({ column, }: { - column: ColumnInstance + column: any // ColumnInstance }): JSX.Element { return (
.join("") function Table({ - columns, dancesGetJson, fetchData, loading, pageCount: controlledPageCount, initialSortBy, }: { - columns: any dancesGetJson: DancesGetJson fetchData: Function loading: boolean @@ -93,7 +171,7 @@ function Table({ // const [{ pageIndex, pageSize }] = tableState const tableOptions = { - columns, + columns: columnDefinitions, data: dancesGetJson.dances, manualPagination: true, manualSortBy: true, // after 7.0.0-rc2 @@ -102,6 +180,7 @@ function Table({ initialState: { sortBy: initialSortBy }, } const { + flatColumns: columns, getTableProps, headerGroups, prepareRow, @@ -119,6 +198,20 @@ function Table({ state: { sortBy }, } = useTable(tableOptions, useSortBy, usePagination) + useEffect(() => { + if (columnDefinitions.length !== columns.length) + throw new Error("columns and columnDefinitions are not the same length") + // first time through hide the columns that should be born hidden + for (let i = 0; i < columns.length; i++) { + const columnDefinition = columnDefinitions[i] + const column = columns[i] + if (!columnDefinition.show) { + column.toggleHidden(true) + console.log("hiding " + columnDefinition.Header) + } + } + }, [columns]) + // again, need to worry about the return value of this first arg to useEffect useEffect(() => fetchData({ pageIndex, pageSize, sortBy }), [ fetchData, @@ -127,21 +220,18 @@ function Table({ sortBy, ]) - if (dancesGetJson.numberMatching > 100) { - // debugger - } - return ( <> {loading &&
loading...
} +
- {headerGroups.map(headerGroup => ( + {headerGroups.map((headerGroup: any) => ( - {headerGroup.headers.map(column => ( + {headerGroup.headers.map((column: any) => ( @@ -150,11 +240,11 @@ function Table({ ))} - {rows.map(row => { + {rows.map((row: any) => { prepareRow(row) return ( - {row.cells.map(cell => ( + {row.cells.map((cell: any) => ( ))} @@ -288,88 +378,44 @@ interface DancesGetJson { dances: Array } -// TODO: use rails route helpers -const choreographerPath = (cid: number): string => { - return "/choreographers/" + cid -} -const dancePath = (danceId: number): string => { - return "/dances/" + danceId -} - -const ChoreographerCell = (props: any): JSX.Element => { - const values: DanceSearchResult = props.row.original // shouldn't I be looking at props.row.values? It only has the accessor'd field in the column definition. +const ColumnVisToggles = ({ columns }: { columns: any[] }): JSX.Element => { return ( - - {values.choreographer_name} - +
+ +
+ {columns.map((column, i) => ( + + ))} +
+
) } -const DanceTitleCell = (props: any): JSX.Element => { - const values: DanceSearchResult = props.row.original // shouldn't I be looking at props.row.values? It only has the accessor'd field in the column definition. - return {values.title} -} - -const CreatedAtDateCell = (props: Cell): JSX.Element => - DateCell(props.row.values.created_at) - -const UpdatedAtDateCell = (props: Cell): JSX.Element => { - return DateCell(props.row.values.updated_at) +const ColumnVisToggle = ({ + column, + columnDefinition, +}: { + column: any + columnDefinition: ColumnDefinition +}): JSX.Element => { + const [vis, setVis] = useState(columnDefinition.show) + const toggleVisClass = vis ? "toggle-vis-active" : "toggle-vis-inactive" + const className = "btn btn-xs " + toggleVisClass + const onChange = (e: any): void => { + const e2 = { ...e, target: { checked: !vis } } + setVis(!vis) + return column.getToggleHiddenProps().onChange(e2) + } + return ( + + ) } -// time looks like: '2019-10-13T06:22:08.818Z' -const DateCell = (time: string): JSX.Element => ( - <>{new Date(time).toLocaleDateString()} -) - -const MatchingFiguresHtmlCell = (props: Cell): JSX.Element => ( -
-) - -const columnsArr: Array<{ - Header: string - accessor: string - Cell?: (props: any) => JSX.Element - show: boolean -}> = [ - { - Header: "Title", - accessor: "title", - Cell: DanceTitleCell, - show: true, - }, - { - Header: "Choreographer", - accessor: "choreographer_name", - Cell: ChoreographerCell, - show: true, - }, - { Header: "Hook", accessor: "hook", show: true }, - { Header: "Formation", accessor: "formation", show: true }, - { Header: "User", accessor: "user_name", show: true }, - { - Header: "Entered", - accessor: "created_at", - Cell: CreatedAtDateCell, - show: true, - }, - { - Header: "Updated", - accessor: "updated_at", - Cell: UpdatedAtDateCell, - show: false, - }, - { Header: "Sharing", accessor: "publish", show: false }, - { - Header: "Figures", - accessor: "matching_figures_html", - show: false, - Cell: MatchingFiguresHtmlCell, - }, -] function DanceTable(): JSX.Element { const [dancesGetJson, setDancesGetJson] = useState({ @@ -396,50 +442,26 @@ function DanceTable(): JSX.Element { // maybe return in-use-ness to prevent a memory leak here? }, []) - const [visibleToggles, setVisibleToggles] = useState( - columnsArr.map(ca => ca.show) - ) - // const toggleTitleVisible = () => setTitleVisible(!titleVisible) - const columns = useMemo( - () => columnsArr.map((ca, i) => ({ ...ca, show: () => visibleToggles[i] })), - [visibleToggles] - ) + // const [visibleToggles, setVisibleToggles] = useState( + // columnDefinitions.map(ca => ca.show) + // ) + + // // const toggleTitleVisible = () => setTitleVisible(!titleVisible) + // const columns = useMemo( + // () => + // columnDefinitions.map((cd, i) => ({ ...cd, show: visibleToggles[i] })), + // [visibleToggles] + // ) + // console.log(columns) return ( - <> -
- -
- {columnsArr.map((ca, i) => { - const toggleVisFn = (): void => { - setVisibleToggles( - visibleToggles.map((vis, j) => (i === j) !== vis) - ) - } - const toggleVisClass = visibleToggles[i] - ? "toggle-vis-active" - : "toggle-vis-inactive" - return ( - - ) - })} -
-
-
{cell.render("Cell")}
- +
) } diff --git a/app/javascript/types/react-table-config.d.ts b/app/javascript/types/react-table-config.d.ts index 5dfdfe76..db5b3b52 100644 --- a/app/javascript/types/react-table-config.d.ts +++ b/app/javascript/types/react-table-config.d.ts @@ -1,3 +1,4 @@ +declare module "react-table" // import { // UseColumnOrderInstanceProps, // UseColumnOrderState, @@ -37,58 +38,58 @@ // UseSortByState, // UseTableCellProps, // } from "react-table" -import {} from "react-table" +// import {} from "react-table" -declare module "react-table" { - // take this file as-is, or comment out the sections that don't apply to your plugin configuration +// declare module "react-table" { +// // take this file as-is, or comment out the sections that don't apply to your plugin configuration - export interface TableOptions // UseExpandedOptions, // UseFiltersOptions, // UseGroupByOptions, // UsePaginationOptions, // UseRowSelectOptions, // UseSortByOptions, - extends // UseFiltersOptions, - // UseResizeColumnsOptions, - // note that having Record here allows you to add anything to the options, this matches the spirit of the - // underlying js library, but might be cleaner if it's replaced by a more specific type that matches your - // feature set, this is a safe default. - Record {} +// export interface TableOptions // UseExpandedOptions, // UseFiltersOptions, // UseGroupByOptions, // UsePaginationOptions, // UseRowSelectOptions, // UseSortByOptions, +// extends // UseFiltersOptions, +// // UseResizeColumnsOptions, +// // note that having Record here allows you to add anything to the options, this matches the spirit of the +// // underlying js library, but might be cleaner if it's replaced by a more specific type that matches your +// // feature set, this is a safe default. +// Record {} - export interface TableInstance {} - // UseColumnOrderInstanceProps, - // UseExpandedInstanceProps, - // UseFiltersInstanceProps, - // UseGroupByInstanceProps, - // UsePaginationInstanceProps, - // UseRowSelectInstanceProps, - // UseRowStateInstanceProps, - // UseSortByInstanceProps +// export interface TableInstance {} +// // UseColumnOrderInstanceProps, +// // UseExpandedInstanceProps, +// // UseFiltersInstanceProps, +// // UseGroupByInstanceProps, +// // UsePaginationInstanceProps, +// // UseRowSelectInstanceProps, +// // UseRowStateInstanceProps, +// // UseSortByInstanceProps - export interface TableState - extends UseSortByState {} - // UseGroupByState, - // UseFiltersState, - // UseExpandedState, - // UseColumnOrderState, - // UsePaginationState, - // UseRowSelectState +// export interface TableState +// extends UseSortByState {} +// // UseGroupByState, +// // UseFiltersState, +// // UseExpandedState, +// // UseColumnOrderState, +// // UsePaginationState, +// // UseRowSelectState - export interface Column {} - // UseFiltersColumnOptions, - // UseGroupByColumnOptions, - // UseSortByColumnOptions, - // UseResizeColumnsColumnOptions {} +// export interface Column {} +// // UseFiltersColumnOptions, +// // UseGroupByColumnOptions, +// // UseSortByColumnOptions, +// // UseResizeColumnsColumnOptions {} - export interface ColumnInstance - extends UseSortByColumnProps {} - // UseFiltersColumnProps, - // UseGroupByColumnProps, - // UseResizeColumnsHeaderProps, +// export interface ColumnInstance +// extends UseSortByColumnProps {} +// // UseFiltersColumnProps, +// // UseGroupByColumnProps, +// // UseResizeColumnsHeaderProps, - export interface Cell {} - // UseTableCellProps, - // UseGroupByCellProps, - // UseRowStateCellProps {} +// export interface Cell {} +// // UseTableCellProps, +// // UseGroupByCellProps, +// // UseRowStateCellProps {} - export interface Row {} - // UseExpandedRowProps, - // UseGroupByRowProps, - // UseRowSelectRowProps, - // UseRowStateRowProps {} -} +// export interface Row {} +// // UseExpandedRowProps, +// // UseGroupByRowProps, +// // UseRowSelectRowProps, +// // UseRowStateRowProps {} +// } diff --git a/spec/features/welcome/search_spec.rb b/spec/features/welcome/search_spec.rb index 10bfa716..4d07182b 100644 --- a/spec/features/welcome/search_spec.rb +++ b/spec/features/welcome/search_spec.rb @@ -11,7 +11,7 @@ to_probably = i < 10 ? :to : :to_not expect(page).send to_probably, have_link(dance.title, href: dance_path(dance)) expect(page).send to_probably, have_link(dance.choreographer.name, href: choreographer_path(dance.choreographer_id)) - expect(page).send to_probably, have_text(dance.created_at.strftime("%-m/%-d/%Y")) + expect(page).send to_probably, have_text(dance.created_at.localtime.strftime("%-m/%-d/%Y")) end end @@ -135,7 +135,7 @@ def turn_page_button_css(label, disabled=false) end end - describe 'figures column' do + describe 'matching figures column' do it 'whole dance' do dances visit(s_path) From bfbbfed28ed8d96a998363bd076ad9acae4c33d2 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 29 Dec 2019 10:49:05 -0600 Subject: [PATCH 077/103] fix pagination broken by upgrade --- app/javascript/dance-table.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index fc385a16..a063df70 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -193,9 +193,7 @@ function Table({ setPageSize, getTableBodyProps, rows, - pageIndex, - pageSize, - state: { sortBy }, + state: { sortBy, pageIndex, pageSize }, } = useTable(tableOptions, useSortBy, usePagination) useEffect(() => { From 27b91e499ac586b83a1e7af5e189273912a71be3 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 29 Dec 2019 16:42:43 -0600 Subject: [PATCH 078/103] disable sorting on matching figures column --- app/javascript/dance-table.tsx | 2 ++ spec/features/welcome/search_spec.rb | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index a063df70..81352cd5 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -50,6 +50,7 @@ type ColumnDefinition = { accessor: string Cell?: (props: any) => JSX.Element show: boolean + disableSortBy?: boolean } const columnDefinitions: Array = [ @@ -86,6 +87,7 @@ const columnDefinitions: Array = [ accessor: "matching_figures_html", show: false, Cell: MatchingFiguresHtmlCell, + disableSortBy: true, }, ] diff --git a/spec/features/welcome/search_spec.rb b/spec/features/welcome/search_spec.rb index 4d07182b..da518a68 100644 --- a/spec/features/welcome/search_spec.rb +++ b/spec/features/welcome/search_spec.rb @@ -222,5 +222,19 @@ def turn_page_button_css(label, disabled=false) find('th', text: 'Title').click expect(page).to have_text(Regexp.new(titles_sorted.join('.*\n'))) end + + it "you can't sort by matching figures" do + dances = [:dance, :box_the_gnat_contra, :call_me].each_with_index.map do |t, i| + FactoryGirl.create(t, created_at: now - i.hours) + end + the_ordered_regexp = Regexp.new(dances.map(&:title).join('(?:.*\n)+')) + visit(s_path) + click_button 'Figures' + expect(page).to have_content(the_ordered_regexp) # order is time-sorted + find('th', text: 'Figures').click + expect(page).to_not have_css('th .glyphicon-sort-by-attributes') + expect(page).to_not have_css('th .glyphicon-sort-by-attributes-alt') + expect(page).to have_content(the_ordered_regexp) # order is still time-sorted + end end end From 9cdfad1c0e1f22bb7b72460a66012a458ec14b28 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 29 Dec 2019 22:23:34 -0600 Subject: [PATCH 079/103] test for clicking every th --- app/assets/stylesheets/welcome.scss | 6 +++ app/javascript/dance-table.tsx | 63 ++++++++++++---------------- lib/sort_parser.rb | 2 +- spec/features/welcome/search_spec.rb | 32 ++++++++++++++ spec/lib/sort_parser_spec.rb | 7 ++-- 5 files changed, 70 insertions(+), 40 deletions(-) diff --git a/app/assets/stylesheets/welcome.scss b/app/assets/stylesheets/welcome.scss index d0671af9..ed96ea1d 100644 --- a/app/assets/stylesheets/welcome.scss +++ b/app/assets/stylesheets/welcome.scss @@ -178,3 +178,9 @@ select.chooser-argument { border-radius: 0.5em; border: 3px dashed black; } + +.dance-table-th div { + display: flex; + justify-content: space-between; + align-items: center; +} diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index 81352cd5..b223fc12 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -110,37 +110,36 @@ function PaginationSentence({ ) } -function DanceTableThLabel({ +function DanceTableTh({ column, }: { column: any // ColumnInstance }): JSX.Element { return ( -
- {column.render("Header")} {/* Add a sort direction indicator */} - {column.isSorted ? ( - - ) : ( - - )} -
+
+ {column.render("Header")} {/* Add a sort direction indicator */} + {column.isSorted ? ( + + ) : ( + + )} +
+ ) } @@ -202,14 +201,8 @@ function Table({ if (columnDefinitions.length !== columns.length) throw new Error("columns and columnDefinitions are not the same length") // first time through hide the columns that should be born hidden - for (let i = 0; i < columns.length; i++) { - const columnDefinition = columnDefinitions[i] - const column = columns[i] - if (!columnDefinition.show) { - column.toggleHidden(true) - console.log("hiding " + columnDefinition.Header) - } - } + for (let i = 0; i < columns.length; i++) + if (!columnDefinitions[i].show) columns[i].toggleHidden(true) }, [columns]) // again, need to worry about the return value of this first arg to useEffect @@ -232,9 +225,7 @@ function Table({ {headerGroups.map((headerGroup: any) => (
{headerGroup.headers.map((column: any) => ( - + ))} ))} diff --git a/lib/sort_parser.rb b/lib/sort_parser.rb index 530dcc6c..d94a833f 100644 --- a/lib/sort_parser.rb +++ b/lib/sort_parser.rb @@ -23,7 +23,7 @@ def self.parse_valid(p) is_ascending ? 'users.name' : User.arel_table[:name].desc when 'formation' is_ascending ? 'start_type' : {'start_type' => :desc} - when 'created_at', 'updated_at' + when 'created_at', 'updated_at', 'publish' is_ascending ? "dances.#{column}" : Dance.arel_table[column.to_sym].desc else # is_ascending ? User.arel_table[:name].lower.asc : User.arel_table[:name].lower.desc diff --git a/spec/features/welcome/search_spec.rb b/spec/features/welcome/search_spec.rb index da518a68..79fa48e7 100644 --- a/spec/features/welcome/search_spec.rb +++ b/spec/features/welcome/search_spec.rb @@ -236,5 +236,37 @@ def turn_page_button_css(label, disabled=false) expect(page).to_not have_css('th .glyphicon-sort-by-attributes-alt') expect(page).to have_content(the_ordered_regexp) # order is still time-sorted end + + it "sorting all columns (except matching figure) does not give error" do + dances = [:dance, :box_the_gnat_contra, :call_me].each_with_index.map do |t, i| + FactoryGirl.create(t, created_at: now - i.hours) + end + visit(s_path) + columns = page.find_all(".toggle-vis-active").to_a + page.find_all(".toggle-vis-inactive").to_a + column_names = columns.map(&:text) + column_names_not_to_check = ['Figures'] + column_names_checked = column_names - column_names_not_to_check + column_names_checked.each do |column_name| + unless has_css?('.toggle-vis-active', text: column_name) + click_button(column_name) + end + th = find('.dance-table-th', text: column_name) + expect(th).to have_css('.glyphicon-sort') + expect(th).to_not have_css('.glyphicon-sort-by-attributes') + expect(th).to_not have_css('.glyphicon-sort-by-attributes-alt') + th.click + expect(th).to have_css('.glyphicon-sort-by-attributes') + expect(th).to_not have_css('.glyphicon-sort') + expect(th).to_not have_css('.glyphicon-sort-by-attributes-alt') + th.click + expect(th).to have_css('.glyphicon-sort-by-attributes-alt') + expect(th).to_not have_css('.glyphicon-sort') + expect(th).to_not have_css('.glyphicon-sort-by-attributes') + th.click + expect(th).to have_css('.glyphicon-sort') + expect(th).to_not have_css('.glyphicon-sort-by-attributes') + expect(th).to_not have_css('.glyphicon-sort-by-attributes-alt') + end + end end end diff --git a/spec/lib/sort_parser_spec.rb b/spec/lib/sort_parser_spec.rb index aa203506..0cf838c5 100644 --- a/spec/lib/sort_parser_spec.rb +++ b/spec/lib/sort_parser_spec.rb @@ -5,12 +5,13 @@ describe SortParser do describe 'parse' do it 'works part 1' do - input = "titleAhookDchoreographer_nameAuser_nameD" + input = "titleAhookDchoreographer_nameAuser_nameDpublishA" expected = [ "title", {"hook" => :desc}, "choreographers.name", - User.arel_table[:name].desc + User.arel_table[:name].desc, + "dances.publish" ] expect(SortParser.parse(input)).to eq(expected) end @@ -21,7 +22,7 @@ {"start_type" => :desc}, Choreographer.arel_table[:name].desc, "users.name", - {"publish" => :desc} + Dance.arel_table[:publish].desc ] expect(SortParser.parse(input)).to eq(expected) end From 8625280b58382b6a71adcb5379a0c79e1e42094b Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 26 Jan 2020 15:46:27 -0600 Subject: [PATCH 080/103] rename hello_react.tsx to search_page.tsx --- app/javascript/packs/{hello_react.tsx => search_page.tsx} | 0 app/views/welcome/search.html.erb | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename app/javascript/packs/{hello_react.tsx => search_page.tsx} (100%) diff --git a/app/javascript/packs/hello_react.tsx b/app/javascript/packs/search_page.tsx similarity index 100% rename from app/javascript/packs/hello_react.tsx rename to app/javascript/packs/search_page.tsx diff --git a/app/views/welcome/search.html.erb b/app/views/welcome/search.html.erb index 36890a6e..89c8c917 100644 --- a/app/views/welcome/search.html.erb +++ b/app/views/welcome/search.html.erb @@ -1,5 +1,5 @@ -<%= javascript_pack_tag 'hello_react', defer: true %> -<%= stylesheet_pack_tag 'hello_react' %> +<%= javascript_pack_tag 'search_page', defer: true %> +<%= stylesheet_pack_tag 'search_page' %>

Find Dances

From 17f551191c8c96ff7a1e210fd3839c805678c4c6 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 26 Jan 2020 16:05:55 -0600 Subject: [PATCH 081/103] introduce AdvancedSearch component which contains DanceTable component --- app/javascript/advanced-search.tsx | 6 ++++++ app/javascript/packs/search_page.tsx | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 app/javascript/advanced-search.tsx diff --git a/app/javascript/advanced-search.tsx b/app/javascript/advanced-search.tsx new file mode 100644 index 00000000..2ca6501f --- /dev/null +++ b/app/javascript/advanced-search.tsx @@ -0,0 +1,6 @@ +import * as React from "react" +import DanceTable from "./dance-table" + +export const AdvancedSearch = () => + +export default AdvancedSearch diff --git a/app/javascript/packs/search_page.tsx b/app/javascript/packs/search_page.tsx index 5ae69d38..3300c973 100644 --- a/app/javascript/packs/search_page.tsx +++ b/app/javascript/packs/search_page.tsx @@ -3,12 +3,12 @@ import * as React from "react" import * as ReactDOM from "react-dom" // import './index.css'; -import DanceTable from "../dance-table" +import AdvancedSearch from "../advanced-search" // import * as serviceWorker from './serviceWorker'; const root = document.getElementById("root") console.log("root = ", root) -ReactDOM.render(, root) +ReactDOM.render(, root) // If you want your app to work offline and load faster, you can change // unregister() to register() below. Note this comes with some pitfalls. From 168b82ea5ada58f90bcc07ca103578b58f7dfcb3 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 26 Jan 2020 16:06:46 -0600 Subject: [PATCH 082/103] add failing test --- spec/features/welcome/search_spec.rb | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/spec/features/welcome/search_spec.rb b/spec/features/welcome/search_spec.rb index 79fa48e7..d08b8703 100644 --- a/spec/features/welcome/search_spec.rb +++ b/spec/features/welcome/search_spec.rb @@ -269,4 +269,17 @@ def turn_page_button_css(label, disabled=false) end end end + + describe "filters" do + describe "choreographer" do + let(:dances) { [:dance, :box_the_gnat_contra, :call_me].map {|name| FactoryGirl.create(name)} } + + it "works" do + dances + visit(s_path) + fill_in("ez-choroeographer-filter", with: dances.last.choreographer) + + end + end + end end From 694e8923e26b027a079b8c63ab61bd17c297d23b Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 26 Jan 2020 16:22:58 -0600 Subject: [PATCH 083/103] AdvancedSearch component has a choreographer search input (which does nothing) --- app/javascript/advanced-search.tsx | 13 ++++++++++++- spec/features/welcome/search_spec.rb | 3 +-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/app/javascript/advanced-search.tsx b/app/javascript/advanced-search.tsx index 2ca6501f..b172ceea 100644 --- a/app/javascript/advanced-search.tsx +++ b/app/javascript/advanced-search.tsx @@ -1,6 +1,17 @@ import * as React from "react" import DanceTable from "./dance-table" -export const AdvancedSearch = () => +export const AdvancedSearch = () => ( +
+ +
+
+
+ +
+) export default AdvancedSearch diff --git a/spec/features/welcome/search_spec.rb b/spec/features/welcome/search_spec.rb index d08b8703..f217f536 100644 --- a/spec/features/welcome/search_spec.rb +++ b/spec/features/welcome/search_spec.rb @@ -277,8 +277,7 @@ def turn_page_button_css(label, disabled=false) it "works" do dances visit(s_path) - fill_in("ez-choroeographer-filter", with: dances.last.choreographer) - + find('.ez-choreographer-filter').fill_in(with: dances.last.choreographer) end end end From 2557e216d2a3b624b54f52c920a6dd5edbd402f1 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 26 Jan 2020 16:26:14 -0600 Subject: [PATCH 084/103] test that choreographer filter actually filters out non-matching choreographers --- spec/features/welcome/search_spec.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/spec/features/welcome/search_spec.rb b/spec/features/welcome/search_spec.rb index f217f536..d0986028 100644 --- a/spec/features/welcome/search_spec.rb +++ b/spec/features/welcome/search_spec.rb @@ -275,9 +275,13 @@ def turn_page_button_css(label, disabled=false) let(:dances) { [:dance, :box_the_gnat_contra, :call_me].map {|name| FactoryGirl.create(name)} } it "works" do - dances + call_me = dances.last + dont_call_me = dances[0, dances.length-2] visit(s_path) - find('.ez-choreographer-filter').fill_in(with: dances.last.choreographer) + find('.ez-choreographer-filter').fill_in(with: call_me.choreographer) + dont_call_me.each do |dance| + expect(page).to_not have_content(dance.title) + end end end end From 252a2ed675f84c3576b77b26676641b5cafd91e8 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Sun, 26 Jan 2020 16:35:36 -0600 Subject: [PATCH 085/103] tidy up --- spec/requests/api/v1/dances_controller_spec.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/spec/requests/api/v1/dances_controller_spec.rb b/spec/requests/api/v1/dances_controller_spec.rb index 85274ac4..feacaf33 100644 --- a/spec/requests/api/v1/dances_controller_spec.rb +++ b/spec/requests/api/v1/dances_controller_spec.rb @@ -5,7 +5,6 @@ let (:now) { DateTime.now } it "returns json of all dances" do dance = FactoryGirl.create(:call_me) - dance.reload get api_v1_dances_path expect(response).to have_http_status(200) expect(JSON.parse(response.body)) @@ -59,6 +58,6 @@ expect(dances_received.map{|json| json['title']}).to eq(aaaBBBccc) end - it 'only performs one query' + it 'only performs one sql query' end end From 242317bc941a657f02b44ae7e0b3a8561bf110c4 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Mon, 27 Jan 2020 23:18:08 -0600 Subject: [PATCH 086/103] convert /api/v1/dances endpoint from GET to POST --- app/controllers/api/v1/dances_controller.rb | 19 +++++++++++++++---- app/javascript/dance-table.tsx | 10 ++++++++-- config/routes.rb | 2 +- .../requests/api/v1/dances_controller_spec.rb | 10 ++++++---- 4 files changed, 30 insertions(+), 11 deletions(-) diff --git a/app/controllers/api/v1/dances_controller.rb b/app/controllers/api/v1/dances_controller.rb index a0b53fb7..1ea2e926 100644 --- a/app/controllers/api/v1/dances_controller.rb +++ b/app/controllers/api/v1/dances_controller.rb @@ -2,6 +2,9 @@ require 'sort_parser' class Api::V1::DancesController < ApplicationController + # small security risk: dialetcs are snoopable with this + skip_before_action :verify_authenticity_token + def index render json:FilterDances.filter_dances(filter, count: count, @@ -20,14 +23,22 @@ def sort_by end def count - parseIntWithDefault(params[:count], 10) + default_integer_param(:count, 10) end def offset - parseIntWithDefault(params[:offset], 0) + default_integer_param(:offset, 0) end - def parseIntWithDefault(s, default) - s =~ /^[0-9]+$/ ? Integer(s) : default + def default_integer_param(s, default) + p = params[s] + case p + when Integer # path in production + p + when String # path for request specs, because: frustration! + Integer(p) + else + default + end end end diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index b223fc12..6bc70716 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -422,8 +422,14 @@ function DanceTable(): JSX.Element { async function fetchData1(): Promise { const offset = pageIndex * pageSize const sort = sortByParam(sortBy) - const url = `/api/v1/dances?count=${pageSize}&offset=${offset}&sort_by=${sort}` - const response = await fetch(url) + const url = "/api/v1/dances" + const headers = { "Content-type": "application/json" } + const body = JSON.stringify({ + count: pageSize, + offset: offset, + sort_by: sort, + }) + const response = await fetch(url, { method: "POST", headers, body }) const json: DancesGetJson = await response.json() setDancesGetJson(json) setPageCount(Math.ceil(json.numberMatching / pageSize)) diff --git a/config/routes.rb b/config/routes.rb index 4b623d22..b68cd92f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -75,7 +75,7 @@ # end namespace :api do namespace :v1 do - resources :dances, only: [:index] + post 'dances' => "dances#index" end end end diff --git a/spec/requests/api/v1/dances_controller_spec.rb b/spec/requests/api/v1/dances_controller_spec.rb index feacaf33..bcc5b873 100644 --- a/spec/requests/api/v1/dances_controller_spec.rb +++ b/spec/requests/api/v1/dances_controller_spec.rb @@ -1,11 +1,11 @@ require 'rails_helper' RSpec.describe Api::V1::DancesController do - describe "GET #index" do + describe "POST #index" do let (:now) { DateTime.now } it "returns json of all dances" do dance = FactoryGirl.create(:call_me) - get api_v1_dances_path + post api_v1_dances_path expect(response).to have_http_status(200) expect(JSON.parse(response.body)) .to eq({ @@ -35,7 +35,9 @@ end pages.times do |pageIndex| pageSize.times do |rowIndex| - get api_v1_dances_path(count: pageSize, offset: pageIndex*pageSize) + headers = { "content_type" => "application/json" } + params = {count: pageSize, offset: pageIndex*pageSize} + post(api_v1_dances_path, params: params, headers: headers) expect(response).to have_http_status(200) rendered = JSON.parse(response.body) expect(rendered['numberMatching']).to eq(12) @@ -51,7 +53,7 @@ dances = "caB".chars.each_with_index.map do |char, i| FactoryGirl.create(:dance, title: char*3, created_at: now - i.hours) end - get api_v1_dances_path(sort_by: 'titleA') + post api_v1_dances_path(sort_by: 'titleA') dances_received = JSON.parse(response.body)['dances'] aaaBBBccc = ['aaa', 'BBB', 'ccc'] expect(aaaBBBccc).to eq(dances.dup.sort_by {|d| d.title.downcase }.map(&:title)) From 2f791ba3a6a3e1311082a4c1702804e6a4ea17ef Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Tue, 28 Jan 2020 07:19:43 -0600 Subject: [PATCH 087/103] improve realism of dances_controller_spec calls --- spec/requests/api/v1/dances_controller_spec.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spec/requests/api/v1/dances_controller_spec.rb b/spec/requests/api/v1/dances_controller_spec.rb index bcc5b873..6d314a7c 100644 --- a/spec/requests/api/v1/dances_controller_spec.rb +++ b/spec/requests/api/v1/dances_controller_spec.rb @@ -3,9 +3,10 @@ RSpec.describe Api::V1::DancesController do describe "POST #index" do let (:now) { DateTime.now } + let (:headers) { { "content_type" => "application/json" } } it "returns json of all dances" do dance = FactoryGirl.create(:call_me) - post api_v1_dances_path + post(api_v1_dances_path, params: {}, headers: headers) expect(response).to have_http_status(200) expect(JSON.parse(response.body)) .to eq({ @@ -35,7 +36,6 @@ end pages.times do |pageIndex| pageSize.times do |rowIndex| - headers = { "content_type" => "application/json" } params = {count: pageSize, offset: pageIndex*pageSize} post(api_v1_dances_path, params: params, headers: headers) expect(response).to have_http_status(200) @@ -53,7 +53,7 @@ dances = "caB".chars.each_with_index.map do |char, i| FactoryGirl.create(:dance, title: char*3, created_at: now - i.hours) end - post api_v1_dances_path(sort_by: 'titleA') + post(api_v1_dances_path, params: {sort_by: 'titleA'}, headers: headers) dances_received = JSON.parse(response.body)['dances'] aaaBBBccc = ['aaa', 'BBB', 'ccc'] expect(aaaBBBccc).to eq(dances.dup.sort_by {|d| d.title.downcase }.map(&:title)) From d4de182f09f3c8468300f6ac70cf43e59c16a639 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Tue, 28 Jan 2020 07:42:04 -0600 Subject: [PATCH 088/103] /api/v1/dances endpoint accepts filter param --- app/controllers/api/v1/dances_controller.rb | 2 +- spec/requests/api/v1/dances_controller_spec.rb | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app/controllers/api/v1/dances_controller.rb b/app/controllers/api/v1/dances_controller.rb index 1ea2e926..a6584d34 100644 --- a/app/controllers/api/v1/dances_controller.rb +++ b/app/controllers/api/v1/dances_controller.rb @@ -15,7 +15,7 @@ def index private def filter - ['figure', '*'] + params[:filter] || ['figure', '*'] end def sort_by diff --git a/spec/requests/api/v1/dances_controller_spec.rb b/spec/requests/api/v1/dances_controller_spec.rb index 6d314a7c..69b3bf9b 100644 --- a/spec/requests/api/v1/dances_controller_spec.rb +++ b/spec/requests/api/v1/dances_controller_spec.rb @@ -60,6 +60,14 @@ expect(dances_received.map{|json| json['title']}).to eq(aaaBBBccc) end + it 'heeds filter' do + dances = [:box_the_gnat_contra, :dance].map {|name| FactoryGirl.create(name)} + box_the_gnat = dances.first + post(api_v1_dances_path, params: {filter: ['figure', 'box the gnat']}, headers: headers) + dances_received = JSON.parse(response.body)['dances'] + expect(dances_received.map {|d| d['title']}).to eq([box_the_gnat.title]) + end + it 'only performs one sql query' end end From 123d667718081d2cbcc8180eef64f1a15c40a471 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Tue, 28 Jan 2020 19:14:40 -0600 Subject: [PATCH 089/103] ez-choreographer-filter works end-to-end. Add 'choreographer' figure filter op. --- app/javascript/advanced-search.tsx | 34 +++++++++++++++++++----------- app/javascript/dance-table.tsx | 11 +++++++--- lib/filter_dances.rb | 5 +++++ 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/app/javascript/advanced-search.tsx b/app/javascript/advanced-search.tsx index b172ceea..d4b21560 100644 --- a/app/javascript/advanced-search.tsx +++ b/app/javascript/advanced-search.tsx @@ -1,17 +1,27 @@ import * as React from "react" +import { useState } from "react" import DanceTable from "./dance-table" -export const AdvancedSearch = () => ( -
- -
-
-
- -
-) +export const AdvancedSearch = () => { + const [choreographer, setChoreographer] = useState("") + const filter = ["choreographer", choreographer] + return ( +
+ +
+
+
+ +
+ ) +} export default AdvancedSearch diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index 6bc70716..5e9cccb3 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -160,12 +160,14 @@ function Table({ fetchData, loading, pageCount: controlledPageCount, + filter, initialSortBy, }: { dancesGetJson: DancesGetJson fetchData: Function loading: boolean pageCount: number + filter: any initialSortBy: any // SortBy }): JSX.Element { // const tableState = useTableState({ pageIndex: 0 }) @@ -206,11 +208,12 @@ function Table({ }, [columns]) // again, need to worry about the return value of this first arg to useEffect - useEffect(() => fetchData({ pageIndex, pageSize, sortBy }), [ + useEffect(() => fetchData({ pageIndex, pageSize, sortBy, filter }), [ fetchData, pageIndex, pageSize, sortBy, + filter, ]) return ( @@ -408,7 +411,7 @@ const ColumnVisToggle = ({ ) } -function DanceTable(): JSX.Element { +function DanceTable({ filter }: { filter: any }): JSX.Element { const [dancesGetJson, setDancesGetJson] = useState({ dances: [] as DanceSearchResult[], numberSearched: 0, @@ -417,7 +420,7 @@ function DanceTable(): JSX.Element { const [pageCount, setPageCount] = React.useState(0) const [loading, setLoading] = React.useState(false) - const fetchData = useCallback(({ pageSize, pageIndex, sortBy }) => { + const fetchData = useCallback(({ pageSize, pageIndex, sortBy, filter }) => { setLoading(true) async function fetchData1(): Promise { const offset = pageIndex * pageSize @@ -428,6 +431,7 @@ function DanceTable(): JSX.Element { count: pageSize, offset: offset, sort_by: sort, + filter: filter, }) const response = await fetch(url, { method: "POST", headers, body }) const json: DancesGetJson = await response.json() @@ -457,6 +461,7 @@ function DanceTable(): JSX.Element { fetchData={fetchData} loading={loading} pageCount={pageCount} + filter={filter} initialSortBy={[]} /> ) diff --git a/lib/filter_dances.rb b/lib/filter_dances.rb index 1d9c2304..a13b5f82 100644 --- a/lib/filter_dances.rb +++ b/lib/filter_dances.rb @@ -239,6 +239,11 @@ def self.matching_figures_for_then(filter, dance) going_concerns end + def self.matching_figures_for_choreographer(filter, dance) + choreographer = filter[1] + dance.choreographer.name.include?(choreographer) ? Set[] : nil + end + COMPARISON_STRING_TO_RUBY_OP = {'≥' => :'>=', '≤' => :'<=', '≠' => :'!=', From bdd8f486699750738faed33fb4f7f31ca0bc5189 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Tue, 28 Jan 2020 21:49:41 -0600 Subject: [PATCH 090/103] fix bug where search Matching Figures weren't displaying correctly. Introced 'when' internal search operator. --- app/javascript/advanced-search.tsx | 2 +- lib/filter_dances.rb | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/app/javascript/advanced-search.tsx b/app/javascript/advanced-search.tsx index d4b21560..5cb5fd37 100644 --- a/app/javascript/advanced-search.tsx +++ b/app/javascript/advanced-search.tsx @@ -4,7 +4,7 @@ import DanceTable from "./dance-table" export const AdvancedSearch = () => { const [choreographer, setChoreographer] = useState("") - const filter = ["choreographer", choreographer] + const filter = ["when", ["choreographer", choreographer], ["figure", "*"]] return (
diff --git a/lib/filter_dances.rb b/lib/filter_dances.rb index a13b5f82..1b059ad4 100644 --- a/lib/filter_dances.rb +++ b/lib/filter_dances.rb @@ -213,6 +213,12 @@ def self.matching_figures_for_figurewise_and(filter, dance) a.present? ? a : nil end + # 2nd argument gets its return value passed through intact iff the 1st argment is truthy + def self.matching_figures_for_when(filter, dance) + _op, when_, expression = filter + matching_figures(when_, dance) ? matching_figures(expression, dance) : nil + end + # figurewise_not def self.matching_figures_for_not(filter, dance) subfilter = filter[1] From b1ba4d59a622f2c6b4fdf031d2108a7a4c71f885 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Tue, 28 Jan 2020 21:50:12 -0600 Subject: [PATCH 091/103] debounce filter --- app/javascript/dance-table.tsx | 14 +++++++------- app/javascript/use-debounce.ts | 30 ++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 7 deletions(-) create mode 100644 app/javascript/use-debounce.ts diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index 5e9cccb3..50584160 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -2,6 +2,7 @@ import * as React from "react" import { useState, useEffect, useCallback } from "react" import { useTable, usePagination, useSortBy } from "react-table" import { NaturalNumberEditor } from "./natural-number-editor" +import useDebounce from "./use-debounce" // TODO: use rails route helpers const choreographerPath = (cid: number): string => { @@ -207,14 +208,13 @@ function Table({ if (!columnDefinitions[i].show) columns[i].toggleHidden(true) }, [columns]) + const debouncedFilter = useDebounce(filter, 800) + // again, need to worry about the return value of this first arg to useEffect - useEffect(() => fetchData({ pageIndex, pageSize, sortBy, filter }), [ - fetchData, - pageIndex, - pageSize, - sortBy, - filter, - ]) + useEffect(() => { + console.log("fire", debouncedFilter) + return fetchData({ pageIndex, pageSize, sortBy, filter: debouncedFilter }) + }, [fetchData, pageIndex, pageSize, sortBy, debouncedFilter]) return ( <> diff --git a/app/javascript/use-debounce.ts b/app/javascript/use-debounce.ts new file mode 100644 index 00000000..282f3113 --- /dev/null +++ b/app/javascript/use-debounce.ts @@ -0,0 +1,30 @@ +// from https://dev.to/gabe_ragland/debouncing-with-react-hooks-jci + +import React, { useState, useEffect } from "react" + +// Our hook +export default function useDebounce(value: T, delay: number): T { + // State and setters for debounced value + const [debouncedValue, setDebouncedValue] = useState(value) + + useEffect(() => { + // Set debouncedValue to value (passed in) after the specified delay + const handler = setTimeout(() => { + setDebouncedValue(value) + }, delay) + + // Return a cleanup function that will be called every time ... + // ... useEffect is re-called. useEffect will only be re-called ... + // ... if value changes (see the inputs array below). + // This is how we prevent debouncedValue from changing if value is ... + // ... changed within the delay period. Timeout gets cleared and restarted. + // To put it in context, if the user is typing within our app's ... + // ... search box, we don't want the debouncedValue to update until ... + // ... they've stopped typing for more than 500ms. + return () => { + clearTimeout(handler) + } // Only re-call effect if value changes + }, [value]) + + return debouncedValue +} From 3e2d57e3453a411f76f908c1d4142f108655cba6 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Tue, 28 Jan 2020 23:09:36 -0600 Subject: [PATCH 092/103] port many specs from dance_datatable_spec to filter_dances_spec --- spec/lib/filter_dances_spec.rb | 172 ++++++++++++++++++++++++++++++++- 1 file changed, 171 insertions(+), 1 deletion(-) diff --git a/spec/lib/filter_dances_spec.rb b/spec/lib/filter_dances_spec.rb index cf463aea..69f4663d 100644 --- a/spec/lib/filter_dances_spec.rb +++ b/spec/lib/filter_dances_spec.rb @@ -1,11 +1,13 @@ +# coding: utf-8 require 'rails_helper' require 'filter_dances' describe FilterDances do + let (:dialect) { JSLibFigure.default_dialect } + describe "filter_dances" do let (:now) { DateTime.now } - let (:dialect) { JSLibFigure.default_dialect } it 'works with a matchy filter and plenty of dances' do dances = 20.times.map {|i| FactoryGirl.create(:dance, created_at: now - i.hours) } @@ -54,6 +56,174 @@ it 'checks the numberSearched and numberMatching fields' end + describe "search operators (kinda filter_dances again)" do + let! (:dances) { [:dance, :box_the_gnat_contra, :call_me, :dance_with_zero_figures].map {|name| FactoryGirl.create(name)} } + let (:zero) { dances.last } + let (:dance_titles_without_zero) { dances.map(&:title) - [dances.last.title]} + + def titles(filtered) + filtered[:dances].map {|json| json['title']} + end + + describe 'figure' do + it 'works' do + filtered = FilterDances.filter_dances(['figure', 'hey'], dialect: dialect) + expect(titles(filtered)).to eq(['Call Me']) + end + + it 'wildcard' do + filtered = FilterDances.filter_dances(['figure', '*'], dialect: dialect) + expect(titles(filtered)).to contain_exactly(*dance_titles_without_zero) + end + + it "quotes and spaces work - Rory O'More" do # something about this figure didn't work -dm 10-15-2017 + rory = FactoryGirl.create(:dance_with_a_rory_o_more); + dances << rory + filtered = FilterDances.filter_dances(['figure', "Rory O'More"], dialect: dialect) + expect(titles(filtered)).to eq([rory.title]) + end + + it 'circle works with an angle' do + filtered = FilterDances.filter_dances(['figure', 'circle', '*', 360, '*'], dialect: dialect) + expect(titles(filtered)).to eq(['The Rendevouz']) + end + + it "'shadow' finds both 'shadow' and '2nd shadow'" do + first_shadow = FactoryGirl.create(:dance_with_pair, pair: 'shadows') + second_shadow = FactoryGirl.create(:dance_with_pair, pair: '2nd shadows') + augmented_dances = dances + [first_shadow, second_shadow] + filtered = FilterDances.filter_dances(['figure', 'swing', 'shadows', '*', '*'], dialect: dialect) + expect(titles(filtered)).to contain_exactly(first_shadow.title, second_shadow.title) + end + + it "'neighbors' finds 'neigbhors', 'prev neighbors', 'next neighbors', '3rd neighbors', and '4th neighbors'" do + augmented_dances = dances + ['prev neighbors', 'next neighbors', '3rd neighbors', '4th neighbors', 'partners'].map {|n| + FactoryGirl.create(:dance_with_pair, pair: n) + } + partners_should_not_match = augmented_dances.last + filtered = FilterDances.filter_dances(['figure', 'swing', 'neighbors', '*', '*'], dialect: dialect) + expect(titles(filtered)).to contain_exactly(*(augmented_dances.map(&:title).sort - [partners_should_not_match.title, zero.title])) + end + end + + describe 'formation' do + # there's some heavier testing of this in features/welcome/index_spec.rb -dm 08-19-2018 + it 'Becket ccw' do + filtered = FilterDances.filter_dances(['formation', 'Becket ccw'], dialect: dialect) + expect(titles(filtered)).to eq(['Call Me']) + end + + it 'improper' do + filtered = FilterDances.filter_dances(['formation', 'improper'], dialect: dialect) + expect(titles(filtered)).to contain_exactly(*(dances.map(&:title) - ['Call Me'])) + end + + it 'everything else' do + FactoryGirl.create(:dance, start_type: 'circle mixer', title: 'wacky') + filtered = FilterDances.filter_dances(['formation', 'everything else'], dialect: dialect) + expect(titles(filtered)).to eq(['wacky']) + end + end + + it 'progression' do + filtered = FilterDances.filter_dances(['progression'], dialect: dialect) + expect(titles(filtered)).to contain_exactly("The Rendevouz", "Box the Gnat Contra", "Call Me") + end + + describe 'and' do + it 'works' do + filtered = FilterDances.filter_dances(['and', ['figure', 'circle'], ['figure', 'right left through']], dialect: dialect) + expect(titles(filtered)).to eq(['Call Me']) + end + + it 'works with no' do + filtered = FilterDances.filter_dances(['and', ['no', ['figure', 'chain']], ['figure', 'star']], dialect: dialect) + expect(titles(filtered)).to eq([]) + end + end + + it '& works with progression' do + filtered = FilterDances.filter_dances(['&', ['figure', 'slide along set'], ['progression']], dialect: dialect) + expect(titles(filtered)).to eq(['The Rendevouz']) + end + + it 'or' do + filtered = FilterDances.filter_dances(['or', ['figure', 'circle'], ['figure', 'right left through']], dialect: dialect) + expect(titles(filtered)).to contain_exactly(*dance_titles_without_zero) + end + + it 'no' do + filtered = FilterDances.filter_dances(['no', ['figure', 'hey']], dialect: dialect) + expect(titles(filtered)).to contain_exactly('The Rendevouz', 'Box the Gnat Contra', zero.title) + end + + it 'all' do + dances2 = [:dance_with_a_swing, :dance_with_a_do_si_do].map {|d| FactoryGirl.create(d)} + filtered = FilterDances.filter_dances(['all', ['figure', 'swing']], dialect: dialect) + expect(titles(filtered)).to contain_exactly(dances2.first.title, zero.title) + end + + it 'not' do + FactoryGirl.create(:dance_with_a_swing) + filtered = FilterDances.filter_dances(['not', ['figure', 'swing']], dialect: dialect) + expect(titles(filtered)).to contain_exactly('The Rendevouz', 'Box the Gnat Contra', 'Call Me') + end + + describe 'then' do + it 'basically works' do + filtered = FilterDances.filter_dances(['then', ['figure', 'swing'], ['figure', 'circle']], dialect: dialect) + expect(titles(filtered)).to contain_exactly('The Rendevouz', 'Call Me') + end + + it 'works with not' do + # All the swings in Call Me are immediately followed by either a circle or a right left through. + filtered = FilterDances.filter_dances(['then', ['figure', 'swing'], ['not', ['or', ['figure', 'circle'], ['figure', 'right left through']]]], dialect: dialect) + expect(titles(filtered)).to contain_exactly('The Rendevouz', 'Box the Gnat Contra') + end + end + + describe 'count' do + let (:all_titles) { dances.map(&:title) } + + def filtered_titles(comparison, number) + titles(FilterDances.filter_dances(['count', ['figure', 'circle'], comparison, number.to_s], dialect: dialect)) + end + + it '≥ 2' do + expect(filtered_titles('≥', 2)).to eq(['The Rendevouz']) + end + + it '< 2' do + expect(filtered_titles('<', 2)).to contain_exactly(*(all_titles - ['The Rendevouz'])) + end + + it '≠ 1' do + expect(filtered_titles('≠', 1)).to contain_exactly(*(all_titles - ['Call Me'])) + end + + it '= 1' do + expect(filtered_titles('=', 1)).to eq(['Call Me']) + end + + end + + describe 'compare' do + let (:all_titles) { dances.map(&:title) } + + def filtered_titles(comparison, number) + titles(FilterDances.filter_dances(['compare', ['constant', 0], comparison, ['constant', number]], dialect: dialect)) + end + + it "0 = 0" do + expect(filtered_titles('=', 0)).to contain_exactly(*all_titles) + end + + it "0 > 0" do + expect(filtered_titles('>', 0)).to eq([]) + end + end + end + it 'filter_result_to_json' do dance = FactoryGirl.build(:dance) result = { From 60bbdb719f9d9396f10fcfb2275ba2b5d41c454b Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Tue, 28 Jan 2020 23:20:58 -0600 Subject: [PATCH 093/103] choreographer search is case insensitive --- lib/filter_dances.rb | 4 ++-- spec/lib/filter_dances_spec.rb | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/filter_dances.rb b/lib/filter_dances.rb index 1b059ad4..e1264898 100644 --- a/lib/filter_dances.rb +++ b/lib/filter_dances.rb @@ -246,8 +246,8 @@ def self.matching_figures_for_then(filter, dance) end def self.matching_figures_for_choreographer(filter, dance) - choreographer = filter[1] - dance.choreographer.name.include?(choreographer) ? Set[] : nil + choreographer = filter[1].downcase + dance.choreographer.name.downcase.include?(choreographer) ? Set[] : nil end COMPARISON_STRING_TO_RUBY_OP = {'≥' => :'>=', diff --git a/spec/lib/filter_dances_spec.rb b/spec/lib/filter_dances_spec.rb index 69f4663d..a0c079ce 100644 --- a/spec/lib/filter_dances_spec.rb +++ b/spec/lib/filter_dances_spec.rb @@ -222,6 +222,17 @@ def filtered_titles(comparison, number) expect(filtered_titles('>', 0)).to eq([]) end end + + describe 'choreographer' do + it "works case-insensitively" do + filtered = FilterDances.filter_dances(['choreographer', dances.first.choreographer.name.upcase], dialect: dialect) + expect(titles(filtered)).to eq([dances.first.title]) + end + end + + describe 'when' do + it "returns the dances of the 2nd argument iff 1st argument" + end end it 'filter_result_to_json' do From 7c7d0869d98086717bbfe3423934632c72f5544b Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Tue, 28 Jan 2020 23:22:17 -0600 Subject: [PATCH 094/103] remove console.log --- app/javascript/dance-table.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index 50584160..b173b6af 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -211,10 +211,10 @@ function Table({ const debouncedFilter = useDebounce(filter, 800) // again, need to worry about the return value of this first arg to useEffect - useEffect(() => { - console.log("fire", debouncedFilter) - return fetchData({ pageIndex, pageSize, sortBy, filter: debouncedFilter }) - }, [fetchData, pageIndex, pageSize, sortBy, debouncedFilter]) + useEffect( + () => fetchData({ pageIndex, pageSize, sortBy, filter: debouncedFilter }), + [fetchData, pageIndex, pageSize, sortBy, debouncedFilter] + ) return ( <> From e3e4f8738a3024d1ddf41585a21fbaee8dc1dfd2 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Wed, 29 Jan 2020 21:20:07 -0600 Subject: [PATCH 095/103] replace obtuse 'when' search operator with intuitive 'if' search operator --- app/javascript/advanced-search.tsx | 2 +- lib/filter_dances.rb | 17 +++++++++++------ spec/lib/filter_dances_spec.rb | 22 ++++++++++++++++++++-- 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/app/javascript/advanced-search.tsx b/app/javascript/advanced-search.tsx index 5cb5fd37..c78b713f 100644 --- a/app/javascript/advanced-search.tsx +++ b/app/javascript/advanced-search.tsx @@ -4,7 +4,7 @@ import DanceTable from "./dance-table" export const AdvancedSearch = () => { const [choreographer, setChoreographer] = useState("") - const filter = ["when", ["choreographer", choreographer], ["figure", "*"]] + const filter = ["if", ["choreographer", choreographer], ["figure", "*"]] return (
diff --git a/lib/filter_dances.rb b/lib/filter_dances.rb index e1264898..39f9c446 100644 --- a/lib/filter_dances.rb +++ b/lib/filter_dances.rb @@ -166,6 +166,17 @@ def self.matching_figures_for_progression(filter, dance) s.present? ? s : nil end + def self.matching_figures_for_if(filter, dance) + _op, if_, then_, else_ = filter + if matching_figures(if_, dance) + matching_figures(then_, dance) + elsif else_ + matching_figures(else_, dance) + else + nil + end + end + def self.matching_figures_for_no(filter, dance) subfilter = filter[1] if matching_figures(subfilter, dance) @@ -213,12 +224,6 @@ def self.matching_figures_for_figurewise_and(filter, dance) a.present? ? a : nil end - # 2nd argument gets its return value passed through intact iff the 1st argment is truthy - def self.matching_figures_for_when(filter, dance) - _op, when_, expression = filter - matching_figures(when_, dance) ? matching_figures(expression, dance) : nil - end - # figurewise_not def self.matching_figures_for_not(filter, dance) subfilter = filter[1] diff --git a/spec/lib/filter_dances_spec.rb b/spec/lib/filter_dances_spec.rb index a0c079ce..a0641f60 100644 --- a/spec/lib/filter_dances_spec.rb +++ b/spec/lib/filter_dances_spec.rb @@ -230,8 +230,26 @@ def filtered_titles(comparison, number) end end - describe 'when' do - it "returns the dances of the 2nd argument iff 1st argument" + describe 'if' do + it "only with the then" do + filter = ['if', ['choreographer', dances.first.choreographer.name], + ['figure', 'do si do']] + filtered = FilterDances.filter_dances(filter, dialect: dialect) + expect(titles(filtered)).to eq([dances.first.title]) + expect(filtered.dig(:dances, 0, 'matching_figures_html')).to eq('ladles do si do 1½') + end + + it "with both then and else" do + filter = ['if', ['choreographer', dances.first.choreographer.name], + ['figure', 'do si do'], + ['progression']] + filtered = FilterDances.filter_dances(filter, dialect: dialect) + titles_with_a_progression = dances.select {|d| d.figures.length > 0}.map(&:title) + expect(titles(filtered)).to contain_exactly(*titles_with_a_progression) + expect(filtered[:dances].map {|d| d['matching_figures_html']}).to( + contain_exactly("ladles do si do 1½", "ladles chain ⁋", "partners balance & swing ⁋") + ) + end end end From 7718758017b619da34c2714d626d146dce9c555e Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Wed, 29 Jan 2020 22:53:47 -0600 Subject: [PATCH 096/103] fix merge bug --- lib/filter_dances.rb | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/lib/filter_dances.rb b/lib/filter_dances.rb index 39f9c446..38ee6de0 100644 --- a/lib/filter_dances.rb +++ b/lib/filter_dances.rb @@ -60,16 +60,17 @@ def self.filter_result_to_json(dance, matching_figures_html) } end + # this code is duplicated in dance_helper, but I can't figure out how to cleanly import it. def self.dance_publish_cell(enum_value) - case enum_value.to_s - when 'all' - 'everyone' - when 'link' - 'link' + case enum_value when 'off' - 'myself' + 'private' + when 'sketchbook' + 'sketchbook' + when 'all' + 'everywhere' else - raise 'Fell through enum case statement' + raise 'fell through enum case' end end From 59623668d63206095b4f25ffbad2586220cfeab9 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Wed, 29 Jan 2020 23:07:06 -0600 Subject: [PATCH 097/103] fix spec --- spec/features/welcome/search_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/features/welcome/search_spec.rb b/spec/features/welcome/search_spec.rb index d0986028..3f290e57 100644 --- a/spec/features/welcome/search_spec.rb +++ b/spec/features/welcome/search_spec.rb @@ -125,8 +125,8 @@ def turn_page_button_css(label, disabled=false) it 'published column cells' do with_login do |user| dances.each_with_index do |dance, i| - publish = [:off, :link, :all][i] - publish_string = ['myself', 'link', 'everyone'][i] + publish = [:off, :sketchbook, :all][i] + publish_string = ['private', 'sketchbook', 'everywhere'][i] dance.update!(publish: publish, user: user) visit(s_path) click_button 'Sharing' From 604e255c03d9320d278e37b236a6fb38fdb8942d Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Wed, 29 Jan 2020 23:08:33 -0600 Subject: [PATCH 098/103] fix spec --- spec/lib/filter_dances_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/lib/filter_dances_spec.rb b/spec/lib/filter_dances_spec.rb index a0641f60..20643daa 100644 --- a/spec/lib/filter_dances_spec.rb +++ b/spec/lib/filter_dances_spec.rb @@ -266,7 +266,7 @@ def filtered_titles(comparison, number) user_name: dance.user.name, created_at: dance.created_at.as_json, updated_at: dance.updated_at.as_json, - publish: dance.publish == 'all' && 'everyone', + publish: dance.publish == 'all' && 'everywhere', matching_figures_html: 'whole dance', }.stringify_keys expect(FilterDances.filter_result_to_json(dance, 'whole dance')).to eq(result) From 9fb035694790bf5dafeed5c0d108ba5ccc736736 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Wed, 29 Jan 2020 23:09:51 -0600 Subject: [PATCH 099/103] fix spec --- spec/requests/api/v1/dances_controller_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/requests/api/v1/dances_controller_spec.rb b/spec/requests/api/v1/dances_controller_spec.rb index 69b3bf9b..90aa817d 100644 --- a/spec/requests/api/v1/dances_controller_spec.rb +++ b/spec/requests/api/v1/dances_controller_spec.rb @@ -23,7 +23,7 @@ "user_name" => dance.user.name, "created_at"=>dance.created_at.as_json, "updated_at"=>dance.updated_at.as_json, - "publish"=>"everyone", + "publish"=>"everywhere", "matching_figures_html"=>"whole dance"} ]}) end From 60a45c2c2efef1cb6119babe73cb27bc6805ab93 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Wed, 29 Jan 2020 23:22:31 -0600 Subject: [PATCH 100/103] remove dead file --- app/javascript/search_chooser.vue | 105 ------------------------------ 1 file changed, 105 deletions(-) delete mode 100644 app/javascript/search_chooser.vue diff --git a/app/javascript/search_chooser.vue b/app/javascript/search_chooser.vue deleted file mode 100644 index 07bcb807..00000000 --- a/app/javascript/search_chooser.vue +++ /dev/null @@ -1,105 +0,0 @@ - - From c7ddf384cc65d0708c7e65da0f592b402982f610 Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Wed, 29 Jan 2020 23:25:37 -0600 Subject: [PATCH 101/103] update README.md --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 83a5a0b2..5b542d8b 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,6 @@ will run the js linter on `app/javascript/dance-table.tsx`. This is currently th ``` -yarn run tsc --watch +bin/webpack-dev-server ``` -This will run the typescript compiler - for some reason ts compile errors don't stop the main build, so I keep an eye on this. -Unfortunately, it barfs compilation artifacts in the soruce tree. If those are the only new files, I carefully clean them with `git clean -fd`. \ No newline at end of file +This will indirectly run the typescript compiler in watch mode - for some reason ts compile errors don't stop the ruby, so I keep an eye on this terminal. From f0d464166aa5bf831af2c78f97c83afb66b764ee Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Thu, 30 Jan 2020 22:59:45 -0600 Subject: [PATCH 102/103] code review fixups --- app/javascript/dance-table.tsx | 19 +++---------------- app/javascript/packs/search_page.tsx | 1 - lib/filter_dances.rb | 17 ----------------- lib/sort_parser.rb | 14 ++++++-------- spec/features/welcome/search_spec.rb | 3 ++- spec/lib/filter_dances_spec.rb | 2 +- 6 files changed, 12 insertions(+), 44 deletions(-) diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index b173b6af..2382248f 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -34,9 +34,8 @@ const DateCell = (time: string): JSX.Element => ( const CreatedAtDateCell = (props: any /* Cell */): JSX.Element => DateCell(props.row.values.created_at) -const UpdatedAtDateCell = (props: any /* Cell */): JSX.Element => { - return DateCell(props.row.values.updated_at) -} +const UpdatedAtDateCell = (props: any /* Cell */): JSX.Element => + DateCell(props.row.values.updated_at) const MatchingFiguresHtmlCell = (props: any /* Cell */): JSX.Element => (
ca.show) - // ) - - // // const toggleTitleVisible = () => setTitleVisible(!titleVisible) - // const columns = useMemo( - // () => - // columnDefinitions.map((cd, i) => ({ ...cd, show: visibleToggles[i] })), - // [visibleToggles] - // ) - // console.log(columns) - return (
- -
:desc} end end end - DEFAULT = [{created_at: :desc}] + DEFAULT_SORT = [{created_at: :desc}] end diff --git a/spec/features/welcome/search_spec.rb b/spec/features/welcome/search_spec.rb index 3f290e57..3f6a19bb 100644 --- a/spec/features/welcome/search_spec.rb +++ b/spec/features/welcome/search_spec.rb @@ -147,6 +147,8 @@ def turn_page_button_css(label, disabled=false) end it 'some matches prints figures' do + # TODO: update how we pass the filter when there's a user-facing way to send figure queries + # 4NOW: stub the controller, heh heh -dm 01-30-2020 expect_any_instance_of(Api::V1::DancesController).to receive(:filter).and_return(['figure', 'circle']) # mock dances @@ -207,7 +209,6 @@ def turn_page_button_css(label, disabled=false) find('th', text: 'Title').click expect(page).to_not have_css('th .glyphicon-sort-by-attributes-alt') expect(page).to_not have_css('th .glyphicon-sort-by-attributes') - page.save_screenshot('/tmp/foo.png') dances.each_with_index do |dance, i| expect(page).send(i < 10 ? :to : :to_not, have_text(dance.title)) end diff --git a/spec/lib/filter_dances_spec.rb b/spec/lib/filter_dances_spec.rb index 20643daa..1912e04f 100644 --- a/spec/lib/filter_dances_spec.rb +++ b/spec/lib/filter_dances_spec.rb @@ -266,7 +266,7 @@ def filtered_titles(comparison, number) user_name: dance.user.name, created_at: dance.created_at.as_json, updated_at: dance.updated_at.as_json, - publish: dance.publish == 'all' && 'everywhere', + publish: (dance.publish == 'all') && 'everywhere', matching_figures_html: 'whole dance', }.stringify_keys expect(FilterDances.filter_result_to_json(dance, 'whole dance')).to eq(result) From 76de3c5183bd3044f1a8d1a5c67238699459e14b Mon Sep 17 00:00:00 2001 From: Dave Morse Date: Fri, 31 Jan 2020 08:18:25 -0600 Subject: [PATCH 103/103] Add bouncyFirstRun option to useDebounce. Rejigger arguments to use options hash. --- app/javascript/dance-table.tsx | 5 +++- app/javascript/use-debounce.ts | 43 ++++++++++++++++++---------------- 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx index 2382248f..60cb897b 100644 --- a/app/javascript/dance-table.tsx +++ b/app/javascript/dance-table.tsx @@ -207,7 +207,10 @@ function Table({ if (!columnDefinitions[i].show) columns[i].toggleHidden(true) }, [columns]) - const debouncedFilter = useDebounce(filter, 800) + const debouncedFilter = useDebounce(filter, { + delay: 800, + bouncyFirstRun: true, + }) // again, need to worry about the return value of this first arg to useEffect useEffect( diff --git a/app/javascript/use-debounce.ts b/app/javascript/use-debounce.ts index 282f3113..2e12389e 100644 --- a/app/javascript/use-debounce.ts +++ b/app/javascript/use-debounce.ts @@ -1,29 +1,32 @@ // from https://dev.to/gabe_ragland/debouncing-with-react-hooks-jci -import React, { useState, useEffect } from "react" +import React, { useState, useEffect, useRef } from "react" -// Our hook -export default function useDebounce(value: T, delay: number): T { - // State and setters for debounced value +export default function useDebounce( + value: T, + { + delay = 800, + bouncyFirstRun = false, + }: { delay: number; bouncyFirstRun: boolean } = { + delay: 800, + bouncyFirstRun: false, + } +): T { const [debouncedValue, setDebouncedValue] = useState(value) - + const isFirstRun = useRef(true) useEffect(() => { - // Set debouncedValue to value (passed in) after the specified delay - const handler = setTimeout(() => { + if (bouncyFirstRun && isFirstRun.current) { + isFirstRun.current = false setDebouncedValue(value) - }, delay) - - // Return a cleanup function that will be called every time ... - // ... useEffect is re-called. useEffect will only be re-called ... - // ... if value changes (see the inputs array below). - // This is how we prevent debouncedValue from changing if value is ... - // ... changed within the delay period. Timeout gets cleared and restarted. - // To put it in context, if the user is typing within our app's ... - // ... search box, we don't want the debouncedValue to update until ... - // ... they've stopped typing for more than 500ms. - return () => { - clearTimeout(handler) - } // Only re-call effect if value changes + } else { + const handler = setTimeout(() => { + console.log("setTimeout resolve") + setDebouncedValue(value) + }, delay) + return () => { + clearTimeout(handler) + } + } }, [value]) return debouncedValue