diff --git a/.browserslistrc b/.browserslistrc index de555672..e94f8140 100644 --- a/.browserslistrc +++ b/.browserslistrc @@ -1 +1 @@ -> 1% +defaults 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..ccfcf30e --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,57 @@ +module.exports = { + root: true, + parser: "@typescript-eslint/parser", + parserOptions: { + ecmaVersion: 2018, + sourceType: "module", + ecmaFeatures: { + jsx: true, + }, + }, + plugins: ["@typescript-eslint", "react-hooks"], + extends: [ + "eslint:recommended", + "plugin:react/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, + }, + }, + ], + "@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: [ + { + files: ["*.ts", "*.tsx"], + rules: { + "@typescript-eslint/explicit-function-return-type": [ + "error", + { + allowExpressions: true, + allowTypedFunctionExpressions: true, + }, + ], + }, + }, + ], + settings: { + react: { + version: "detect", + }, + }, +} diff --git a/Gemfile b/Gemfile index c4319b4c..0261f2bc 100644 --- a/Gemfile +++ b/Gemfile @@ -84,4 +84,4 @@ gem 'ajax-datatables-rails' gem 'actionview-encoded_mail_to' -gem 'webpacker', '>= 4.0.x' +gem 'webpacker', '~> 4.x' diff --git a/Gemfile.lock b/Gemfile.lock index 31b5f5cb..7e6f48f4 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) @@ -300,7 +300,7 @@ DEPENDENCIES uglifier (>= 1.3.0) unicorn web-console - webpacker (>= 4.0.x) + webpacker (~> 4.x) BUNDLED WITH 2.0.2 diff --git a/README.md b/README.md index 79db2037..5b542d8b 100644 --- a/README.md +++ b/README.md @@ -54,8 +54,22 @@ 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. + + +``` +bin/webpack-dev-server +``` +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. 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/assets/stylesheets/welcome.scss b/app/assets/stylesheets/welcome.scss index 9157a51a..ed96ea1d 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 @@ -148,3 +149,38 @@ select.chooser-argument { .chooser-argument input[type="checkbox"] { margin-top: 0px; /* override 4px in bootstrap */ } + +.pagination { + @extend .btn-group; + margin-top: 0; + margin-bottom: 0; +} + +.flipped-glyphicon { + transform: scaleX(-1); +} + +.dance-table-footer { + display: flex; + justify-content: space-between; + 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; +} + +.dance-table-th div { + display: flex; + justify-content: space-between; + align-items: center; +} diff --git a/app/controllers/api/v1/dances_controller.rb b/app/controllers/api/v1/dances_controller.rb new file mode 100644 index 00000000..a6584d34 --- /dev/null +++ b/app/controllers/api/v1/dances_controller.rb @@ -0,0 +1,44 @@ +require 'filter_dances' +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, + offset: offset, + dialect: dialect, + sort_by: sort_by) + end + + private + def filter + params[:filter] || ['figure', '*'] + end + + def sort_by + params[:sort_by] || "" + end + + def count + default_integer_param(:count, 10) + end + + def offset + default_integer_param(:offset, 0) + end + + 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/advanced-search.tsx b/app/javascript/advanced-search.tsx new file mode 100644 index 00000000..c78b713f --- /dev/null +++ b/app/javascript/advanced-search.tsx @@ -0,0 +1,27 @@ +import * as React from "react" +import { useState } from "react" +import DanceTable from "./dance-table" + +export const AdvancedSearch = () => { + const [choreographer, setChoreographer] = useState("") + const filter = ["if", ["choreographer", choreographer], ["figure", "*"]] + + return ( +
+ +
+
+
+ +
+ ) +} +export default AdvancedSearch diff --git a/app/javascript/dance-table.tsx b/app/javascript/dance-table.tsx new file mode 100644 index 00000000..60cb897b --- /dev/null +++ b/app/javascript/dance-table.tsx @@ -0,0 +1,460 @@ +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 => { + 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 => + 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 + disableSortBy?: 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, + disableSortBy: true, + }, +] + +function PaginationSentence({ + pageOffset, + pageCount, + matchCount, + isFiltered, +}: { + pageOffset: number + pageCount: number + matchCount: number + isFiltered: boolean +}): JSX.Element { + return ( + + Showing {pageOffset + 1} to {pageOffset + pageCount} of {matchCount}{" "} + {isFiltered && "filtered"} dances. + + ) +} + +function DanceTableTh({ + column, +}: { + column: any // 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" + desc?: boolean +} +export type SortBy = Array + +export const sortByParam = (sortBy: SortBy): string => + sortBy + .map(sbe => (sbe.id ? sbe.id + (sbe.desc ? "D" : "A") : sbe + "A")) + .join("") + +function Table({ + dancesGetJson, + 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 }) + // const [{ pageIndex, pageSize }] = tableState + + const tableOptions = { + columns: columnDefinitions, + data: dancesGetJson.dances, + manualPagination: true, + manualSortBy: true, // after 7.0.0-rc2 + manualSorting: true, // before 7.0.0-rc2 + pageCount: controlledPageCount, + initialState: { sortBy: initialSortBy }, + } + const { + flatColumns: columns, + getTableProps, + headerGroups, + prepareRow, + canPreviousPage, + canNextPage, + pageCount, + gotoPage, + nextPage, + previousPage, + setPageSize, + getTableBodyProps, + rows, + state: { sortBy, pageIndex, pageSize }, + } = 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++) + if (!columnDefinitions[i].show) columns[i].toggleHidden(true) + }, [columns]) + + const debouncedFilter = useDebounce(filter, { + delay: 800, + bouncyFirstRun: true, + }) + + // again, need to worry about the return value of this first arg to useEffect + useEffect( + () => fetchData({ pageIndex, pageSize, sortBy, filter: debouncedFilter }), + [fetchData, pageIndex, pageSize, sortBy, debouncedFilter] + ) + + return ( + <> + {loading &&
loading...
} + + + + {headerGroups.map((headerGroup: any) => ( + + {headerGroup.headers.map((column: any) => ( + + ))} + + ))} + + + {rows.map((row: any) => { + prepareRow(row) + return ( + + {row.cells.map((cell: any) => ( + + ))} + + ) + })} + +
{cell.render("Cell")}
+
+
+ +
+
+ +
+
+ {" "} +
+
+
+ { + gotoPage(0) + }} + isDisabled={!canPreviousPage} + label="<<" + />{" "} + {" "} + {" "} + { + gotoPage(pageCount - 1) + }} + isDisabled={!canNextPage} + label=">>" + /> +
+
+
+ + ) +} + +function TurnPageButton({ + label, + onClick, + isDisabled = false, +}: // glyphicon, +// iconIsFlipped = false, +{ + label: "<<" | "<" | ">" | ">>" + onClick: () => void + isDisabled?: boolean + // glyphicon: string + // iconIsFlipped?: boolean +}): JSX.Element { + 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 ( + + ) +} + +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 + publish: string + figures: string +} + +interface DancesGetJson { + numberSearched: number + numberMatching: number + dances: Array +} + +const ColumnVisToggles = ({ columns }: { columns: any[] }): JSX.Element => { + return ( +
+ +
+ {columns.map((column, i) => ( + + ))} +
+
+ ) +} + +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 ( + + ) +} + +function DanceTable({ filter }: { filter: any }): JSX.Element { + const [dancesGetJson, setDancesGetJson] = useState({ + dances: [] as DanceSearchResult[], + numberSearched: 0, + numberMatching: 0, + }) + + const [pageCount, setPageCount] = React.useState(0) + const [loading, setLoading] = React.useState(false) + const fetchData = useCallback(({ pageSize, pageIndex, sortBy, filter }) => { + setLoading(true) + async function fetchData1(): Promise { + const offset = pageIndex * pageSize + const sort = sortByParam(sortBy) + const url = "/api/v1/dances" + const headers = { "Content-type": "application/json" } + const body = JSON.stringify({ + count: pageSize, + offset: offset, + sort_by: sort, + filter: filter, + }) + const response = await fetch(url, { method: "POST", headers, body }) + const json: DancesGetJson = await response.json() + setDancesGetJson(json) + setPageCount(Math.ceil(json.numberMatching / pageSize)) + setLoading(false) + } + fetchData1() + // maybe return in-use-ness to prevent a memory leak here? + }, []) + + return ( + + ) +} + +export default DanceTable diff --git a/app/javascript/natural-number-editor.tsx b/app/javascript/natural-number-editor.tsx new file mode 100644 index 00000000..51a5c2d4 --- /dev/null +++ b/app/javascript/natural-number-editor.tsx @@ -0,0 +1,41 @@ +import * as React from "react" +import { useState } from "react" + +// kidna want a 'min', so that I can set a minimum page number of 1 + +export function NaturalNumberEditor({ + value, + setValue, + inputProperties = {}, +}: { + value: number + setValue: (n: number) => void + 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 ( + { + const sv = e.target.value.replace(/[^0-9]/g, "") + setStringValue(sv) + if (sv) setValue(Number(sv)) + }} + className={className} + {...inputPropertiesWithoutClassName} + /> + ) +} +export default NaturalNumberEditor 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/packs/search_page.tsx b/app/javascript/packs/search_page.tsx new file mode 100644 index 00000000..f7acd39f --- /dev/null +++ b/app/javascript/packs/search_page.tsx @@ -0,0 +1,15 @@ +///////////////////////////////////////////////////////////////// + +import * as React from "react" +import * as ReactDOM from "react-dom" +// import './index.css'; +import AdvancedSearch from "../advanced-search" +// import * as serviceWorker from './serviceWorker'; +const root = document.getElementById("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/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 @@ - - 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/app/javascript/types/react-table-config.d.ts b/app/javascript/types/react-table-config.d.ts new file mode 100644 index 00000000..db5b3b52 --- /dev/null +++ b/app/javascript/types/react-table-config.d.ts @@ -0,0 +1,95 @@ +declare module "react-table" +// 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, // 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 TableState +// extends UseSortByState {} +// // UseGroupByState, +// // UseFiltersState, +// // UseExpandedState, +// // UseColumnOrderState, +// // UsePaginationState, +// // UseRowSelectState + +// export interface Column {} +// // UseFiltersColumnOptions, +// // UseGroupByColumnOptions, +// // UseSortByColumnOptions, +// // UseResizeColumnsColumnOptions {} + +// export interface ColumnInstance +// extends UseSortByColumnProps {} +// // UseFiltersColumnProps, +// // UseGroupByColumnProps, +// // UseResizeColumnsHeaderProps, + +// export interface Cell {} +// // UseTableCellProps, +// // UseGroupByCellProps, +// // UseRowStateCellProps {} + +// export interface Row {} +// // UseExpandedRowProps, +// // UseGroupByRowProps, +// // UseRowSelectRowProps, +// // UseRowStateRowProps {} +// } diff --git a/app/javascript/use-debounce.ts b/app/javascript/use-debounce.ts new file mode 100644 index 00000000..2e12389e --- /dev/null +++ b/app/javascript/use-debounce.ts @@ -0,0 +1,33 @@ +// from https://dev.to/gabe_ragland/debouncing-with-react-hooks-jci + +import React, { useState, useEffect, useRef } from "react" + +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(() => { + if (bouncyFirstRun && isFirstRun.current) { + isFirstRun.current = false + setDebouncedValue(value) + } else { + const handler = setTimeout(() => { + console.log("setTimeout resolve") + setDebouncedValue(value) + }, delay) + return () => { + clearTimeout(handler) + } + } + }, [value]) + + return debouncedValue +} diff --git a/app/views/welcome/search.html.erb b/app/views/welcome/search.html.erb index 498224a7..89c8c917 100644 --- a/app/views/welcome/search.html.erb +++ b/app/views/welcome/search.html.erb @@ -1,30 +1,11 @@ -<%= javascript_pack_tag 'search' %> -
-

Find Dances

-
- - -
+<%= javascript_pack_tag 'search_page', defer: true %> +<%= stylesheet_pack_tag 'search_page' %> -
+
+

Find Dances

-
- - - - - - - - - - - - - - - -
TitleChoreographerHookFormationUserEnteredUpdatedSharingFigures
+
+
<%= @dialect_json %>
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/routes.rb b/config/routes.rb index 77a82cd0..b68cd92f 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 + post 'dances' => "dances#index" + end + end end diff --git a/config/webpack/environment.js b/config/webpack/environment.js index 6ef014b0..f10aeb53 100644 --- a/config/webpack/environment.js +++ b/config/webpack/environment.js @@ -1,7 +1,5 @@ const { environment } = require('@rails/webpacker') -const { VueLoaderPlugin } = require('vue-loader') -const vue = require('./loaders/vue') +const typescript = require('./loaders/typescript') -environment.plugins.prepend('VueLoaderPlugin', new VueLoaderPlugin()) -environment.loaders.prepend('vue', vue) +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/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..c42c2349 100644 --- a/config/webpacker.yml +++ b/config/webpacker.yml @@ -34,7 +34,9 @@ default: &default - .woff2 extensions: - - .vue + - .tsx + - .ts + - .jsx - .mjs - .js - .sass @@ -53,7 +55,7 @@ development: <<: *default compile: true - # Verifies that versions and hashed value of the package contents in the project's package.json + # 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/ diff --git a/lib/filter_dances.rb b/lib/filter_dances.rb new file mode 100644 index 00000000..a171c880 --- /dev/null +++ b/lib/filter_dances.rb @@ -0,0 +1,316 @@ +# coding: utf-8 +require 'set' +require 'search_match' +require 'sort_parser' + +module FilterDances + 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(*SortParser.parse(sort_by)) + number_searched = 0 + number_matching = 0 + filter_results = [] + query.map do |dance| + number_searched += 1 + mf = matching_figures(filter, dance) + if mf + number_matching += 1 + send_this_dance = offset < number_matching && number_matching <= offset + count + if send_this_dance + mf_html = matching_figures_html(mf, dance, dialect) + filter_results << filter_result_to_json(dance, mf_html) + end + end + end + { + numberSearched: number_searched, + numberMatching: number_matching, + dances: filter_results + } + end + + 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 + + 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 + + # 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 + when 'off' + 'private' + when 'sketchbook' + 'sketchbook' + when 'all' + 'everywhere' + else + raise 'fell through enum case' + 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_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) + 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 + + def self.matching_figures_for_choreographer(filter, dance) + choreographer = filter[1].downcase + dance.choreographer.name.downcase.include?(choreographer) ? Set[] : nil + 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 +end diff --git a/lib/sort_parser.rb b/lib/sort_parser.rb new file mode 100644 index 00000000..f5faf290 --- /dev/null +++ b/lib/sort_parser.rb @@ -0,0 +1,35 @@ +module SortParser + def self.parse(p) + p_is_valid = p.match?(/\A((?:title|choreographer_name|hook|formation|user_name|created_at|updated_at|publish)[AD])*\z/) + if p_is_valid + a = parse_valid_string(p) + a.empty? ? DEFAULT_SORT : a + else + raise "SortParser could not read #{p.inspect}" + end + end + # "title", + # {hook: :desc}, + # Choreographer.arel_table[:name].desc + private + def self.parse_valid_string(p) + p.split(/(?<=[AD])/).map do |s| + column, a_or_d = s.match(/^([a-z_]*)([AD])$/).to_a.drop(1) + 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', 'publish' + is_ascending ? "dances.#{column}" : Dance.arel_table[column.to_sym].desc + else + is_ascending ? column : {column => :desc} + end + end + end + + DEFAULT_SORT = [{created_at: :desc}] +end diff --git a/package.json b/package.json index 69444f8e..e11ac8e9 100644 --- a/package.json +++ b/package.json @@ -1,18 +1,31 @@ { "dependencies": { - "@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/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", + "namor": "^1.1.3", + "prop-types": "^15.7.2", + "react": "^16.11.0", + "react-dom": "^16.11.0", + "react-table": "^7.0.0-rc.15", + "ts-loader": "^6.2.1", + "typescript": "^3.6.4" }, "devDependencies": { + "@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": "^7.17.0", + "eslint-plugin-react-hooks": "^2.3.0", "jest": "^24.8.0", "prettier": "1.18.2", + "ts-jest": "^24.2.0", "webpack-dev-server": "^3.1.14" }, "scripts": { @@ -20,9 +33,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)" + ], + "setupFilesAfterEnv": [ + "/spec/jest-setup.ts" + ], "moduleDirectories": [ "node_modules", "app/javascript" 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..3f6a19bb 100644 --- a/spec/features/welcome/search_spec.rb +++ b/spec/features/welcome/search_spec.rb @@ -3,191 +3,287 @@ 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) + let (:now) { DateTime.now } + it "works" do + dances = 12.times.map {|i| FactoryGirl.create(:dance, title: "Dance #{i}.", created_at: now - i.days)} + visit(s_path) + dances.each_with_index do |dance, i| + 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.localtime.strftime("%-m/%-d/%Y")) 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", "*" ] ]') + describe 'pagination' do + def have_turn_page_button(*args) + have_css(turn_page_button_css(*args)) 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') + def turn_page_button_css(label, disabled=false) + "button[data-testid=#{label.inspect}]#{disabled ? '[disabled]' : ''}" 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') + 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_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_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_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_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_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_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 - 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))) + it "page size select menu" do + visit(s_path) + expect(page).to have_text("Showing 1 to 10 of 52 dances.") + select('30') + 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 end + end - it 'count filter' do + 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' - 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))) + visit(s_path) + %w[Title Choreographer Formation Hook User Entered].each do |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 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) + 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 - 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) + it 'published column cells' do + with_login do |user| + dances.each_with_index do |dance, i| + publish = [:off, :sketchbook, :all][i] + publish_string = ['private', 'sketchbook', 'everywhere'][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 - select '1' - dances.each do |dance| - expect(page).to_not have_link(dance.title) + end + + describe 'matching 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 - 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 + + 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 + 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 - 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 "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} dances.") + end + + describe "sorting" do + it "clicking a header displays that column in descending order" do + 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)) end - expect(matches).to eq(1) + 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 + 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 + # 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') + 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 - 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') + 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 - 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") + 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 - 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") + 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 - def open_ellipsis - find('.toggle-off').click + describe "filters" do + describe "choreographer" do + let(:dances) { [:dance, :box_the_gnat_contra, :call_me].map {|name| FactoryGirl.create(name)} } + + it "works" do + call_me = dances.last + dont_call_me = dances[0, dances.length-2] + visit(s_path) + 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 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/javascript/natural-number-editor.spec.tsx b/spec/javascript/natural-number-editor.spec.tsx new file mode 100644 index 00000000..b7786f66 --- /dev/null +++ b/spec/javascript/natural-number-editor.spec.tsx @@ -0,0 +1,47 @@ +import React from "react" +import { render, fireEvent } from "@testing-library/react" + +import NaturalNumberEditor from "../../app/javascript/natural-number-editor" + +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") + }) + }) +}) 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" diff --git a/spec/lib/filter_dances_spec.rb b/spec/lib/filter_dances_spec.rb new file mode 100644 index 00000000..1912e04f --- /dev/null +++ b/spec/lib/filter_dances_spec.rb @@ -0,0 +1,274 @@ +# 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 } + + 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] + 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 'works with an unexpectedly unmatchy filter and not enough dances' do + dance1 = 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(['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['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(['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['id']).to eq(dance.id) + end + end + + 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 + + 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 + + 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 '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 + + 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') && 'everywhere', + 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/lib/sort_parser_spec.rb b/spec/lib/sort_parser_spec.rb new file mode 100644 index 00000000..0cf838c5 --- /dev/null +++ b/spec/lib/sort_parser_spec.rb @@ -0,0 +1,59 @@ +require 'ostruct' +require 'spec_helper' +require 'sort_parser' + +describe SortParser do + describe 'parse' do + it 'works part 1' do + input = "titleAhookDchoreographer_nameAuser_nameDpublishA" + expected = [ + "title", + {"hook" => :desc}, + "choreographers.name", + User.arel_table[:name].desc, + "dances.publish" + ] + 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", + Dance.arel_table[: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 = '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([{created_at: :desc}]) + end + end +end diff --git a/spec/models/dance_spec.rb b/spec/models/dance_spec.rb index 6a9e5ce5..fd676855 100644 --- a/spec/models/dance_spec.rb +++ b/spec/models/dance_spec.rb @@ -183,32 +183,4 @@ expect(dut.dance.tags.to_a).to eq([dut.tag]) 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 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..90aa817d --- /dev/null +++ b/spec/requests/api/v1/dances_controller_spec.rb @@ -0,0 +1,73 @@ +require 'rails_helper' + +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, params: {}, headers: headers) + 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"=>"everywhere", + "matching_figures_html"=>"whole dance"} + ]}) + end + + it 'understands count and offset' do + pageSize = 4 + pages = 3 + 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| + 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) + 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 '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 + 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)) + 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 diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..f3057f18 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "declaration": false, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "lib": ["es6", "dom"], + "module": "es6", + "moduleResolution": "node", + "sourceMap": true, + "strict": true, + "target": "es5", + "jsx": "react", + "esModuleInterop": true + }, + "exclude": [ + "**/*.spec.ts", + "node_modules", + "vendor", + "public" + ], + "compileOnSave": true +} diff --git a/yarn.lock b/yarn.lock index db8b5772..3eaec8fd 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.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== 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.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== 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,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" @@ -224,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.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== "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" @@ -308,6 +316,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" @@ -345,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" @@ -470,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" @@ -508,6 +523,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" @@ -578,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" @@ -599,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" @@ -614,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" @@ -627,17 +674,35 @@ "@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.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.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/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" @@ -650,25 +715,25 @@ "@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.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== 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.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" @@ -835,7 +900,7 @@ "@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== @@ -879,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" @@ -912,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" @@ -946,26 +1057,80 @@ "@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/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" 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" + 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@*": + 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" + integrity sha512-FUuZKXPr9qlzUT9lhuzrZgLjH63TvNn28Ch3MvKG4B+F52zQtO8DtE0Opbncy3xaucNZM2WIPfuNTgkbKx5Brg== + 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" + 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/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" @@ -978,20 +1143,48 @@ dependencies: "@types/yargs-parser" "*" -"@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== +"@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: - 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" + 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" @@ -1175,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" @@ -1190,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" @@ -1200,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== @@ -1230,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" @@ -1250,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" @@ -1290,6 +1505,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" @@ -1325,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" @@ -1376,6 +1607,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" @@ -1396,10 +1632,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" @@ -1412,16 +1650,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: @@ -1447,7 +1685,7 @@ babel-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== @@ -1490,6 +1728,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" @@ -1550,10 +1793,10 @@ block-stream@*: dependencies: inherits "~2.0.0" -bluebird@^3.1.1, 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== +bluebird@^3.5.5: + 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" @@ -1593,11 +1836,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" @@ -1622,6 +1860,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" @@ -1698,23 +1943,30 @@ 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, browserslist@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.0.tgz#9ee89225ffc07db03409f2fee524dc8227458a17" - integrity sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA== +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: - caniuse-lite "^1.0.30000989" - electron-to-chromium "^1.3.247" - node-releases "^1.1.29" + caniuse-lite "^1.0.30001004" + 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.0" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.0.tgz#65fc784bf7f87c009b973c12db6546902fa9c7b5" - integrity sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg== + 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: +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== @@ -1851,6 +2103,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" @@ -1866,10 +2123,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, 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.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== capture-exit@^2.0.0: version "2.0.0" @@ -1888,7 +2145,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.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== @@ -1908,6 +2165,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" @@ -1962,6 +2224,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" @@ -2065,10 +2339,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.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== commondir@^1.0.1: version "1.0.1" @@ -2144,13 +2418,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" @@ -2203,17 +2470,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" @@ -2261,7 +2528,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== @@ -2390,6 +2657,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" @@ -2492,6 +2774,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" @@ -2525,11 +2812,6 @@ date-now@^0.1.4: resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= -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= - 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" @@ -2537,14 +2819,14 @@ 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== 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== @@ -2715,6 +2997,20 @@ 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" + 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" @@ -2783,10 +3079,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.276" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.276.tgz#1cca47c31b6e852ce43ab62ae4f31608db8b95d4" - integrity sha512-J7bVRAW2fHJVOGZqxSvmMcbBAWPiueHsKwSq+TjaNq1wQ71Za0uBExC1ECuMmAAQioDA2//auhI/glFINnUGPw== +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" @@ -2806,6 +3102,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" @@ -2823,7 +3124,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: 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== @@ -2832,6 +3133,15 @@ enhanced-resolve@4.1.0, enhanced-resolve@^4.1.0: memory-fs "^0.4.0" tapable "^1.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== + 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" @@ -2852,9 +3162,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" @@ -2867,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" @@ -2876,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" @@ -2898,6 +3234,39 @@ 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-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" @@ -2906,6 +3275,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" @@ -2916,6 +3357,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" @@ -2923,12 +3371,12 @@ 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== -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== @@ -3074,6 +3522,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" @@ -3103,12 +3560,12 @@ 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= -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= @@ -3139,6 +3596,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" @@ -3157,6 +3628,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" @@ -3204,6 +3682,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" @@ -3318,6 +3805,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" @@ -3354,6 +3846,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" @@ -3381,10 +3878,29 @@ 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.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" - integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== + 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" + inherits "2" + minimatch "^3.0.4" + 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" @@ -3434,6 +3950,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" @@ -3455,9 +3978,9 @@ 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== + version "4.2.3" + 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" @@ -3470,9 +3993,9 @@ handle-thing@^2.0.0: 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== + 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" @@ -3510,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" @@ -3561,11 +4089,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 +4097,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" @@ -3601,9 +4119,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" @@ -3717,7 +4235,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== @@ -3747,12 +4265,17 @@ 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" +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" @@ -3768,6 +4291,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" @@ -3800,6 +4331,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" @@ -3838,6 +4374,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" @@ -3944,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" @@ -4041,6 +4601,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" @@ -4053,7 +4618,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== @@ -4067,6 +4632,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" @@ -4103,6 +4673,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" @@ -4110,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" @@ -4277,7 +4859,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== @@ -4382,7 +4964,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== @@ -4665,6 +5247,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" @@ -4675,6 +5262,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" @@ -4682,13 +5276,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" @@ -4699,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" @@ -4765,7 +5360,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= @@ -4831,7 +5426,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= @@ -4856,12 +5451,17 @@ 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" 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== @@ -4871,7 +5471,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== @@ -4886,7 +5486,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== @@ -4909,6 +5509,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" @@ -4986,6 +5591,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" @@ -5007,23 +5620,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-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" - 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== -merge@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" - integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== - methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -5048,6 +5649,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" @@ -5083,11 +5692,16 @@ 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== +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" @@ -5169,7 +5783,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.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= @@ -5216,6 +5830,16 @@ 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" + 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" @@ -5356,17 +5980,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== +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" @@ -5375,7 +5999,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" @@ -5449,9 +6073,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" @@ -5519,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" @@ -5546,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" @@ -5595,6 +6244,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" @@ -5630,6 +6286,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" @@ -5663,7 +6331,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= @@ -5748,6 +6416,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" @@ -5879,6 +6554,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" @@ -5932,14 +6612,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" @@ -6581,10 +7261,10 @@ 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: - version "7.0.18" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.18.tgz#4b9cda95ae6c069c67a4d933029eddd4838ac233" - integrity sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g== +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" @@ -6600,17 +7280,12 @@ 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" 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== @@ -6635,6 +7310,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" @@ -6648,6 +7328,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" @@ -6801,10 +7490,34 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.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-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.17.0" + +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== + +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" + 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" + prop-types "^15.6.2" read-cache@^1.0.0: version "1.0.0" @@ -6893,6 +7606,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" @@ -6932,6 +7653,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" @@ -6945,9 +7676,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" @@ -7060,6 +7791,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" @@ -7070,6 +7806,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" @@ -7077,6 +7820,21 @@ 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" + 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" @@ -7104,6 +7862,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" @@ -7117,6 +7882,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" @@ -7124,6 +7896,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" @@ -7187,6 +7966,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.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" + schema-utils@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" @@ -7216,12 +8003,12 @@ 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== -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== @@ -7362,6 +8149,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" @@ -7424,7 +8220,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== @@ -7435,7 +8231,15 @@ 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.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" integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== @@ -7654,6 +8458,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" @@ -7662,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" @@ -7670,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" @@ -7705,6 +8534,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" @@ -7729,6 +8565,18 @@ 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@^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" @@ -7794,6 +8642,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" @@ -7837,9 +8695,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.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" @@ -7855,6 +8713,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" @@ -7868,10 +8731,15 @@ 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.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" @@ -7885,6 +8753,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" @@ -7915,6 +8790,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" @@ -7965,16 +8847,50 @@ 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" + integrity sha512-Dd9FekWuABGgjE1g0TlQJ+4dFUfYGbYcs52/HQObE0ZmUNjQlmLAS7xXsSzy23AMaMwipsx5sNHvoEpT2CZq1g== + 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" 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" @@ -7999,6 +8915,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" @@ -8012,12 +8933,17 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +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== + 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== + 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.0" + commander "~2.20.3" source-map "~0.6.1" unicode-canonical-property-names-ecmascript@^1.0.4: @@ -8175,6 +9101,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" @@ -8207,61 +9138,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" @@ -8269,6 +9145,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" @@ -8339,9 +9220,9 @@ webpack-dev-middleware@^3.7.2: 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== + 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" @@ -8361,7 +9242,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" @@ -8394,9 +9275,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" @@ -8458,9 +9339,9 @@ whatwg-url@^6.4.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== + 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" @@ -8490,6 +9371,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" @@ -8538,6 +9424,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" @@ -8582,6 +9475,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"